diff --git a/contenttype-data.js b/contenttype-data.js new file mode 100644 index 0000000..fe20915 --- /dev/null +++ b/contenttype-data.js @@ -0,0 +1,223 @@ +'use strict'; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); +var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); +var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); +var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); +var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); +var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); +var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); +var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); +function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +var FetchContentTypes = /*#__PURE__*/function () { + function FetchContentTypes() { + (0, _classCallCheck2["default"])(this, FetchContentTypes); + } + return (0, _createClass2["default"])(FetchContentTypes, [{ + key: "getPagedData", + value: function () { + var _getPagedData = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() { + return _regenerator["default"].wrap(function (_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + case "end": + return _context.stop(); + } + }, _callee); + })); + function getPagedData() { + return _getPagedData.apply(this, arguments); + } + return getPagedData; + }() + }]); +}(); +var FetchDefaultContentTypes = /*#__PURE__*/function (_FetchContentTypes) { + function FetchDefaultContentTypes() { + (0, _classCallCheck2["default"])(this, FetchDefaultContentTypes); + return _callSuper(this, FetchDefaultContentTypes, arguments); + } + (0, _inherits2["default"])(FetchDefaultContentTypes, _FetchContentTypes); + return (0, _createClass2["default"])(FetchDefaultContentTypes, [{ + key: "getPagedData", + value: function () { + var _getPagedData2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(url, config, responseKey, fn) { + var query, result; + return _regenerator["default"].wrap(function (_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + query = { + include_global_field_schema: true + }; + _context2.next = 1; + return fn.apply(null, [url, config, responseKey, query]); + case 1: + result = _context2.sent; + return _context2.abrupt("return", result); + case 2: + case "end": + return _context2.stop(); + } + }, _callee2); + })); + function getPagedData(_x, _x2, _x3, _x4) { + return _getPagedData2.apply(this, arguments); + } + return getPagedData; + }() + }]); +}(FetchContentTypes); +var FetchSpecifiedContentTypes = /*#__PURE__*/function (_FetchContentTypes2) { + function FetchSpecifiedContentTypes() { + (0, _classCallCheck2["default"])(this, FetchSpecifiedContentTypes); + return _callSuper(this, FetchSpecifiedContentTypes, arguments); + } + (0, _inherits2["default"])(FetchSpecifiedContentTypes, _FetchContentTypes2); + return (0, _createClass2["default"])(FetchSpecifiedContentTypes, [{ + key: "getPagedData", + value: function () { + var _getPagedData3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3(url, config, responseKey, fn) { + var query, contentTypes, referredContentTypes, referredContentTypesList, referredContentTypesData, result; + return _regenerator["default"].wrap(function (_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + query = { + query: JSON.stringify({ + uid: { + $in: config.contentTypes + } + }), + include_global_field_schema: true + }; + _context3.next = 1; + return fn.apply(null, [url, config, responseKey, query]); + case 1: + contentTypes = _context3.sent; + referredContentTypes = new ReferredContentTypes(); + referredContentTypesList = referredContentTypes.getReferredContentTypes(contentTypes); + referredContentTypesData = []; + if (!referredContentTypesList.length) { + _context3.next = 3; + break; + } + query.query = JSON.stringify({ + uid: { + $in: referredContentTypesList + } + }); + _context3.next = 2; + return fn.apply(null, [url, config, responseKey, query]); + case 2: + referredContentTypesData = _context3.sent; + case 3: + result = contentTypes.concat(referredContentTypesData); + return _context3.abrupt("return", result); + case 4: + case "end": + return _context3.stop(); + } + }, _callee3); + })); + function getPagedData(_x5, _x6, _x7, _x8) { + return _getPagedData3.apply(this, arguments); + } + return getPagedData; + }() + }]); +}(FetchContentTypes); +var FetchUnspecifiedContentTypes = /*#__PURE__*/function (_FetchContentTypes3) { + function FetchUnspecifiedContentTypes() { + (0, _classCallCheck2["default"])(this, FetchUnspecifiedContentTypes); + return _callSuper(this, FetchUnspecifiedContentTypes, arguments); + } + (0, _inherits2["default"])(FetchUnspecifiedContentTypes, _FetchContentTypes3); + return (0, _createClass2["default"])(FetchUnspecifiedContentTypes, [{ + key: "getPagedData", + value: function () { + var _getPagedData4 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4(url, config, responseKey, fn) { + var query, contentTypes, referredContentTypes, referredContentTypesList, referredContentTypesData, result; + return _regenerator["default"].wrap(function (_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + query = { + query: JSON.stringify({ + uid: { + $nin: config.excludeContentTypes + } + }), + include_global_field_schema: true + }; + _context4.next = 1; + return fn.apply(null, [url, config, responseKey, query]); + case 1: + contentTypes = _context4.sent; + referredContentTypes = new ReferredContentTypes(); + referredContentTypesList = referredContentTypes.getReferredContentTypes(contentTypes); + referredContentTypesData = []; + if (!referredContentTypesList.length) { + _context4.next = 3; + break; + } + query.query = JSON.stringify({ + uid: { + $in: referredContentTypesList + } + }); + _context4.next = 2; + return fn.apply(null, [url, config, responseKey, query]); + case 2: + referredContentTypesData = _context4.sent; + case 3: + result = contentTypes.concat(referredContentTypesData); + return _context4.abrupt("return", result); + case 4: + case "end": + return _context4.stop(); + } + }, _callee4); + })); + function getPagedData(_x9, _x0, _x1, _x10) { + return _getPagedData4.apply(this, arguments); + } + return getPagedData; + }() + }]); +}(FetchContentTypes); +var ReferredContentTypes = /*#__PURE__*/function () { + function ReferredContentTypes() { + (0, _classCallCheck2["default"])(this, ReferredContentTypes); + } + return (0, _createClass2["default"])(ReferredContentTypes, [{ + key: "getReferredContentTypes", + value: function getReferredContentTypes(contentTypes) { + var referredContentTypes = {}; + for (var i = 0; i < contentTypes.length; i++) { + var contentType = contentTypes[i]; + for (var j = 0; j < contentType.schema.length; j++) { + var schema = contentType.schema[j]; + if (schema.data_type === 'reference') { + for (var k = 0; k < schema.reference_to.length; k++) { + // Keep unique values only. + referredContentTypes[schema.reference_to[k]] = null; + } + } + } + } + // Remove the content-types if they were already fetched. + for (var _i = 0; _i < contentTypes.length; _i++) { + var _contentType = contentTypes[_i].uid; + var keys = Object.keys(referredContentTypes); + if (keys.includes(_contentType)) { + delete referredContentTypes[_contentType]; + } + } + return Object.keys(referredContentTypes); + } + }]); +}(); +exports.FetchContentTypes = FetchContentTypes; +exports.FetchDefaultContentTypes = FetchDefaultContentTypes; +exports.FetchSpecifiedContentTypes = FetchSpecifiedContentTypes; +exports.FetchUnspecifiedContentTypes = FetchUnspecifiedContentTypes; +//# sourceMappingURL=contenttype-data.js.map \ No newline at end of file diff --git a/create-resolvers.js b/create-resolvers.js new file mode 100644 index 0000000..ff2eb77 --- /dev/null +++ b/create-resolvers.js @@ -0,0 +1,218 @@ +'use strict'; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); +var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); +var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); +var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); +var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +var Contentstack = require('@contentstack/utils'); +var _require = require('./utils'), + getJSONToHtmlRequired = _require.getJSONToHtmlRequired; +var _require2 = require('./normalize'), + makeEntryNodeUid = _require2.makeEntryNodeUid, + makeAssetNodeUid = _require2.makeAssetNodeUid; +var _require3 = require('./live-preview/resolveCslpMeta'), + resolveCslpMeta = _require3.resolveCslpMeta; +exports.createResolvers = /*#__PURE__*/function () { + var _ref = (0, _asyncToGenerator2["default"])(function (_ref2, configOptions) { + var createResolvers = _ref2.createResolvers, + cache = _ref2.cache, + createNodeId = _ref2.createNodeId; + return /*#__PURE__*/_regenerator["default"].mark(function _callee() { + var resolvers, typePrefix, _yield$Promise$all, _yield$Promise$all2, fileFields, references, groups, jsonRteFields, contentTypes, contentTypeMap; + return _regenerator["default"].wrap(function (_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + resolvers = {}; + typePrefix = configOptions.type_prefix || 'Contentstack'; + _context.next = 1; + return Promise.all([cache.get("".concat(typePrefix, "_").concat(configOptions.api_key, "_file_fields")), cache.get("".concat(typePrefix, "_").concat(configOptions.api_key, "_references")), cache.get("".concat(typePrefix, "_").concat(configOptions.api_key, "_groups")), cache.get("".concat(typePrefix, "_").concat(configOptions.api_key, "_json_rte_fields"))]); + case 1: + _yield$Promise$all = _context.sent; + _yield$Promise$all2 = (0, _slicedToArray2["default"])(_yield$Promise$all, 4); + fileFields = _yield$Promise$all2[0]; + references = _yield$Promise$all2[1]; + groups = _yield$Promise$all2[2]; + jsonRteFields = _yield$Promise$all2[3]; + _context.next = 2; + return cache.get(typePrefix); + case 2: + contentTypes = _context.sent; + contentTypeMap = {}; + contentTypes.forEach(function (item) { + contentTypeMap[item.uid] = item; + }); + contentTypes.forEach(function (contentType) { + resolvers["".concat(typePrefix, "_").concat(contentType.uid)] = { + "cslp__meta": { + type: "JSON", + resolve: function resolve(source, args, context, info) { + try { + return resolveCslpMeta({ + source: source, + args: args, + context: context, + info: info, + contentTypeMap: contentTypeMap, + typePrefix: typePrefix + }); + } catch (error) { + var _error$message; + console.error("ContentstackGatsby (Live Preview):", error); + return { + error: { + message: (_error$message = error.message) !== null && _error$message !== void 0 ? _error$message : "failed to resolve cslp__meta" + } + }; + } + } + } + }; + }); + fileFields && fileFields.forEach(function (fileField) { + resolvers[fileField.parent] = _objectSpread(_objectSpread({}, resolvers[fileField.parent]), (0, _defineProperty2["default"])({}, fileField.field.uid, { + resolve: function resolve(source, args, context) { + if (fileField.field.multiple && source["".concat(fileField.field.uid, "___NODE")]) { + var nodesData = []; + source["".concat(fileField.field.uid, "___NODE")].forEach(function (id) { + var existingNode = context.nodeModel.getNodeById({ + id: id + }); + if (existingNode) { + nodesData.push(existingNode); + } + }); + return nodesData; + } else { + var id = source["".concat(fileField.field.uid, "___NODE")]; + return context.nodeModel.getNodeById({ + id: id + }); + } + } + })); + }); + references && references.forEach(function (reference) { + resolvers[reference.parent] = _objectSpread(_objectSpread({}, resolvers[reference.parent]), {}, (0, _defineProperty2["default"])({}, reference.uid, { + resolve: function resolve(source, args, context) { + if (source["".concat(reference.uid, "___NODE")]) { + var nodesData = []; + source["".concat(reference.uid, "___NODE")].forEach(function (id) { + var existingNode = context.nodeModel.getNodeById({ + id: id + }); + if (existingNode) { + nodesData.push(existingNode); + } + }); + return nodesData; + } + return []; + } + })); + }); + groups && groups.forEach(function (group) { + resolvers[group.parent] = _objectSpread(_objectSpread({}, resolvers[group.parent]), (0, _defineProperty2["default"])({}, group.field.uid, { + resolve: function resolve(source) { + if (group.field.multiple && !Array.isArray(source[group.field.uid])) { + return []; + } + return source[group.field.uid] || null; + } + })); + }); + jsonRteFields && jsonRteFields.forEach(function (jsonRteField) { + resolvers[jsonRteField.parent] = _objectSpread(_objectSpread({}, resolvers[jsonRteField.parent]), (0, _defineProperty2["default"])({}, jsonRteField.field.uid, { + resolve: function resolve(source, args, context) { + if (getJSONToHtmlRequired(configOptions.jsonRteToHtml, jsonRteField.field)) { + var keys = Object.keys(source); + var embeddedItems = {}; + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (!source[key]) { + continue; + } + if (Array.isArray(source[key])) { + for (var j = 0; j < source[key].length; j++) { + if (source[key][j].type === 'doc') { + source[key] = parseJSONRTEToHtml(source[key][j].children, embeddedItems, key, source, context, createNodeId, typePrefix); + } + } + } else { + if (source[key].type === 'doc') { + source[key] = parseJSONRTEToHtml(source[key].children, embeddedItems, key, source, context, createNodeId, typePrefix); + } + } + } + } + return source[jsonRteField.field.uid] || null; + } + })); + }); + createResolvers(resolvers); + case 3: + case "end": + return _context.stop(); + } + }, _callee); + })(); + }); + return function (_x, _x2) { + return _ref.apply(this, arguments); + }; +}(); +function parseJSONRTEToHtml(children, embeddedItems, key, source, context, createNodeId, prefix) { + embeddedItems[key] = embeddedItems[key] || []; + getChildren(children, embeddedItems, key, source, context, createNodeId, prefix); + source._embedded_items = _objectSpread(_objectSpread({}, source._embedded_items), embeddedItems); + return parseJSONRteToHtmlHelper(source, key); +} +function getChildren(children, embeddedItems, key, source, context, createNodeId, prefix) { + for (var j = 0; j < children.length; j++) { + var child = children[j]; + if (child.type === 'reference') { + var id = void 0; + if (child.attrs && child.attrs.type === 'asset') { + id = makeAssetNodeUid({ + publish_details: { + locale: source.publish_details.locale + }, + uid: child.attrs['asset-uid'] + }, createNodeId, prefix); + } else { + id = makeEntryNodeUid({ + publish_details: { + locale: source.publish_details.locale + }, + uid: child.attrs['entry-uid'] + }, createNodeId, prefix); + } + var node = context.nodeModel.getNodeById({ + id: id + }); + // The following line is required by contentstack utils package to parse value from json to html. + node._content_type_uid = child.attrs['content-type-uid']; + embeddedItems[key].push(node); + } + if (child.children) { + getChildren(child.children, embeddedItems, key, source, context, createNodeId, prefix); + } + } +} +function parseJSONRteToHtmlHelper(value, path) { + var jsonRteToHtml = {}; + if (value) { + Contentstack.jsonToHTML({ + entry: value, + paths: [path] + }); + jsonRteToHtml = value[path]; + } else { + jsonRteToHtml = null; + } + return jsonRteToHtml; +} +; +//# sourceMappingURL=create-resolvers.js.map \ No newline at end of file diff --git a/create-schema-customization.js b/create-schema-customization.js new file mode 100644 index 0000000..8743f12 --- /dev/null +++ b/create-schema-customization.js @@ -0,0 +1,216 @@ +'use strict'; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); +var _typeof = require("@babel/runtime/helpers/typeof"); +var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); +var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); +var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); +function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t8 in e) "default" !== _t8 && {}.hasOwnProperty.call(e, _t8) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t8)) && (i.get || i.set) ? o(f, _t8, i) : f[_t8] = e[_t8]); return f; })(e, t); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +var _require = require('gatsby/graphql'), + GraphQLInt = _require.GraphQLInt, + GraphQLJSON = _require.GraphQLJSON, + GraphQLString = _require.GraphQLString; +var _require2 = require('./normalize'), + buildCustomSchema = _require2.buildCustomSchema, + extendSchemaWithDefaultEntryFields = _require2.extendSchemaWithDefaultEntryFields; +var _require3 = require('./fetch'), + fetchContentTypes = _require3.fetchContentTypes; +var _require4 = require('./utils'), + getContentTypeOption = _require4.getContentTypeOption; +var _require5 = require('./gatsby-plugin-image'), + resolveGatsbyImageData = _require5.resolveGatsbyImageData; +exports.createSchemaCustomization = /*#__PURE__*/function () { + var _ref = (0, _asyncToGenerator2["default"])(function (_ref2, configOptions) { + var cache = _ref2.cache, + actions = _ref2.actions, + schema = _ref2.schema, + reporter = _ref2.reporter, + createNodeId = _ref2.createNodeId; + return /*#__PURE__*/_regenerator["default"].mark(function _callee2() { + var contentTypes, typePrefix, disableMandatoryFields, jsonRteToHtml, contentTypeOption, references, groups, fileFields, jsonRteFields, createTypes, contentTypeSchema, assetTypeSchema, _yield$import, getGatsbyImageFieldConfig, fieldConfig, _t, _t2, _t3, _t4, _t5, _t6, _t7; + return _regenerator["default"].wrap(function (_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + typePrefix = configOptions.type_prefix || 'Contentstack'; + disableMandatoryFields = configOptions.disableMandatoryFields || false; + jsonRteToHtml = configOptions.jsonRteToHtml || false; + _context2.prev = 1; + contentTypeOption = getContentTypeOption(configOptions); + _context2.next = 2; + return fetchContentTypes(configOptions, contentTypeOption); + case 2: + contentTypes = _context2.sent; + _context2.next = 3; + return cache.set(typePrefix, contentTypes); + case 3: + _context2.next = 5; + break; + case 4: + _context2.prev = 4; + _t = _context2["catch"](1); + console.error('Contentstack fetch content type failed!'); + case 5: + references = [], groups = [], fileFields = [], jsonRteFields = []; + if (!configOptions.enableSchemaGeneration) { + _context2.next = 14; + break; + } + createTypes = actions.createTypes; + /** Type definition for content-type schema */ + contentTypeSchema = { + name: "".concat(typePrefix, "ContentTypes"), + fields: { + title: 'String!', + uid: 'String!', + created_at: { + type: 'Date', + extensions: { + dateformat: {} + } + }, + updated_at: { + type: 'Date', + extensions: { + dateformat: {} + } + }, + schema: 'JSON!', + description: 'String' + }, + interfaces: ['Node'], + extensions: { + infer: false + } + }; + /** Type definition for asset schema */ + assetTypeSchema = { + name: "".concat(typePrefix, "_assets"), + fields: _objectSpread({ + url: 'String' + }, configOptions.downloadImages ? { + localAsset: { + type: 'File', + extensions: { + link: { + from: "fields.localAsset" + } + } + } + } : {}), + interfaces: ['Node'], + extensions: { + infer: true + } + }; // Checks if gatsby-plugin-image is installed. + _context2.prev = 6; + _context2.next = 7; + return Promise.resolve().then(function () { + return _interopRequireWildcard(require('gatsby-plugin-image/graphql-utils')); + }); + case 7: + _yield$import = _context2.sent; + getGatsbyImageFieldConfig = _yield$import.getGatsbyImageFieldConfig; + fieldConfig = {}; + fieldConfig = getGatsbyImageFieldConfig(/*#__PURE__*/function () { + var _ref3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(image, options) { + return _regenerator["default"].wrap(function (_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + return _context.abrupt("return", resolveGatsbyImageData({ + image: image, + options: options, + cache: cache, + reporter: reporter + })); + case 1: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function (_x3, _x4) { + return _ref3.apply(this, arguments); + }; + }(), { + fit: { + type: GraphQLString + }, + crop: { + type: GraphQLString + }, + trim: { + type: GraphQLString + }, + pad: { + type: GraphQLString + }, + quality: { + type: GraphQLInt, + defaultValue: 50 + } + }); + fieldConfig.type = GraphQLJSON; + assetTypeSchema.fields.gatsbyImageData = fieldConfig; + _context2.next = 9; + break; + case 8: + _context2.prev = 8; + _t2 = _context2["catch"](6); + if (_t2.code === 'MODULE_NOT_FOUND') { + reporter.info("Gatsby plugin image is required to use new gatsby image plugin's feature. Please check https://github.com/contentstack/gatsby-source-contentstack#the-new-gatsby-image-plugin for more help."); + } + case 9: + createTypes([schema.buildObjectType(contentTypeSchema), schema.buildObjectType(assetTypeSchema)]); + contentTypes && contentTypes.forEach(function (contentType) { + var contentTypeUid = contentType.uid.replace(/-/g, '_'); + var name = "".concat(typePrefix, "_").concat(contentTypeUid); + var extendedSchema = extendSchemaWithDefaultEntryFields(contentType.schema); + var result = buildCustomSchema(extendedSchema, [], [], [], [], [], name, typePrefix, disableMandatoryFields, jsonRteToHtml, createNodeId, undefined); + references = references.concat(result.references); + groups = groups.concat(result.groups); + fileFields = fileFields.concat(result.fileFields); + jsonRteFields = jsonRteFields.concat(result.jsonRteFields); + var typeDefs = ["type linktype { title: String href: String }", schema.buildObjectType({ + name: name, + fields: result.fields, + interfaces: ['Node'], + extensions: { + infer: true + } + })]; + result.types = result.types.concat(typeDefs); + createTypes(result.types); + }); + _t3 = Promise; + _context2.next = 10; + return cache.set("".concat(typePrefix, "_").concat(configOptions.api_key, "_references"), references); + case 10: + _t4 = _context2.sent; + _context2.next = 11; + return cache.set("".concat(typePrefix, "_").concat(configOptions.api_key, "_groups"), groups); + case 11: + _t5 = _context2.sent; + _context2.next = 12; + return cache.set("".concat(typePrefix, "_").concat(configOptions.api_key, "_file_fields"), fileFields); + case 12: + _t6 = _context2.sent; + _context2.next = 13; + return cache.set("".concat(typePrefix, "_").concat(configOptions.api_key, "_json_rte_fields"), jsonRteFields); + case 13: + _t7 = _context2.sent; + _context2.next = 14; + return _t3.all.call(_t3, [_t4, _t5, _t6, _t7]); + case 14: + case "end": + return _context2.stop(); + } + }, _callee2, null, [[1, 4], [6, 8]]); + })(); + }); + return function (_x, _x2) { + return _ref.apply(this, arguments); + }; +}(); +//# sourceMappingURL=create-schema-customization.js.map \ No newline at end of file diff --git a/download-assets.js b/download-assets.js new file mode 100644 index 0000000..93d06ca --- /dev/null +++ b/download-assets.js @@ -0,0 +1,214 @@ +'use strict'; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); +var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); +var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); +var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +var _require = require('gatsby-source-filesystem'), + createRemoteFileNode = _require.createRemoteFileNode; +var _require2 = require('./normalize'), + makeAssetNodeUid = _require2.makeAssetNodeUid; +var _require3 = require('./utils'), + createProgress = _require3.createProgress, + checkIfUnsupportedFormat = _require3.checkIfUnsupportedFormat, + SUPPORTED_FILES_COUNT = _require3.SUPPORTED_FILES_COUNT, + IMAGE_REGEXP = _require3.IMAGE_REGEXP, + ASSET_NODE_UIDS = _require3.ASSET_NODE_UIDS; +var bar; // Keep track of the total number of jobs we push in the queue +var sizeBar; +var totalJobs = 0; +var totalSize = 0; +module.exports = /*#__PURE__*/function () { + var _ref = (0, _asyncToGenerator2["default"])(function (_ref2, typePrefix, configOptions) { + var cache = _ref2.cache, + getCache = _ref2.getCache, + createNode = _ref2.createNode, + createNodeId = _ref2.createNodeId, + getNodesByType = _ref2.getNodesByType, + reporter = _ref2.reporter, + createNodeField = _ref2.createNodeField, + getNode = _ref2.getNode; + return /*#__PURE__*/_regenerator["default"].mark(function _callee() { + var assetUids, batches, i, batchPromises, skip, lastCount, shouldBreak, j, asset, regexp, matches, isUnsupportedExt, _t, _t2; + return _regenerator["default"].wrap(function (_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 1; + return cache.get(ASSET_NODE_UIDS); + case 1: + assetUids = _context.sent; + configOptions.MAX_CONCURRENCY_LIMIT = process.env.GATSBY_CONCURRENT_DOWNLOAD || 20; + batches = getBatches(assetUids.length, configOptions.MAX_CONCURRENCY_LIMIT); // Get total count of files that will be downloaded, excluding unsupported formats + _context.next = 2; + return cache.get(SUPPORTED_FILES_COUNT); + case 2: + totalJobs = _context.sent; + // Create progress bar + bar = createProgress("Downloading remote files", reporter); + bar.start(); + bar.total = totalJobs; + i = 0; + case 3: + if (!(i < batches.length)) { + _context.next = 11; + break; + } + batchPromises = []; + skip = i * configOptions.MAX_CONCURRENCY_LIMIT; + lastCount = (i + 1) * configOptions.MAX_CONCURRENCY_LIMIT; + reporter.verbose("Skip: ".concat(skip, ", limit: ").concat(lastCount)); + shouldBreak = false; + j = skip; + case 4: + if (!(j < lastCount)) { + _context.next = 8; + break; + } + asset = assetUids[j] ? getNode(assetUids[j]) : null; // Last batch will contain null references when accessed, can be handled in a better way + if (!(!asset && i + 1 === batches.length)) { + _context.next = 5; + break; + } + shouldBreak = true; + return _context.abrupt("continue", 8); + case 5: + // filter the images from all the assets + regexp = IMAGE_REGEXP; + matches = void 0; // SVG is not supported by gatsby-source-filesystem. Reference: https://github.com/gatsbyjs/gatsby/issues/10297 + isUnsupportedExt = false; + try { + matches = regexp.exec(asset.url); + isUnsupportedExt = checkIfUnsupportedFormat(asset.url); + } catch (error) { + reporter.panic('Something went wrong. Details: ' + JSON.stringify(error)); + } + if (!(matches && !isUnsupportedExt)) { + _context.next = 7; + break; + } + _t = batchPromises; + _context.next = 6; + return createRemoteFileNodePromise({ + cache: cache, + getCache: getCache, + createNode: createNode, + createNodeId: createNodeId, + createNodeField: createNodeField + }, asset, typePrefix, reporter); + case 6: + _t.push.call(_t, _context.sent); + case 7: + j++; + _context.next = 4; + break; + case 8: + if (!shouldBreak) { + _context.next = 9; + break; + } + return _context.abrupt("continue", 11); + case 9: + _context.next = 10; + return Promise.all(batchPromises); + case 10: + i++; + _context.next = 3; + break; + case 11: + bar && bar.done(); + sizeBar && sizeBar.done(); + reporter.verbose("Total size of downloaded files ".concat(totalSize)); + _context.next = 13; + break; + case 12: + _context.prev = 12; + _t2 = _context["catch"](0); + reporter.info('Something went wrong while downloading assets. Details: ' + _t2); + case 13: + case "end": + return _context.stop(); + } + }, _callee, null, [[0, 12]]); + })(); + }); + return function (_x, _x2, _x3) { + return _ref.apply(this, arguments); + }; +}(); +var createRemoteFileNodePromise = /*#__PURE__*/function () { + var _ref3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(params, node, typePrefix, reporter) { + var fileNode, assetUid, fileSize, _t3; + return _regenerator["default"].wrap(function (_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + _context2.prev = 0; + if (!sizeBar) { + sizeBar = createProgress("Total KBs downloaded", reporter); + sizeBar.start(); + } + assetUid = makeAssetNodeUid(node, params.createNodeId, typePrefix); // Get asset from cache + _context2.next = 1; + return params.cache.get(assetUid); + case 1: + fileNode = _context2.sent; + // Handles condition if the asset has been updated, then it will be downloaded again + if (fileNode && fileNode.updated_at !== node.updated_at) fileNode = null; + if (fileNode) { + _context2.next = 3; + break; + } + _context2.next = 2; + return createRemoteFileNode(_objectSpread(_objectSpread({}, params), {}, { + url: encodeURI(node.url), + parentNodeId: node.id + })); + case 2: + fileNode = _context2.sent; + if (!fileNode) { + _context2.next = 3; + break; + } + // Save updated_at value in the cached fileNode + fileNode.updated_at = node.updated_at; + fileSize = parseInt(fileNode.size / 1000); // Get size in megabytes + totalSize = totalSize + fileSize; + sizeBar.total = totalSize; + sizeBar.tick(fileSize); + // Cache fileNode to prevent re-downloading asset + _context2.next = 3; + return params.cache.set(assetUid, fileNode); + case 3: + bar.tick(); + if (fileNode) { + params.createNodeField({ + node: node, + name: 'localAsset', + value: fileNode.id + }); + } + return _context2.abrupt("return", fileNode); + case 4: + _context2.prev = 4; + _t3 = _context2["catch"](0); + reporter.info('Something went wrong while creating file nodes. Details: ' + _t3); + case 5: + case "end": + return _context2.stop(); + } + }, _callee2, null, [[0, 4]]); + })); + return function createRemoteFileNodePromise(_x4, _x5, _x6, _x7) { + return _ref3.apply(this, arguments); + }; +}(); +var getBatches = function getBatches(count, batchLimit) { + var partitions = Math.ceil(count / batchLimit); + // Returns array filled with indexes + return Array(partitions).fill(null).map(function (_, i) { + return i; + }); +}; +//# sourceMappingURL=download-assets.js.map \ No newline at end of file diff --git a/entry-data.js b/entry-data.js new file mode 100644 index 0000000..469290e --- /dev/null +++ b/entry-data.js @@ -0,0 +1,617 @@ +'use strict'; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); +var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); +var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); +var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); +var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); +var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); +var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); +var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); +var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); +function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } +function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } +var FetchEntries = /*#__PURE__*/function () { + function FetchEntries() { + (0, _classCallCheck2["default"])(this, FetchEntries); + } + return (0, _createClass2["default"])(FetchEntries, [{ + key: "fetchSyncData", + value: function () { + var _fetchSyncData = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() { + return _regenerator["default"].wrap(function (_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + case "end": + return _context.stop(); + } + }, _callee); + })); + function fetchSyncData() { + return _fetchSyncData.apply(this, arguments); + } + return fetchSyncData; + }() + }]); +}(); +var FetchDefaultEntries = /*#__PURE__*/function (_FetchEntries) { + function FetchDefaultEntries() { + (0, _classCallCheck2["default"])(this, FetchDefaultEntries); + return _callSuper(this, FetchDefaultEntries, arguments); + } + (0, _inherits2["default"])(FetchDefaultEntries, _FetchEntries); + return (0, _createClass2["default"])(FetchDefaultEntries, [{ + key: "fetchSyncData", + value: function () { + var _fetchSyncData2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(configOptions, cache, fn) { + var typePrefix, syncData, entryTokenKey, assetTokenKey, _yield$Promise$all, _yield$Promise$all2, syncEntryToken, syncAssetToken, syncEntryParams, syncAssetParams, _yield$Promise$all3, _yield$Promise$all4, syncEntryData, syncAssetData, data, tokenKey, syncToken, syncParams, _t; + return _regenerator["default"].wrap(function (_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + typePrefix = configOptions.type_prefix || 'Contentstack'; + syncData = {}; + _context2.prev = 1; + if (!configOptions.expediteBuild) { + _context2.next = 5; + break; + } + entryTokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-entry-").concat(configOptions.api_key); + assetTokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-asset-").concat(configOptions.api_key); + _context2.next = 2; + return Promise.all([cache.get(entryTokenKey), cache.get(assetTokenKey)]); + case 2: + _yield$Promise$all = _context2.sent; + _yield$Promise$all2 = (0, _slicedToArray2["default"])(_yield$Promise$all, 2); + syncEntryToken = _yield$Promise$all2[0]; + syncAssetToken = _yield$Promise$all2[1]; + syncEntryParams = syncEntryToken ? { + sync_token: syncEntryToken + } : { + init: true, + limit: configOptions.limit > 100 ? 50 : configOptions.limit + }; + syncAssetParams = syncAssetToken ? { + sync_token: syncAssetToken + } : { + init: true, + limit: configOptions.limit > 100 ? 50 : configOptions.limit + }; + syncEntryParams.type = 'entry_published,entry_unpublished,entry_deleted'; + syncAssetParams.type = 'asset_published,asset_unpublished,asset_deleted'; + _context2.next = 3; + return Promise.all([fn.apply(null, [syncEntryParams, configOptions]), fn.apply(null, [syncAssetParams, configOptions])]); + case 3: + _yield$Promise$all3 = _context2.sent; + _yield$Promise$all4 = (0, _slicedToArray2["default"])(_yield$Promise$all3, 2); + syncEntryData = _yield$Promise$all4[0]; + syncAssetData = _yield$Promise$all4[1]; + data = syncEntryData.data.concat(syncAssetData.data); + syncData.data = data; + _context2.next = 4; + return Promise.all([syncEntryData.sync_token !== undefined ? cache.set(entryTokenKey, syncEntryData.sync_token) : Promise.resolve(), syncAssetData.sync_token !== undefined ? cache.set(assetTokenKey, syncAssetData.sync_token) : Promise.resolve()]); + case 4: + _context2.next = 8; + break; + case 5: + tokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-").concat(configOptions.api_key); + _context2.next = 6; + return cache.get(tokenKey); + case 6: + syncToken = _context2.sent; + syncParams = syncToken ? { + sync_token: syncToken + } : { + init: true, + limit: configOptions.limit > 100 ? 50 : configOptions.limit + }; + _context2.next = 7; + return fn.apply(null, [syncParams, configOptions]); + case 7: + syncData = _context2.sent; + if (!(syncData.sync_token !== undefined)) { + _context2.next = 8; + break; + } + _context2.next = 8; + return cache.set(tokenKey, syncData.sync_token); + case 8: + _context2.next = 10; + break; + case 9: + _context2.prev = 9; + _t = _context2["catch"](1); + throw _t; + case 10: + return _context2.abrupt("return", syncData); + case 11: + case "end": + return _context2.stop(); + } + }, _callee2, null, [[1, 9]]); + })); + function fetchSyncData(_x, _x2, _x3) { + return _fetchSyncData2.apply(this, arguments); + } + return fetchSyncData; + }() + }]); +}(FetchEntries); +var FetchSpecifiedContentTypesEntries = /*#__PURE__*/function (_FetchEntries2) { + function FetchSpecifiedContentTypesEntries() { + (0, _classCallCheck2["default"])(this, FetchSpecifiedContentTypesEntries); + return _callSuper(this, FetchSpecifiedContentTypesEntries, arguments); + } + (0, _inherits2["default"])(FetchSpecifiedContentTypesEntries, _FetchEntries2); + return (0, _createClass2["default"])(FetchSpecifiedContentTypesEntries, [{ + key: "fetchSyncData", + value: function () { + var _fetchSyncData3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3(configOptions, cache, fn) { + var _yield$Promise$all5, _yield$Promise$all6, syncEntryData, syncAssetData, syncData, _t2; + return _regenerator["default"].wrap(function (_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + _context3.prev = 0; + _context3.next = 1; + return Promise.all([this.fetchEntries(configOptions, cache, fn), this.fetchAssets(configOptions, cache, fn)]); + case 1: + _yield$Promise$all5 = _context3.sent; + _yield$Promise$all6 = (0, _slicedToArray2["default"])(_yield$Promise$all5, 2); + syncEntryData = _yield$Promise$all6[0]; + syncAssetData = _yield$Promise$all6[1]; + syncData = {}; + syncData.data = syncEntryData.data.concat(syncAssetData.data); + return _context3.abrupt("return", syncData); + case 2: + _context3.prev = 2; + _t2 = _context3["catch"](0); + throw _t2; + case 3: + case "end": + return _context3.stop(); + } + }, _callee3, this, [[0, 2]]); + })); + function fetchSyncData(_x4, _x5, _x6) { + return _fetchSyncData3.apply(this, arguments); + } + return fetchSyncData; + }() + }, { + key: "fetchEntries", + value: function () { + var _fetchEntries = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4(configOptions, cache, fn) { + var syncData, typePrefix, contentTypes, i, contentType, tokenKey, syncToken, syncParams, _syncData, _t3; + return _regenerator["default"].wrap(function (_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + _context4.prev = 0; + syncData = {}; + typePrefix = configOptions.type_prefix || 'Contentstack'; + _context4.next = 1; + return cache.get(typePrefix); + case 1: + contentTypes = _context4.sent; + i = 0; + case 2: + if (!(i < contentTypes.length)) { + _context4.next = 6; + break; + } + contentType = contentTypes[i].uid; + tokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-").concat(contentType, "-").concat(configOptions.api_key); + _context4.next = 3; + return cache.get(tokenKey); + case 3: + syncToken = _context4.sent; + syncParams = syncToken ? { + sync_token: syncToken + } : { + init: true + }; + syncParams.content_type_uid = contentType; + _context4.next = 4; + return fn.apply(null, [syncParams, configOptions]); + case 4: + _syncData = _context4.sent; + syncData.data = syncData.data || []; + syncData.data = syncData.data.concat(_syncData.data); + // Caching token for the next sync. + if (!(_syncData.sync_token !== undefined)) { + _context4.next = 5; + break; + } + _context4.next = 5; + return cache.set(tokenKey, _syncData.sync_token); + case 5: + i++; + _context4.next = 2; + break; + case 6: + return _context4.abrupt("return", syncData); + case 7: + _context4.prev = 7; + _t3 = _context4["catch"](0); + throw _t3; + case 8: + case "end": + return _context4.stop(); + } + }, _callee4, null, [[0, 7]]); + })); + function fetchEntries(_x7, _x8, _x9) { + return _fetchEntries.apply(this, arguments); + } + return fetchEntries; + }() + }, { + key: "fetchAssets", + value: function () { + var _fetchAssets = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5(configOptions, cache, fn) { + var fetchAssetService, syncData, _t4; + return _regenerator["default"].wrap(function (_context5) { + while (1) switch (_context5.prev = _context5.next) { + case 0: + _context5.prev = 0; + fetchAssetService = new FetchAssets(); + _context5.next = 1; + return fetchAssetService.fetchAssets(configOptions, cache, fn); + case 1: + syncData = _context5.sent; + return _context5.abrupt("return", syncData); + case 2: + _context5.prev = 2; + _t4 = _context5["catch"](0); + throw _t4; + case 3: + case "end": + return _context5.stop(); + } + }, _callee5, null, [[0, 2]]); + })); + function fetchAssets(_x0, _x1, _x10) { + return _fetchAssets.apply(this, arguments); + } + return fetchAssets; + }() + }]); +}(FetchEntries); +var FetchSpecifiedLocalesEntries = /*#__PURE__*/function (_FetchEntries3) { + function FetchSpecifiedLocalesEntries() { + (0, _classCallCheck2["default"])(this, FetchSpecifiedLocalesEntries); + return _callSuper(this, FetchSpecifiedLocalesEntries, arguments); + } + (0, _inherits2["default"])(FetchSpecifiedLocalesEntries, _FetchEntries3); + return (0, _createClass2["default"])(FetchSpecifiedLocalesEntries, [{ + key: "fetchSyncData", + value: function () { + var _fetchSyncData4 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6(configOptions, cache, fn) { + var _yield$Promise$all7, _yield$Promise$all8, syncEntryData, syncAssetData, syncData; + return _regenerator["default"].wrap(function (_context6) { + while (1) switch (_context6.prev = _context6.next) { + case 0: + _context6.next = 1; + return Promise.all([this.fetchEntries(configOptions, cache, fn), this.fetchAssets(configOptions, cache, fn)]); + case 1: + _yield$Promise$all7 = _context6.sent; + _yield$Promise$all8 = (0, _slicedToArray2["default"])(_yield$Promise$all7, 2); + syncEntryData = _yield$Promise$all8[0]; + syncAssetData = _yield$Promise$all8[1]; + syncData = {}; + syncData.data = syncEntryData.data.concat(syncAssetData.data); + return _context6.abrupt("return", syncData); + case 2: + case "end": + return _context6.stop(); + } + }, _callee6, this); + })); + function fetchSyncData(_x11, _x12, _x13) { + return _fetchSyncData4.apply(this, arguments); + } + return fetchSyncData; + }() + }, { + key: "fetchEntries", + value: function () { + var _fetchEntries2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7(configOptions, cache, fn) { + var syncData, typePrefix, locales, i, locale, tokenKey, syncToken, syncParams, _syncData, _t5; + return _regenerator["default"].wrap(function (_context7) { + while (1) switch (_context7.prev = _context7.next) { + case 0: + _context7.prev = 0; + syncData = {}; + typePrefix = configOptions.type_prefix || 'Contentstack'; + locales = configOptions.locales; + i = 0; + case 1: + if (!(i < locales.length)) { + _context7.next = 5; + break; + } + locale = locales[i]; + tokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-").concat(locale, "-").concat(configOptions.api_key); + _context7.next = 2; + return cache.get(tokenKey); + case 2: + syncToken = _context7.sent; + syncParams = syncToken ? { + sync_token: syncToken + } : { + init: true + }; + syncParams.locale = locale; + _context7.next = 3; + return fn.apply(null, [syncParams, configOptions]); + case 3: + _syncData = _context7.sent; + syncData.data = syncData.data || []; + syncData.data = syncData.data.concat(_syncData.data); + // Caching token for next sync + if (!(_syncData.sync_token !== undefined)) { + _context7.next = 4; + break; + } + _context7.next = 4; + return cache.set(tokenKey, _syncData.sync_token); + case 4: + i++; + _context7.next = 1; + break; + case 5: + return _context7.abrupt("return", syncData); + case 6: + _context7.prev = 6; + _t5 = _context7["catch"](0); + throw _t5; + case 7: + case "end": + return _context7.stop(); + } + }, _callee7, null, [[0, 6]]); + })); + function fetchEntries(_x14, _x15, _x16) { + return _fetchEntries2.apply(this, arguments); + } + return fetchEntries; + }() + }, { + key: "fetchAssets", + value: function () { + var _fetchAssets2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee8(configOptions, cache, fn) { + var fetchAssetService, syncData, _t6; + return _regenerator["default"].wrap(function (_context8) { + while (1) switch (_context8.prev = _context8.next) { + case 0: + _context8.prev = 0; + fetchAssetService = new FetchAssets(); + _context8.next = 1; + return fetchAssetService.fetchAssets(configOptions, cache, fn); + case 1: + syncData = _context8.sent; + return _context8.abrupt("return", syncData); + case 2: + _context8.prev = 2; + _t6 = _context8["catch"](0); + throw _t6; + case 3: + case "end": + return _context8.stop(); + } + }, _callee8, null, [[0, 2]]); + })); + function fetchAssets(_x17, _x18, _x19) { + return _fetchAssets2.apply(this, arguments); + } + return fetchAssets; + }() + }]); +}(FetchEntries); +var FetchSpecifiedLocalesAndContentTypesEntries = /*#__PURE__*/function (_FetchEntries4) { + function FetchSpecifiedLocalesAndContentTypesEntries() { + (0, _classCallCheck2["default"])(this, FetchSpecifiedLocalesAndContentTypesEntries); + return _callSuper(this, FetchSpecifiedLocalesAndContentTypesEntries, arguments); + } + (0, _inherits2["default"])(FetchSpecifiedLocalesAndContentTypesEntries, _FetchEntries4); + return (0, _createClass2["default"])(FetchSpecifiedLocalesAndContentTypesEntries, [{ + key: "fetchSyncData", + value: function () { + var _fetchSyncData5 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9(configOptions, cache, fn) { + var _yield$Promise$all9, _yield$Promise$all0, syncEntryData, syncAssetData, syncData; + return _regenerator["default"].wrap(function (_context9) { + while (1) switch (_context9.prev = _context9.next) { + case 0: + _context9.next = 1; + return Promise.all([this.fetchEntries(configOptions, cache, fn), this.fetchAssets(configOptions, cache, fn)]); + case 1: + _yield$Promise$all9 = _context9.sent; + _yield$Promise$all0 = (0, _slicedToArray2["default"])(_yield$Promise$all9, 2); + syncEntryData = _yield$Promise$all0[0]; + syncAssetData = _yield$Promise$all0[1]; + syncData = {}; + syncData.data = syncEntryData.data.concat(syncAssetData.data); + return _context9.abrupt("return", syncData); + case 2: + case "end": + return _context9.stop(); + } + }, _callee9, this); + })); + function fetchSyncData(_x20, _x21, _x22) { + return _fetchSyncData5.apply(this, arguments); + } + return fetchSyncData; + }() + }, { + key: "fetchEntries", + value: function () { + var _fetchEntries3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee0(configOptions, cache, fn) { + var syncData, typePrefix, contentTypes, locales, i, contentType, j, locale, tokenKey, syncToken, syncParams, _syncData, _t7; + return _regenerator["default"].wrap(function (_context0) { + while (1) switch (_context0.prev = _context0.next) { + case 0: + _context0.prev = 0; + syncData = {}; + typePrefix = configOptions.type_prefix || 'Contentstack'; + _context0.next = 1; + return cache.get(typePrefix); + case 1: + contentTypes = _context0.sent; + locales = configOptions.locales; + i = 0; + case 2: + if (!(i < contentTypes.length)) { + _context0.next = 8; + break; + } + contentType = contentTypes[i].uid; + j = 0; + case 3: + if (!(j < locales.length)) { + _context0.next = 7; + break; + } + locale = locales[j]; + tokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-").concat(contentType, "-").concat(locale, "-").concat(configOptions.api_key); + _context0.next = 4; + return cache.get(tokenKey); + case 4: + syncToken = _context0.sent; + syncParams = syncToken ? { + sync_token: syncToken + } : { + init: true + }; + syncParams.content_type_uid = contentType; + syncParams.locale = locale; + _context0.next = 5; + return fn.apply(null, [syncParams, configOptions]); + case 5: + _syncData = _context0.sent; + syncData.data = syncData.data || []; + syncData.data = syncData.data.concat(_syncData.data); + // Caching token for next sync + if (!(_syncData.sync_token !== undefined)) { + _context0.next = 6; + break; + } + _context0.next = 6; + return cache.set(tokenKey, _syncData.sync_token); + case 6: + j++; + _context0.next = 3; + break; + case 7: + i++; + _context0.next = 2; + break; + case 8: + return _context0.abrupt("return", syncData); + case 9: + _context0.prev = 9; + _t7 = _context0["catch"](0); + throw _t7; + case 10: + case "end": + return _context0.stop(); + } + }, _callee0, null, [[0, 9]]); + })); + function fetchEntries(_x23, _x24, _x25) { + return _fetchEntries3.apply(this, arguments); + } + return fetchEntries; + }() + }, { + key: "fetchAssets", + value: function () { + var _fetchAssets3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee1(configOptions, cache, fn) { + var fetchAssetService, syncData, _t8; + return _regenerator["default"].wrap(function (_context1) { + while (1) switch (_context1.prev = _context1.next) { + case 0: + _context1.prev = 0; + fetchAssetService = new FetchAssets(); + _context1.next = 1; + return fetchAssetService.fetchAssets(configOptions, cache, fn); + case 1: + syncData = _context1.sent; + return _context1.abrupt("return", syncData); + case 2: + _context1.prev = 2; + _t8 = _context1["catch"](0); + throw _t8; + case 3: + case "end": + return _context1.stop(); + } + }, _callee1, null, [[0, 2]]); + })); + function fetchAssets(_x26, _x27, _x28) { + return _fetchAssets3.apply(this, arguments); + } + return fetchAssets; + }() + }]); +}(FetchEntries); +var FetchAssets = /*#__PURE__*/function () { + function FetchAssets() { + (0, _classCallCheck2["default"])(this, FetchAssets); + } + return (0, _createClass2["default"])(FetchAssets, [{ + key: "fetchAssets", + value: function () { + var _fetchAssets4 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10(configOptions, cache, fn) { + var typePrefix, syncData, assetTokenKey, syncAssetToken, syncAssetParams, syncAssetData, _t9; + return _regenerator["default"].wrap(function (_context10) { + while (1) switch (_context10.prev = _context10.next) { + case 0: + typePrefix = configOptions.type_prefix || 'Contentstack'; + _context10.prev = 1; + syncData = {}; + assetTokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-asset-").concat(configOptions.api_key); + _context10.next = 2; + return cache.get(assetTokenKey); + case 2: + syncAssetToken = _context10.sent; + syncAssetParams = syncAssetToken ? { + sync_token: syncAssetToken + } : { + init: true + }; + syncAssetParams.type = 'asset_published,asset_unpublished,asset_deleted'; + _context10.next = 3; + return fn.apply(null, [syncAssetParams, configOptions]); + case 3: + syncAssetData = _context10.sent; + syncData.data = syncAssetData.data; + if (!(syncAssetData.sync_token !== undefined)) { + _context10.next = 4; + break; + } + _context10.next = 4; + return cache.set(assetTokenKey, syncAssetData.sync_token); + case 4: + return _context10.abrupt("return", syncData); + case 5: + _context10.prev = 5; + _t9 = _context10["catch"](1); + throw _t9; + case 6: + case "end": + return _context10.stop(); + } + }, _callee10, null, [[1, 5]]); + })); + function fetchAssets(_x29, _x30, _x31) { + return _fetchAssets4.apply(this, arguments); + } + return fetchAssets; + }() + }]); +}(); +exports.FetchEntries = FetchEntries; +exports.FetchDefaultEntries = FetchDefaultEntries; +exports.FetchSpecifiedContentTypesEntries = FetchSpecifiedContentTypesEntries; +exports.FetchSpecifiedLocalesEntries = FetchSpecifiedLocalesEntries; +exports.FetchSpecifiedLocalesAndContentTypesEntries = FetchSpecifiedLocalesAndContentTypesEntries; +//# sourceMappingURL=entry-data.js.map \ No newline at end of file diff --git a/fetch.js b/fetch.js new file mode 100644 index 0000000..16d719f --- /dev/null +++ b/fetch.js @@ -0,0 +1,512 @@ +'use strict'; + +/* + `node-fetch` have different export depending on CJS or ESM + context - requiring CJS (regular build) will return a function directly, + requiring ESM (what is currently being bundled for rendering engines + which are used by DSG) will return object with `default` field which is + a function. `preferDefault` helper will just use `.default` if available, + but will fallback to entire export if not available +*/ +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); +var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); +var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); +var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); +var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); +function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; } +function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } +function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +var preferDefault = function preferDefault(m) { + return m && m["default"] || m; +}; + +/**NPM dependencies */ +var queryString = require('query-string'); +var fetch = preferDefault(require('node-fetch')); + +// eslint-disable-next-line import/no-unresolved +var _require = require('./package.json'), + version = _require.version; +var _require2 = require('./contenttype-data'), + FetchDefaultContentTypes = _require2.FetchDefaultContentTypes, + FetchSpecifiedContentTypes = _require2.FetchSpecifiedContentTypes, + FetchUnspecifiedContentTypes = _require2.FetchUnspecifiedContentTypes; +var _require3 = require('./entry-data'), + FetchDefaultEntries = _require3.FetchDefaultEntries, + FetchSpecifiedContentTypesEntries = _require3.FetchSpecifiedContentTypesEntries, + FetchSpecifiedLocalesEntries = _require3.FetchSpecifiedLocalesEntries, + FetchSpecifiedLocalesAndContentTypesEntries = _require3.FetchSpecifiedLocalesAndContentTypesEntries; +var _require4 = require('./utils'), + CODES = _require4.CODES, + getCustomHeaders = _require4.getCustomHeaders; +var OPTION_CLASS_MAPPING = { + '': FetchDefaultContentTypes, + contentTypes: FetchSpecifiedContentTypes, + excludeContentTypes: FetchUnspecifiedContentTypes, + locales: FetchDefaultContentTypes, + contentTypeslocales: FetchSpecifiedContentTypes, + excludeContentTypeslocales: FetchUnspecifiedContentTypes +}; +var OPTIONS_ENTRIES_CLASS_MAPPING = { + '': FetchDefaultEntries, + contentTypes: FetchSpecifiedContentTypesEntries, + excludeContentTypes: FetchSpecifiedContentTypesEntries, + locales: FetchSpecifiedLocalesEntries, + contentTypeslocales: FetchSpecifiedLocalesAndContentTypesEntries, + excludeContentTypeslocales: FetchSpecifiedLocalesAndContentTypesEntries +}; +var activity; +var globalConfig; +var syncToken = []; +exports.fetchData = /*#__PURE__*/function () { + var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(configOptions, reporter, cache, contentTypeOption) { + var syncData, entryService, _syncData, contentstackData, _t; + return _regenerator["default"].wrap(function (_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + activity = reporter.activityTimer("Fetching Contentstack data"); + activity.start(); + activity.setStatus('Starting to fetch data from Contentstack'); + _context.prev = 1; + syncData = {}; + entryService = new OPTIONS_ENTRIES_CLASS_MAPPING[contentTypeOption](); + _context.next = 2; + return entryService.fetchSyncData(configOptions, cache, fetchSyncData); + case 2: + _syncData = _context.sent; + syncData.data = _syncData.data; + contentstackData = { + syncData: syncData.data + }; + activity.end(); + return _context.abrupt("return", { + contentstackData: contentstackData + }); + case 3: + _context.prev = 3; + _t = _context["catch"](1); + reporter.panic({ + id: CODES.SyncError, + context: { + sourceMessage: "Fetching contentstack data failed. Please check https://www.contentstack.com/docs/developers/apis/content-delivery-api/ for more help." + }, + error: _t + }); + case 4: + case "end": + return _context.stop(); + } + }, _callee, null, [[1, 3]]); + })); + return function (_x, _x2, _x3, _x4) { + return _ref.apply(this, arguments); + }; +}(); +exports.fetchContentTypes = /*#__PURE__*/function () { + var _ref2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(config, contentTypeOption) { + var url, responseKey, contentType, allContentTypes, _t2; + return _regenerator["default"].wrap(function (_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + globalConfig = config; + _context2.prev = 1; + config.cdn = config.cdn ? config.cdn : 'https://cdn.contentstack.io/v3'; + url = 'content_types'; + responseKey = 'content_types'; + contentType = new OPTION_CLASS_MAPPING[contentTypeOption](); + _context2.next = 2; + return contentType.getPagedData(url, config, responseKey, _getPagedData); + case 2: + allContentTypes = _context2.sent; + return _context2.abrupt("return", allContentTypes); + case 3: + _context2.prev = 3; + _t2 = _context2["catch"](1); + reporter.panic({ + id: CODES.SyncError, + context: { + sourceMessage: "Fetching contentstack data failed. Please check https://www.contentstack.com/docs/developers/apis/content-delivery-api/ for more help." + }, + error: _t2 + }); + case 4: + case "end": + return _context2.stop(); + } + }, _callee2, null, [[1, 3]]); + })); + return function (_x5, _x6) { + return _ref2.apply(this, arguments); + }; +}(); +var fetchSyncData = /*#__PURE__*/function () { + var _ref3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3(query, config) { + var url, response; + return _regenerator["default"].wrap(function (_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + url = 'stacks/sync'; + _context3.next = 1; + return getSyncData(url, config, query, 'items'); + case 1: + response = _context3.sent; + return _context3.abrupt("return", response); + case 2: + case "end": + return _context3.stop(); + } + }, _callee3); + })); + return function fetchSyncData(_x7, _x8) { + return _ref3.apply(this, arguments); + }; +}(); +function waitFor(milliseconds) { + return new Promise(function (resolve) { + return setTimeout(resolve, milliseconds); + }); +} +var getData = /*#__PURE__*/function () { + var _ref4 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5(url, options) { + var retries; + return _regenerator["default"].wrap(function (_context5) { + while (1) switch (_context5.prev = _context5.next) { + case 0: + retries = 0; + return _context5.abrupt("return", new Promise(function (resolve, reject) { + var _handleResponse = function handleResponse() { + fetch(url, options).then(function (response) { + return response.json(); + }).then(function (data) { + if (data.error_code) { + if (data.error_code === 141) { + console.warn("Error ".concat(data.error_code, ": ").concat(data.error_message, ". Details: ").concat(JSON.stringify(data.errors))); + console.info("Retrying... Please wait..."); + } else if (data.error_code >= 500) { + throw new Error("Server error: ".concat(data.error_code)); + } else { + console.error("data"); + } + reject(data); + } else { + resolve(data); + } + })["catch"](/*#__PURE__*/function () { + var _ref5 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4(err) { + var retryAttempt, timeToWait; + return _regenerator["default"].wrap(function (_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + retryAttempt = globalConfig.httpRetries ? globalConfig.httpRetries : 3; + if (!(retries < retryAttempt)) { + _context4.next = 2; + break; + } + retries++; + timeToWait = Math.pow(2, retries) * 100; + _context4.next = 1; + return waitFor(timeToWait); + case 1: + _handleResponse(); + _context4.next = 3; + break; + case 2: + reject(new Error("Fetch failed after ".concat(retryAttempt, " retry attempts."))); + case 3: + case "end": + return _context4.stop(); + } + }, _callee4); + })); + return function (_x1) { + return _ref5.apply(this, arguments); + }; + }()); + }; + retries = 1; + _handleResponse(); + })); + case 1: + case "end": + return _context5.stop(); + } + }, _callee5); + })); + return function getData(_x9, _x0) { + return _ref4.apply(this, arguments); + }; +}(); +var fetchCsData = /*#__PURE__*/function () { + var _ref6 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6(url, config, query) { + var queryParams, apiUrl, option, data; + return _regenerator["default"].wrap(function (_context6) { + while (1) switch (_context6.prev = _context6.next) { + case 0: + query = query || {}; + query.include_count = true; + query.environment = config.environment; + queryParams = queryString.stringify(query); + apiUrl = "".concat(config.cdn, "/").concat(url, "?").concat(queryParams); + option = { + headers: _objectSpread({ + 'X-User-Agent': "contentstack-gatsby-source-plugin-".concat(version), + api_key: config === null || config === void 0 ? void 0 : config.api_key, + access_token: config === null || config === void 0 ? void 0 : config.delivery_token, + branch: config !== null && config !== void 0 && config.branch ? config.branch : 'main' + }, getCustomHeaders(config === null || config === void 0 ? void 0 : config.enableEarlyAccessKey, config === null || config === void 0 ? void 0 : config.enableEarlyAccessValue)) + }; + _context6.next = 1; + return getData(apiUrl, option); + case 1: + data = _context6.sent; + return _context6.abrupt("return", data); + case 2: + case "end": + return _context6.stop(); + } + }, _callee6); + })); + return function fetchCsData(_x10, _x11, _x12) { + return _ref6.apply(this, arguments); + }; +}(); +var _getPagedData = /*#__PURE__*/function () { + var _ref7 = (0, _asyncToGenerator2["default"])(function (url, config, responseKey) { + var query = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + var skip = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 0; + var limit = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : config === null || config === void 0 ? void 0 : config.limit; + var aggregatedResponse = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : null; + return /*#__PURE__*/_regenerator["default"].mark(function _callee7() { + var response; + return _regenerator["default"].wrap(function (_context7) { + while (1) switch (_context7.prev = _context7.next) { + case 0: + query.skip = skip; + //if limit is greater than 100, it will throw ann error that limit cannot exceed 100. + if (limit > 100) { + console.error('Limit cannot exceed 100. Setting limit to 50.'); + } + query.limit = limit > 100 ? 50 : limit; + query.include_global_field_schema = true; + _context7.next = 1; + return fetchCsData(url, config, query); + case 1: + response = _context7.sent; + if (!aggregatedResponse) { + aggregatedResponse = response[responseKey]; + } else { + aggregatedResponse = aggregatedResponse.concat(response[responseKey]); + } + if (!(skip + limit <= response.count)) { + _context7.next = 2; + break; + } + return _context7.abrupt("return", _getPagedData(url, config, responseKey, query = {}, skip + limit, limit, aggregatedResponse)); + case 2: + return _context7.abrupt("return", aggregatedResponse); + case 3: + case "end": + return _context7.stop(); + } + }, _callee7); + })(); + }); + return function getPagedData(_x13, _x14, _x15) { + return _ref7.apply(this, arguments); + }; +}(); +var getSyncData = /*#__PURE__*/function () { + var _ref8 = (0, _asyncToGenerator2["default"])(function (url, config, query, responseKey) { + var aggregatedResponse = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null; + var retries = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; + return /*#__PURE__*/_regenerator["default"].mark(function _callee8() { + var response, syncEvents, _t3; + return _regenerator["default"].wrap(function (_context8) { + while (1) switch (_context8.prev = _context8.next) { + case 0: + _context8.prev = 0; + _context8.next = 1; + return fetchCsData(url, config, query); + case 1: + response = _context8.sent; + syncEvents = ['entry_published', 'asset_published']; // Collect sync tokens from response items + if (response.items.some(function (item) { + return syncEvents.includes(item.type); + }) && response.sync_token) { + syncToken.push(response.sync_token); + } + if (!aggregatedResponse) { + aggregatedResponse = {}; + aggregatedResponse.data = []; + aggregatedResponse.data = response[responseKey]; + aggregatedResponse.sync_token = response.sync_token; + } else { + aggregatedResponse.data = aggregatedResponse.data || []; + aggregatedResponse.data = aggregatedResponse.data.concat(response[responseKey]); + aggregatedResponse.sync_token = response.sync_token ? response.sync_token : aggregatedResponse.sync_token; + } + + // Handle pagination + if (!response.pagination_token) { + _context8.next = 2; + break; + } + _context8.next = 2; + return _handlePagination(url, config, response.pagination_token, responseKey, aggregatedResponse); + case 2: + if (!response.sync_token) { + _context8.next = 4; + break; + } + _context8.next = 3; + return processSyncTokens(url, config, aggregatedResponse, syncToken); + case 3: + aggregatedResponse = _context8.sent; + case 4: + return _context8.abrupt("return", aggregatedResponse); + case 5: + _context8.prev = 5; + _t3 = _context8["catch"](0); + throw new Error("Failed to fetch sync data: ".concat(_t3.message)); + case 6: + case "end": + return _context8.stop(); + } + }, _callee8, null, [[0, 5]]); + })(); + }); + return function getSyncData(_x16, _x17, _x18, _x19) { + return _ref8.apply(this, arguments); + }; +}(); +var processSyncTokens = /*#__PURE__*/function () { + var _ref9 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee9(url, config, aggregatedResponse, syncToken) { + var aggregatedSyncToken, _iterator, _step, token, syncResponse, SyncRetryCount, delay, _aggregatedResponse$d, _t4, _t5; + return _regenerator["default"].wrap(function (_context9) { + while (1) switch (_context9.prev = _context9.next) { + case 0: + // Remove Duplicate/ undefined sync tokens [if any] before iterating. + aggregatedSyncToken = (0, _toConsumableArray2["default"])(new Set(syncToken.filter(function (item) { + return item !== undefined; + }))); // Clear the syncToken array so further processing won’t include already handled tokens. + syncToken.length = 0; + _iterator = _createForOfIteratorHelper(aggregatedSyncToken); + _context9.prev = 1; + _iterator.s(); + case 2: + if ((_step = _iterator.n()).done) { + _context9.next = 12; + break; + } + token = _step.value; + syncResponse = void 0; + SyncRetryCount = 0; // Attempt to fetch data using the token, with retries. + case 3: + if (!(SyncRetryCount <= config.httpRetries)) { + _context9.next = 10; + break; + } + _context9.prev = 4; + _context9.next = 5; + return fetchCsData(url, config, { + sync_token: token + }); + case 5: + syncResponse = _context9.sent; + return _context9.abrupt("continue", 10); + case 6: + _context9.prev = 6; + _t4 = _context9["catch"](4); + SyncRetryCount++; + if (!(SyncRetryCount <= config.httpRetries)) { + _context9.next = 8; + break; + } + delay = Math.min(Math.pow(2, SyncRetryCount) * 1000, 30000); // To prevent excessive long waits we cap the delays at 30s + _context9.next = 7; + return waitFor(delay); + case 7: + _context9.next = 9; + break; + case 8: + throw new Error("Failed after ".concat(config.httpRetries, " retries due to a sync token error.")); + case 9: + _context9.next = 3; + break; + case 10: + if (syncResponse) { + aggregatedResponse.data = (_aggregatedResponse$d = aggregatedResponse.data) === null || _aggregatedResponse$d === void 0 ? void 0 : _aggregatedResponse$d.concat.apply(_aggregatedResponse$d, (0, _toConsumableArray2["default"])(syncResponse.items)); + aggregatedResponse.sync_token = syncResponse.sync_token; + } + case 11: + _context9.next = 2; + break; + case 12: + _context9.next = 14; + break; + case 13: + _context9.prev = 13; + _t5 = _context9["catch"](1); + _iterator.e(_t5); + case 14: + _context9.prev = 14; + _iterator.f(); + return _context9.finish(14); + case 15: + return _context9.abrupt("return", aggregatedResponse); + case 16: + case "end": + return _context9.stop(); + } + }, _callee9, null, [[1, 13, 14, 15], [4, 6]]); + })); + return function processSyncTokens(_x20, _x21, _x22, _x23) { + return _ref9.apply(this, arguments); + }; +}(); +var _handlePagination = /*#__PURE__*/function () { + var _ref0 = (0, _asyncToGenerator2["default"])(function (url, config, paginationToken, responseKey, aggregatedResponse) { + var retries = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 0; + return /*#__PURE__*/_regenerator["default"].mark(function _callee0() { + var retryDelay, _t6; + return _regenerator["default"].wrap(function (_context0) { + while (1) switch (_context0.prev = _context0.next) { + case 0: + _context0.prev = 0; + _context0.next = 1; + return getSyncData(url, config, { + pagination_token: paginationToken + }, responseKey, aggregatedResponse, 0); + case 1: + return _context0.abrupt("return", _context0.sent); + case 2: + _context0.prev = 2; + _t6 = _context0["catch"](0); + if (!(retries < config.httpRetries)) { + _context0.next = 5; + break; + } + retryDelay = Math.min(Math.pow(2, retries) * 1000, 30000); + _context0.next = 3; + return waitFor(retryDelay); + case 3: + _context0.next = 4; + return _handlePagination(url, config, paginationToken, responseKey, aggregatedResponse, retries + 1); + case 4: + return _context0.abrupt("return", _context0.sent); + case 5: + throw new Error("Failed after ".concat(config.httpRetries, " retries due to a pagination token error.")); + case 6: + case "end": + return _context0.stop(); + } + }, _callee0, null, [[0, 2]]); + })(); + }); + return function handlePagination(_x24, _x25, _x26, _x27, _x28) { + return _ref0.apply(this, arguments); + }; +}(); +//# sourceMappingURL=fetch.js.map \ No newline at end of file diff --git a/gatsby-node.js b/gatsby-node.js new file mode 100644 index 0000000..e9a9bf4 --- /dev/null +++ b/gatsby-node.js @@ -0,0 +1,21 @@ +'use strict'; + +var _require = require('./source-node'), + sourceNodes = _require.sourceNodes; +var _require2 = require('./pre-bootstrap'), + onPreBootstrap = _require2.onPreBootstrap; +var _require3 = require('./plugin-options-schema'), + pluginOptionsSchema = _require3.pluginOptionsSchema; +var _require4 = require('./plugin-init'), + onPluginInit = _require4.onPluginInit; +var _require5 = require('./create-schema-customization'), + createSchemaCustomization = _require5.createSchemaCustomization; +var _require6 = require('./create-resolvers'), + createResolvers = _require6.createResolvers; +exports.onPreBootstrap = onPreBootstrap; +exports.createSchemaCustomization = createSchemaCustomization; +exports.sourceNodes = sourceNodes; +exports.createResolvers = createResolvers; +exports.pluginOptionsSchema = pluginOptionsSchema; +exports.onPluginInit = onPluginInit; +//# sourceMappingURL=gatsby-node.js.map \ No newline at end of file diff --git a/gatsby-plugin-image.js b/gatsby-plugin-image.js new file mode 100644 index 0000000..b1ba923 --- /dev/null +++ b/gatsby-plugin-image.js @@ -0,0 +1,205 @@ +'use strict'; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); +var _typeof = require("@babel/runtime/helpers/typeof"); +var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); +var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); +var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); +var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); +function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +var _require = require('gatsby-core-utils'), + fetchRemoteFile = _require.fetchRemoteFile; +var readFile = require('fs').promises.readFile; +var _require2 = require('./image-helper'), + createUrl = _require2.createUrl, + mimeTypeExtensions = _require2.mimeTypeExtensions, + validImageFormats = _require2.validImageFormats, + isImage = _require2.isImage; +var _require3 = require('./utils'), + CODES = _require3.CODES; +var unresolvedBase64Cache = {}; +var resolvedBase64Cache = {}; +var getBase64Image = exports.getBase64Image = function (props, cache, reporter) { + var aspectRatio = props.aspectRatio; + var originalFormat = props.image.content_type.split('/')[1]; + var toFormat = props.options.toFormat; + var imageOptions = _objectSpread(_objectSpread({}, props.options), {}, { + toFormat: toFormat, + width: 20, + height: Math.floor(20 * aspectRatio) + }); + var csImageUrl = createUrl(props.baseUrl, imageOptions); + var resolvedUrl = resolvedBase64Cache[csImageUrl]; + if (resolvedUrl) { + return resolvedUrl; + } + var inflightUrl = unresolvedBase64Cache[csImageUrl]; + if (inflightUrl) { + return inflightUrl; + } + var loadImage = /*#__PURE__*/function () { + var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() { + var content_type, extension, absolutePath, base64; + return _regenerator["default"].wrap(function (_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + content_type = props.image.content_type; + extension = mimeTypeExtensions[content_type]; + _context.next = 1; + return fetchRemoteFile({ + url: csImageUrl, + cache: cache, + ext: extension + }); + case 1: + absolutePath = _context.sent; + _context.next = 2; + return readFile(absolutePath); + case 2: + base64 = _context.sent.toString('base64'); + return _context.abrupt("return", "data:image/".concat(toFormat || originalFormat, ";base64,").concat(base64)); + case 3: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function loadImage() { + return _ref.apply(this, arguments); + }; + }(); + var promise = loadImage(); + unresolvedBase64Cache[csImageUrl] = promise; + return promise.then(function (body) { + delete unresolvedBase64Cache[csImageUrl]; + resolvedBase64Cache[csImageUrl] = body; + })["catch"](function (error) { + reporter.panic({ + id: CODES.ImageAPIError, + context: { + sourceMessage: "Error occurred while fetching image. Please find the image url here: ".concat(props.baseUrl) + }, + error: error + }); + }); +}; +function getBasicImageProps(image, args) { + var aspectRatio; + if (args.width && args.height) { + aspectRatio = args.width / args.height; + } else { + aspectRatio = image.dimension.width / image.dimension.height; + } + return { + baseUrl: image.url, + contentType: image.content_type, + aspectRatio: aspectRatio, + width: image.dimension.width, + height: image.dimension.height + }; +} + +// Generate image source data for gatsby-plugin-image +function generateImageSource(filename, width, height, toFormat, _fit, imageTransformOptions) { + var quality = imageTransformOptions.quality, + crop = imageTransformOptions.crop, + backgroundColor = imageTransformOptions.backgroundColor, + fit = imageTransformOptions.fit, + trim = imageTransformOptions.trim, + pad = imageTransformOptions.pad; + if (!validImageFormats.includes(toFormat)) { + console.warn("[gatsby-source-contentstack] Invalid image format \"".concat(toFormat, "\". Supported types are ").concat(validImageFormats.join(', '))); + return; + } + var src = createUrl(filename, { + width: width, + height: height, + toFormat: toFormat, + fit: fit, + background: backgroundColor === null || backgroundColor === void 0 ? void 0 : backgroundColor.replace('#', 'rgb:'), + quality: quality, + crop: crop, + trim: trim, + pad: pad + }); + return { + width: width, + height: height, + format: toFormat, + src: src + }; +} +exports.resolveGatsbyImageData = /*#__PURE__*/function () { + var _ref2 = (0, _asyncToGenerator2["default"])(function (_ref3) { + var image = _ref3.image, + options = _ref3.options, + cache = _ref3.cache, + reporter = _ref3.reporter; + return /*#__PURE__*/_regenerator["default"].mark(function _callee2() { + var _yield$import, generateImageData, _getBasicImageProps, baseUrl, contentType, width, height, _contentType$split, _contentType$split2, format, imageProps, placeholderDataURI; + return _regenerator["default"].wrap(function (_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + if (isImage(image)) { + _context2.next = 1; + break; + } + return _context2.abrupt("return", null); + case 1: + _context2.next = 2; + return Promise.resolve().then(function () { + return _interopRequireWildcard(require('gatsby-plugin-image')); + }); + case 2: + _yield$import = _context2.sent; + generateImageData = _yield$import.generateImageData; + _getBasicImageProps = getBasicImageProps(image, options), baseUrl = _getBasicImageProps.baseUrl, contentType = _getBasicImageProps.contentType, width = _getBasicImageProps.width, height = _getBasicImageProps.height; + _contentType$split = contentType.split('/'), _contentType$split2 = (0, _slicedToArray2["default"])(_contentType$split, 2), format = _contentType$split2[1]; + if (format === 'jpeg') { + format = 'jpg'; + } + imageProps = generateImageData(_objectSpread(_objectSpread({}, options), {}, { + pluginName: 'gatsby-source-contentstack', + sourceMetadata: { + width: width, + height: height, + format: format + }, + filename: baseUrl, + generateImageSource: generateImageSource, + options: options + })); + placeholderDataURI = null; + if (!(options.placeholder === 'blurred')) { + _context2.next = 4; + break; + } + _context2.next = 3; + return getBase64Image({ + baseUrl: baseUrl, + image: image, + options: options + }, cache, reporter); + case 3: + placeholderDataURI = _context2.sent; + case 4: + if (placeholderDataURI) { + imageProps.placeholder = { + fallback: placeholderDataURI + }; + } + return _context2.abrupt("return", imageProps); + case 5: + case "end": + return _context2.stop(); + } + }, _callee2); + })(); + }); + return function (_x) { + return _ref2.apply(this, arguments); + }; +}(); +//# sourceMappingURL=gatsby-plugin-image.js.map \ No newline at end of file diff --git a/image-helper.js b/image-helper.js new file mode 100644 index 0000000..35ad778 --- /dev/null +++ b/image-helper.js @@ -0,0 +1,48 @@ +'use strict'; + +var _require = require('url'), + URLSearchParams = _require.URLSearchParams; + +// Determine the proper file extension based on mime type +var mimeTypeExtensions = { + 'image/jpeg': '.jpg', + 'image/jpg': '.jpg', + 'image/gif': '.gif', + 'image/png': '.png', + 'image/webp': '.webp' +}; + +// Supported image formats by contentstack image API +var validImageFormats = ['jpg', 'png', 'webp', 'gif']; +var isImage = function isImage(image) { + return !!mimeTypeExtensions[image === null || image === void 0 ? void 0 : image.content_type]; +}; + +// Creates a Contentstack image url +var createUrl = function createUrl(imgUrl) { + var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var queryParams = { + width: options.width, + height: options.height, + format: options.toFormat, + quality: options.quality, + crop: options.crop, + fit: options.fit, + trim: options.trim, + pad: options.pad, + 'bg-color': options.background + }; + var searchParams = new URLSearchParams(); + for (var key in queryParams) { + if (typeof queryParams[key] !== 'undefined') { + var _queryParams$key; + searchParams.append(key, (_queryParams$key = queryParams[key]) !== null && _queryParams$key !== void 0 ? _queryParams$key : ''); + } + } + return "".concat(imgUrl, "?").concat(searchParams.toString()); +}; +exports.mimeTypeExtensions = mimeTypeExtensions; +exports.validImageFormats = validImageFormats; +exports.isImage = isImage; +exports.createUrl = createUrl; +//# sourceMappingURL=image-helper.js.map \ No newline at end of file diff --git a/live-preview/index.js b/live-preview/index.js index 7697332..eb8460b 100644 --- a/live-preview/index.js +++ b/live-preview/index.js @@ -85,12 +85,12 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { key: "fetchContentTypes", value: function () { var _fetchContentTypes = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(uids) { - var result, contentTypes; - return _regenerator["default"].wrap(function _callee$(_context) { + var result, contentTypes, _t; + return _regenerator["default"].wrap(function (_context) { while (1) switch (_context.prev = _context.next) { case 0: _context.prev = 0; - _context.next = 3; + _context.next = 1; return this.stackSdk.getContentTypes({ query: { uid: { @@ -99,10 +99,10 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { }, include_global_field_schema: true }); - case 3: + case 1: result = _context.sent; if (!result) { - _context.next = 8; + _context.next = 2; break; } contentTypes = {}; @@ -110,19 +110,19 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { contentTypes[ct.uid] = ct; }); return _context.abrupt("return", contentTypes); - case 8: - _context.next = 14; + case 2: + _context.next = 4; break; - case 10: - _context.prev = 10; - _context.t0 = _context["catch"](0); + case 3: + _context.prev = 3; + _t = _context["catch"](0); console.error("Contentstack Gatsby (Live Preview): failed to fetch content types"); - throw _context.t0; - case 14: + throw _t; + case 4: case "end": return _context.stop(); } - }, _callee, this, [[0, 10]]); + }, _callee, this, [[0, 3]]); })); function fetchContentTypes(_x) { return _fetchContentTypes.apply(this, arguments); @@ -135,7 +135,7 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { var _getContentTypes = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(uids) { var _this = this; var uidsToFetch, types; - return _regenerator["default"].wrap(function _callee2$(_context2) { + return _regenerator["default"].wrap(function (_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: // fetch and filter only content types that are not available in cache @@ -143,14 +143,14 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { return !_this.contentTypes[uid]; }); if (uidsToFetch.length) { - _context2.next = 3; + _context2.next = 1; break; } return _context2.abrupt("return", this.contentTypes); - case 3: - _context2.next = 5; + case 1: + _context2.next = 2; return this.fetchContentTypes(uidsToFetch); - case 5: + case 2: types = _context2.sent; uidsToFetch.forEach(function (uid) { // TODO need to set it in two places, can be better @@ -158,7 +158,7 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { _this.contentTypesStorage.set(uid, types[uid]); }); return _context2.abrupt("return", this.contentTypes); - case 8: + case 3: case "end": return _context2.stop(); } @@ -181,19 +181,19 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { var seen = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : []; return /*#__PURE__*/_regenerator["default"].mark(function _callee3() { var uids, contentTypes, refPathsCount, explorePaths, _iterator, _step, _step$value, refPath, refUids, _iterator2, _step2, uid, rPath; - return _regenerator["default"].wrap(function _callee3$(_context3) { + return _regenerator["default"].wrap(function (_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: if (!(depth <= 0)) { - _context3.next = 2; + _context3.next = 1; break; } return _context3.abrupt("return", refPathMap); - case 2: + case 1: uids = (0, _toConsumableArray2["default"])(new Set(Object.values(refPathMap).flat())); - _context3.next = 5; + _context3.next = 2; return _this2.getContentTypes(uids); - case 5: + case 2: contentTypes = _context3.sent; refPathsCount = Object.keys(refPathMap).length; explorePaths = Object.entries(refPathMap).filter(function (_ref) { @@ -232,17 +232,17 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { _iterator.f(); } if (!(Object.keys(refPathMap).length > refPathsCount)) { - _context3.next = 13; + _context3.next = 3; break; } - _context3.next = 13; + _context3.next = 3; return _this2.extractReferences(refPathMap, status, jsonRtePaths, depth - 1, seen); - case 13: + case 3: return _context3.abrupt("return", { refPathMap: refPathMap, jsonRtePaths: jsonRtePaths }); - case 14: + case 4: case "end": return _context3.stop(); } @@ -392,15 +392,15 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { var jsonRtePaths = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : []; return /*#__PURE__*/_regenerator["default"].mark(function _callee4() { var entry; - return _regenerator["default"].wrap(function _callee4$(_context4) { + return _regenerator["default"].wrap(function (_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: - _context4.next = 2; + _context4.next = 1; return _this4.stackSdk.ContentType(contentTypeUid).Entry(entryUid).includeReference(referencePaths).toJSON().fetch(); - case 2: + case 1: entry = _context4.sent; if ((0, _lodash["default"])(entry)) { - _context4.next = 6; + _context4.next = 2; break; } if (_this4.config.jsonRteToHtml) { @@ -410,7 +410,7 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { }); } return _context4.abrupt("return", entry); - case 6: + case 2: case "end": return _context4.stop(); } @@ -447,8 +447,8 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { value: function () { var _getUsingTypeName = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee5(data) { var _this$statusStorage$g, _this$jsonRteFields$c; - var receivedData, live_preview, status, contentTypeUid, entryUid, _yield$this$extractRe, refPathMap, jsonRtePaths, referencePaths, paths, entry; - return _regenerator["default"].wrap(function _callee5$(_context5) { + var receivedData, live_preview, status, contentTypeUid, entryUid, _yield$this$extractRe, refPathMap, jsonRtePaths, referencePaths, paths, entry, _t2; + return _regenerator["default"].wrap(function (_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: receivedData = (0, _lodash2["default"])(data); @@ -463,15 +463,15 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { hasLivePreviewEntryFound: this.isCurrentEntryEdited(contentTypeUid) }; if (!((0, _lodash["default"])(this.referenceFields[contentTypeUid]) || (0, _lodash["default"])(this.jsonRteFields[contentTypeUid]))) { - _context5.next = 25; + _context5.next = 4; break; } - _context5.prev = 8; - _context5.next = 11; + _context5.prev = 1; + _context5.next = 2; return this.extractReferences({ '': [contentTypeUid] }, status); - case 11: + case 2: _yield$this$extractRe = _context5.sent; refPathMap = _yield$this$extractRe.refPathMap; jsonRtePaths = _yield$this$extractRe.jsonRtePaths; @@ -481,15 +481,15 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { // store json rte paths this.jsonRteFields[contentTypeUid] = jsonRtePaths; this.jsonRteFieldsStorage.set(contentTypeUid, this.jsonRteFields[contentTypeUid]); - _context5.next = 25; + _context5.next = 4; break; - case 20: - _context5.prev = 20; - _context5.t0 = _context5["catch"](8); - console.error("Contentstack Gatsby (Live Preview): an error occurred while determining reference paths", _context5.t0); + case 3: + _context5.prev = 3; + _t2 = _context5["catch"](1); + console.error("Contentstack Gatsby (Live Preview): an error occurred while determining reference paths", _t2); console.log("Contentstack Gatsby (Live Preview): unable to determine reference paths. This may have occurred due to the way the content types refer each other. Please try including the cslp__meta field in your query."); return _context5.abrupt("return", receivedData); - case 25: + case 4: referencePaths = Object.keys(this.referenceFields[contentTypeUid]); referencePaths = referencePaths.filter(function (field) { return !!field; @@ -497,21 +497,21 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { paths = this.identifyReferences(receivedData, [], referencePaths); this.statusStorage.set(contentTypeUid, status); if (status.hasLivePreviewEntryFound) { - _context5.next = 31; + _context5.next = 5; break; } return _context5.abrupt("return", receivedData); - case 31: - _context5.next = 33; + case 5: + _context5.next = 6; return this.fetchEntry(entryUid, contentTypeUid, paths, (_this$jsonRteFields$c = this.jsonRteFields[contentTypeUid]) !== null && _this$jsonRteFields$c !== void 0 ? _this$jsonRteFields$c : []); - case 33: + case 6: entry = _context5.sent; return _context5.abrupt("return", entry); - case 35: + case 7: case "end": return _context5.stop(); } - }, _callee5, this, [[8, 20]]); + }, _callee5, this, [[1, 3]]); })); function getUsingTypeName(_x5) { return _getUsingTypeName.apply(this, arguments); @@ -524,31 +524,31 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { var _get = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6(data) { var _this$stackSdk$live_p, _this5 = this; - var dataCloned, hasTypeNameAndUid, hasCslpMetaAtRoot, multipleEntriesKey, hasSingleEntry, hasMultipleEntries, receivedData, live_preview, hasCslpMeta, hasMultipleCslpMeta, multipleLPEntries, result, _entryCslpMeta$refere, _entryCslpMeta$jsonRt, entryCslpMeta, contentTypeUid, entryUid, refPaths, rtePaths, entry; - return _regenerator["default"].wrap(function _callee6$(_context6) { + var dataCloned, hasTypeNameAndUid, hasCslpMetaAtRoot, multipleEntriesKey, hasSingleEntry, hasMultipleEntries, receivedData, live_preview, hasCslpMeta, hasMultipleCslpMeta, multipleLPEntries, result, _entryCslpMeta$refere, _entryCslpMeta$jsonRt, entryCslpMeta, contentTypeUid, entryUid, refPaths, rtePaths, entry, _t3; + return _regenerator["default"].wrap(function (_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: if (!(this.stackSdk.live_preview && !((_this$stackSdk$live_p = this.stackSdk.live_preview) !== null && _this$stackSdk$live_p !== void 0 && _this$stackSdk$live_p.enable))) { - _context6.next = 3; + _context6.next = 1; break; } console.warn("Contentstack Gatsby (Live Preview): live preview is disabled in config"); return _context6.abrupt("return", data); - case 3: + case 1: if (!(data === null)) { - _context6.next = 6; + _context6.next = 2; break; } console.warn("Contentstack Gatsby (Live Preview): null was passed to get()"); return _context6.abrupt("return", data); - case 6: + case 2: if (this.isNested(data)) { - _context6.next = 9; + _context6.next = 3; break; } console.warn("Contentstack Gatsby (Live Preview): data passed to get() is invalid"); return _context6.abrupt("return", data); - case 9: + case 3: dataCloned = (0, _lodash2["default"])(data); delete dataCloned["$"]; @@ -561,7 +561,7 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { receivedData = hasSingleEntry || hasMultipleEntries ? this.unwrapEntryData(dataCloned) : dataCloned; live_preview = this.stackSdk.live_preview; if (!(live_preview !== null && live_preview !== void 0 && live_preview.hash && live_preview.hash !== 'init')) { - _context6.next = 59; + _context6.next = 13; break; } this.livePreviewConfig = live_preview; @@ -570,76 +570,73 @@ var ContentstackGatsby = exports.ContentstackGatsby = /*#__PURE__*/function () { return item === null || item.cslp__meta; }); if (!(!hasCslpMeta && !hasMultipleCslpMeta && !hasTypeNameAndUid)) { - _context6.next = 24; + _context6.next = 4; break; } throw new Error("Contentstack Gatsby (Live Preview): Entry data must contain cslp__meta for live preview"); - case 24: + case 4: if (!hasMultipleCslpMeta) { - _context6.next = 40; + _context6.next = 8; break; } - _context6.prev = 25; - _context6.next = 28; + _context6.prev = 5; + _context6.next = 6; return Promise.all(receivedData.map(function (item) { if (item === null) { return Promise.resolve(null); } return _this5.fetchEntry(item.cslp__meta.entryUid, item.cslp__meta.contentTypeUid, item.cslp__meta.refPaths, item.cslp__meta.rtePaths); })); - case 28: + case 6: multipleLPEntries = _context6.sent; result = {}; multipleEntriesKey.forEach(function (key, index) { result[key] = multipleLPEntries[index]; }); return _context6.abrupt("return", result); - case 34: - _context6.prev = 34; - _context6.t0 = _context6["catch"](25); - console.error("Contentstack Gatsby (Live Preview):", _context6.t0); + case 7: + _context6.prev = 7; + _t3 = _context6["catch"](5); + console.error("Contentstack Gatsby (Live Preview):", _t3); return _context6.abrupt("return", dataCloned); - case 38: - _context6.next = 59; - break; - case 40: + case 8: if (!hasCslpMeta) { - _context6.next = 55; + _context6.next = 11; break; } entryCslpMeta = receivedData.cslp__meta; contentTypeUid = entryCslpMeta.contentTypeUid; entryUid = entryCslpMeta.entryUid; if (!(!entryUid || !contentTypeUid)) { - _context6.next = 47; + _context6.next = 9; break; } console.warn("Contentstack Gatsby (Live Preview): no entry uid or content type uid was found inside cslp__meta"); return _context6.abrupt("return", dataCloned); - case 47: + case 9: refPaths = (_entryCslpMeta$refere = entryCslpMeta.referencePaths) !== null && _entryCslpMeta$refere !== void 0 ? _entryCslpMeta$refere : []; rtePaths = (_entryCslpMeta$jsonRt = entryCslpMeta.jsonRtePaths) !== null && _entryCslpMeta$jsonRt !== void 0 ? _entryCslpMeta$jsonRt : []; - _context6.next = 51; + _context6.next = 10; return this.fetchEntry(entryUid, contentTypeUid, refPaths, rtePaths); - case 51: + case 10: entry = _context6.sent; return _context6.abrupt("return", entry); - case 55: + case 11: if (!hasTypeNameAndUid) { - _context6.next = 59; + _context6.next = 13; break; } - _context6.next = 58; + _context6.next = 12; return this.getUsingTypeName(dataCloned); - case 58: + case 12: return _context6.abrupt("return", _context6.sent); - case 59: + case 13: return _context6.abrupt("return", dataCloned); - case 60: + case 14: case "end": return _context6.stop(); } - }, _callee6, this, [[25, 34]]); + }, _callee6, this, [[5, 7]]); })); function get(_x6) { return _get.apply(this, arguments); diff --git a/node-helper.js b/node-helper.js new file mode 100644 index 0000000..1519e55 --- /dev/null +++ b/node-helper.js @@ -0,0 +1,76 @@ +'use strict'; + +/* + `node-fetch` have different export depending on CJS or ESM + context - requiring CJS (regular build) will return a function directly, + requiring ESM (what is currently being bundled for rendering engines + which are used by DSG) will return object with `default` field which is + a function. `preferDefault` helper will just use `.default` if available, + but will fallback to entire export if not available +*/ +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); +var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); +var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); +var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +var preferDefault = function preferDefault(m) { + return m && m["default"] || m; +}; +var fetch = preferDefault(require('node-fetch')); +var _require = require('./utils'), + getCustomHeaders = _require.getCustomHeaders; +var deleteContentstackNodes = function deleteContentstackNodes(item, type, createNodeId, getNode, deleteNode, typePrefix) { + var nodeId = ''; + var node = null; + if (type === 'entry') { + nodeId = createNodeId("".concat(typePrefix.toLowerCase(), "-entry-").concat(item.uid, "-").concat(item.locale)); + } + if (type === 'asset') { + nodeId = createNodeId("".concat(typePrefix.toLowerCase(), "-assets-").concat(item.uid, "-").concat(item.locale)); + } + node = getNode(nodeId); + if (node) { + deleteNode(node); + } +}; +var validateContentstackAccess = /*#__PURE__*/function () { + var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(pluginOptions) { + var host; + return _regenerator["default"].wrap(function (_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + if (!(process.env.NODE_ENV === "test")) { + _context.next = 1; + break; + } + return _context.abrupt("return", undefined); + case 1: + host = pluginOptions.cdn ? pluginOptions.cdn : 'https://cdn.contentstack.io/v3'; + _context.next = 2; + return fetch("".concat(host, "/content_types?include_count=false"), { + headers: _objectSpread({ + api_key: "".concat(pluginOptions.api_key), + access_token: "".concat(pluginOptions.delivery_token), + branch: pluginOptions === null || pluginOptions === void 0 ? void 0 : pluginOptions.branch + }, getCustomHeaders(pluginOptions === null || pluginOptions === void 0 ? void 0 : pluginOptions.enableEarlyAccessKey, pluginOptions === null || pluginOptions === void 0 ? void 0 : pluginOptions.enableEarlyAccessValue)) + }).then(function (res) { + return res.ok; + }).then(function (ok) { + if (!ok) throw new Error("Cannot access Contentstack with api_key=".concat(pluginOptions.api_key, " & delivery_token=").concat(pluginOptions.delivery_token, ".")); + }); + case 2: + return _context.abrupt("return", undefined); + case 3: + case "end": + return _context.stop(); + } + }, _callee); + })); + return function validateContentstackAccess(_x) { + return _ref.apply(this, arguments); + }; +}(); +exports.deleteContentstackNodes = deleteContentstackNodes; +exports.validateContentstackAccess = validateContentstackAccess; +//# sourceMappingURL=node-helper.js.map \ No newline at end of file diff --git a/normalize.js b/normalize.js new file mode 100644 index 0000000..c04e4e9 --- /dev/null +++ b/normalize.js @@ -0,0 +1,520 @@ +'use strict'; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); +var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); +var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); +var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); +function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } +function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } +var _require = require('./utils'), + getJSONToHtmlRequired = _require.getJSONToHtmlRequired; +exports.processContentType = function (contentType, createNodeId, createContentDigest, typePrefix) { + var nodeId = createNodeId("".concat(typePrefix.toLowerCase(), "-contentType-").concat(contentType.uid)); + var type = "".concat(typePrefix, "ContentTypes"); + var nodeContent = JSON.stringify(contentType); + var nodeData = _objectSpread(_objectSpread({}, contentType), {}, { + id: nodeId, + parent: null, + children: [], + internal: { + type: type, + content: nodeContent, + contentDigest: createContentDigest(nodeContent) + } + }); + return nodeData; +}; +exports.processAsset = function (asset, createNodeId, createContentDigest, typePrefix) { + var nodeId = makeAssetNodeUid(asset, createNodeId, typePrefix); + var nodeContent = JSON.stringify(asset); + var nodeData = _objectSpread(_objectSpread({}, asset), {}, { + id: nodeId, + parent: null, + children: [], + internal: { + type: "".concat(typePrefix, "_assets"), + content: nodeContent, + contentDigest: createContentDigest(nodeContent) + } + }); + return nodeData; +}; +exports.processEntry = function (contentType, entry, createNodeId, createContentDigest, typePrefix) { + var nodeId = makeEntryNodeUid(entry, createNodeId, typePrefix); + var nodeContent = JSON.stringify(entry); + var nodeData = _objectSpread(_objectSpread({}, entry), {}, { + id: nodeId, + parent: null, + children: [], + internal: { + type: "".concat(typePrefix, "_").concat(contentType.uid), + content: nodeContent, + contentDigest: createContentDigest(nodeContent) + } + }); + return nodeData; +}; +exports.normalizeEntry = function (contentType, entry, entriesNodeIds, assetsNodeIds, createNodeId, typePrefix, configOptions) { + var _entry$publish_detail; + var resolveEntry = _objectSpread(_objectSpread({}, entry), builtEntry(contentType.schema, entry, entry === null || entry === void 0 || (_entry$publish_detail = entry.publish_details) === null || _entry$publish_detail === void 0 ? void 0 : _entry$publish_detail.locale, entriesNodeIds, assetsNodeIds, createNodeId, typePrefix, configOptions)); + return resolveEntry; +}; +var makeAssetNodeUid = exports.makeAssetNodeUid = function (asset, createNodeId, typePrefix) { + var _asset$publish_detail; + var publishedLocale = asset === null || asset === void 0 || (_asset$publish_detail = asset.publish_details) === null || _asset$publish_detail === void 0 ? void 0 : _asset$publish_detail.locale; + return createNodeId("".concat(typePrefix.toLowerCase(), "-assets-").concat(asset.uid, "-").concat(publishedLocale)); +}; +var makeEntryNodeUid = exports.makeEntryNodeUid = function (entry, createNodeId, typePrefix) { + var _entry$publish_detail2; + var publishedLocale = entry === null || entry === void 0 || (_entry$publish_detail2 = entry.publish_details) === null || _entry$publish_detail2 === void 0 ? void 0 : _entry$publish_detail2.locale; + return createNodeId("".concat(typePrefix.toLowerCase(), "-entry-").concat(entry.uid, "-").concat(publishedLocale)); +}; +var normalizeGroup = function normalizeGroup(field, value, locale, entriesNodeIds, assetsNodeIds, createNodeId, typePrefix, configOptions) { + var groupObj = null; + if (field.multiple) { + groupObj = []; + if (value instanceof Array) { + value.forEach(function (groupValue) { + groupObj.push(builtEntry(field.schema, groupValue, locale, entriesNodeIds, assetsNodeIds, createNodeId, typePrefix, configOptions)); + }); + } else { + // In some cases value is null, this makes graphql treat all the objects as null + // So need to pass a valid array instance. + // This also helps to handle when a user changes a group to multiple after initially + // setting a group to single.. the server passes an object and the previous condition + // again makes groupObj null + groupObj.push(builtEntry(field.schema, value, locale, entriesNodeIds, assetsNodeIds, createNodeId, typePrefix, configOptions)); + } + } else { + groupObj = {}; + groupObj = builtEntry(field.schema, value, locale, entriesNodeIds, assetsNodeIds, createNodeId, typePrefix, configOptions); + } + return groupObj; +}; +var normalizeModularBlock = function normalizeModularBlock(blocks, value, locale, entriesNodeIds, assetsNodeIds, createNodeId, typePrefix, configOptions) { + var modularBlocksObj = []; + if (value) { + value.map(function (block) { + Object.keys(block).forEach(function (key) { + var blockSchema = blocks.filter(function (block) { + return block.uid === key; + }); + if (!blockSchema.length) { + // block value no longer exists block schema so ignore it + return; + } + var blockObj = {}; + blockObj[key] = builtEntry(blockSchema[0].schema, block[key], locale, entriesNodeIds, assetsNodeIds, createNodeId, typePrefix, configOptions); + modularBlocksObj.push(blockObj); + }); + }); + } + return modularBlocksObj; +}; +var normalizeReferenceField = function normalizeReferenceField(value, locale, entriesNodeIds, createNodeId, typePrefix) { + var reference = []; + if (value && !Array.isArray(value)) return; + value.forEach(function (entry) { + if ((0, _typeof2["default"])(entry) === 'object' && entry.uid) { + if (entriesNodeIds.has(createNodeId("".concat(typePrefix.toLowerCase(), "-entry-").concat(entry.uid, "-").concat(locale)))) { + reference.push(createNodeId("".concat(typePrefix.toLowerCase(), "-entry-").concat(entry.uid, "-").concat(locale))); + } + } else if (entriesNodeIds.has(createNodeId("".concat(typePrefix.toLowerCase(), "-entry-").concat(entry, "-").concat(locale)))) { + reference.push(createNodeId("".concat(typePrefix.toLowerCase(), "-entry-").concat(entry, "-").concat(locale))); + } + }); + return reference; +}; +var normalizeFileField = function normalizeFileField(value, locale, assetsNodeIds, createNodeId, typePrefix) { + var reference = {}; + if (Array.isArray(value)) { + reference = []; + value.forEach(function (assetUid) { + var nodeId = createNodeId("".concat(typePrefix.toLowerCase(), "-assets-").concat(assetUid, "-").concat(locale)); + if (assetsNodeIds.has(nodeId)) { + reference.push(nodeId); + } + }); + } else if (assetsNodeIds.has(createNodeId("".concat(typePrefix.toLowerCase(), "-assets-").concat(value, "-").concat(locale)))) { + reference = createNodeId("".concat(typePrefix.toLowerCase(), "-assets-").concat(value, "-").concat(locale)); + } else { + // when the asset is not published + reference = null; + } + return reference; +}; +var getSchemaValue = function getSchemaValue(obj, key) { + if (obj === null) return null; + if ((0, _typeof2["default"])(obj) !== 'object') return null; + return Object.prototype.hasOwnProperty.call(obj, key.uid) ? obj[key.uid] : null; +}; +var builtEntry = function builtEntry(schema, entry, locale, entriesNodeIds, assetsNodeIds, createNodeId, typePrefix, configOptions) { + var entryObj = {}; + schema.forEach(function (field) { + var value = getSchemaValue(entry, field); + switch (field.data_type) { + case 'reference': + entryObj["".concat(field.uid, "___NODE")] = value && normalizeReferenceField(value, locale, entriesNodeIds, createNodeId, typePrefix); + break; + case 'file': + if (!value) value = null; + entryObj["".concat(field.uid, "___NODE")] = value && normalizeFileField(value, locale, assetsNodeIds, createNodeId, typePrefix); + break; + case 'group': + case 'global_field': + entryObj[field.uid] = normalizeGroup(field, value, locale, entriesNodeIds, assetsNodeIds, createNodeId, typePrefix, configOptions); + break; + case 'blocks': + entryObj[field.uid] = normalizeModularBlock(field.blocks, value, locale, entriesNodeIds, assetsNodeIds, createNodeId, typePrefix, configOptions); + break; + case 'json': + entryObj[field.uid] = value; + break; + default: + entryObj[field.uid] = value; + } + }); + return entryObj; +}; +var buildBlockCustomSchema = function buildBlockCustomSchema(blocks, types, references, groups, fileFields, jsonRteFields, parent, prefix, disableMandatoryFields, jsonRteToHtml, createNodeId, interfaceParent) { + if (interfaceParent) interfaceParent = interfaceParent.replace(/-/g, "_"); + var blockType = interfaceParent ? "type ".concat(parent, " implements ").concat(interfaceParent, " @infer {") : "type ".concat(parent, " @infer {"); + var blockInterface = interfaceParent && "interface ".concat(interfaceParent, " {"); + var blockFields = {}; // Initialize blockFields here + blocks.forEach(function (block) { + var newparent = parent.concat(block.uid); + // If this block has a reference_to, it is a global field and should have a new interface + var newInterfaceParent = block.reference_to ? "".concat(prefix, "_").concat(block.reference_to.replace(/-/g, "_")) : interfaceParent && interfaceParent.concat(block.uid); + blockType = blockType.concat("".concat(block.uid, " : ").concat(newparent, " ")); + blockInterface = blockInterface && blockInterface.concat("".concat(block.uid, " : ").concat(newInterfaceParent, " ")); + var _buildCustomSchema = buildCustomSchema(block.schema, types, references, groups, fileFields, jsonRteFields, newparent, prefix, disableMandatoryFields, jsonRteToHtml, createNodeId, newInterfaceParent), + fields = _buildCustomSchema.fields; + var typeFields = {}; + var interfaceFields = {}; + for (var key in fields) { + typeFields[key] = fields[key].type || fields[key]; + interfaceFields[key] = typeFields[key].replace(newparent, newInterfaceParent); + } + if (Object.keys(fields).length > 0) { + if (newInterfaceParent) { + var interfaceType = "interface ".concat(newInterfaceParent, " ").concat(JSON.stringify(interfaceFields).replace(/"/g, '')); + var type = "type ".concat(newparent, " implements ").concat(newInterfaceParent, " @infer ").concat(JSON.stringify(typeFields).replace(/"/g, '')); + types.push(interfaceType, type); + } else { + var _type = "type ".concat(newparent, " @infer ").concat(JSON.stringify(typeFields).replace(/"/g, '')); + types.push(_type); + } + blockFields[block.uid] = "".concat(newparent); + } + }); + blockType = blockType.concat('}'); + blockInterface = blockInterface && blockInterface.concat('}'); + return blockInterface ? [blockInterface, blockType] : [blockType]; +}; +exports.extendSchemaWithDefaultEntryFields = function (schema) { + schema.push({ + data_type: 'text', + uid: 'uid', + multiple: false, + mandatory: false + }); + schema.push({ + data_type: 'text', + uid: 'locale', + multiple: false, + mandatory: false + }); + schema.push({ + data_type: 'group', + uid: 'publish_details', + schema: [{ + data_type: 'text', + uid: 'locale', + multiple: false, + mandatory: false + }], + multiple: false, + mandatory: false + }); + schema.push({ + data_type: 'isodate', + uid: 'updated_at', + multiple: false, + mandatory: false + }); + schema.push({ + data_type: 'string', + uid: 'updated_by', + multiple: false, + mandatory: false + }); + schema.push({ + data_type: 'isodate', + uid: 'created_at', + multiple: false, + mandatory: false + }); + schema.push({ + data_type: 'string', + uid: 'created_by', + multiple: false, + mandatory: false + }); + return schema; +}; +var buildCustomSchema = exports.buildCustomSchema = function (schema, types, references, groups, fileFields, jsonRteFields, parent, prefix, disableMandatoryFields, jsonRteToHtml, createNodeId, interfaceParent) { + var fields = {}; + groups = groups || []; + references = references || []; + fileFields = fileFields || []; + types = types || []; + jsonRteFields = jsonRteFields || []; + schema.forEach(function (field) { + var _types; + switch (field.data_type) { + case 'text': + fields[field.uid] = { + resolve: function resolve(source) { + return source[field.uid] || null; + } + }; + if (field.mandatory && !disableMandatoryFields) { + if (field.multiple) { + fields[field.uid].type = '[String]!'; + } else { + fields[field.uid].type = 'String!'; + } + } else if (field.multiple) { + fields[field.uid].type = '[String]'; + } else { + fields[field.uid].type = 'String'; + } + break; + case 'isodate': + if (field.mandatory && !disableMandatoryFields) { + if (field.multiple) { + fields[field.uid] = { + type: '[Date]!' + }; + } else { + fields[field.uid] = { + type: 'Date!' + }; + } + } else if (field.multiple) { + fields[field.uid] = { + type: '[Date]' + }; + } else { + fields[field.uid] = { + type: 'Date' + }; + } + fields[field.uid].extensions = { + dateformat: {} + }; + break; + case 'boolean': + if (field.mandatory && !disableMandatoryFields) { + if (field.multiple) { + fields[field.uid] = '[Boolean]!'; + } else { + fields[field.uid] = 'Boolean!'; + } + } else if (field.multiple) { + fields[field.uid] = '[Boolean]'; + } else { + fields[field.uid] = 'Boolean'; + } + break; + case 'number': + fields[field.uid] = { + resolve: function resolve(source) { + return source[field.uid] || null; + } + }; + if (field.mandatory && !disableMandatoryFields) { + if (field.multiple) { + fields[field.uid].type = '[Float]!'; + } else { + fields[field.uid].type = 'Float!'; + } + } else if (field.multiple) { + fields[field.uid].type = '[Float]'; + } else { + fields[field.uid].type = 'Float'; + } + break; + // This is to support custom field types nested inside groups, global_fields & modular_blocks + case 'json': + if (getJSONToHtmlRequired(jsonRteToHtml, field)) { + jsonRteFields.push({ + parent: parent, + field: field + }); + if (field.mandatory && !disableMandatoryFields) { + if (field.multiple) { + fields[field.uid] = '[String]!'; + } else { + fields[field.uid] = 'String!'; + } + } else if (field.multiple) { + fields[field.uid] = '[String]'; + } else { + fields[field.uid] = 'String'; + } + } else { + fields[field.uid] = { + resolve: function resolve(source) { + return source[field.uid] || null; + } + }; + if (field.mandatory && !disableMandatoryFields) { + if (field.multiple) { + fields[field.uid].type = '[JSON]!'; + } else { + fields[field.uid].type = 'JSON!'; + } + } else if (field.multiple) { + fields[field.uid].type = '[JSON]'; + } else { + fields[field.uid].type = 'JSON'; + } + } + break; + case 'link': + if (field.mandatory && !disableMandatoryFields) { + if (field.multiple) { + fields[field.uid] = '[linktype]!'; + } else { + fields[field.uid] = 'linktype!'; + } + } else if (field.multiple) { + fields[field.uid] = '[linktype]'; + } else { + fields[field.uid] = 'linktype'; + } + break; + case 'file': + fileFields.push({ + parent: parent, + field: field + }); + if (field.mandatory && !disableMandatoryFields) { + if (field.multiple) { + fields[field.uid] = "[".concat(prefix, "_assets]!"); + } else { + fields[field.uid] = "".concat(prefix, "_assets!"); + } + } else if (field.multiple) { + fields[field.uid] = "[".concat(prefix, "_assets]"); + } else { + fields[field.uid] = "".concat(prefix, "_assets"); + } + break; + case 'group': + case 'global_field': + var newParent = parent.concat('_', field.uid); + // If this is a global field, generate a new top-level interface for it + var newInterfaceParent = field.data_type === 'global_field' ? "".concat(prefix, "_").concat(field.reference_to) : interfaceParent && interfaceParent.concat('_', field.uid); + var result = buildCustomSchema(field.schema, types, references, groups, fileFields, jsonRteFields, newParent, prefix, disableMandatoryFields, jsonRteToHtml, createNodeId, newInterfaceParent); + var typeFields = {}; + var interfaceFields = {}; + for (var key in result.fields) { + typeFields[key] = result.fields[key].type || result.fields[key]; + interfaceFields[key] = typeFields[key].replace(newParent, newInterfaceParent); + } + if (Object.keys(typeFields).length > 0) { + if (newInterfaceParent) { + var interfaceType = "interface ".concat(newInterfaceParent, " ").concat(JSON.stringify(interfaceFields).replace(/"/g, '')); + var type = "type ".concat(newParent, " implements ").concat(newInterfaceParent, " @infer ").concat(JSON.stringify(typeFields).replace(/"/g, '')); + types.push(interfaceType, type); + } else { + var _type2 = "type ".concat(newParent, " @infer ").concat(JSON.stringify(typeFields).replace(/"/g, '')); + types.push(_type2); + } + groups.push({ + parent: parent, + field: field + }); + if (field.mandatory && !disableMandatoryFields) { + if (field.multiple) { + fields[field.uid] = "[".concat(newParent, "]!"); + } else { + fields[field.uid] = "".concat(newParent, "!"); + } + } else if (field.multiple) { + fields[field.uid] = "[".concat(newParent, "]"); + } else { + fields[field.uid] = "".concat(newParent); + } + } + break; + case 'blocks': + var blockParent = parent.concat('_', field.uid); + var blockInterfaceParent = interfaceParent && interfaceParent.concat('_', field.uid); + var blockTypes = buildBlockCustomSchema(field.blocks, types, references, groups, fileFields, jsonRteFields, blockParent, prefix, disableMandatoryFields, jsonRteToHtml, createNodeId, blockInterfaceParent); + (_types = types).push.apply(_types, (0, _toConsumableArray2["default"])(blockTypes)); + if (field.mandatory && !disableMandatoryFields) { + if (field.multiple) { + fields[field.uid] = "[".concat(blockParent, "]!"); + } else { + fields[field.uid] = "".concat(blockParent, "!"); + } + } else if (field.multiple) { + fields[field.uid] = "[".concat(blockParent, "]"); + } else { + fields[field.uid] = "".concat(blockParent); + } + break; + case 'reference': + var unionType = 'union '; + if (typeof field.reference_to === 'string' || field.reference_to.length === 1) { + field.reference_to = Array.isArray(field.reference_to) ? field.reference_to[0] : field.reference_to; + var _type3 = "type ".concat(prefix, "_").concat(field.reference_to, " implements Node @infer { title: String").concat(disableMandatoryFields ? '' : '!', " }"); + types.push(_type3); + references.push({ + parent: parent, + uid: field.uid + }); + if (field.mandatory && !disableMandatoryFields) { + fields[field.uid] = "[".concat(prefix, "_").concat(field.reference_to, "]!"); + } else { + fields[field.uid] = "[".concat(prefix, "_").concat(field.reference_to, "]"); + } + } else { + var unions = []; + field.reference_to.forEach(function (reference) { + var referenceType = "".concat(prefix, "_").concat(reference); + unionType = unionType.concat(referenceType); + unions.push(referenceType); + var type = "type ".concat(referenceType, " implements Node @infer { title: String").concat(disableMandatoryFields ? '' : '!', " }"); + types.push(type); + }); + var name = ''; + name = name.concat(unions.join(''), '_Union'); + unionType = unionType.concat('_Union = ', unions.join(' | ')); + types.push(unionType); + references.push({ + parent: parent, + uid: field.uid + }); + if (field.mandatory && !disableMandatoryFields) { + fields[field.uid] = "[".concat(name, "]!"); + } else { + fields[field.uid] = "[".concat(name, "]"); + } + } + break; + } + }); + return { + fields: fields, + types: types, + references: references, + groups: groups, + fileFields: fileFields, + jsonRteFields: jsonRteFields + }; +}; +//# sourceMappingURL=normalize.js.map \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 69fdba5..48b772a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "gatsby-source-contentstack", - "version": "5.4.1", + "version": "5.4.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "gatsby-source-contentstack", - "version": "5.4.1", + "version": "5.4.2", "license": "MIT", "dependencies": { "@contentstack/utils": "^1.1.3", @@ -54,39 +54,43 @@ } }, "node_modules/@actions/core": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-2.0.1.tgz", - "integrity": "sha512-oBfqT3GwkvLlo1fjvhQLQxuwZCGTarTE5OuZ2Wg10hvhBj7LRIlF611WT4aZS6fDhO5ZKlY7lCAZTlpmyaHaeg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-3.0.0.tgz", + "integrity": "sha512-zYt6cz+ivnTmiT/ksRVriMBOiuoUpDCJJlZ5KPl2/FRdvwU3f7MPh9qftvbkXJThragzUZieit2nyHUyw53Seg==", "dev": true, + "license": "MIT", "dependencies": { - "@actions/exec": "^2.0.0", - "@actions/http-client": "^3.0.0" + "@actions/exec": "^3.0.0", + "@actions/http-client": "^4.0.0" } }, "node_modules/@actions/exec": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-2.0.0.tgz", - "integrity": "sha512-k8ngrX2voJ/RIN6r9xB82NVqKpnMRtxDoiO+g3olkIUpQNqjArXrCQceduQZCQj3P3xm32pChRLqRrtXTlqhIw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-3.0.0.tgz", + "integrity": "sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==", "dev": true, + "license": "MIT", "dependencies": { - "@actions/io": "^2.0.0" + "@actions/io": "^3.0.2" } }, "node_modules/@actions/http-client": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-3.0.0.tgz", - "integrity": "sha512-1s3tXAfVMSz9a4ZEBkXXRQD4QhY3+GAsWSbaYpeknPOKEeyRiU3lH+bHiLMZdo2x/fIeQ/hscL1wCkDLVM2DZQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-4.0.0.tgz", + "integrity": "sha512-QuwPsgVMsD6qaPD57GLZi9sqzAZCtiJT8kVBCDpLtxhL5MydQ4gS+DrejtZZPdIYyB1e95uCK9Luyds7ybHI3g==", "dev": true, + "license": "MIT", "dependencies": { "tunnel": "^0.0.6", - "undici": "^5.28.5" + "undici": "^6.23.0" } }, "node_modules/@actions/io": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@actions/io/-/io-2.0.0.tgz", - "integrity": "sha512-Jv33IN09XLO+0HS79aaODsvIRyduiF7NY/F6LYeK5oeUmrsz7aFdRphQjFoESF4jS7lMauDOttKALcpapVDIAg==", - "dev": true + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-3.0.2.tgz", + "integrity": "sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==", + "dev": true, + "license": "MIT" }, "node_modules/@ardatan/relay-compiler": { "version": "12.0.0", @@ -287,10 +291,11 @@ } }, "node_modules/@babel/cli": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.28.3.tgz", - "integrity": "sha512-n1RU5vuCX0CsaqaXm9I0KUCNKNQMy5epmzl/xdSSm70bSqhg9GWhgeosypyQLc0bK24+Xpk1WGzZlI9pJtkZdg==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.28.6.tgz", + "integrity": "sha512-6EUNcuBbNkj08Oj4gAZ+BUU8yLCgKzgVX4gaTh09Ya2C8ICM4P+G30g4m3akRxSYAp3A/gnWchrNst7px4/nUQ==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.28", "commander": "^6.2.0", @@ -366,9 +371,10 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.5.tgz", - "integrity": "sha512-fcdRcWahONYo+JRnJg1/AekOacGvKx12Gu0qXJXFi2WBqQA1i7+O5PaxRB7kxE/Op94dExnCiiar6T09pvdHpA==", + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.6.tgz", + "integrity": "sha512-QGmsKi2PBO/MHSQk+AAgA9R6OHQr+VqnniFE0eMWZcVcfBZoA2dKn2hUsl3Csg/Plt9opRUWdY7//VXsrIlEiA==", + "license": "MIT", "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -2519,9 +2525,10 @@ "integrity": "sha512-FU1hFks9vnJ5e9cwBTPgnf3obx/fuKh+c3Gtc71mq1Mrub3/z4rJZJWLJ2kublVKnXWnhz+Yt66rshxO/TT9IQ==" }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", - "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", + "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -2629,15 +2636,6 @@ "integrity": "sha512-HHQigo3rQWKMDzYDLkubN5WQOYXJJE2eNqIQC2axC2iO3mHdwnIR7FgZVvHWtBwAdzBgAP0ECp8KqS8TiMKvgw==", "peer": true }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "dev": true, - "engines": { - "node": ">=14" - } - }, "node_modules/@gatsbyjs/parcel-namer-relative-to-cwd": { "version": "2.15.0", "resolved": "https://registry.npmjs.org/@gatsbyjs/parcel-namer-relative-to-cwd/-/parcel-namer-relative-to-cwd-2.15.0.tgz", @@ -5732,12 +5730,13 @@ } }, "node_modules/@semantic-release/npm": { - "version": "13.1.3", - "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-13.1.3.tgz", - "integrity": "sha512-q7zreY8n9V0FIP1Cbu63D+lXtRAVAIWb30MH5U3TdrfXt6r2MIrWCY0whAImN53qNvSGp0Zt07U95K+Qp9GpEg==", + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/@semantic-release/npm/-/npm-13.1.4.tgz", + "integrity": "sha512-z5Fn9ftK1QQgFxMSuOd3DtYbTl4hWI2trCEvZcEJMQJy1/OBR0WHcxqzfVun455FSkHML8KgvPxJEa9MtZIBsg==", "dev": true, + "license": "MIT", "dependencies": { - "@actions/core": "^2.0.0", + "@actions/core": "^3.0.0", "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", "env-ci": "^11.2.0", @@ -7240,9 +7239,10 @@ } }, "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -7717,13 +7717,14 @@ } }, "node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "version": "1.13.5", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", + "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "license": "MIT", "peer": true, "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", "proxy-from-env": "^1.1.0" } }, @@ -8045,17 +8046,18 @@ } }, "node_modules/babel-plugin-remove-graphql-queries": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-5.15.0.tgz", - "integrity": "sha512-zr+0PCFQ2JHnVm1wPYyopawpIskdabV9V0C2uiF2NcTUN520pmmbHVpgjwJ9sKjgF48UyeKUKXfFy8aDnc/fkA==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/babel-plugin-remove-graphql-queries/-/babel-plugin-remove-graphql-queries-5.16.0.tgz", + "integrity": "sha512-dYh/VoEU5pwmM0N1TbKwdBAqMqW5lYwJsttqYYVuVaZgSE/zikak4KUC3S/qCqCbh6D8/LTeM9YhZgQKU2c8tg==", + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.13", "@babel/types": "^7.20.7", - "gatsby-core-utils": "^4.15.0" + "gatsby-core-utils": "^4.16.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" }, "peerDependencies": { "@babel/core": "^7.0.0", @@ -8063,9 +8065,10 @@ } }, "node_modules/babel-plugin-remove-graphql-queries/node_modules/gatsby-core-utils": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.15.0.tgz", - "integrity": "sha512-fxzHbCvQm1u74DSjy7G4PVqEcWb7sOCFg3kFFVUqVKe3hDCm6s1M/gRSvpm3/3fm74HhgLsmQ54Qaf54Ckyn9w==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.16.0.tgz", + "integrity": "sha512-QCZ9BmQp3YyYxH0Wf4bofayL3vJnayqSvsBUAhKXGh/Os0fn1KMNyAjPLnW+zrGFQaK05Vjdlp99I/Wnc3M33A==", + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.13", @@ -8086,7 +8089,7 @@ "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" } }, "node_modules/babel-plugin-syntax-trailing-function-commas": { @@ -9875,9 +9878,10 @@ } }, "node_modules/create-gatsby": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/create-gatsby/-/create-gatsby-3.15.0.tgz", - "integrity": "sha512-EjScC6GRDvL/mgbURFxv7gCkJmNqU1q+pptKx2ry11JbSzx1vvFIFXpiID3JxuM3fCzPcqh2GnCPUk+PU7lvLg==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/create-gatsby/-/create-gatsby-3.16.0.tgz", + "integrity": "sha512-F2gzKq1Pl3wFzHOIZdA2XEiynt0sPxnq0ccwzbz4YFZxGf5vLG16ijTvnmZjJzm/LSSP+szedX5cA0c6a+mnjg==", + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.13" @@ -12432,9 +12436,10 @@ "peer": true }, "node_modules/express/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", + "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "license": "BSD-3-Clause", "peer": true, "dependencies": { "side-channel": "^1.1.0" @@ -12553,6 +12558,7 @@ "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "peer": true, "engines": { "node": ">= 4.9.1" } @@ -13437,10 +13443,11 @@ } }, "node_modules/gatsby-cli": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-5.15.0.tgz", - "integrity": "sha512-wTUAc2rNr39s7PDO1EaFOBbFmgfuEJ4hdJfh0b/0zd5FMHep+8Z7Kp6/B9KWhHOhHFkFasL7jgZozin4y3QGdg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/gatsby-cli/-/gatsby-cli-5.16.0.tgz", + "integrity": "sha512-O+2ouCR0Yex04AllxPMIWxlwcj2GiGsvK8sC6AfVL092j0rQJAfwEEBhgVNhFrniPnEanaADRKbgjj2k6vPaBw==", "hasInstallScript": true, + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "^7.18.6", @@ -13459,12 +13466,12 @@ "clipboardy": "^4.0.0", "common-tags": "^1.8.2", "convert-hrtime": "^3.0.0", - "create-gatsby": "^3.15.0", + "create-gatsby": "^3.16.0", "envinfo": "^7.10.0", "execa": "^5.1.1", "fs-exists-cached": "^1.0.0", "fs-extra": "^11.2.0", - "gatsby-core-utils": "^4.15.0", + "gatsby-core-utils": "^4.16.0", "hosted-git-info": "^3.0.8", "is-valid-path": "^0.1.1", "joi": "^17.9.2", @@ -13488,7 +13495,7 @@ "gatsby": "cli.js" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" } }, "node_modules/gatsby-cli/node_modules/ansi-styles": { @@ -13556,9 +13563,10 @@ } }, "node_modules/gatsby-cli/node_modules/gatsby-core-utils": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.15.0.tgz", - "integrity": "sha512-fxzHbCvQm1u74DSjy7G4PVqEcWb7sOCFg3kFFVUqVKe3hDCm6s1M/gRSvpm3/3fm74HhgLsmQ54Qaf54Ckyn9w==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.16.0.tgz", + "integrity": "sha512-QCZ9BmQp3YyYxH0Wf4bofayL3vJnayqSvsBUAhKXGh/Os0fn1KMNyAjPLnW+zrGFQaK05Vjdlp99I/Wnc3M33A==", + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.13", @@ -13579,7 +13587,7 @@ "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" } }, "node_modules/gatsby-cli/node_modules/locate-path": { @@ -13768,47 +13776,50 @@ } }, "node_modules/gatsby-link": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-5.15.0.tgz", - "integrity": "sha512-YUUWc8p2/6wZpSPES+8qPyWGomX9RRUU1omsLSRpRw+XZ6WxeTJ56SLp0XLU1zvtdpb74FGpdAOj8uvDffEtIw==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/gatsby-link/-/gatsby-link-5.16.0.tgz", + "integrity": "sha512-1drjKlnH9Si54npVsAnT46uW7fM7xT1ISgxzMZenhoSfAZYE0ZVqu9BbOJnj784YYLVo9t7YLzQrzP8VMHBFqQ==", + "license": "MIT", "peer": true, "dependencies": { "@types/reach__router": "^1.3.10", - "gatsby-page-utils": "^3.15.0", + "gatsby-page-utils": "^3.16.0", "prop-types": "^15.8.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" }, "peerDependencies": { "@gatsbyjs/reach-router": "^2.0.0", - "react": "^18.0.0 || ^0.0.0", - "react-dom": "^18.0.0 || ^0.0.0" + "react": "^18.0.0 || ^19.0.0 || ^0.0.0", + "react-dom": "^18.0.0 || ^19.0.0 || ^0.0.0" } }, "node_modules/gatsby-page-utils": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-3.15.0.tgz", - "integrity": "sha512-RXxFajO9f74Aw5cir1d6llzLQ1wePn7IWSG5xig+5pfPprIiKX76qFNUHwOf5Y3RFi/Qb0PWaVlRIyYh5uPQGw==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/gatsby-page-utils/-/gatsby-page-utils-3.16.0.tgz", + "integrity": "sha512-dZvHyhb9XvqeRlU0dzeeGHhgKVjMfStzWsPCQzSIf3A98U2LbBvAClJZhdFhLoNcYtLTo5hq8518G2+DlNVe6w==", + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.13", "bluebird": "^3.7.2", "chokidar": "^3.6.0", "fs-exists-cached": "^1.0.0", - "gatsby-core-utils": "^4.15.0", + "gatsby-core-utils": "^4.16.0", "glob": "^7.2.3", "lodash": "^4.17.21", "micromatch": "^4.0.5" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" } }, "node_modules/gatsby-page-utils/node_modules/gatsby-core-utils": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.15.0.tgz", - "integrity": "sha512-fxzHbCvQm1u74DSjy7G4PVqEcWb7sOCFg3kFFVUqVKe3hDCm6s1M/gRSvpm3/3fm74HhgLsmQ54Qaf54Ckyn9w==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.16.0.tgz", + "integrity": "sha512-QCZ9BmQp3YyYxH0Wf4bofayL3vJnayqSvsBUAhKXGh/Os0fn1KMNyAjPLnW+zrGFQaK05Vjdlp99I/Wnc3M33A==", + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.13", @@ -13829,7 +13840,7 @@ "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" } }, "node_modules/gatsby-parcel-config": { @@ -13859,9 +13870,10 @@ } }, "node_modules/gatsby-plugin-image": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-image/-/gatsby-plugin-image-3.15.0.tgz", - "integrity": "sha512-GlcBjJgRqBfTKG7iYRzqpdlar/MeKqNKRZBlvNhqu6fit68njRotCcoH+SnQizSgt+NoSYfjVY6mOjyD2LO8Dg==", + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-image/-/gatsby-plugin-image-3.16.0.tgz", + "integrity": "sha512-1RCXMce7iHr7XwilgffkOPXdcdRbb6AyRCRRW4xUJLBQnwcDpthiznNh/iBy1ZAa5ssDCh6K71KTB7dkuarojw==", + "license": "MIT", "peer": true, "dependencies": { "@babel/code-frame": "^7.18.6", @@ -13869,13 +13881,13 @@ "@babel/runtime": "^7.20.13", "@babel/traverse": "^7.20.13", "babel-jsx-utils": "^1.1.0", - "babel-plugin-remove-graphql-queries": "^5.15.0", + "babel-plugin-remove-graphql-queries": "^5.16.0", "camelcase": "^6.3.0", "chokidar": "^3.6.0", "common-tags": "^1.8.2", "fs-extra": "^11.2.0", - "gatsby-core-utils": "^4.15.0", - "gatsby-plugin-utils": "^4.15.0", + "gatsby-core-utils": "^4.16.0", + "gatsby-plugin-utils": "^4.16.0", "objectFitPolyfill": "^2.3.5", "prop-types": "^15.8.1" }, @@ -13884,8 +13896,8 @@ "gatsby": "^5.0.0-next", "gatsby-plugin-sharp": "^5.0.0-next", "gatsby-source-filesystem": "^5.0.0-next", - "react": "^18.0.0 || ^0.0.0", - "react-dom": "^18.0.0 || ^0.0.0" + "react": "^18.0.0 || ^19.0.0 || ^0.0.0", + "react-dom": "^18.0.0 || ^19.0.0 || ^0.0.0" }, "peerDependenciesMeta": { "gatsby-plugin-sharp": { @@ -13897,9 +13909,10 @@ } }, "node_modules/gatsby-plugin-image/node_modules/gatsby-core-utils": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.15.0.tgz", - "integrity": "sha512-fxzHbCvQm1u74DSjy7G4PVqEcWb7sOCFg3kFFVUqVKe3hDCm6s1M/gRSvpm3/3fm74HhgLsmQ54Qaf54Ckyn9w==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.16.0.tgz", + "integrity": "sha512-QCZ9BmQp3YyYxH0Wf4bofayL3vJnayqSvsBUAhKXGh/Os0fn1KMNyAjPLnW+zrGFQaK05Vjdlp99I/Wnc3M33A==", + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.13", @@ -13920,13 +13933,14 @@ "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" } }, "node_modules/gatsby-plugin-page-creator": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-5.15.0.tgz", - "integrity": "sha512-OYT37V2vif83c9TbnNoQrxzKqfSiXoRUWleXrxs3q5lydxCBrGc5DIQgJLJSJRs4OYEBFniYVIAdM+i5jD2Ybw==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-page-creator/-/gatsby-plugin-page-creator-5.16.0.tgz", + "integrity": "sha512-SkKb7X/8A+C1bhhw/tEDPSTr8AcsTc526OisIu8fHlxLKUQ2jY7ppsvY2PimwtSCdX6euNdDafWWlfpy5XSSFA==", + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.13", @@ -13935,23 +13949,24 @@ "chokidar": "^3.6.0", "fs-exists-cached": "^1.0.0", "fs-extra": "^11.2.0", - "gatsby-core-utils": "^4.15.0", - "gatsby-page-utils": "^3.15.0", - "gatsby-plugin-utils": "^4.15.0", + "gatsby-core-utils": "^4.16.0", + "gatsby-page-utils": "^3.16.0", + "gatsby-plugin-utils": "^4.16.0", "globby": "^11.1.0", "lodash": "^4.17.21" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" }, "peerDependencies": { "gatsby": "^5.0.0-next" } }, "node_modules/gatsby-plugin-page-creator/node_modules/gatsby-core-utils": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.15.0.tgz", - "integrity": "sha512-fxzHbCvQm1u74DSjy7G4PVqEcWb7sOCFg3kFFVUqVKe3hDCm6s1M/gRSvpm3/3fm74HhgLsmQ54Qaf54Ckyn9w==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.16.0.tgz", + "integrity": "sha512-QCZ9BmQp3YyYxH0Wf4bofayL3vJnayqSvsBUAhKXGh/Os0fn1KMNyAjPLnW+zrGFQaK05Vjdlp99I/Wnc3M33A==", + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.13", @@ -13972,13 +13987,14 @@ "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" } }, "node_modules/gatsby-plugin-typescript": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-5.15.0.tgz", - "integrity": "sha512-UFNZ1/CBzfVwd4nCGKwhYo4BE++OF6F1rplprlmvQEjFFfuZIvNxf1TiGCjKM6U7J55rG3F3jKeSLMGEkTBjfg==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-typescript/-/gatsby-plugin-typescript-5.16.0.tgz", + "integrity": "sha512-+eE2mfmNU+AxnSCBIFU1oJIETMpfvAsBywFDPwtwDLlNl7GyQnvv0kz2OvR+jG8kjlUwBrR+71LJCg8Ydc5CSw==", + "license": "MIT", "peer": true, "dependencies": { "@babel/core": "^7.20.12", @@ -13987,33 +14003,34 @@ "@babel/plugin-proposal-optional-chaining": "^7.20.7", "@babel/preset-typescript": "^7.18.6", "@babel/runtime": "^7.20.13", - "babel-plugin-remove-graphql-queries": "^5.15.0" + "babel-plugin-remove-graphql-queries": "^5.16.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" }, "peerDependencies": { "gatsby": "^5.0.0-next" } }, "node_modules/gatsby-plugin-utils": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/gatsby-plugin-utils/-/gatsby-plugin-utils-4.15.0.tgz", - "integrity": "sha512-6syfcye5eVYHXAU48G83mU2uXohxM3fO0BSGYYvGYlnM7FSV5HvwfFuksh3QEd0MKpE9gcQMVPvxa0pq2/PWdg==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/gatsby-plugin-utils/-/gatsby-plugin-utils-4.16.0.tgz", + "integrity": "sha512-5a2ui0XQBNP8vln/UyfaGBYrVpZ0oeK3fY6LjL2zx9H6wVcO5HLdjmU9yDUwQJygi2GtYW7VGQVKHfBGXMHI6A==", + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.13", "fastq": "^1.16.0", "fs-extra": "^11.2.0", - "gatsby-core-utils": "^4.15.0", - "gatsby-sharp": "^1.15.0", + "gatsby-core-utils": "^4.16.0", + "gatsby-sharp": "^1.16.0", "graphql-compose": "^9.0.10", "import-from": "^4.0.0", "joi": "^17.11.0", "mime": "^3.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" }, "peerDependencies": { "gatsby": "^5.0.0-next", @@ -14021,9 +14038,10 @@ } }, "node_modules/gatsby-plugin-utils/node_modules/gatsby-core-utils": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.15.0.tgz", - "integrity": "sha512-fxzHbCvQm1u74DSjy7G4PVqEcWb7sOCFg3kFFVUqVKe3hDCm6s1M/gRSvpm3/3fm74HhgLsmQ54Qaf54Ckyn9w==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.16.0.tgz", + "integrity": "sha512-QCZ9BmQp3YyYxH0Wf4bofayL3vJnayqSvsBUAhKXGh/Os0fn1KMNyAjPLnW+zrGFQaK05Vjdlp99I/Wnc3M33A==", + "license": "MIT", "peer": true, "dependencies": { "@babel/runtime": "^7.20.13", @@ -14044,7 +14062,7 @@ "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" } }, "node_modules/gatsby-react-router-scroll": { @@ -14080,43 +14098,46 @@ } }, "node_modules/gatsby-sharp": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/gatsby-sharp/-/gatsby-sharp-1.15.0.tgz", - "integrity": "sha512-nl+dSQwXPmhkE0qcLVvkLdE8scQALYopuk25RkLCDfi1VTNz0g6wcZwkmbcNjlTCR4RkbvCt7MGgNC7CVH3Ddw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/gatsby-sharp/-/gatsby-sharp-1.16.0.tgz", + "integrity": "sha512-Xh2MwKtr9UYQnhlv5xpLXADRG6j/9dPgTLf010jNKQmvPsETkwZ3TZwnOpIgbGYJjg50rYzSCQ9RAuYXlqLmMA==", + "license": "MIT", "peer": true, "dependencies": { "sharp": "^0.32.6" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" } }, "node_modules/gatsby-source-filesystem": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-5.15.0.tgz", - "integrity": "sha512-i8pJdgGEVo+M9F1BCChKg3kzxpMTsK/wddtNvUPZj47yJGNJlW3Cax6Qr8mTu8/Rm5kno4+uM8eLKjwdB0ajMQ==", + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/gatsby-source-filesystem/-/gatsby-source-filesystem-5.16.0.tgz", + "integrity": "sha512-z64lyDaonLpD1fHV8s9MYVBz2z6Mv3jwEntwt/KA4QKPJsH/qD1eKZ0OBSilGqEadzLw7EcgTGkTXBAz1gd8fg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", "chokidar": "^3.6.0", "file-type": "^16.5.4", "fs-extra": "^11.2.0", - "gatsby-core-utils": "^4.15.0", + "gatsby-core-utils": "^4.16.0", "mime": "^3.0.0", "pretty-bytes": "^5.6.0", "valid-url": "^1.0.9", "xstate": "^4.38.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" }, "peerDependencies": { "gatsby": "^5.0.0-next" } }, "node_modules/gatsby-source-filesystem/node_modules/gatsby-core-utils": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.15.0.tgz", - "integrity": "sha512-fxzHbCvQm1u74DSjy7G4PVqEcWb7sOCFg3kFFVUqVKe3hDCm6s1M/gRSvpm3/3fm74HhgLsmQ54Qaf54Ckyn9w==", + "version": "4.16.0", + "resolved": "https://registry.npmjs.org/gatsby-core-utils/-/gatsby-core-utils-4.16.0.tgz", + "integrity": "sha512-QCZ9BmQp3YyYxH0Wf4bofayL3vJnayqSvsBUAhKXGh/Os0fn1KMNyAjPLnW+zrGFQaK05Vjdlp99I/Wnc3M33A==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.13", "ci-info": "2.0.0", @@ -14136,7 +14157,7 @@ "xdg-basedir": "^4.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=18.0.0 <26" } }, "node_modules/gatsby-worker": { @@ -15106,6 +15127,7 @@ "version": "3.0.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz", "integrity": "sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw==", + "peer": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -15117,6 +15139,7 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -15127,7 +15150,8 @@ "node_modules/hosted-git-info/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "peer": true }, "node_modules/html-entities": { "version": "2.6.0", @@ -18044,15 +18068,17 @@ "integrity": "sha512-NZQIJJL5Rb9lMJ0Yl1JoVr9GSdo4HTPsUEWsSFzB8dE8DSoiLCVavWZPi7Rnlv/o73u6I24S/XYc/NmG4l8EKA==" }, "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT" }, "node_modules/lodash-es": { - "version": "4.17.22", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.22.tgz", - "integrity": "sha512-XEawp1t0gxSi9x01glktRZ5HDy0HXqrM0x5pXQM98EaI0NxO6jVM7omDOxsuEo5UIASAnm2bRp1Jt/e0a2XU8Q==", - "dev": true + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "dev": true, + "license": "MIT" }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -18805,7 +18831,8 @@ "node_modules/mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "peer": true }, "node_modules/mz": { "version": "2.7.0", @@ -19058,9 +19085,9 @@ } }, "node_modules/npm": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/npm/-/npm-11.7.0.tgz", - "integrity": "sha512-wiCZpv/41bIobCoJ31NStIWKfAxxYyD1iYnWCtiyns8s5v3+l8y0HCP/sScuH6B5+GhIfda4HQKiqeGZwJWhFw==", + "version": "11.10.0", + "resolved": "https://registry.npmjs.org/npm/-/npm-11.10.0.tgz", + "integrity": "sha512-i8hE43iSIAMFuYVi8TxsEISdELM4fIza600aLjJ0ankGPLqd0oTPKMJqAcO/QWm307MbSlWGzJcNZ0lGMQgHPA==", "bundleDependencies": [ "@isaacs/string-locale-compare", "@npmcli/arborist", @@ -19130,10 +19157,18 @@ "which" ], "dev": true, + "license": "Artistic-2.0", + "workspaces": [ + "docs", + "smoke-tests", + "mock-globals", + "mock-registry", + "workspaces/*" + ], "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", - "@npmcli/arborist": "^9.1.9", - "@npmcli/config": "^10.4.5", + "@npmcli/arborist": "^9.3.0", + "@npmcli/config": "^10.7.0", "@npmcli/fs": "^5.0.0", "@npmcli/map-workspaces": "^5.0.3", "@npmcli/metavuln-calculator": "^9.0.3", @@ -19141,28 +19176,28 @@ "@npmcli/promise-spawn": "^9.0.1", "@npmcli/redact": "^4.0.0", "@npmcli/run-script": "^10.0.3", - "@sigstore/tuf": "^4.0.0", + "@sigstore/tuf": "^4.0.1", "abbrev": "^4.0.0", "archy": "~1.0.0", "cacache": "^20.0.3", "chalk": "^5.6.2", - "ci-info": "^4.3.1", + "ci-info": "^4.4.0", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", - "glob": "^13.0.0", + "glob": "^13.0.2", "graceful-fs": "^4.2.11", "hosted-git-info": "^9.0.2", "ini": "^6.0.0", "init-package-json": "^8.2.4", - "is-cidr": "^6.0.1", + "is-cidr": "^6.0.3", "json-parse-even-better-errors": "^5.0.0", "libnpmaccess": "^10.0.3", - "libnpmdiff": "^8.0.12", - "libnpmexec": "^10.1.11", - "libnpmfund": "^7.0.12", + "libnpmdiff": "^8.1.1", + "libnpmexec": "^10.2.1", + "libnpmfund": "^7.0.15", "libnpmorg": "^8.0.1", - "libnpmpack": "^9.0.12", + "libnpmpack": "^9.1.1", "libnpmpublish": "^11.1.3", "libnpmsearch": "^9.0.1", "libnpmteam": "^8.0.2", @@ -19172,7 +19207,7 @@ "minipass": "^7.1.1", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", - "node-gyp": "^12.1.0", + "node-gyp": "^12.2.0", "nopt": "^9.0.0", "npm-audit-report": "^7.0.0", "npm-install-checks": "^8.0.0", @@ -19182,21 +19217,21 @@ "npm-registry-fetch": "^19.1.1", "npm-user-validate": "^4.0.0", "p-map": "^7.0.4", - "pacote": "^21.0.4", + "pacote": "^21.3.1", "parse-conflict-json": "^5.0.1", "proc-log": "^6.1.0", "qrcode-terminal": "^0.12.0", "read": "^5.0.1", - "semver": "^7.7.3", + "semver": "^7.7.4", "spdx-expression-parse": "^4.0.0", - "ssri": "^13.0.0", + "ssri": "^13.0.1", "supports-color": "^10.2.2", - "tar": "^7.5.2", + "tar": "^7.5.7", "text-table": "~0.2.0", "tiny-relative-date": "^2.0.2", "treeverse": "^3.0.0", - "validate-npm-package-name": "^7.0.0", - "which": "^6.0.0" + "validate-npm-package-name": "^7.0.2", + "which": "^6.0.1" }, "bin": { "npm": "bin/npm-cli.js", @@ -19227,7 +19262,7 @@ } }, "node_modules/npm/node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", + "version": "5.0.1", "dev": true, "inBundle": true, "license": "MIT", @@ -19273,7 +19308,7 @@ } }, "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "9.1.9", + "version": "9.3.0", "dev": true, "inBundle": true, "license": "ISC", @@ -19291,7 +19326,7 @@ "@npmcli/run-script": "^10.0.0", "bin-links": "^6.0.0", "cacache": "^20.0.1", - "common-ancestor-path": "^1.0.1", + "common-ancestor-path": "^2.0.0", "hosted-git-info": "^9.0.0", "json-stringify-nice": "^1.1.4", "lru-cache": "^11.2.1", @@ -19320,7 +19355,7 @@ } }, "node_modules/npm/node_modules/@npmcli/config": { - "version": "10.4.5", + "version": "10.7.0", "dev": true, "inBundle": true, "license": "ISC", @@ -19515,7 +19550,7 @@ } }, "node_modules/npm/node_modules/@sigstore/core": { - "version": "3.0.0", + "version": "3.1.0", "dev": true, "inBundle": true, "license": "Apache-2.0", @@ -19533,52 +19568,43 @@ } }, "node_modules/npm/node_modules/@sigstore/sign": { - "version": "4.0.1", + "version": "4.1.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", + "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0", - "make-fetch-happen": "^15.0.2", - "proc-log": "^5.0.0", + "make-fetch-happen": "^15.0.3", + "proc-log": "^6.1.0", "promise-retry": "^2.0.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@sigstore/sign/node_modules/proc-log": { - "version": "5.0.0", - "dev": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, "node_modules/npm/node_modules/@sigstore/tuf": { - "version": "4.0.0", + "version": "4.0.1", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/protobuf-specs": "^0.5.0", - "tuf-js": "^4.0.0" + "tuf-js": "^4.1.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, "node_modules/npm/node_modules/@sigstore/verify": { - "version": "3.0.0", + "version": "3.1.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", + "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0" }, "engines": { @@ -19595,33 +19621,18 @@ } }, "node_modules/npm/node_modules/@tufjs/models": { - "version": "4.0.0", + "version": "4.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "@tufjs/canonical-json": "2.0.0", - "minimatch": "^9.0.5" + "minimatch": "^10.1.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" } }, - "node_modules/npm/node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.5", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/npm/node_modules/abbrev": { "version": "4.0.0", "dev": true, @@ -19661,12 +19672,6 @@ "inBundle": true, "license": "MIT" }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "dev": true, - "inBundle": true, - "license": "MIT" - }, "node_modules/npm/node_modules/bin-links": { "version": "6.0.0", "dev": true, @@ -19695,15 +19700,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "2.0.2", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, "node_modules/npm/node_modules/cacache": { "version": "20.0.3", "dev": true, @@ -19748,7 +19744,7 @@ } }, "node_modules/npm/node_modules/ci-info": { - "version": "4.3.1", + "version": "4.4.0", "dev": true, "funding": [ { @@ -19763,7 +19759,7 @@ } }, "node_modules/npm/node_modules/cidr-regex": { - "version": "5.0.1", + "version": "5.0.2", "dev": true, "inBundle": true, "license": "BSD-2-Clause", @@ -19797,10 +19793,13 @@ } }, "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", + "version": "2.0.0", "dev": true, "inBundle": true, - "license": "ISC" + "license": "BlueOak-1.0.0", + "engines": { + "node": ">= 18" + } }, "node_modules/npm/node_modules/cssesc": { "version": "3.0.0", @@ -19832,7 +19831,7 @@ } }, "node_modules/npm/node_modules/diff": { - "version": "8.0.2", + "version": "8.0.3", "dev": true, "inBundle": true, "license": "BSD-3-Clause", @@ -19899,12 +19898,12 @@ } }, "node_modules/npm/node_modules/glob": { - "version": "13.0.0", + "version": "13.0.2", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { - "minimatch": "^10.1.1", + "minimatch": "^10.1.2", "minipass": "^7.1.2", "path-scurry": "^2.0.0" }, @@ -20027,7 +20026,7 @@ } }, "node_modules/npm/node_modules/ip-address": { - "version": "10.0.1", + "version": "10.1.0", "dev": true, "inBundle": true, "license": "MIT", @@ -20048,12 +20047,12 @@ } }, "node_modules/npm/node_modules/is-cidr": { - "version": "6.0.1", + "version": "6.0.3", "dev": true, "inBundle": true, "license": "BSD-2-Clause", "dependencies": { - "cidr-regex": "5.0.1" + "cidr-regex": "^5.0.1" }, "engines": { "node": ">=20" @@ -20069,12 +20068,12 @@ } }, "node_modules/npm/node_modules/isexe": { - "version": "3.1.1", + "version": "4.0.0", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=16" + "node": ">=20" } }, "node_modules/npm/node_modules/json-parse-even-better-errors": { @@ -20130,12 +20129,12 @@ } }, "node_modules/npm/node_modules/libnpmdiff": { - "version": "8.0.12", + "version": "8.1.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.1.9", + "@npmcli/arborist": "^9.3.0", "@npmcli/installed-package-contents": "^4.0.0", "binary-extensions": "^3.0.0", "diff": "^8.0.2", @@ -20149,12 +20148,12 @@ } }, "node_modules/npm/node_modules/libnpmexec": { - "version": "10.1.11", + "version": "10.2.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.1.9", + "@npmcli/arborist": "^9.3.0", "@npmcli/package-json": "^7.0.0", "@npmcli/run-script": "^10.0.0", "ci-info": "^4.0.0", @@ -20172,12 +20171,12 @@ } }, "node_modules/npm/node_modules/libnpmfund": { - "version": "7.0.12", + "version": "7.0.15", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.1.9" + "@npmcli/arborist": "^9.3.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -20197,12 +20196,12 @@ } }, "node_modules/npm/node_modules/libnpmpack": { - "version": "9.0.12", + "version": "9.1.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "@npmcli/arborist": "^9.1.9", + "@npmcli/arborist": "^9.3.0", "@npmcli/run-script": "^10.0.0", "npm-package-arg": "^13.0.0", "pacote": "^21.0.2" @@ -20272,10 +20271,10 @@ } }, "node_modules/npm/node_modules/lru-cache": { - "version": "11.2.2", + "version": "11.2.6", "dev": true, "inBundle": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } @@ -20303,12 +20302,12 @@ } }, "node_modules/npm/node_modules/minimatch": { - "version": "10.1.1", + "version": "10.1.2", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "@isaacs/brace-expansion": "^5.0.1" }, "engines": { "node": "20 || >=22" @@ -20339,13 +20338,13 @@ } }, "node_modules/npm/node_modules/minipass-fetch": { - "version": "5.0.0", + "version": "5.0.1", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", + "minipass-sized": "^2.0.0", "minizlib": "^3.0.1" }, "engines": { @@ -20404,24 +20403,12 @@ } }, "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "dev": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", + "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "yallist": "^4.0.0" + "minipass": "^7.1.2" }, "engines": { "node": ">=8" @@ -20464,7 +20451,7 @@ } }, "node_modules/npm/node_modules/node-gyp": { - "version": "12.1.0", + "version": "12.2.0", "dev": true, "inBundle": true, "license": "MIT", @@ -20476,7 +20463,7 @@ "nopt": "^9.0.0", "proc-log": "^6.0.0", "semver": "^7.3.5", - "tar": "^7.5.2", + "tar": "^7.5.4", "tinyglobby": "^0.2.12", "which": "^6.0.0" }, @@ -20641,7 +20628,7 @@ } }, "node_modules/npm/node_modules/pacote": { - "version": "21.0.4", + "version": "21.3.1", "dev": true, "inBundle": true, "license": "ISC", @@ -20686,7 +20673,7 @@ } }, "node_modules/npm/node_modules/path-scurry": { - "version": "2.0.0", + "version": "2.0.1", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -20702,7 +20689,7 @@ } }, "node_modules/npm/node_modules/postcss-selector-parser": { - "version": "7.1.0", + "version": "7.1.1", "dev": true, "inBundle": true, "license": "MIT", @@ -20821,7 +20808,7 @@ "optional": true }, "node_modules/npm/node_modules/semver": { - "version": "7.7.3", + "version": "7.7.4", "dev": true, "inBundle": true, "license": "ISC", @@ -20845,17 +20832,17 @@ } }, "node_modules/npm/node_modules/sigstore": { - "version": "4.0.0", + "version": "4.1.0", "dev": true, "inBundle": true, "license": "Apache-2.0", "dependencies": { "@sigstore/bundle": "^4.0.0", - "@sigstore/core": "^3.0.0", + "@sigstore/core": "^3.1.0", "@sigstore/protobuf-specs": "^0.5.0", - "@sigstore/sign": "^4.0.0", - "@sigstore/tuf": "^4.0.0", - "@sigstore/verify": "^3.0.0" + "@sigstore/sign": "^4.1.0", + "@sigstore/tuf": "^4.0.1", + "@sigstore/verify": "^3.1.0" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -20942,7 +20929,7 @@ "license": "CC0-1.0" }, "node_modules/npm/node_modules/ssri": { - "version": "13.0.0", + "version": "13.0.1", "dev": true, "inBundle": true, "license": "ISC", @@ -20992,7 +20979,7 @@ } }, "node_modules/npm/node_modules/tar": { - "version": "7.5.2", + "version": "7.5.7", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", @@ -21083,14 +21070,14 @@ } }, "node_modules/npm/node_modules/tuf-js": { - "version": "4.0.0", + "version": "4.1.0", "dev": true, "inBundle": true, "license": "MIT", "dependencies": { - "@tufjs/models": "4.0.0", - "debug": "^4.4.1", - "make-fetch-happen": "^15.0.0" + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" }, "engines": { "node": "^20.17.0 || >=22.9.0" @@ -21147,7 +21134,7 @@ } }, "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "7.0.0", + "version": "7.0.2", "dev": true, "inBundle": true, "license": "ISC", @@ -21165,12 +21152,12 @@ } }, "node_modules/npm/node_modules/which": { - "version": "6.0.0", + "version": "6.0.1", "dev": true, "inBundle": true, "license": "ISC", "dependencies": { - "isexe": "^3.1.1" + "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" @@ -23700,6 +23687,7 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", "integrity": "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==", + "peer": true, "dependencies": { "mute-stream": "~0.0.4" }, @@ -29866,6 +29854,7 @@ "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6.11 <=0.7.0 || >=0.7.3" } @@ -30101,15 +30090,13 @@ } }, "node_modules/undici": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", - "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.23.0.tgz", + "integrity": "sha512-VfQPToRA5FZs/qJxLIinmU59u0r7LXqoJkCzinq3ckNJp3vKEh7jTWN589YQ5+aoAC/TGRLyJLCPKcLQbM8r9g==", "dev": true, - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, + "license": "MIT", "engines": { - "node": ">=14.0" + "node": ">=18.17" } }, "node_modules/undici-types": { diff --git a/package.json b/package.json index 69dc210..ff47247 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "gatsby-source-contentstack", - "version": "5.4.1", + "version": "5.4.2", "description": "Gatsby source plugin for building websites using Contentstack as a data source", "scripts": { "prepublish": "npm run build", diff --git a/plugin-init.js b/plugin-init.js new file mode 100644 index 0000000..b59da50 --- /dev/null +++ b/plugin-init.js @@ -0,0 +1,36 @@ +'use strict'; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); +var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); +var _require = require('./utils'), + CODES = _require.CODES; +var ERROR_MAP = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, CODES.SyncError, { + text: function text(context) { + return context.sourceMessage; + }, + level: "ERROR", + type: "PLUGIN" +}), CODES.APIError, { + text: function text(context) { + return context.sourceMessage; + }, + level: "ERROR", + type: "PLUGIN" +}), CODES.ImageAPIError, { + text: function text(context) { + return context.sourceMessage; + }, + level: "ERROR", + type: "PLUGIN" +}), CODES.MissingDependencyError, { + text: function text(context) { + return context.sourceMessage; + }, + level: "ERROR", + type: "PLUGIN" +}); +exports.onPluginInit = function (_ref) { + var reporter = _ref.reporter; + reporter.setErrorMap(ERROR_MAP); +}; +//# sourceMappingURL=plugin-init.js.map \ No newline at end of file diff --git a/plugin-options-schema.js b/plugin-options-schema.js new file mode 100644 index 0000000..18945ad --- /dev/null +++ b/plugin-options-schema.js @@ -0,0 +1,28 @@ +'use strict'; + +var _require = require('./node-helper'), + validateContentstackAccess = _require.validateContentstackAccess; +exports.pluginOptionsSchema = function (_ref) { + var Joi = _ref.Joi; + return Joi.object({ + api_key: Joi.string().required().description("API Key is a unique key assigned to each stack."), + delivery_token: Joi.string().required().description("Delivery Token is a read-only credential."), + environment: Joi.string().required().description("Environment where you published your data."), + branch: Joi.string()["default"]('main').description("Specify a branch from where you'd like to fetch the data. Default it will be fetched from main"), + cdn: Joi.string()["default"]("https://cdn.contentstack.io/v3").description("CDN set this to point to other cdn end point. For eg: https://eu-cdn.contentstack.com/v3 "), + type_prefix: Joi.string()["default"]("Contentstack").description("Specify a different prefix for types. This is useful in cases where you have multiple instances of the plugin to be connected to different stacks."), + expediteBuild: Joi["boolean"]()["default"](false).description("expediteBuild set this to either true or false."), + enableSchemaGeneration: Joi["boolean"]()["default"](false).description("Specify true if you want to generate custom schema."), + disableMandatoryFields: Joi["boolean"]()["default"](false).description("Specify true if you want to generate optional graphql fields for mandatory Contentstack fields"), + downloadImages: Joi["boolean"]()["default"](false).description("Specify true if you want to download all your contentstack images locally"), + contentTypes: Joi.array().items(Joi.string().required()).description("Specify list of content-types to be fetched from contentstack"), + excludeContentTypes: Joi.array().items(Joi.string().required()).description("Specify list of content-types to be excluded while fetching data from contentstack"), + locales: Joi.array().items(Joi.string().required()).description("Specify list of locales to be fetched from contentstack"), + jsonRteToHtml: Joi["boolean"]()["default"](false).description("Specify true if you want to generate html from json RTE field"), + httpRetries: Joi.number().integer()["default"](3).description("Specify the number of times to perform http request on a network failure"), + limit: Joi.number().integer()["default"](50).description("Specify the number of entries/assets to be fetched per page"), + enableEarlyAccessKey: Joi.string()["default"]('').description("Specify the Header key to be passed to Contentstack API"), + enableEarlyAccessValue: Joi.string()["default"]('').description("Specify list of headers to be passed to Contentstack API.") + }).external(validateContentstackAccess); +}; +//# sourceMappingURL=plugin-options-schema.js.map \ No newline at end of file diff --git a/pre-bootstrap.js b/pre-bootstrap.js new file mode 100644 index 0000000..f6a7148 --- /dev/null +++ b/pre-bootstrap.js @@ -0,0 +1,10 @@ +'use strict'; + +exports.onPreBootstrap = function (_ref) { + var reporter = _ref.reporter; + var args = process.argv; + if (args.includes('--verbose')) { + reporter.setVerbose(true); + } +}; +//# sourceMappingURL=pre-bootstrap.js.map \ No newline at end of file diff --git a/source-node.js b/source-node.js new file mode 100644 index 0000000..12f7a1c --- /dev/null +++ b/source-node.js @@ -0,0 +1,192 @@ +'use strict'; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); +var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); +var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); +var _require = require('./utils'), + checkIfUnsupportedFormat = _require.checkIfUnsupportedFormat, + SUPPORTED_FILES_COUNT = _require.SUPPORTED_FILES_COUNT, + IMAGE_REGEXP = _require.IMAGE_REGEXP, + CODES = _require.CODES, + getContentTypeOption = _require.getContentTypeOption, + ASSET_NODE_UIDS = _require.ASSET_NODE_UIDS; +var downloadAssets = require('./download-assets'); +var _require2 = require('./node-helper'), + deleteContentstackNodes = _require2.deleteContentstackNodes; +var _require3 = require('./fetch'), + fetchData = _require3.fetchData; +var _require4 = require('./normalize'), + normalizeEntry = _require4.normalizeEntry, + processContentType = _require4.processContentType, + processEntry = _require4.processEntry, + processAsset = _require4.processAsset, + makeEntryNodeUid = _require4.makeEntryNodeUid, + makeAssetNodeUid = _require4.makeAssetNodeUid; +exports.sourceNodes = /*#__PURE__*/function () { + var _ref = (0, _asyncToGenerator2["default"])(function (_ref2, configOptions) { + var cache = _ref2.cache, + actions = _ref2.actions, + getNode = _ref2.getNode, + getNodes = _ref2.getNodes, + createNodeId = _ref2.createNodeId, + reporter = _ref2.reporter, + createContentDigest = _ref2.createContentDigest, + getNodesByType = _ref2.getNodesByType, + getCache = _ref2.getCache; + return /*#__PURE__*/_regenerator["default"].mark(function _callee() { + var createNode, deleteNode, touchNode, createNodeField, typePrefix, contentstackData, contentTypeOption, _yield$fetchData, _contentstackData, syncData, entriesNodeIds, assetsNodeIds, existingNodes, countOfSupportedFormatFiles, assetUids, contentTypesMap, _t, _t2; + return _regenerator["default"].wrap(function (_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + createNode = actions.createNode, deleteNode = actions.deleteNode, touchNode = actions.touchNode, createNodeField = actions.createNodeField; // use a custom type prefix if specified + typePrefix = configOptions.type_prefix || 'Contentstack'; + _context.prev = 1; + contentTypeOption = getContentTypeOption(configOptions); + _context.next = 2; + return fetchData(configOptions, reporter, cache, contentTypeOption); + case 2: + _yield$fetchData = _context.sent; + _contentstackData = _yield$fetchData.contentstackData; + contentstackData = _contentstackData; + _context.next = 3; + return cache.get(typePrefix); + case 3: + contentstackData.contentTypes = _context.sent; + _context.next = 5; + break; + case 4: + _context.prev = 4; + _t = _context["catch"](1); + reporter.panic({ + id: CODES.SyncError, + context: { + sourceMessage: "Error occurred while fetching contentstack in [sourceNodes]. Please check https://www.contentstack.com/docs/developers/apis/content-delivery-api/ for more help." + }, + error: _t + }); + throw _t; + case 5: + syncData = contentstackData.syncData.reduce(function (merged, item) { + if (!merged[item.type]) { + merged[item.type] = []; + } + merged[item.type].push(item); + return merged; + }, {}); // for checking if the reference node is present or not + entriesNodeIds = new Set(); + assetsNodeIds = new Set(); + existingNodes = getNodes().filter(function (n) { + return n.internal.owner === 'gatsby-source-contentstack'; + }); + existingNodes.forEach(function (n) { + if (n.internal.type !== "".concat(typePrefix, "ContentTypes") && n.internal.type !== "".concat(typePrefix, "_assets")) { + entriesNodeIds.add(n.id); + } + if (n.internal.type === "".concat(typePrefix, "_assets")) { + assetsNodeIds.add(n.id); + } + touchNode(n); + }); + syncData.entry_published && syncData.entry_published.forEach(function (item) { + var entryNodeId = makeEntryNodeUid(item.data, createNodeId, typePrefix); + entriesNodeIds.add(entryNodeId); + }); + countOfSupportedFormatFiles = 0, assetUids = []; + syncData.asset_published && syncData.asset_published.forEach(function (item) { + /** + * Get the count of assets (images), filtering out svg and gif format, as these formats are not supported by gatsby-image. + * We need the right count to render in progress bar, which will show progress for downloading remote files. + */ + if (configOptions.downloadImages) { + var matches, isUnsupportedExt; + try { + matches = IMAGE_REGEXP.exec(item.data.url); + isUnsupportedExt = checkIfUnsupportedFormat(item.data.url); + if (matches && !isUnsupportedExt) countOfSupportedFormatFiles++; + } catch (error) { + reporter.panic('Something went wrong. Details: ', error); + } + } + var assetNodeId = makeAssetNodeUid(item.data, createNodeId, typePrefix); + assetsNodeIds.add(assetNodeId); + assetUids.push(assetNodeId); + }); + _context.next = 6; + return cache.set(ASSET_NODE_UIDS, assetUids); + case 6: + _t2 = configOptions.downloadImages; + if (!_t2) { + _context.next = 7; + break; + } + _context.next = 7; + return cache.set(SUPPORTED_FILES_COUNT, countOfSupportedFormatFiles); + case 7: + contentTypesMap = {}; + contentstackData.contentTypes.forEach(function (contentType) { + contentType.uid = contentType.uid.replace(/-/g, '_'); + var contentTypeNode = processContentType(contentType, createNodeId, createContentDigest, typePrefix); + contentTypesMap[contentType.uid] = contentType; + createNode(contentTypeNode); + }); + syncData.entry_published && syncData.entry_published.forEach(function (item) { + item.content_type_uid = item.content_type_uid.replace(/-/g, '_'); + var contentType = contentTypesMap[item.content_type_uid]; + var normalizedEntry = normalizeEntry(contentType, item.data, entriesNodeIds, assetsNodeIds, createNodeId, typePrefix, configOptions); + var entryNode = processEntry(contentType, normalizedEntry, createNodeId, createContentDigest, typePrefix); + createNode(entryNode); + }); + syncData.asset_published && syncData.asset_published.forEach(function (item) { + var assetNode = processAsset(item.data, createNodeId, createContentDigest, typePrefix); + createNode(assetNode); + }); + if (!configOptions.downloadImages) { + _context.next = 8; + break; + } + _context.next = 8; + return downloadAssets({ + cache: cache, + getCache: getCache, + createNode: createNode, + createNodeId: createNodeId, + getNodesByType: getNodesByType, + reporter: reporter, + createNodeField: createNodeField, + getNode: getNode + }, typePrefix, configOptions); + case 8: + // deleting nodes + syncData.entry_unpublished && syncData.entry_unpublished.forEach(function (item) { + return deleteContentstackNodes(item.data, 'entry', createNodeId, getNode, deleteNode, typePrefix); + }); + syncData.asset_unpublished && syncData.asset_unpublished.forEach(function (item) { + return deleteContentstackNodes(item.data, 'asset', createNodeId, getNode, deleteNode, typePrefix); + }); + syncData.entry_deleted && syncData.entry_deleted.forEach(function (item) { + return deleteContentstackNodes(item.data, 'entry', createNodeId, getNode, deleteNode, typePrefix); + }); + syncData.asset_deleted && syncData.asset_deleted.forEach(function (item) { + return deleteContentstackNodes(item.data, 'asset', createNodeId, getNode, deleteNode, typePrefix); + }); + syncData.content_type_deleted && syncData.content_type_deleted.forEach(function (item) { + item.content_type_uid = item.content_type_uid.replace(/-/g, '_'); + var sameContentTypeNodes = getNodes().filter(function (n) { + return n.internal.type === "".concat(typePrefix, "_").concat(item.content_type_uid); + }); + sameContentTypeNodes.forEach(function (node) { + return deleteNode(node); + }); + }); + case 9: + case "end": + return _context.stop(); + } + }, _callee, null, [[1, 4]]); + })(); + }); + return function (_x, _x2) { + return _ref.apply(this, arguments); + }; +}(); +//# sourceMappingURL=source-node.js.map \ No newline at end of file diff --git a/src/entry-data.js b/src/entry-data.js index 9298b32..dc33547 100644 --- a/src/entry-data.js +++ b/src/entry-data.js @@ -28,7 +28,10 @@ class FetchDefaultEntries extends FetchEntries { const [syncEntryData, syncAssetData] = await Promise.all([fn.apply(null, [syncEntryParams, configOptions]), fn.apply(null, [syncAssetParams, configOptions])]); const data = syncEntryData.data.concat(syncAssetData.data); syncData.data = data; - await Promise.all([cache.set(entryTokenKey, syncEntryData.sync_token), cache.set(assetTokenKey, syncAssetData.sync_token)]); + await Promise.all([ + syncEntryData.sync_token !== undefined ? cache.set(entryTokenKey, syncEntryData.sync_token) : Promise.resolve(), + syncAssetData.sync_token !== undefined ? cache.set(assetTokenKey, syncAssetData.sync_token) : Promise.resolve() + ]); } else { const tokenKey = `${typePrefix.toLowerCase()}-sync-token-${configOptions.api_key}`; const syncToken = await cache.get(tokenKey); @@ -38,7 +41,9 @@ class FetchDefaultEntries extends FetchEntries { syncData = await fn.apply(null, [syncParams, configOptions]); // Caching token for the next sync - await cache.set(tokenKey, syncData.sync_token); + if (syncData.sync_token !== undefined) { + await cache.set(tokenKey, syncData.sync_token); + } } } catch (error) { throw error; @@ -80,7 +85,9 @@ class FetchSpecifiedContentTypesEntries extends FetchEntries { syncData.data = syncData.data || []; syncData.data = syncData.data.concat(_syncData.data); // Caching token for the next sync. - await cache.set(tokenKey, _syncData.sync_token); + if (_syncData.sync_token !== undefined) { + await cache.set(tokenKey, _syncData.sync_token); + } } return syncData; } catch (error) { @@ -128,7 +135,9 @@ class FetchSpecifiedLocalesEntries extends FetchEntries { syncData.data = syncData.data || []; syncData.data = syncData.data.concat(_syncData.data); // Caching token for next sync - await cache.set(tokenKey, _syncData.sync_token); + if (_syncData.sync_token !== undefined) { + await cache.set(tokenKey, _syncData.sync_token); + } } return syncData; } catch (error) { @@ -180,7 +189,9 @@ class FetchSpecifiedLocalesAndContentTypesEntries extends FetchEntries { syncData.data = syncData.data || []; syncData.data = syncData.data.concat(_syncData.data); // Caching token for next sync - await cache.set(tokenKey, _syncData.sync_token); + if (_syncData.sync_token !== undefined) { + await cache.set(tokenKey, _syncData.sync_token); + } } } return syncData; @@ -211,7 +222,9 @@ class FetchAssets { syncAssetParams.type = 'asset_published,asset_unpublished,asset_deleted'; const syncAssetData = await fn.apply(null, [syncAssetParams, configOptions]); syncData.data = syncAssetData.data; - await cache.set(assetTokenKey, syncAssetData.sync_token); + if (syncAssetData.sync_token !== undefined) { + await cache.set(assetTokenKey, syncAssetData.sync_token); + } return syncData; } catch (error) { throw error; diff --git a/utils.js b/utils.js new file mode 100644 index 0000000..21a20af --- /dev/null +++ b/utils.js @@ -0,0 +1,76 @@ +'use strict'; + +var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); +var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); +var ProgressBar = require('progress'); +exports.createProgress = function (message, reporter) { + if (reporter && reporter.createProgress) { + return reporter.createProgress(message); + } + var bar = new ProgressBar(" [:bar] :current/:total :elapsed s :percent ".concat(message), { + total: 0, + width: 30, + clear: true + }); + return { + start: function start() {}, + tick: function tick() { + bar.tick(); + }, + done: function done() {}, + set total(value) { + bar.total = value; + } + }; +}; +exports.checkIfUnsupportedFormat = function (data) { + // Get every char after ".", $ is from end + // eslint-disable-next-line + var extenstionReg = /[^.]+$/, + extName = ''; + try { + extName = extenstionReg.exec(data); + extName = extName && extName.length ? extName[0] : null; + } catch (err) { + throw new Error(err); + } + return extName === 'svg' || extName === 'gif' ? true : false; +}; +exports.SUPPORTED_FILES_COUNT = 'SUPPORTED_FILES_COUNT'; +exports.IMAGE_REGEXP = new RegExp('https://(stag-images|(eu-|azure-na-|azure-eu-|azure-k8s-)?images).(blz-)?contentstack.(io|com)/v3/assets/'); +exports.ASSET_NODE_UIDS = 'ASSET_NODE_UIDS'; +exports.CODES = { + SyncError: '10001', + APIError: '10002', + ImageAPIError: '10003', + MissingDependencyError: '10004' +}; +exports.getContentTypeOption = function (configOptions) { + var _configOptions$locale; + var contentTypeOptions = ['contentTypes', 'excludeContentTypes']; + var configOptionKeys = Object.keys(configOptions); + var contentTypeOption = ''; + for (var i = 0; i < configOptionKeys.length; i++) { + var configOptionKey = configOptionKeys[i]; + if (contentTypeOptions.includes(configOptionKey)) { + contentTypeOption = configOptionKey; + break; + } + } + if ((_configOptions$locale = configOptions.locales) !== null && _configOptions$locale !== void 0 && _configOptions$locale.length) { + contentTypeOption += 'locales'; + } + return contentTypeOption; +}; +exports.getJSONToHtmlRequired = function (jsonRteToHtml, field) { + return jsonRteToHtml && field.field_metadata && field.field_metadata.allow_json_rte; +}; +exports.getCustomHeaders = function (key, value) { + var sanitizedKey = typeof key === 'string' ? key.trim() : ''; + var sanitizedValue = typeof value === 'string' ? value.trim() : ''; + if (!sanitizedKey || !sanitizedValue || !sanitizedKey.startsWith('x-')) { + return {}; + } + return (0, _defineProperty2["default"])({}, sanitizedKey, sanitizedValue.replace(/\s/g, '')); +}; +//# sourceMappingURL=utils.js.map \ No newline at end of file