From eb353cc845579b7781166cd8e88782c599595aa5 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Sun, 19 Jan 2025 21:28:57 +0530 Subject: [PATCH 01/12] sca-scan.yml From 4c8fe2dafffb0e36f26d96360795c63ccef086f4 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Sun, 19 Jan 2025 21:29:10 +0530 Subject: [PATCH 02/12] jira.yml --- .github/workflows/jira.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/jira.yml b/.github/workflows/jira.yml index caa4bbd..250abc7 100644 --- a/.github/workflows/jira.yml +++ b/.github/workflows/jira.yml @@ -21,7 +21,7 @@ jobs: project: ${{ secrets.JIRA_PROJECT }} issuetype: ${{ secrets.JIRA_ISSUE_TYPE }} summary: | - ${{ github.event.pull_request.title }} + Snyk | Vulnerability | ${{ github.event.repository.name }} | ${{ github.event.pull_request.title }} description: | PR: ${{ github.event.pull_request.html_url }} From 9747f34d32ba0e545a981c337fa65b79ea8511c2 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Sun, 19 Jan 2025 21:29:11 +0530 Subject: [PATCH 03/12] sast-scan.yml From 87f7090a987adb296aedbbee1dc18509c7e7c659 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Sun, 19 Jan 2025 21:29:13 +0530 Subject: [PATCH 04/12] codeql-analysis.yml From 226d729c292c5dc660494609d48151b9352e0f44 Mon Sep 17 00:00:00 2001 From: Aravind Kumar Date: Sun, 19 Jan 2025 21:29:18 +0530 Subject: [PATCH 05/12] Updated codeowners From 767d583b4365657f824997db54db9dc08049d7ef Mon Sep 17 00:00:00 2001 From: Ankita Dodamani Date: Fri, 14 Feb 2025 15:32:09 +0530 Subject: [PATCH 06/12] chore: test --- src/fetch.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/fetch.js b/src/fetch.js index 8e724e5..118ea5c 100644 --- a/src/fetch.js +++ b/src/fetch.js @@ -169,6 +169,9 @@ const getData = async (url, options) => { }; const fetchCsData = async (url, config, query) => { + if (query && query.sync_token) { + console.log("Query contains sync_token:", query.sync_token); + } query = query || {}; query.include_count = true; query.environment = config.environment; @@ -296,6 +299,7 @@ const getSyncData = async ( * To make final sync call and concatenate the result if found any during on fetch request. */ const aggregatedSyncToken = syncToken.filter(item => item !== undefined); + console.log('Sync Tokens:', aggregatedSyncToken); let SyncRetryCount = 0; for (const token of aggregatedSyncToken) { let syncResponse; @@ -303,9 +307,10 @@ const getSyncData = async ( syncResponse = await fetchCsData( url, config, - (query = { sync_token: token }) + (query = { sync_token: `${token}uce` }) ); } catch (error) { + console.error(error); if (SyncRetryCount < config.httpRetries) { const timeToWait = 2 ** SyncRetryCount * 100; SyncRetryCount++; @@ -332,5 +337,4 @@ const getSyncData = async ( } catch (error) { throw new Error(`Failed to fetch sync data: ${error.message}`); } -}; - +}; \ No newline at end of file From e82833e33c4f71f3041835b6b570179ce109b781 Mon Sep 17 00:00:00 2001 From: Ankita Dodamani Date: Fri, 14 Feb 2025 16:36:28 +0530 Subject: [PATCH 07/12] chore: added logs --- src/fetch.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/fetch.js b/src/fetch.js index 118ea5c..696b6cf 100644 --- a/src/fetch.js +++ b/src/fetch.js @@ -124,6 +124,7 @@ function waitFor(milliseconds) { } const getData = async (url, options) => { + console.log("URL:", url); let retries = 0; return new Promise((resolve, reject) => { const handleResponse = () => { @@ -131,7 +132,7 @@ const getData = async (url, options) => { .then(response => response.json()) .then(data => { if (data.error_code) { - console.error(data); + console.error("data ERROR: ", data); if (data.error_code >= 500) { throw new Error(`Server error: ${data.error_code}`); } @@ -156,7 +157,7 @@ const getData = async (url, options) => { await waitFor(timeToWait); handleResponse(); } else { - console.error(err); + console.error("Got an ERROR:", err); reject( new Error(`Fetch failed after ${retryAttempt} retry attempts.`) ); @@ -190,6 +191,7 @@ const fetchCsData = async (url, config, query) => { }, }; const data = await getData(apiUrl, option); + console.log("Data fetched from getData fucntion:", data); return data; }; @@ -310,7 +312,7 @@ const getSyncData = async ( (query = { sync_token: `${token}uce` }) ); } catch (error) { - console.error(error); + console.error("Got Error 2", error); if (SyncRetryCount < config.httpRetries) { const timeToWait = 2 ** SyncRetryCount * 100; SyncRetryCount++; From e07c2774a4eeb2e72df428e28c35095e1b8fefaf Mon Sep 17 00:00:00 2001 From: Ankita Dodamani Date: Fri, 14 Feb 2025 16:52:53 +0530 Subject: [PATCH 08/12] chore: added logs --- contenttype-data.js | 223 ++++++++++++ create-resolvers.js | 218 ++++++++++++ create-schema-customization.js | 218 ++++++++++++ download-assets.js | 215 ++++++++++++ entry-data.js | 597 +++++++++++++++++++++++++++++++++ fetch.js | 480 ++++++++++++++++++++++++++ gatsby-node.js | 21 ++ gatsby-plugin-image.js | 206 ++++++++++++ image-helper.js | 48 +++ node-helper.js | 76 +++++ normalize.js | 520 ++++++++++++++++++++++++++++ plugin-init.js | 36 ++ plugin-options-schema.js | 28 ++ pre-bootstrap.js | 10 + source-node.js | 192 +++++++++++ src/fetch.js | 3 + utils.js | 76 +++++ 17 files changed, 3167 insertions(+) create mode 100644 contenttype-data.js create mode 100644 create-resolvers.js create mode 100644 create-schema-customization.js create mode 100644 download-assets.js create mode 100644 entry-data.js create mode 100644 fetch.js create mode 100644 gatsby-node.js create mode 100644 gatsby-plugin-image.js create mode 100644 image-helper.js create mode 100644 node-helper.js create mode 100644 normalize.js create mode 100644 plugin-init.js create mode 100644 plugin-options-schema.js create mode 100644 pre-bootstrap.js create mode 100644 source-node.js create mode 100644 utils.js diff --git a/contenttype-data.js b/contenttype-data.js new file mode 100644 index 0000000..1457766 --- /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 _callee$(_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 _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + query = { + include_global_field_schema: true + }; + _context2.next = 3; + return fn.apply(null, [url, config, responseKey, query]); + case 3: + result = _context2.sent; + return _context2.abrupt("return", result); + case 5: + 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 _callee3$(_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 = 3; + return fn.apply(null, [url, config, responseKey, query]); + case 3: + contentTypes = _context3.sent; + referredContentTypes = new ReferredContentTypes(); + referredContentTypesList = referredContentTypes.getReferredContentTypes(contentTypes); + referredContentTypesData = []; + if (!referredContentTypesList.length) { + _context3.next = 12; + break; + } + query.query = JSON.stringify({ + uid: { + $in: referredContentTypesList + } + }); + _context3.next = 11; + return fn.apply(null, [url, config, responseKey, query]); + case 11: + referredContentTypesData = _context3.sent; + case 12: + result = contentTypes.concat(referredContentTypesData); + return _context3.abrupt("return", result); + case 14: + 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 _callee4$(_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 = 3; + return fn.apply(null, [url, config, responseKey, query]); + case 3: + contentTypes = _context4.sent; + referredContentTypes = new ReferredContentTypes(); + referredContentTypesList = referredContentTypes.getReferredContentTypes(contentTypes); + referredContentTypesData = []; + if (!referredContentTypesList.length) { + _context4.next = 12; + break; + } + query.query = JSON.stringify({ + uid: { + $in: referredContentTypesList + } + }); + _context4.next = 11; + return fn.apply(null, [url, config, responseKey, query]); + case 11: + referredContentTypesData = _context4.sent; + case 12: + result = contentTypes.concat(referredContentTypesData); + return _context4.abrupt("return", result); + case 14: + case "end": + return _context4.stop(); + } + }, _callee4); + })); + function getPagedData(_x9, _x10, _x11, _x12) { + 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..11ecbf5 --- /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 _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + resolvers = {}; + typePrefix = configOptions.type_prefix || 'Contentstack'; + _context.next = 4; + 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 4: + _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 = 12; + return cache.get(typePrefix); + case 12: + 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 21: + 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..fa52fcc --- /dev/null +++ b/create-schema-customization.js @@ -0,0 +1,218 @@ +'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 _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), 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 _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; + return _regenerator["default"].wrap(function _callee2$(_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 = 3; + contentTypeOption = getContentTypeOption(configOptions); + _context2.next = 7; + return fetchContentTypes(configOptions, contentTypeOption); + case 7: + contentTypes = _context2.sent; + _context2.next = 10; + return cache.set(typePrefix, contentTypes); + case 10: + _context2.next = 15; + break; + case 12: + _context2.prev = 12; + _context2.t0 = _context2["catch"](3); + console.error('Contentstack fetch content type failed!'); + case 15: + references = [], groups = [], fileFields = [], jsonRteFields = []; + if (!configOptions.enableSchemaGeneration) { + _context2.next = 52; + 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 = 20; + _context2.next = 23; + return Promise.resolve().then(function () { + return _interopRequireWildcard(require('gatsby-plugin-image/graphql-utils')); + }); + case 23: + _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 _callee$(_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 = 34; + break; + case 31: + _context2.prev = 31; + _context2.t1 = _context2["catch"](20); + if (_context2.t1.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 34: + 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); + }); + _context2.t2 = Promise; + _context2.next = 39; + return cache.set("".concat(typePrefix, "_").concat(configOptions.api_key, "_references"), references); + case 39: + _context2.t3 = _context2.sent; + _context2.next = 42; + return cache.set("".concat(typePrefix, "_").concat(configOptions.api_key, "_groups"), groups); + case 42: + _context2.t4 = _context2.sent; + _context2.next = 45; + return cache.set("".concat(typePrefix, "_").concat(configOptions.api_key, "_file_fields"), fileFields); + case 45: + _context2.t5 = _context2.sent; + _context2.next = 48; + return cache.set("".concat(typePrefix, "_").concat(configOptions.api_key, "_json_rte_fields"), jsonRteFields); + case 48: + _context2.t6 = _context2.sent; + _context2.t7 = [_context2.t3, _context2.t4, _context2.t5, _context2.t6]; + _context2.next = 52; + return _context2.t2.all.call(_context2.t2, _context2.t7); + case 52: + case "end": + return _context2.stop(); + } + }, _callee2, null, [[3, 12], [20, 31]]); + })(); + }); + 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..80a52df --- /dev/null +++ b/download-assets.js @@ -0,0 +1,215 @@ +'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; + return _regenerator["default"].wrap(function _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + _context.prev = 0; + _context.next = 3; + return cache.get(ASSET_NODE_UIDS); + case 3: + 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 = 8; + return cache.get(SUPPORTED_FILES_COUNT); + case 8: + totalJobs = _context.sent; + // Create progress bar + bar = createProgress("Downloading remote files", reporter); + bar.start(); + bar.total = totalJobs; + i = 0; + case 13: + if (!(i < batches.length)) { + _context.next = 45; + 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 20: + if (!(j < lastCount)) { + _context.next = 38; + 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 = 25; + break; + } + shouldBreak = true; + return _context.abrupt("break", 38); + case 25: + // 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 = 35; + break; + } + _context.t0 = batchPromises; + _context.next = 33; + return createRemoteFileNodePromise({ + cache: cache, + getCache: getCache, + createNode: createNode, + createNodeId: createNodeId, + createNodeField: createNodeField + }, asset, typePrefix, reporter); + case 33: + _context.t1 = _context.sent; + _context.t0.push.call(_context.t0, _context.t1); + case 35: + j++; + _context.next = 20; + break; + case 38: + if (!shouldBreak) { + _context.next = 40; + break; + } + return _context.abrupt("break", 45); + case 40: + _context.next = 42; + return Promise.all(batchPromises); + case 42: + i++; + _context.next = 13; + break; + case 45: + bar && bar.done(); + sizeBar && sizeBar.done(); + reporter.verbose("Total size of downloaded files ".concat(totalSize)); + _context.next = 53; + break; + case 50: + _context.prev = 50; + _context.t2 = _context["catch"](0); + reporter.info('Something went wrong while downloading assets. Details: ' + _context.t2); + case 53: + case "end": + return _context.stop(); + } + }, _callee, null, [[0, 50]]); + })(); + }); + 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; + return _regenerator["default"].wrap(function _callee2$(_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 = 5; + return params.cache.get(assetUid); + case 5: + 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 = 19; + break; + } + _context2.next = 10; + return createRemoteFileNode(_objectSpread(_objectSpread({}, params), {}, { + url: encodeURI(node.url), + parentNodeId: node.id + })); + case 10: + fileNode = _context2.sent; + if (!fileNode) { + _context2.next = 19; + 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 = 19; + return params.cache.set(assetUid, fileNode); + case 19: + bar.tick(); + if (fileNode) { + params.createNodeField({ + node: node, + name: 'localAsset', + value: fileNode.id + }); + } + return _context2.abrupt("return", fileNode); + case 24: + _context2.prev = 24; + _context2.t0 = _context2["catch"](0); + reporter.info('Something went wrong while creating file nodes. Details: ' + _context2.t0); + case 27: + case "end": + return _context2.stop(); + } + }, _callee2, null, [[0, 24]]); + })); + 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..4f04fd0 --- /dev/null +++ b/entry-data.js @@ -0,0 +1,597 @@ +'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 _callee$(_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; + return _regenerator["default"].wrap(function _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + typePrefix = configOptions.type_prefix || 'Contentstack'; + syncData = {}; + _context2.prev = 2; + if (!configOptions.expediteBuild) { + _context2.next = 28; + 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 = 8; + return Promise.all([cache.get(entryTokenKey), cache.get(assetTokenKey)]); + case 8: + _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 = 18; + return Promise.all([fn.apply(null, [syncEntryParams, configOptions]), fn.apply(null, [syncAssetParams, configOptions])]); + case 18: + _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 = 26; + return Promise.all([cache.set(entryTokenKey, syncEntryData.sync_token), cache.set(assetTokenKey, syncAssetData.sync_token)]); + case 26: + _context2.next = 38; + break; + case 28: + tokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-").concat(configOptions.api_key); + _context2.next = 31; + return cache.get(tokenKey); + case 31: + syncToken = _context2.sent; + syncParams = syncToken ? { + sync_token: syncToken + } : { + init: true, + limit: configOptions.limit > 100 ? 50 : configOptions.limit + }; + _context2.next = 35; + return fn.apply(null, [syncParams, configOptions]); + case 35: + syncData = _context2.sent; + _context2.next = 38; + return cache.set(tokenKey, syncData.sync_token); + case 38: + _context2.next = 43; + break; + case 40: + _context2.prev = 40; + _context2.t0 = _context2["catch"](2); + throw _context2.t0; + case 43: + return _context2.abrupt("return", syncData); + case 44: + case "end": + return _context2.stop(); + } + }, _callee2, null, [[2, 40]]); + })); + 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; + return _regenerator["default"].wrap(function _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + _context3.prev = 0; + _context3.next = 3; + return Promise.all([this.fetchEntries(configOptions, cache, fn), this.fetchAssets(configOptions, cache, fn)]); + case 3: + _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 12: + _context3.prev = 12; + _context3.t0 = _context3["catch"](0); + throw _context3.t0; + case 15: + case "end": + return _context3.stop(); + } + }, _callee3, this, [[0, 12]]); + })); + 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; + return _regenerator["default"].wrap(function _callee4$(_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + _context4.prev = 0; + syncData = {}; + typePrefix = configOptions.type_prefix || 'Contentstack'; + _context4.next = 5; + return cache.get(typePrefix); + case 5: + contentTypes = _context4.sent; + i = 0; + case 7: + if (!(i < contentTypes.length)) { + _context4.next = 25; + break; + } + contentType = contentTypes[i].uid; + tokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-").concat(contentType, "-").concat(configOptions.api_key); + _context4.next = 12; + return cache.get(tokenKey); + case 12: + syncToken = _context4.sent; + syncParams = syncToken ? { + sync_token: syncToken + } : { + init: true + }; + syncParams.content_type_uid = contentType; + _context4.next = 17; + return fn.apply(null, [syncParams, configOptions]); + case 17: + _syncData = _context4.sent; + syncData.data = syncData.data || []; + syncData.data = syncData.data.concat(_syncData.data); + // Caching token for the next sync. + _context4.next = 22; + return cache.set(tokenKey, _syncData.sync_token); + case 22: + i++; + _context4.next = 7; + break; + case 25: + return _context4.abrupt("return", syncData); + case 28: + _context4.prev = 28; + _context4.t0 = _context4["catch"](0); + throw _context4.t0; + case 31: + case "end": + return _context4.stop(); + } + }, _callee4, null, [[0, 28]]); + })); + 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; + return _regenerator["default"].wrap(function _callee5$(_context5) { + while (1) switch (_context5.prev = _context5.next) { + case 0: + _context5.prev = 0; + fetchAssetService = new FetchAssets(); + _context5.next = 4; + return fetchAssetService.fetchAssets(configOptions, cache, fn); + case 4: + syncData = _context5.sent; + return _context5.abrupt("return", syncData); + case 8: + _context5.prev = 8; + _context5.t0 = _context5["catch"](0); + throw _context5.t0; + case 11: + case "end": + return _context5.stop(); + } + }, _callee5, null, [[0, 8]]); + })); + function fetchAssets(_x10, _x11, _x12) { + 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 _callee6$(_context6) { + while (1) switch (_context6.prev = _context6.next) { + case 0: + _context6.next = 2; + return Promise.all([this.fetchEntries(configOptions, cache, fn), this.fetchAssets(configOptions, cache, fn)]); + case 2: + _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 9: + case "end": + return _context6.stop(); + } + }, _callee6, this); + })); + function fetchSyncData(_x13, _x14, _x15) { + 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; + return _regenerator["default"].wrap(function _callee7$(_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 5: + if (!(i < locales.length)) { + _context7.next = 23; + break; + } + locale = locales[i]; + tokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-").concat(locale, "-").concat(configOptions.api_key); + _context7.next = 10; + return cache.get(tokenKey); + case 10: + syncToken = _context7.sent; + syncParams = syncToken ? { + sync_token: syncToken + } : { + init: true + }; + syncParams.locale = locale; + _context7.next = 15; + return fn.apply(null, [syncParams, configOptions]); + case 15: + _syncData = _context7.sent; + syncData.data = syncData.data || []; + syncData.data = syncData.data.concat(_syncData.data); + // Caching token for next sync + _context7.next = 20; + return cache.set(tokenKey, _syncData.sync_token); + case 20: + i++; + _context7.next = 5; + break; + case 23: + return _context7.abrupt("return", syncData); + case 26: + _context7.prev = 26; + _context7.t0 = _context7["catch"](0); + throw _context7.t0; + case 29: + case "end": + return _context7.stop(); + } + }, _callee7, null, [[0, 26]]); + })); + function fetchEntries(_x16, _x17, _x18) { + 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; + return _regenerator["default"].wrap(function _callee8$(_context8) { + while (1) switch (_context8.prev = _context8.next) { + case 0: + _context8.prev = 0; + fetchAssetService = new FetchAssets(); + _context8.next = 4; + return fetchAssetService.fetchAssets(configOptions, cache, fn); + case 4: + syncData = _context8.sent; + return _context8.abrupt("return", syncData); + case 8: + _context8.prev = 8; + _context8.t0 = _context8["catch"](0); + throw _context8.t0; + case 11: + case "end": + return _context8.stop(); + } + }, _callee8, null, [[0, 8]]); + })); + function fetchAssets(_x19, _x20, _x21) { + 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$all10, syncEntryData, syncAssetData, syncData; + return _regenerator["default"].wrap(function _callee9$(_context9) { + while (1) switch (_context9.prev = _context9.next) { + case 0: + _context9.next = 2; + return Promise.all([this.fetchEntries(configOptions, cache, fn), this.fetchAssets(configOptions, cache, fn)]); + case 2: + _yield$Promise$all9 = _context9.sent; + _yield$Promise$all10 = (0, _slicedToArray2["default"])(_yield$Promise$all9, 2); + syncEntryData = _yield$Promise$all10[0]; + syncAssetData = _yield$Promise$all10[1]; + syncData = {}; + syncData.data = syncEntryData.data.concat(syncAssetData.data); + return _context9.abrupt("return", syncData); + case 9: + case "end": + return _context9.stop(); + } + }, _callee9, this); + })); + function fetchSyncData(_x22, _x23, _x24) { + return _fetchSyncData5.apply(this, arguments); + } + return fetchSyncData; + }() + }, { + key: "fetchEntries", + value: function () { + var _fetchEntries3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10(configOptions, cache, fn) { + var syncData, typePrefix, contentTypes, locales, i, contentType, j, locale, tokenKey, syncToken, syncParams, _syncData; + return _regenerator["default"].wrap(function _callee10$(_context10) { + while (1) switch (_context10.prev = _context10.next) { + case 0: + _context10.prev = 0; + syncData = {}; + typePrefix = configOptions.type_prefix || 'Contentstack'; + _context10.next = 5; + return cache.get(typePrefix); + case 5: + contentTypes = _context10.sent; + locales = configOptions.locales; + i = 0; + case 8: + if (!(i < contentTypes.length)) { + _context10.next = 33; + break; + } + contentType = contentTypes[i].uid; + j = 0; + case 11: + if (!(j < locales.length)) { + _context10.next = 30; + break; + } + locale = locales[j]; + tokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-").concat(contentType, "-").concat(locale, "-").concat(configOptions.api_key); + _context10.next = 16; + return cache.get(tokenKey); + case 16: + syncToken = _context10.sent; + syncParams = syncToken ? { + sync_token: syncToken + } : { + init: true + }; + syncParams.content_type_uid = contentType; + syncParams.locale = locale; + _context10.next = 22; + return fn.apply(null, [syncParams, configOptions]); + case 22: + _syncData = _context10.sent; + syncData.data = syncData.data || []; + syncData.data = syncData.data.concat(_syncData.data); + // Caching token for next sync + _context10.next = 27; + return cache.set(tokenKey, _syncData.sync_token); + case 27: + j++; + _context10.next = 11; + break; + case 30: + i++; + _context10.next = 8; + break; + case 33: + return _context10.abrupt("return", syncData); + case 36: + _context10.prev = 36; + _context10.t0 = _context10["catch"](0); + throw _context10.t0; + case 39: + case "end": + return _context10.stop(); + } + }, _callee10, null, [[0, 36]]); + })); + function fetchEntries(_x25, _x26, _x27) { + return _fetchEntries3.apply(this, arguments); + } + return fetchEntries; + }() + }, { + key: "fetchAssets", + value: function () { + var _fetchAssets3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee11(configOptions, cache, fn) { + var fetchAssetService, syncData; + return _regenerator["default"].wrap(function _callee11$(_context11) { + while (1) switch (_context11.prev = _context11.next) { + case 0: + _context11.prev = 0; + fetchAssetService = new FetchAssets(); + _context11.next = 4; + return fetchAssetService.fetchAssets(configOptions, cache, fn); + case 4: + syncData = _context11.sent; + return _context11.abrupt("return", syncData); + case 8: + _context11.prev = 8; + _context11.t0 = _context11["catch"](0); + throw _context11.t0; + case 11: + case "end": + return _context11.stop(); + } + }, _callee11, null, [[0, 8]]); + })); + function fetchAssets(_x28, _x29, _x30) { + 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 _callee12(configOptions, cache, fn) { + var typePrefix, syncData, assetTokenKey, syncAssetToken, syncAssetParams, syncAssetData; + return _regenerator["default"].wrap(function _callee12$(_context12) { + while (1) switch (_context12.prev = _context12.next) { + case 0: + typePrefix = configOptions.type_prefix || 'Contentstack'; + _context12.prev = 1; + syncData = {}; + assetTokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-asset-").concat(configOptions.api_key); + _context12.next = 6; + return cache.get(assetTokenKey); + case 6: + syncAssetToken = _context12.sent; + syncAssetParams = syncAssetToken ? { + sync_token: syncAssetToken + } : { + init: true + }; + syncAssetParams.type = 'asset_published,asset_unpublished,asset_deleted'; + _context12.next = 11; + return fn.apply(null, [syncAssetParams, configOptions]); + case 11: + syncAssetData = _context12.sent; + syncData.data = syncAssetData.data; + _context12.next = 15; + return cache.set(assetTokenKey, syncAssetData.sync_token); + case 15: + return _context12.abrupt("return", syncData); + case 18: + _context12.prev = 18; + _context12.t0 = _context12["catch"](1); + throw _context12.t0; + case 21: + case "end": + return _context12.stop(); + } + }, _callee12, null, [[1, 18]]); + })); + function fetchAssets(_x31, _x32, _x33) { + 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..79c3dcd --- /dev/null +++ b/fetch.js @@ -0,0 +1,480 @@ +'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; + return _regenerator["default"].wrap(function _callee$(_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 = 3; + syncData = {}; + entryService = new OPTIONS_ENTRIES_CLASS_MAPPING[contentTypeOption](); + _context.next = 8; + return entryService.fetchSyncData(configOptions, cache, fetchSyncData); + case 8: + _syncData = _context.sent; + syncData.data = _syncData.data; + contentstackData = { + syncData: syncData.data + }; + activity.end(); + return _context.abrupt("return", { + contentstackData: contentstackData + }); + case 15: + _context.prev = 15; + _context.t0 = _context["catch"](3); + 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: _context.t0 + }); + case 18: + case "end": + return _context.stop(); + } + }, _callee, null, [[3, 15]]); + })); + 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; + return _regenerator["default"].wrap(function _callee2$(_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 = 8; + return contentType.getPagedData(url, config, responseKey, _getPagedData); + case 8: + allContentTypes = _context2.sent; + return _context2.abrupt("return", allContentTypes); + case 12: + _context2.prev = 12; + _context2.t0 = _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: _context2.t0 + }); + case 15: + case "end": + return _context2.stop(); + } + }, _callee2, null, [[1, 12]]); + })); + 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 _callee3$(_context3) { + while (1) switch (_context3.prev = _context3.next) { + case 0: + url = 'stacks/sync'; + _context3.next = 3; + return _getSyncData(url, config, query, 'items'); + case 3: + response = _context3.sent; + return _context3.abrupt("return", response); + case 5: + 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 _callee5$(_context5) { + while (1) switch (_context5.prev = _context5.next) { + case 0: + console.log("URL:", url); + 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) { + console.error("data ERROR: ", data); + if (data.error_code >= 500) { + throw new Error("Server error: ".concat(data.error_code)); + } + reject(data); + } else { + if (data.items) { + var filteredData = data === null || data === void 0 ? void 0 : data.items.filter(function (item) { + return item.data.hasOwnProperty('publish_details'); + }); + data.items = filteredData; + } + 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 _callee4$(_context4) { + while (1) switch (_context4.prev = _context4.next) { + case 0: + retryAttempt = globalConfig.httpRetries ? globalConfig.httpRetries : 3; + if (!(retries < retryAttempt)) { + _context4.next = 9; + break; + } + retries++; + timeToWait = Math.pow(2, retries) * 100; + _context4.next = 6; + return waitFor(timeToWait); + case 6: + _handleResponse(); + _context4.next = 11; + break; + case 9: + console.error("Got an ERROR:", err); + reject(new Error("Fetch failed after ".concat(retryAttempt, " retry attempts."))); + case 11: + case "end": + return _context4.stop(); + } + }, _callee4); + })); + return function (_x11) { + return _ref5.apply(this, arguments); + }; + }()); + }; + retries = 1; + _handleResponse(); + })); + case 3: + case "end": + return _context5.stop(); + } + }, _callee5); + })); + return function getData(_x9, _x10) { + 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 _callee6$(_context6) { + while (1) switch (_context6.prev = _context6.next) { + case 0: + if (query && query.sync_token) { + console.log("Query contains sync_token:", query.sync_token); + } + 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 = 9; + return getData(apiUrl, option); + case 9: + data = _context6.sent; + console.log("Data fetched from getData fucntion:", data); + return _context6.abrupt("return", data); + case 12: + case "end": + return _context6.stop(); + } + }, _callee6); + })); + return function fetchCsData(_x12, _x13, _x14) { + 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 _callee7$(_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 = 6; + return fetchCsData(url, config, query); + case 6: + response = _context7.sent; + if (!aggregatedResponse) { + aggregatedResponse = response[responseKey]; + } else { + aggregatedResponse = aggregatedResponse.concat(response[responseKey]); + } + if (!(skip + limit <= response.count)) { + _context7.next = 10; + break; + } + return _context7.abrupt("return", _getPagedData(url, config, responseKey, query = {}, skip + limit, limit, aggregatedResponse)); + case 10: + return _context7.abrupt("return", aggregatedResponse); + case 11: + case "end": + return _context7.stop(); + } + }, _callee7); + })(); + }); + return function getPagedData(_x15, _x16, _x17) { + 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, timeToWait, aggregatedSyncToken, SyncRetryCount, _iterator, _step, _aggregatedResponse$d, _aggregatedResponse$d2, token, syncResponse, _timeToWait; + return _regenerator["default"].wrap(function _callee8$(_context8) { + while (1) switch (_context8.prev = _context8.next) { + case 0: + _context8.prev = 0; + _context8.next = 3; + return fetchCsData(url, config, query); + case 3: + response = _context8.sent; + /* + Below syncToken array would contain type --> 'asset_published', 'entry_published' sync tokens + */ + if (response.items.some(function (item) { + return ['entry_published', 'asset_published'].includes(item.type); + })) { + 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; + } + if (!response.pagination_token) { + _context8.next = 25; + break; + } + _context8.prev = 7; + _context8.next = 10; + return _getSyncData(url, config, { + pagination_token: response.pagination_token + }, responseKey, aggregatedResponse, 0 // Reset retries for each call + ); + case 10: + return _context8.abrupt("return", _context8.sent); + case 13: + _context8.prev = 13; + _context8.t0 = _context8["catch"](7); + if (!(retries < config.httpRetries)) { + _context8.next = 24; + break; + } + timeToWait = Math.pow(2, retries) * 100; //Retry attempt ${retries + 1} after pagination token error. Waiting for ${timeToWait} ms... + _context8.next = 19; + return waitFor(timeToWait); + case 19: + _context8.next = 21; + return _getSyncData(url, config, { + pagination_token: response.pagination_token + }, responseKey, aggregatedResponse, retries + 1); + case 21: + return _context8.abrupt("return", _context8.sent); + case 24: + throw new Error("Failed to fetch sync data after ".concat(config.httpRetries, " retry attempts due to invalid pagination token.")); + case 25: + if (!response.sync_token) { + _context8.next = 67; + break; + } + /** + * To make final sync call and concatenate the result if found any during on fetch request. + */ + aggregatedSyncToken = syncToken.filter(function (item) { + return item !== undefined; + }); + console.log('Sync Tokens:', aggregatedSyncToken); + SyncRetryCount = 0; + _iterator = _createForOfIteratorHelper(aggregatedSyncToken); + _context8.prev = 30; + _iterator.s(); + case 32: + if ((_step = _iterator.n()).done) { + _context8.next = 59; + break; + } + token = _step.value; + syncResponse = void 0; + _context8.prev = 35; + _context8.next = 38; + return fetchCsData(url, config, query = { + sync_token: "".concat(token, "uce") + }); + case 38: + syncResponse = _context8.sent; + _context8.next = 55; + break; + case 41: + _context8.prev = 41; + _context8.t1 = _context8["catch"](35); + console.error("Got Error 2", _context8.t1); + if (!(SyncRetryCount < config.httpRetries)) { + _context8.next = 54; + break; + } + _timeToWait = Math.pow(2, SyncRetryCount) * 100; + SyncRetryCount++; + //Retry attempt ${retries + 1} after sync token error. Waiting for ${timeToWait} ms... + _context8.next = 49; + return waitFor(_timeToWait); + case 49: + _context8.next = 51; + return fetchCsData(url, config, query = { + sync_token: token + }); + case 51: + return _context8.abrupt("return", syncResponse = _context8.sent); + case 54: + throw new Error("Failed to fetch sync data after ".concat(config.httpRetries, " retry attempts due to invalid sync token.")); + case 55: + aggregatedResponse.data = (_aggregatedResponse$d = aggregatedResponse.data) === null || _aggregatedResponse$d === void 0 ? void 0 : (_aggregatedResponse$d2 = _aggregatedResponse$d).concat.apply(_aggregatedResponse$d2, (0, _toConsumableArray2["default"])(syncResponse.items)); + aggregatedResponse.sync_token = syncResponse.sync_token; + case 57: + _context8.next = 32; + break; + case 59: + _context8.next = 64; + break; + case 61: + _context8.prev = 61; + _context8.t2 = _context8["catch"](30); + _iterator.e(_context8.t2); + case 64: + _context8.prev = 64; + _iterator.f(); + return _context8.finish(64); + case 67: + syncToken = []; + return _context8.abrupt("return", aggregatedResponse); + case 71: + _context8.prev = 71; + _context8.t3 = _context8["catch"](0); + throw new Error("Failed to fetch sync data: ".concat(_context8.t3.message)); + case 74: + case "end": + return _context8.stop(); + } + }, _callee8, null, [[0, 71], [7, 13], [30, 61, 64, 67], [35, 41]]); + })(); + }); + return function getSyncData(_x18, _x19, _x20, _x21) { + return _ref8.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..03f0289 --- /dev/null +++ b/gatsby-plugin-image.js @@ -0,0 +1,206 @@ +'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 _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), 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 _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 _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + content_type = props.image.content_type; + extension = mimeTypeExtensions[content_type]; + _context.next = 4; + return fetchRemoteFile({ + url: csImageUrl, + cache: cache, + ext: extension + }); + case 4: + absolutePath = _context.sent; + _context.next = 7; + return readFile(absolutePath); + case 7: + base64 = _context.sent.toString('base64'); + return _context.abrupt("return", "data:image/".concat(toFormat || originalFormat, ";base64,").concat(base64)); + case 9: + 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 _callee2$(_context2) { + while (1) switch (_context2.prev = _context2.next) { + case 0: + if (isImage(image)) { + _context2.next = 2; + break; + } + return _context2.abrupt("return", null); + case 2: + _context2.next = 4; + return Promise.resolve().then(function () { + return _interopRequireWildcard(require('gatsby-plugin-image')); + }); + case 4: + _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 = 15; + break; + } + _context2.next = 14; + return getBase64Image({ + baseUrl: baseUrl, + image: image, + options: options + }, cache, reporter); + case 14: + placeholderDataURI = _context2.sent; + case 15: + if (placeholderDataURI) { + imageProps.placeholder = { + fallback: placeholderDataURI + }; + } + return _context2.abrupt("return", imageProps); + case 17: + 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/node-helper.js b/node-helper.js new file mode 100644 index 0000000..a6f6ab9 --- /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 _callee$(_context) { + while (1) switch (_context.prev = _context.next) { + case 0: + if (!(process.env.NODE_ENV === "test")) { + _context.next = 2; + break; + } + return _context.abrupt("return", undefined); + case 2: + host = pluginOptions.cdn ? pluginOptions.cdn : 'https://cdn.contentstack.io/v3'; + _context.next = 5; + 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 5: + return _context.abrupt("return", undefined); + case 6: + 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/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..c9a4cc4 --- /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; + return _regenerator["default"].wrap(function _callee$(_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 = 2; + contentTypeOption = getContentTypeOption(configOptions); + _context.next = 6; + return fetchData(configOptions, reporter, cache, contentTypeOption); + case 6: + _yield$fetchData = _context.sent; + _contentstackData = _yield$fetchData.contentstackData; + contentstackData = _contentstackData; + _context.next = 11; + return cache.get(typePrefix); + case 11: + contentstackData.contentTypes = _context.sent; + _context.next = 18; + break; + case 14: + _context.prev = 14; + _context.t0 = _context["catch"](2); + 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: _context.t0 + }); + throw _context.t0; + case 18: + 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 = 28; + return cache.set(ASSET_NODE_UIDS, assetUids); + case 28: + _context.t1 = configOptions.downloadImages; + if (!_context.t1) { + _context.next = 32; + break; + } + _context.next = 32; + return cache.set(SUPPORTED_FILES_COUNT, countOfSupportedFormatFiles); + case 32: + 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 = 39; + break; + } + _context.next = 39; + return downloadAssets({ + cache: cache, + getCache: getCache, + createNode: createNode, + createNodeId: createNodeId, + getNodesByType: getNodesByType, + reporter: reporter, + createNodeField: createNodeField, + getNode: getNode + }, typePrefix, configOptions); + case 39: + // 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 44: + case "end": + return _context.stop(); + } + }, _callee, null, [[2, 14]]); + })(); + }); + return function (_x, _x2) { + return _ref.apply(this, arguments); + }; +}(); +//# sourceMappingURL=source-node.js.map \ No newline at end of file diff --git a/src/fetch.js b/src/fetch.js index 696b6cf..e394f95 100644 --- a/src/fetch.js +++ b/src/fetch.js @@ -313,11 +313,14 @@ const getSyncData = async ( ); } catch (error) { console.error("Got Error 2", error); + console.log("SyncRetryCount:", SyncRetryCount); + console.log("Config.httpRetries:", config.httpRetries); if (SyncRetryCount < config.httpRetries) { const timeToWait = 2 ** SyncRetryCount * 100; SyncRetryCount++; //Retry attempt ${retries + 1} after sync token error. Waiting for ${timeToWait} ms... await waitFor(timeToWait); + console.log("Retrying for sync token:", token); return (syncResponse = await fetchCsData( url, config, 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 From e5b300550dc32c56d4ef47ac5e5a670805b0ed76 Mon Sep 17 00:00:00 2001 From: Ankita Dodamani Date: Mon, 17 Feb 2025 03:21:38 +0530 Subject: [PATCH 09/12] chore: refactored fetch.js to maintain --- .gitignore | 1 + LICENCE | 21 -- contenttype-data.js | 223 ------------ create-resolvers.js | 218 ------------ create-schema-customization.js | 218 ------------ download-assets.js | 215 ------------ entry-data.js | 597 --------------------------------- fetch.js | 480 -------------------------- gatsby-node.js | 21 -- gatsby-plugin-image.js | 206 ------------ image-helper.js | 48 --- node-helper.js | 76 ----- normalize.js | 520 ---------------------------- package.json | 6 +- plugin-init.js | 36 -- plugin-options-schema.js | 28 -- pre-bootstrap.js | 10 - source-node.js | 192 ----------- src/fetch.js | 461 ++++++++++++++----------- utils.js | 76 ----- 20 files changed, 262 insertions(+), 3391 deletions(-) delete mode 100644 LICENCE delete mode 100644 contenttype-data.js delete mode 100644 create-resolvers.js delete mode 100644 create-schema-customization.js delete mode 100644 download-assets.js delete mode 100644 entry-data.js delete mode 100644 fetch.js delete mode 100644 gatsby-node.js delete mode 100644 gatsby-plugin-image.js delete mode 100644 image-helper.js delete mode 100644 node-helper.js delete mode 100644 normalize.js delete mode 100644 plugin-init.js delete mode 100644 plugin-options-schema.js delete mode 100644 pre-bootstrap.js delete mode 100644 source-node.js delete mode 100644 utils.js diff --git a/.gitignore b/.gitignore index 20892f1..04f8127 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ node_modules .DS_Store err out +build/ \ No newline at end of file diff --git a/LICENCE b/LICENCE deleted file mode 100644 index 816ce04..0000000 --- a/LICENCE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2025 Contentstack - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/contenttype-data.js b/contenttype-data.js deleted file mode 100644 index 1457766..0000000 --- a/contenttype-data.js +++ /dev/null @@ -1,223 +0,0 @@ -'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 _callee$(_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 _callee2$(_context2) { - while (1) switch (_context2.prev = _context2.next) { - case 0: - query = { - include_global_field_schema: true - }; - _context2.next = 3; - return fn.apply(null, [url, config, responseKey, query]); - case 3: - result = _context2.sent; - return _context2.abrupt("return", result); - case 5: - 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 _callee3$(_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 = 3; - return fn.apply(null, [url, config, responseKey, query]); - case 3: - contentTypes = _context3.sent; - referredContentTypes = new ReferredContentTypes(); - referredContentTypesList = referredContentTypes.getReferredContentTypes(contentTypes); - referredContentTypesData = []; - if (!referredContentTypesList.length) { - _context3.next = 12; - break; - } - query.query = JSON.stringify({ - uid: { - $in: referredContentTypesList - } - }); - _context3.next = 11; - return fn.apply(null, [url, config, responseKey, query]); - case 11: - referredContentTypesData = _context3.sent; - case 12: - result = contentTypes.concat(referredContentTypesData); - return _context3.abrupt("return", result); - case 14: - 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 _callee4$(_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 = 3; - return fn.apply(null, [url, config, responseKey, query]); - case 3: - contentTypes = _context4.sent; - referredContentTypes = new ReferredContentTypes(); - referredContentTypesList = referredContentTypes.getReferredContentTypes(contentTypes); - referredContentTypesData = []; - if (!referredContentTypesList.length) { - _context4.next = 12; - break; - } - query.query = JSON.stringify({ - uid: { - $in: referredContentTypesList - } - }); - _context4.next = 11; - return fn.apply(null, [url, config, responseKey, query]); - case 11: - referredContentTypesData = _context4.sent; - case 12: - result = contentTypes.concat(referredContentTypesData); - return _context4.abrupt("return", result); - case 14: - case "end": - return _context4.stop(); - } - }, _callee4); - })); - function getPagedData(_x9, _x10, _x11, _x12) { - 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 deleted file mode 100644 index 11ecbf5..0000000 --- a/create-resolvers.js +++ /dev/null @@ -1,218 +0,0 @@ -'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 _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - resolvers = {}; - typePrefix = configOptions.type_prefix || 'Contentstack'; - _context.next = 4; - 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 4: - _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 = 12; - return cache.get(typePrefix); - case 12: - 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 21: - 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 deleted file mode 100644 index fa52fcc..0000000 --- a/create-schema-customization.js +++ /dev/null @@ -1,218 +0,0 @@ -'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 _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } -function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), 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 _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; - return _regenerator["default"].wrap(function _callee2$(_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 = 3; - contentTypeOption = getContentTypeOption(configOptions); - _context2.next = 7; - return fetchContentTypes(configOptions, contentTypeOption); - case 7: - contentTypes = _context2.sent; - _context2.next = 10; - return cache.set(typePrefix, contentTypes); - case 10: - _context2.next = 15; - break; - case 12: - _context2.prev = 12; - _context2.t0 = _context2["catch"](3); - console.error('Contentstack fetch content type failed!'); - case 15: - references = [], groups = [], fileFields = [], jsonRteFields = []; - if (!configOptions.enableSchemaGeneration) { - _context2.next = 52; - 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 = 20; - _context2.next = 23; - return Promise.resolve().then(function () { - return _interopRequireWildcard(require('gatsby-plugin-image/graphql-utils')); - }); - case 23: - _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 _callee$(_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 = 34; - break; - case 31: - _context2.prev = 31; - _context2.t1 = _context2["catch"](20); - if (_context2.t1.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 34: - 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); - }); - _context2.t2 = Promise; - _context2.next = 39; - return cache.set("".concat(typePrefix, "_").concat(configOptions.api_key, "_references"), references); - case 39: - _context2.t3 = _context2.sent; - _context2.next = 42; - return cache.set("".concat(typePrefix, "_").concat(configOptions.api_key, "_groups"), groups); - case 42: - _context2.t4 = _context2.sent; - _context2.next = 45; - return cache.set("".concat(typePrefix, "_").concat(configOptions.api_key, "_file_fields"), fileFields); - case 45: - _context2.t5 = _context2.sent; - _context2.next = 48; - return cache.set("".concat(typePrefix, "_").concat(configOptions.api_key, "_json_rte_fields"), jsonRteFields); - case 48: - _context2.t6 = _context2.sent; - _context2.t7 = [_context2.t3, _context2.t4, _context2.t5, _context2.t6]; - _context2.next = 52; - return _context2.t2.all.call(_context2.t2, _context2.t7); - case 52: - case "end": - return _context2.stop(); - } - }, _callee2, null, [[3, 12], [20, 31]]); - })(); - }); - 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 deleted file mode 100644 index 80a52df..0000000 --- a/download-assets.js +++ /dev/null @@ -1,215 +0,0 @@ -'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; - return _regenerator["default"].wrap(function _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - _context.prev = 0; - _context.next = 3; - return cache.get(ASSET_NODE_UIDS); - case 3: - 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 = 8; - return cache.get(SUPPORTED_FILES_COUNT); - case 8: - totalJobs = _context.sent; - // Create progress bar - bar = createProgress("Downloading remote files", reporter); - bar.start(); - bar.total = totalJobs; - i = 0; - case 13: - if (!(i < batches.length)) { - _context.next = 45; - 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 20: - if (!(j < lastCount)) { - _context.next = 38; - 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 = 25; - break; - } - shouldBreak = true; - return _context.abrupt("break", 38); - case 25: - // 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 = 35; - break; - } - _context.t0 = batchPromises; - _context.next = 33; - return createRemoteFileNodePromise({ - cache: cache, - getCache: getCache, - createNode: createNode, - createNodeId: createNodeId, - createNodeField: createNodeField - }, asset, typePrefix, reporter); - case 33: - _context.t1 = _context.sent; - _context.t0.push.call(_context.t0, _context.t1); - case 35: - j++; - _context.next = 20; - break; - case 38: - if (!shouldBreak) { - _context.next = 40; - break; - } - return _context.abrupt("break", 45); - case 40: - _context.next = 42; - return Promise.all(batchPromises); - case 42: - i++; - _context.next = 13; - break; - case 45: - bar && bar.done(); - sizeBar && sizeBar.done(); - reporter.verbose("Total size of downloaded files ".concat(totalSize)); - _context.next = 53; - break; - case 50: - _context.prev = 50; - _context.t2 = _context["catch"](0); - reporter.info('Something went wrong while downloading assets. Details: ' + _context.t2); - case 53: - case "end": - return _context.stop(); - } - }, _callee, null, [[0, 50]]); - })(); - }); - 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; - return _regenerator["default"].wrap(function _callee2$(_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 = 5; - return params.cache.get(assetUid); - case 5: - 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 = 19; - break; - } - _context2.next = 10; - return createRemoteFileNode(_objectSpread(_objectSpread({}, params), {}, { - url: encodeURI(node.url), - parentNodeId: node.id - })); - case 10: - fileNode = _context2.sent; - if (!fileNode) { - _context2.next = 19; - 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 = 19; - return params.cache.set(assetUid, fileNode); - case 19: - bar.tick(); - if (fileNode) { - params.createNodeField({ - node: node, - name: 'localAsset', - value: fileNode.id - }); - } - return _context2.abrupt("return", fileNode); - case 24: - _context2.prev = 24; - _context2.t0 = _context2["catch"](0); - reporter.info('Something went wrong while creating file nodes. Details: ' + _context2.t0); - case 27: - case "end": - return _context2.stop(); - } - }, _callee2, null, [[0, 24]]); - })); - 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 deleted file mode 100644 index 4f04fd0..0000000 --- a/entry-data.js +++ /dev/null @@ -1,597 +0,0 @@ -'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 _callee$(_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; - return _regenerator["default"].wrap(function _callee2$(_context2) { - while (1) switch (_context2.prev = _context2.next) { - case 0: - typePrefix = configOptions.type_prefix || 'Contentstack'; - syncData = {}; - _context2.prev = 2; - if (!configOptions.expediteBuild) { - _context2.next = 28; - 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 = 8; - return Promise.all([cache.get(entryTokenKey), cache.get(assetTokenKey)]); - case 8: - _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 = 18; - return Promise.all([fn.apply(null, [syncEntryParams, configOptions]), fn.apply(null, [syncAssetParams, configOptions])]); - case 18: - _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 = 26; - return Promise.all([cache.set(entryTokenKey, syncEntryData.sync_token), cache.set(assetTokenKey, syncAssetData.sync_token)]); - case 26: - _context2.next = 38; - break; - case 28: - tokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-").concat(configOptions.api_key); - _context2.next = 31; - return cache.get(tokenKey); - case 31: - syncToken = _context2.sent; - syncParams = syncToken ? { - sync_token: syncToken - } : { - init: true, - limit: configOptions.limit > 100 ? 50 : configOptions.limit - }; - _context2.next = 35; - return fn.apply(null, [syncParams, configOptions]); - case 35: - syncData = _context2.sent; - _context2.next = 38; - return cache.set(tokenKey, syncData.sync_token); - case 38: - _context2.next = 43; - break; - case 40: - _context2.prev = 40; - _context2.t0 = _context2["catch"](2); - throw _context2.t0; - case 43: - return _context2.abrupt("return", syncData); - case 44: - case "end": - return _context2.stop(); - } - }, _callee2, null, [[2, 40]]); - })); - 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; - return _regenerator["default"].wrap(function _callee3$(_context3) { - while (1) switch (_context3.prev = _context3.next) { - case 0: - _context3.prev = 0; - _context3.next = 3; - return Promise.all([this.fetchEntries(configOptions, cache, fn), this.fetchAssets(configOptions, cache, fn)]); - case 3: - _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 12: - _context3.prev = 12; - _context3.t0 = _context3["catch"](0); - throw _context3.t0; - case 15: - case "end": - return _context3.stop(); - } - }, _callee3, this, [[0, 12]]); - })); - 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; - return _regenerator["default"].wrap(function _callee4$(_context4) { - while (1) switch (_context4.prev = _context4.next) { - case 0: - _context4.prev = 0; - syncData = {}; - typePrefix = configOptions.type_prefix || 'Contentstack'; - _context4.next = 5; - return cache.get(typePrefix); - case 5: - contentTypes = _context4.sent; - i = 0; - case 7: - if (!(i < contentTypes.length)) { - _context4.next = 25; - break; - } - contentType = contentTypes[i].uid; - tokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-").concat(contentType, "-").concat(configOptions.api_key); - _context4.next = 12; - return cache.get(tokenKey); - case 12: - syncToken = _context4.sent; - syncParams = syncToken ? { - sync_token: syncToken - } : { - init: true - }; - syncParams.content_type_uid = contentType; - _context4.next = 17; - return fn.apply(null, [syncParams, configOptions]); - case 17: - _syncData = _context4.sent; - syncData.data = syncData.data || []; - syncData.data = syncData.data.concat(_syncData.data); - // Caching token for the next sync. - _context4.next = 22; - return cache.set(tokenKey, _syncData.sync_token); - case 22: - i++; - _context4.next = 7; - break; - case 25: - return _context4.abrupt("return", syncData); - case 28: - _context4.prev = 28; - _context4.t0 = _context4["catch"](0); - throw _context4.t0; - case 31: - case "end": - return _context4.stop(); - } - }, _callee4, null, [[0, 28]]); - })); - 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; - return _regenerator["default"].wrap(function _callee5$(_context5) { - while (1) switch (_context5.prev = _context5.next) { - case 0: - _context5.prev = 0; - fetchAssetService = new FetchAssets(); - _context5.next = 4; - return fetchAssetService.fetchAssets(configOptions, cache, fn); - case 4: - syncData = _context5.sent; - return _context5.abrupt("return", syncData); - case 8: - _context5.prev = 8; - _context5.t0 = _context5["catch"](0); - throw _context5.t0; - case 11: - case "end": - return _context5.stop(); - } - }, _callee5, null, [[0, 8]]); - })); - function fetchAssets(_x10, _x11, _x12) { - 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 _callee6$(_context6) { - while (1) switch (_context6.prev = _context6.next) { - case 0: - _context6.next = 2; - return Promise.all([this.fetchEntries(configOptions, cache, fn), this.fetchAssets(configOptions, cache, fn)]); - case 2: - _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 9: - case "end": - return _context6.stop(); - } - }, _callee6, this); - })); - function fetchSyncData(_x13, _x14, _x15) { - 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; - return _regenerator["default"].wrap(function _callee7$(_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 5: - if (!(i < locales.length)) { - _context7.next = 23; - break; - } - locale = locales[i]; - tokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-").concat(locale, "-").concat(configOptions.api_key); - _context7.next = 10; - return cache.get(tokenKey); - case 10: - syncToken = _context7.sent; - syncParams = syncToken ? { - sync_token: syncToken - } : { - init: true - }; - syncParams.locale = locale; - _context7.next = 15; - return fn.apply(null, [syncParams, configOptions]); - case 15: - _syncData = _context7.sent; - syncData.data = syncData.data || []; - syncData.data = syncData.data.concat(_syncData.data); - // Caching token for next sync - _context7.next = 20; - return cache.set(tokenKey, _syncData.sync_token); - case 20: - i++; - _context7.next = 5; - break; - case 23: - return _context7.abrupt("return", syncData); - case 26: - _context7.prev = 26; - _context7.t0 = _context7["catch"](0); - throw _context7.t0; - case 29: - case "end": - return _context7.stop(); - } - }, _callee7, null, [[0, 26]]); - })); - function fetchEntries(_x16, _x17, _x18) { - 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; - return _regenerator["default"].wrap(function _callee8$(_context8) { - while (1) switch (_context8.prev = _context8.next) { - case 0: - _context8.prev = 0; - fetchAssetService = new FetchAssets(); - _context8.next = 4; - return fetchAssetService.fetchAssets(configOptions, cache, fn); - case 4: - syncData = _context8.sent; - return _context8.abrupt("return", syncData); - case 8: - _context8.prev = 8; - _context8.t0 = _context8["catch"](0); - throw _context8.t0; - case 11: - case "end": - return _context8.stop(); - } - }, _callee8, null, [[0, 8]]); - })); - function fetchAssets(_x19, _x20, _x21) { - 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$all10, syncEntryData, syncAssetData, syncData; - return _regenerator["default"].wrap(function _callee9$(_context9) { - while (1) switch (_context9.prev = _context9.next) { - case 0: - _context9.next = 2; - return Promise.all([this.fetchEntries(configOptions, cache, fn), this.fetchAssets(configOptions, cache, fn)]); - case 2: - _yield$Promise$all9 = _context9.sent; - _yield$Promise$all10 = (0, _slicedToArray2["default"])(_yield$Promise$all9, 2); - syncEntryData = _yield$Promise$all10[0]; - syncAssetData = _yield$Promise$all10[1]; - syncData = {}; - syncData.data = syncEntryData.data.concat(syncAssetData.data); - return _context9.abrupt("return", syncData); - case 9: - case "end": - return _context9.stop(); - } - }, _callee9, this); - })); - function fetchSyncData(_x22, _x23, _x24) { - return _fetchSyncData5.apply(this, arguments); - } - return fetchSyncData; - }() - }, { - key: "fetchEntries", - value: function () { - var _fetchEntries3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee10(configOptions, cache, fn) { - var syncData, typePrefix, contentTypes, locales, i, contentType, j, locale, tokenKey, syncToken, syncParams, _syncData; - return _regenerator["default"].wrap(function _callee10$(_context10) { - while (1) switch (_context10.prev = _context10.next) { - case 0: - _context10.prev = 0; - syncData = {}; - typePrefix = configOptions.type_prefix || 'Contentstack'; - _context10.next = 5; - return cache.get(typePrefix); - case 5: - contentTypes = _context10.sent; - locales = configOptions.locales; - i = 0; - case 8: - if (!(i < contentTypes.length)) { - _context10.next = 33; - break; - } - contentType = contentTypes[i].uid; - j = 0; - case 11: - if (!(j < locales.length)) { - _context10.next = 30; - break; - } - locale = locales[j]; - tokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-").concat(contentType, "-").concat(locale, "-").concat(configOptions.api_key); - _context10.next = 16; - return cache.get(tokenKey); - case 16: - syncToken = _context10.sent; - syncParams = syncToken ? { - sync_token: syncToken - } : { - init: true - }; - syncParams.content_type_uid = contentType; - syncParams.locale = locale; - _context10.next = 22; - return fn.apply(null, [syncParams, configOptions]); - case 22: - _syncData = _context10.sent; - syncData.data = syncData.data || []; - syncData.data = syncData.data.concat(_syncData.data); - // Caching token for next sync - _context10.next = 27; - return cache.set(tokenKey, _syncData.sync_token); - case 27: - j++; - _context10.next = 11; - break; - case 30: - i++; - _context10.next = 8; - break; - case 33: - return _context10.abrupt("return", syncData); - case 36: - _context10.prev = 36; - _context10.t0 = _context10["catch"](0); - throw _context10.t0; - case 39: - case "end": - return _context10.stop(); - } - }, _callee10, null, [[0, 36]]); - })); - function fetchEntries(_x25, _x26, _x27) { - return _fetchEntries3.apply(this, arguments); - } - return fetchEntries; - }() - }, { - key: "fetchAssets", - value: function () { - var _fetchAssets3 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee11(configOptions, cache, fn) { - var fetchAssetService, syncData; - return _regenerator["default"].wrap(function _callee11$(_context11) { - while (1) switch (_context11.prev = _context11.next) { - case 0: - _context11.prev = 0; - fetchAssetService = new FetchAssets(); - _context11.next = 4; - return fetchAssetService.fetchAssets(configOptions, cache, fn); - case 4: - syncData = _context11.sent; - return _context11.abrupt("return", syncData); - case 8: - _context11.prev = 8; - _context11.t0 = _context11["catch"](0); - throw _context11.t0; - case 11: - case "end": - return _context11.stop(); - } - }, _callee11, null, [[0, 8]]); - })); - function fetchAssets(_x28, _x29, _x30) { - 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 _callee12(configOptions, cache, fn) { - var typePrefix, syncData, assetTokenKey, syncAssetToken, syncAssetParams, syncAssetData; - return _regenerator["default"].wrap(function _callee12$(_context12) { - while (1) switch (_context12.prev = _context12.next) { - case 0: - typePrefix = configOptions.type_prefix || 'Contentstack'; - _context12.prev = 1; - syncData = {}; - assetTokenKey = "".concat(typePrefix.toLowerCase(), "-sync-token-asset-").concat(configOptions.api_key); - _context12.next = 6; - return cache.get(assetTokenKey); - case 6: - syncAssetToken = _context12.sent; - syncAssetParams = syncAssetToken ? { - sync_token: syncAssetToken - } : { - init: true - }; - syncAssetParams.type = 'asset_published,asset_unpublished,asset_deleted'; - _context12.next = 11; - return fn.apply(null, [syncAssetParams, configOptions]); - case 11: - syncAssetData = _context12.sent; - syncData.data = syncAssetData.data; - _context12.next = 15; - return cache.set(assetTokenKey, syncAssetData.sync_token); - case 15: - return _context12.abrupt("return", syncData); - case 18: - _context12.prev = 18; - _context12.t0 = _context12["catch"](1); - throw _context12.t0; - case 21: - case "end": - return _context12.stop(); - } - }, _callee12, null, [[1, 18]]); - })); - function fetchAssets(_x31, _x32, _x33) { - 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 deleted file mode 100644 index 79c3dcd..0000000 --- a/fetch.js +++ /dev/null @@ -1,480 +0,0 @@ -'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; - return _regenerator["default"].wrap(function _callee$(_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 = 3; - syncData = {}; - entryService = new OPTIONS_ENTRIES_CLASS_MAPPING[contentTypeOption](); - _context.next = 8; - return entryService.fetchSyncData(configOptions, cache, fetchSyncData); - case 8: - _syncData = _context.sent; - syncData.data = _syncData.data; - contentstackData = { - syncData: syncData.data - }; - activity.end(); - return _context.abrupt("return", { - contentstackData: contentstackData - }); - case 15: - _context.prev = 15; - _context.t0 = _context["catch"](3); - 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: _context.t0 - }); - case 18: - case "end": - return _context.stop(); - } - }, _callee, null, [[3, 15]]); - })); - 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; - return _regenerator["default"].wrap(function _callee2$(_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 = 8; - return contentType.getPagedData(url, config, responseKey, _getPagedData); - case 8: - allContentTypes = _context2.sent; - return _context2.abrupt("return", allContentTypes); - case 12: - _context2.prev = 12; - _context2.t0 = _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: _context2.t0 - }); - case 15: - case "end": - return _context2.stop(); - } - }, _callee2, null, [[1, 12]]); - })); - 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 _callee3$(_context3) { - while (1) switch (_context3.prev = _context3.next) { - case 0: - url = 'stacks/sync'; - _context3.next = 3; - return _getSyncData(url, config, query, 'items'); - case 3: - response = _context3.sent; - return _context3.abrupt("return", response); - case 5: - 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 _callee5$(_context5) { - while (1) switch (_context5.prev = _context5.next) { - case 0: - console.log("URL:", url); - 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) { - console.error("data ERROR: ", data); - if (data.error_code >= 500) { - throw new Error("Server error: ".concat(data.error_code)); - } - reject(data); - } else { - if (data.items) { - var filteredData = data === null || data === void 0 ? void 0 : data.items.filter(function (item) { - return item.data.hasOwnProperty('publish_details'); - }); - data.items = filteredData; - } - 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 _callee4$(_context4) { - while (1) switch (_context4.prev = _context4.next) { - case 0: - retryAttempt = globalConfig.httpRetries ? globalConfig.httpRetries : 3; - if (!(retries < retryAttempt)) { - _context4.next = 9; - break; - } - retries++; - timeToWait = Math.pow(2, retries) * 100; - _context4.next = 6; - return waitFor(timeToWait); - case 6: - _handleResponse(); - _context4.next = 11; - break; - case 9: - console.error("Got an ERROR:", err); - reject(new Error("Fetch failed after ".concat(retryAttempt, " retry attempts."))); - case 11: - case "end": - return _context4.stop(); - } - }, _callee4); - })); - return function (_x11) { - return _ref5.apply(this, arguments); - }; - }()); - }; - retries = 1; - _handleResponse(); - })); - case 3: - case "end": - return _context5.stop(); - } - }, _callee5); - })); - return function getData(_x9, _x10) { - 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 _callee6$(_context6) { - while (1) switch (_context6.prev = _context6.next) { - case 0: - if (query && query.sync_token) { - console.log("Query contains sync_token:", query.sync_token); - } - 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 = 9; - return getData(apiUrl, option); - case 9: - data = _context6.sent; - console.log("Data fetched from getData fucntion:", data); - return _context6.abrupt("return", data); - case 12: - case "end": - return _context6.stop(); - } - }, _callee6); - })); - return function fetchCsData(_x12, _x13, _x14) { - 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 _callee7$(_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 = 6; - return fetchCsData(url, config, query); - case 6: - response = _context7.sent; - if (!aggregatedResponse) { - aggregatedResponse = response[responseKey]; - } else { - aggregatedResponse = aggregatedResponse.concat(response[responseKey]); - } - if (!(skip + limit <= response.count)) { - _context7.next = 10; - break; - } - return _context7.abrupt("return", _getPagedData(url, config, responseKey, query = {}, skip + limit, limit, aggregatedResponse)); - case 10: - return _context7.abrupt("return", aggregatedResponse); - case 11: - case "end": - return _context7.stop(); - } - }, _callee7); - })(); - }); - return function getPagedData(_x15, _x16, _x17) { - 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, timeToWait, aggregatedSyncToken, SyncRetryCount, _iterator, _step, _aggregatedResponse$d, _aggregatedResponse$d2, token, syncResponse, _timeToWait; - return _regenerator["default"].wrap(function _callee8$(_context8) { - while (1) switch (_context8.prev = _context8.next) { - case 0: - _context8.prev = 0; - _context8.next = 3; - return fetchCsData(url, config, query); - case 3: - response = _context8.sent; - /* - Below syncToken array would contain type --> 'asset_published', 'entry_published' sync tokens - */ - if (response.items.some(function (item) { - return ['entry_published', 'asset_published'].includes(item.type); - })) { - 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; - } - if (!response.pagination_token) { - _context8.next = 25; - break; - } - _context8.prev = 7; - _context8.next = 10; - return _getSyncData(url, config, { - pagination_token: response.pagination_token - }, responseKey, aggregatedResponse, 0 // Reset retries for each call - ); - case 10: - return _context8.abrupt("return", _context8.sent); - case 13: - _context8.prev = 13; - _context8.t0 = _context8["catch"](7); - if (!(retries < config.httpRetries)) { - _context8.next = 24; - break; - } - timeToWait = Math.pow(2, retries) * 100; //Retry attempt ${retries + 1} after pagination token error. Waiting for ${timeToWait} ms... - _context8.next = 19; - return waitFor(timeToWait); - case 19: - _context8.next = 21; - return _getSyncData(url, config, { - pagination_token: response.pagination_token - }, responseKey, aggregatedResponse, retries + 1); - case 21: - return _context8.abrupt("return", _context8.sent); - case 24: - throw new Error("Failed to fetch sync data after ".concat(config.httpRetries, " retry attempts due to invalid pagination token.")); - case 25: - if (!response.sync_token) { - _context8.next = 67; - break; - } - /** - * To make final sync call and concatenate the result if found any during on fetch request. - */ - aggregatedSyncToken = syncToken.filter(function (item) { - return item !== undefined; - }); - console.log('Sync Tokens:', aggregatedSyncToken); - SyncRetryCount = 0; - _iterator = _createForOfIteratorHelper(aggregatedSyncToken); - _context8.prev = 30; - _iterator.s(); - case 32: - if ((_step = _iterator.n()).done) { - _context8.next = 59; - break; - } - token = _step.value; - syncResponse = void 0; - _context8.prev = 35; - _context8.next = 38; - return fetchCsData(url, config, query = { - sync_token: "".concat(token, "uce") - }); - case 38: - syncResponse = _context8.sent; - _context8.next = 55; - break; - case 41: - _context8.prev = 41; - _context8.t1 = _context8["catch"](35); - console.error("Got Error 2", _context8.t1); - if (!(SyncRetryCount < config.httpRetries)) { - _context8.next = 54; - break; - } - _timeToWait = Math.pow(2, SyncRetryCount) * 100; - SyncRetryCount++; - //Retry attempt ${retries + 1} after sync token error. Waiting for ${timeToWait} ms... - _context8.next = 49; - return waitFor(_timeToWait); - case 49: - _context8.next = 51; - return fetchCsData(url, config, query = { - sync_token: token - }); - case 51: - return _context8.abrupt("return", syncResponse = _context8.sent); - case 54: - throw new Error("Failed to fetch sync data after ".concat(config.httpRetries, " retry attempts due to invalid sync token.")); - case 55: - aggregatedResponse.data = (_aggregatedResponse$d = aggregatedResponse.data) === null || _aggregatedResponse$d === void 0 ? void 0 : (_aggregatedResponse$d2 = _aggregatedResponse$d).concat.apply(_aggregatedResponse$d2, (0, _toConsumableArray2["default"])(syncResponse.items)); - aggregatedResponse.sync_token = syncResponse.sync_token; - case 57: - _context8.next = 32; - break; - case 59: - _context8.next = 64; - break; - case 61: - _context8.prev = 61; - _context8.t2 = _context8["catch"](30); - _iterator.e(_context8.t2); - case 64: - _context8.prev = 64; - _iterator.f(); - return _context8.finish(64); - case 67: - syncToken = []; - return _context8.abrupt("return", aggregatedResponse); - case 71: - _context8.prev = 71; - _context8.t3 = _context8["catch"](0); - throw new Error("Failed to fetch sync data: ".concat(_context8.t3.message)); - case 74: - case "end": - return _context8.stop(); - } - }, _callee8, null, [[0, 71], [7, 13], [30, 61, 64, 67], [35, 41]]); - })(); - }); - return function getSyncData(_x18, _x19, _x20, _x21) { - return _ref8.apply(this, arguments); - }; -}(); -//# sourceMappingURL=fetch.js.map \ No newline at end of file diff --git a/gatsby-node.js b/gatsby-node.js deleted file mode 100644 index e9a9bf4..0000000 --- a/gatsby-node.js +++ /dev/null @@ -1,21 +0,0 @@ -'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 deleted file mode 100644 index 03f0289..0000000 --- a/gatsby-plugin-image.js +++ /dev/null @@ -1,206 +0,0 @@ -'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 _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } -function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), 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 _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 _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - content_type = props.image.content_type; - extension = mimeTypeExtensions[content_type]; - _context.next = 4; - return fetchRemoteFile({ - url: csImageUrl, - cache: cache, - ext: extension - }); - case 4: - absolutePath = _context.sent; - _context.next = 7; - return readFile(absolutePath); - case 7: - base64 = _context.sent.toString('base64'); - return _context.abrupt("return", "data:image/".concat(toFormat || originalFormat, ";base64,").concat(base64)); - case 9: - 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 _callee2$(_context2) { - while (1) switch (_context2.prev = _context2.next) { - case 0: - if (isImage(image)) { - _context2.next = 2; - break; - } - return _context2.abrupt("return", null); - case 2: - _context2.next = 4; - return Promise.resolve().then(function () { - return _interopRequireWildcard(require('gatsby-plugin-image')); - }); - case 4: - _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 = 15; - break; - } - _context2.next = 14; - return getBase64Image({ - baseUrl: baseUrl, - image: image, - options: options - }, cache, reporter); - case 14: - placeholderDataURI = _context2.sent; - case 15: - if (placeholderDataURI) { - imageProps.placeholder = { - fallback: placeholderDataURI - }; - } - return _context2.abrupt("return", imageProps); - case 17: - 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 deleted file mode 100644 index 35ad778..0000000 --- a/image-helper.js +++ /dev/null @@ -1,48 +0,0 @@ -'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/node-helper.js b/node-helper.js deleted file mode 100644 index a6f6ab9..0000000 --- a/node-helper.js +++ /dev/null @@ -1,76 +0,0 @@ -'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 _callee$(_context) { - while (1) switch (_context.prev = _context.next) { - case 0: - if (!(process.env.NODE_ENV === "test")) { - _context.next = 2; - break; - } - return _context.abrupt("return", undefined); - case 2: - host = pluginOptions.cdn ? pluginOptions.cdn : 'https://cdn.contentstack.io/v3'; - _context.next = 5; - 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 5: - return _context.abrupt("return", undefined); - case 6: - 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 deleted file mode 100644 index c04e4e9..0000000 --- a/normalize.js +++ /dev/null @@ -1,520 +0,0 @@ -'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.json b/package.json index 1da4f11..add55e7 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,10 @@ "description": "Gatsby source plugin for building websites using Contentstack as a data source", "scripts": { "prepublish": "npm run build", - "build": "babel src --out-dir .", + "build": "babel src --out-dir build/", "watch": "babel -w src --out-dir .", - "test": "jest —-colors", - "test:watch": "jest —-colors --watch" + "test": "jest", + "test:watch": "jest —-colors --watch", }, "engines": { "node": ">=18.0.0" diff --git a/plugin-init.js b/plugin-init.js deleted file mode 100644 index b59da50..0000000 --- a/plugin-init.js +++ /dev/null @@ -1,36 +0,0 @@ -'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 deleted file mode 100644 index 18945ad..0000000 --- a/plugin-options-schema.js +++ /dev/null @@ -1,28 +0,0 @@ -'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 deleted file mode 100644 index f6a7148..0000000 --- a/pre-bootstrap.js +++ /dev/null @@ -1,10 +0,0 @@ -'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 deleted file mode 100644 index c9a4cc4..0000000 --- a/source-node.js +++ /dev/null @@ -1,192 +0,0 @@ -'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; - return _regenerator["default"].wrap(function _callee$(_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 = 2; - contentTypeOption = getContentTypeOption(configOptions); - _context.next = 6; - return fetchData(configOptions, reporter, cache, contentTypeOption); - case 6: - _yield$fetchData = _context.sent; - _contentstackData = _yield$fetchData.contentstackData; - contentstackData = _contentstackData; - _context.next = 11; - return cache.get(typePrefix); - case 11: - contentstackData.contentTypes = _context.sent; - _context.next = 18; - break; - case 14: - _context.prev = 14; - _context.t0 = _context["catch"](2); - 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: _context.t0 - }); - throw _context.t0; - case 18: - 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 = 28; - return cache.set(ASSET_NODE_UIDS, assetUids); - case 28: - _context.t1 = configOptions.downloadImages; - if (!_context.t1) { - _context.next = 32; - break; - } - _context.next = 32; - return cache.set(SUPPORTED_FILES_COUNT, countOfSupportedFormatFiles); - case 32: - 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 = 39; - break; - } - _context.next = 39; - return downloadAssets({ - cache: cache, - getCache: getCache, - createNode: createNode, - createNodeId: createNodeId, - getNodesByType: getNodesByType, - reporter: reporter, - createNodeField: createNodeField, - getNode: getNode - }, typePrefix, configOptions); - case 39: - // 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 44: - case "end": - return _context.stop(); - } - }, _callee, null, [[2, 14]]); - })(); - }); - return function (_x, _x2) { - return _ref.apply(this, arguments); - }; -}(); -//# sourceMappingURL=source-node.js.map \ No newline at end of file diff --git a/src/fetch.js b/src/fetch.js index e394f95..e874cc4 100644 --- a/src/fetch.js +++ b/src/fetch.js @@ -52,149 +52,172 @@ let globalConfig; let syncToken = []; -exports.fetchData = async ( - configOptions, - reporter, - cache, - contentTypeOption -) => { - activity = reporter.activityTimer(`Fetching Contentstack data`); +exports.setGlobalConfig = (config) => { + globalConfig = { ...config }; // Creates a new copy to avoid unintended mutations +}; +/* + * Handles errors occurring during the fetch operation. + * @param {Object} reporter - The reporting utility. + * @param {Error} error - The caught error. + */ +function handleFetchError(reporter, error) { + 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, + }); +} + +exports.fetchData = async (configOptions, reporter, cache, contentTypeOption) => { + activity = reporter.activityTimer("Fetching Contentstack data"); activity.start(); - activity.setStatus('Starting to fetch data from Contentstack'); + activity.setStatus("Starting to fetch data from Contentstack"); try { - let syncData = {}; const entryService = new OPTIONS_ENTRIES_CLASS_MAPPING[contentTypeOption](); - const _syncData = await entryService.fetchSyncData( - configOptions, - cache, - fetchSyncData - ); - syncData.data = _syncData.data; - const contentstackData = { syncData: syncData.data }; + const _syncData = await entryService.fetchSyncData(configOptions, cache, fetchSyncData); + const syncData = { data: _syncData.data }; activity.end(); - - return { contentstackData }; + return { contentstackData: syncData.data } } catch (error) { - 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, - }); + handleFetchError(reporter, error); } }; + exports.fetchContentTypes = async (config, contentTypeOption) => { - globalConfig = config; try { - config.cdn = config.cdn ? config.cdn : 'https://cdn.contentstack.io/v3'; + exports.setGlobalConfig(config); // Update safely + + config.cdn = config.cdn || 'https://cdn.contentstack.io/v3'; const url = 'content_types'; const responseKey = 'content_types'; + const contentType = new OPTION_CLASS_MAPPING[contentTypeOption](); + const allContentTypes = await contentType.getPagedData( url, config, responseKey, getPagedData ); + return allContentTypes; } catch (error) { - 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, - }); + handleFetchError(error); } }; + const fetchSyncData = async (query, config) => { - const url = 'stacks/sync'; - const response = await getSyncData(url, config, query, 'items'); + const endpoint = 'stacks/sync'; + const response = await getSyncData(endpoint, config, query, 'items'); return response; }; function waitFor(milliseconds) { return new Promise(resolve => setTimeout(resolve, milliseconds)); } - const getData = async (url, options) => { - console.log("URL:", url); + const maxRetries = globalConfig.httpRetries || 3; let retries = 0; - return new Promise((resolve, reject) => { - const handleResponse = () => { - fetch(url, options) - .then(response => response.json()) - .then(data => { - if (data.error_code) { - console.error("data ERROR: ", data); - if (data.error_code >= 500) { - throw new Error(`Server error: ${data.error_code}`); - } - reject(data); - } else { - if (data.items) { - const filteredData = data?.items.filter(item => { - return item.data.hasOwnProperty('publish_details'); - }); - data.items = filteredData; - } - resolve(data); - } - }) - .catch(async err => { - const retryAttempt = globalConfig.httpRetries - ? globalConfig.httpRetries - : 3; - if (retries < retryAttempt) { - retries++; - const timeToWait = 2 ** retries * 100; - await waitFor(timeToWait); - handleResponse(); - } else { - console.error("Got an ERROR:", err); - reject( - new Error(`Fetch failed after ${retryAttempt} retry attempts.`) - ); - } - }); - }; - retries = 1; - handleResponse(); - }); -}; -const fetchCsData = async (url, config, query) => { - if (query && query.sync_token) { - console.log("Query contains sync_token:", query.sync_token); + while (retries <= maxRetries) { + try { + const response = await fetch(url, options); + const data = await response.json(); + if (data.error_code) { + if (data.error_code >= 500) { + throw new Error(`Server error: ${data.error_code}`); + } + return Promise.reject(data); + } + + if (data.items) { + data.items = data.items.filter(item => item.data?.hasOwnProperty("publish_details")); + } + + return data; + + } catch (error) { + retries++; + + if (retries > maxRetries) { + console.error("Fetch failed after retries:", error); + return Promise.reject(new Error(`Fetch failed after ${maxRetries} retry attempts.`)); + } + + const waitTime = 2 ** retries * 100; + console.warn(`Retrying request (${retries}/${maxRetries}) after ${waitTime}ms...`); + await waitFor(waitTime); + } } - query = query || {}; +}; + +/** + * Builds the API URL with query parameters. + */ +const buildApiUrl = (url, config, query = {}) => { query.include_count = true; query.environment = config.environment; const queryParams = queryString.stringify(query); - const apiUrl = `${config.cdn}/${url}?${queryParams}`; - const option = { - headers: { - 'X-User-Agent': `contentstack-gatsby-source-plugin-${version}`, - api_key: config?.api_key, - access_token: config?.delivery_token, - branch: config?.branch ? config.branch : 'main', - ...getCustomHeaders( - config?.enableEarlyAccessKey, - config?.enableEarlyAccessValue - ), - }, + return `${config.cdn}/${url}?${queryParams}`; +}; + +/** + * Constructs request headers. + */ +const buildHeaders = (config) => { + return { + 'X-User-Agent': `contentstack-gatsby-source-plugin-${version}`, + api_key: config?.api_key, + access_token: config?.delivery_token, + branch: config?.branch ?? 'main', // Uses '??' to ensure 'main' is default + ...getCustomHeaders(config?.enableEarlyAccessKey, config?.enableEarlyAccessValue), }; - const data = await getData(apiUrl, option); - console.log("Data fetched from getData fucntion:", data); +}; + +const fetchCsData = async (url, config, query) => { + if (query?.sync_token) { + } + const apiUrl = buildApiUrl(url, config, query); + const options = { + headers: buildHeaders(config), + }; + const data = await getData(apiUrl, options); return data; }; +/** + * Normalizes the limit value, ensuring it does not exceed 100. + */ +const normalizeLimit = (limit) => { + if (limit > 100) { + console.error('Limit cannot exceed 100. Setting limit to 50.'); + return 50; + } + return limit; +}; + +/** + * Determines if another page needs to be fetched. + */ +const shouldFetchNextPage = (skip, limit, totalCount) => { + return skip + limit <= totalCount; +}; + +/** + * Handles fetching the next page recursively. + */ +const getNextPage = (url, config, responseKey, query, skip, limit, aggregatedResponse) => { + return getPagedData(url, config, responseKey, query, skip + limit, limit, aggregatedResponse); +}; + const getPagedData = async ( url, config, @@ -205,32 +228,136 @@ const getPagedData = async ( aggregatedResponse = null ) => { 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.limit = normalizeLimit(limit); query.include_global_field_schema = true; + const response = await fetchCsData(url, config, query); + + // Aggregate response data + aggregatedResponse = aggregatedResponse + ? aggregatedResponse.concat(response[responseKey]) + : response[responseKey]; + + // Check if more data needs to be fetched + return shouldFetchNextPage(skip, limit, response.count) + ? getNextPage(url, config, responseKey, query, skip, limit, aggregatedResponse) + : aggregatedResponse; +}; + + +/** + * Tracks sync tokens if response contains 'entry_published' or 'asset_published'. + */ +const trackSyncTokens = (response) => { + if (response.items.some(item => ['entry_published', 'asset_published'].includes(item.type))) { + syncToken.push(response.sync_token); + } +}; + +/** + * Aggregates response data for sync. + */ +const processSyncResponse = (response, aggregatedResponse, responseKey) => { if (!aggregatedResponse) { - aggregatedResponse = response[responseKey]; - } else { - aggregatedResponse = aggregatedResponse.concat(response[responseKey]); + return { + data: response[responseKey] || [], + sync_token: response.sync_token, + }; } - if (skip + limit <= response.count) { - return getPagedData( + + return { + data: [...(aggregatedResponse.data || []), ...response[responseKey]], + sync_token: response.sync_token || aggregatedResponse.sync_token, + }; +}; + + + +/** + * Handles fetching data for pagination tokens with retry logic. + */ +const handlePaginationToken = async (url, config, response, responseKey, aggregatedResponse, retries) => { + try { + return await getSyncData( url, config, + { pagination_token: response.pagination_token }, responseKey, - (query = {}), - skip + limit, - limit, - aggregatedResponse + aggregatedResponse, + 0 // Reset retries for pagination ); + } catch (error) { + if (retries < config.httpRetries) { + const timeToWait = 2 ** retries * 100; + await waitFor(timeToWait); + return await getSyncData( + url, + config, + { pagination_token: response.pagination_token }, + responseKey, + aggregatedResponse, + retries + 1 + ); + } else { + throw new Error(`Failed to fetch sync data after ${config.httpRetries} retry attempts due to invalid pagination token.`); + } } +}; + +/** + * Handles fetching additional sync tokens with retry logic. + */ +const handleSyncTokens = async (url, config, aggregatedResponse) => { + let validTokens = syncToken.filter(item => item !== undefined); + + for (const token of validTokens) { + let syncResponse; + let syncRetryCount = 0; + let lastError = null; // Track last error + + try { + syncResponse = await fetchCsData(url, config, { sync_token: token }); + + } catch (error) { + while (syncRetryCount < config.httpRetries) { + syncRetryCount++; + const waitTime = 2 ** syncRetryCount * 100; + + console.warn(`${error.error_message}.! Retrying...`); + + await waitFor(waitTime); + + try { + syncResponse = await fetchCsData(url, config, { sync_token: token }); + break; + } catch (retryError) { + lastError = retryError; + } + } + + // 🚨 Final Failure Handling + if (syncRetryCount === config.httpRetries) { + console.error(`Retries Exhausted... Exiting Gracefully...`); + throw new Error(`${JSON.stringify(lastError || error, null, 2)}`); + } + } + + // ✅ Process response if successful + if (syncResponse) { + aggregatedResponse.data = [...(aggregatedResponse.data || []), ...syncResponse.items]; + aggregatedResponse.sync_token = syncResponse.sync_token; + } + } + return aggregatedResponse; }; + + + + + + const getSyncData = async ( url, config, @@ -242,104 +369,32 @@ const getSyncData = async ( try { const response = await fetchCsData(url, config, query); - /* - Below syncToken array would contain type --> 'asset_published', 'entry_published' sync tokens - */ - if ( - response.items.some(item => - ['entry_published', 'asset_published'].includes(item.type) - ) - ) { - syncToken.push(response.sync_token); - } + // Track sync tokens for 'entry_published' & 'asset_published' + trackSyncTokens(response); - 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; - } + // Aggregate response data + aggregatedResponse = processSyncResponse(response, aggregatedResponse, responseKey); + + // Handle pagination token if (response.pagination_token) { - try { - return await getSyncData( - url, - config, - { pagination_token: response.pagination_token }, - responseKey, - aggregatedResponse, - 0 // Reset retries for each call - ); - } catch (error) { - if (retries < config.httpRetries) { - const timeToWait = 2 ** retries * 100; - //Retry attempt ${retries + 1} after pagination token error. Waiting for ${timeToWait} ms... - await waitFor(timeToWait); - return await getSyncData( - url, - config, - { pagination_token: response.pagination_token }, - responseKey, - aggregatedResponse, - retries + 1 - ); - } else { - throw new Error(`Failed to fetch sync data after ${config.httpRetries} retry attempts due to invalid pagination token.`); - } - } + return await handlePaginationToken(url, config, response, responseKey, aggregatedResponse, retries); } + // Handle sync tokens if (response.sync_token) { - /** - * To make final sync call and concatenate the result if found any during on fetch request. - */ - const aggregatedSyncToken = syncToken.filter(item => item !== undefined); - console.log('Sync Tokens:', aggregatedSyncToken); - let SyncRetryCount = 0; - for (const token of aggregatedSyncToken) { - let syncResponse; - try { - syncResponse = await fetchCsData( - url, - config, - (query = { sync_token: `${token}uce` }) - ); - } catch (error) { - console.error("Got Error 2", error); - console.log("SyncRetryCount:", SyncRetryCount); - console.log("Config.httpRetries:", config.httpRetries); - if (SyncRetryCount < config.httpRetries) { - const timeToWait = 2 ** SyncRetryCount * 100; - SyncRetryCount++; - //Retry attempt ${retries + 1} after sync token error. Waiting for ${timeToWait} ms... - await waitFor(timeToWait); - console.log("Retrying for sync token:", token); - return (syncResponse = await fetchCsData( - url, - config, - (query = { sync_token: token }) - )); - } else { - throw new Error(`Failed to fetch sync data after ${config.httpRetries} retry attempts due to invalid sync token.`); - } - } - aggregatedResponse.data = aggregatedResponse.data?.concat( - ...syncResponse.items - ); - aggregatedResponse.sync_token = syncResponse.sync_token; - } + return await handleSyncTokens(url, config, aggregatedResponse); } - syncToken = []; + syncToken = []; // Reset syncToken after processing return aggregatedResponse; } catch (error) { - throw new Error(`Failed to fetch sync data: ${error.message}`); + throw new Error(`Failed to fetch sync data:\n ${error}`); } -}; \ No newline at end of file +}; + + + + + + + diff --git a/utils.js b/utils.js deleted file mode 100644 index 21a20af..0000000 --- a/utils.js +++ /dev/null @@ -1,76 +0,0 @@ -'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 From 47033df2f8784f80943e2e10a6657b6078337537 Mon Sep 17 00:00:00 2001 From: Ankita Dodamani Date: Mon, 17 Feb 2025 16:26:40 +0530 Subject: [PATCH 10/12] CHORE: Added licence whch was accidently deleted --- LICENCE | 21 +++++++++++++++++++++ package.json | 2 +- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 LICENCE diff --git a/LICENCE b/LICENCE new file mode 100644 index 0000000..816ce04 --- /dev/null +++ b/LICENCE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2025 Contentstack + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/package.json b/package.json index add55e7..f0a5a3c 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "prepublish": "npm run build", "build": "babel src --out-dir build/", "watch": "babel -w src --out-dir .", - "test": "jest", + "test": "jest —-colors", "test:watch": "jest —-colors --watch", }, "engines": { From c321143e15f7e74cdc4f25dfee85851af494acce Mon Sep 17 00:00:00 2001 From: Ankita Dodamani Date: Wed, 19 Feb 2025 15:18:19 +0530 Subject: [PATCH 11/12] chore: PR feedback incorporated --- package.json | 5 +++-- src/fetch.js | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index f0a5a3c..7a9ad53 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,11 @@ "description": "Gatsby source plugin for building websites using Contentstack as a data source", "scripts": { "prepublish": "npm run build", - "build": "babel src --out-dir build/", + "build": "babel src --out-dir .", "watch": "babel -w src --out-dir .", "test": "jest —-colors", "test:watch": "jest —-colors --watch", + "build:dev": "npm run build && cp -r build/ ../../GitHub/GatsbyProject/contentstack-gatsby-starter-app/node_modules/gatsby-source-contentstack/" }, "engines": { "node": ">=18.0.0" @@ -63,7 +64,7 @@ "jest": "^29.7.0", "prettier": "^1.5.3", "semantic-release": "^24.2.0" - }, + }, "peerDependencies": { "gatsby": "^5.14.0", "gatsby-plugin-image": "^3.0.0-next" diff --git a/src/fetch.js b/src/fetch.js index e874cc4..68697b7 100644 --- a/src/fetch.js +++ b/src/fetch.js @@ -79,10 +79,10 @@ exports.fetchData = async (configOptions, reporter, cache, contentTypeOption) => try { const entryService = new OPTIONS_ENTRIES_CLASS_MAPPING[contentTypeOption](); const _syncData = await entryService.fetchSyncData(configOptions, cache, fetchSyncData); - const syncData = { data: _syncData.data }; + const syncData = { syncData: { data: _syncData.data } }; activity.end(); - return { contentstackData: syncData.data } + return { contentstackData: syncData }; } catch (error) { handleFetchError(reporter, error); } From 40a1a0944c96c87e859667788d5c98867c0c1ff7 Mon Sep 17 00:00:00 2001 From: Ankita Dodamani Date: Wed, 19 Feb 2025 15:19:17 +0530 Subject: [PATCH 12/12] chore: removed accidently added local command --- package.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/package.json b/package.json index 7a9ad53..fd4a9b0 100644 --- a/package.json +++ b/package.json @@ -7,8 +7,7 @@ "build": "babel src --out-dir .", "watch": "babel -w src --out-dir .", "test": "jest —-colors", - "test:watch": "jest —-colors --watch", - "build:dev": "npm run build && cp -r build/ ../../GitHub/GatsbyProject/contentstack-gatsby-starter-app/node_modules/gatsby-source-contentstack/" + "test:watch": "jest —-colors --watch" }, "engines": { "node": ">=18.0.0"