UNPKG

@contentstack/management

Version:

The Content Management API is used to manage the content of your Contentstack account

286 lines (280 loc) 12.5 kB
"use strict"; var _interopRequireDefault3 = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireDefault2 = _interopRequireDefault3(require("@babel/runtime/helpers/interopRequireDefault")); Object.defineProperty(exports, "__esModule", { value: true }); var _slicedToArray2 = require("@babel/runtime/helpers/slicedToArray"); var _slicedToArray3 = (0, _interopRequireDefault2["default"])(_slicedToArray2); var _defineProperty2 = require("@babel/runtime/helpers/defineProperty"); var _defineProperty3 = (0, _interopRequireDefault2["default"])(_defineProperty2); exports["default"] = contentstackHttpClient; var _axios = require("axios"); var _axios2 = (0, _interopRequireDefault2["default"])(_axios); var _cloneDeep = require("lodash/cloneDeep"); var _cloneDeep2 = (0, _interopRequireDefault2["default"])(_cloneDeep); var _qs = require("qs"); var _qs2 = (0, _interopRequireDefault2["default"])(_qs); var _concurrencyQueue = require("./concurrency-queue"); var _Util = require("./Util"); var _errorMessages = require("./errorMessages"); 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, _defineProperty3["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; } function contentstackHttpClient(options) { var _uiHostName, _developerHubBaseUrl; var defaultConfig = { insecure: false, retryOnError: true, logHandler: function logHandler(level, data) { if (level === 'error' && data) { var title = [data.name, data.message].filter(function (a) { return a; }).join(' - '); console.error(_errorMessages.ERROR_MESSAGES.ERROR_WITH_TITLE(title)); return; } console.log("[".concat(level, "] ").concat(data)); }, retryCondition: function retryCondition(error) { if (error.response && error.response.status === 429) { return true; } return false; }, headers: {}, basePath: '', proxy: false, httpAgent: false, httpsAgent: false, adapter: false, timeout: 30000 }; var config = _objectSpread(_objectSpread({}, defaultConfig), (0, _cloneDeep2["default"])(options)); if (config.apiKey) { config.headers['apiKey'] = config.apiKey; } if (config.accessToken) { config.headers['accessToken'] = config.accessToken; } if (config.early_access) { config.headers['x-header-ea'] = config.early_access; } var protocol = config.insecure ? 'http' : 'https'; var hostname = config.defaultHostName; var port = config.port || 443; var version = config.version || 'v3'; if (config.region) { config.host = config.defaultHostName; // set region on priority } if ((0, _Util.isHost)(config.host)) { var parsed = config.host.split(':'); if (parsed.length === 2) { var _parsed = (0, _slicedToArray3["default"])(parsed, 2); hostname = _parsed[0]; port = _parsed[1]; } else { hostname = parsed[0]; } } if (config.basePath) { config.basePath = "/".concat(config.basePath.split('/').filter(Boolean).join('/')); } var baseURL = config.endpoint || "".concat(protocol, "://").concat(hostname, ":").concat(port).concat(config.basePath, "/{api-version}"); var uiHostName = hostname; var developerHubBaseUrl = hostname; if ((_uiHostName = uiHostName) !== null && _uiHostName !== void 0 && _uiHostName.endsWith('io')) { uiHostName = uiHostName.replace('io', 'com'); } if (uiHostName) { uiHostName = uiHostName.replace('api', 'app'); } var uiBaseUrl = config.endpoint || "".concat(protocol, "://").concat(uiHostName); developerHubBaseUrl = (_developerHubBaseUrl = developerHubBaseUrl) === null || _developerHubBaseUrl === void 0 ? void 0 : _developerHubBaseUrl.replace('api', 'developerhub-api').replace(/^dev\d+/, 'dev') // Replaces any 'dev1', 'dev2', etc. with 'dev' .replace('io', 'com').replace(/^http/, '') // Removing `http` if already present .replace(/^/, 'https://'); // Adds 'https://' at the start if not already there // set ui host name var axiosOptions = _objectSpread(_objectSpread({ // Axios baseURL: baseURL, uiBaseUrl: uiBaseUrl, developerHubBaseUrl: developerHubBaseUrl }, config), {}, { paramsSerializer: function paramsSerializer(params) { var query = params.query; delete params.query; var qs = _qs2["default"].stringify(params, { arrayFormat: 'brackets' }); if (query) { qs = qs + "&query=".concat(encodeURIComponent(JSON.stringify(query))); } params.query = query; return qs; }, versioningStrategy: 'path' }); var instance = _axios2["default"].create(axiosOptions); instance.httpClientParams = options; // Normalize and store plugins before ConcurrencyQueue so plugin interceptors // run after the queue's (plugin sees responses/errors before they reach the queue). // Use options.plugins so hooks run against the same plugin references (spies work in tests). var plugins = (0, _Util.normalizePlugins)(options.plugins || config.plugins); // Request interceptor for versioning strategy (must run first) instance.interceptors.request.use(function (request) { if (request.versioningStrategy && request.versioningStrategy === 'path') { request.baseURL = request.baseURL.replace('{api-version}', version); } else { request.baseURL = request.baseURL.replace('/{api-version}', ''); } return request; }); // Request interceptor for plugins (runs after versioning) if (plugins.length > 0) { instance.interceptors.request.use(function (request) { // Run all onRequest hooks sequentially, using return values var currentRequest = request; var _iterator = _createForOfIteratorHelper(plugins), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var plugin = _step.value; try { if (typeof plugin.onRequest === 'function') { var result = plugin.onRequest(currentRequest); // Use returned value if provided, otherwise use current request if (result !== undefined) { currentRequest = result; } } } catch (error) { // Log error and continue with next plugin if (config.logHandler) { config.logHandler('error', { name: 'PluginError', message: "Error in plugin onRequest: ".concat(error.message), error: error }); } } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return currentRequest; }, function (error) { // Handle request errors - run plugins even on error var currentConfig = error.config; var _iterator2 = _createForOfIteratorHelper(plugins), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var plugin = _step2.value; try { if (typeof plugin.onRequest === 'function' && currentConfig) { var result = plugin.onRequest(currentConfig); // Use returned value if provided, otherwise use current config if (result !== undefined) { currentConfig = result; error.config = currentConfig; } } } catch (pluginError) { if (config.logHandler) { config.logHandler('error', { name: 'PluginError', message: "Error in plugin onRequest (error handler): ".concat(pluginError.message), error: pluginError }); } } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } return Promise.reject(error); }); // Response interceptor for plugins instance.interceptors.response.use(function (response) { // Run all onResponse hooks sequentially for successful responses // Use return values from plugins var currentResponse = response; var _iterator3 = _createForOfIteratorHelper(plugins), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var plugin = _step3.value; try { if (typeof plugin.onResponse === 'function') { var result = plugin.onResponse(currentResponse); // Use returned value if provided, otherwise use current response if (result !== undefined) { currentResponse = result; } } } catch (error) { // Log error and continue with next plugin if (config.logHandler) { config.logHandler('error', { name: 'PluginError', message: "Error in plugin onResponse: ".concat(error.message), error: error }); } } } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } return currentResponse; }, function (error) { // Handle response errors - run plugins even on error // Pass the error object (which may contain error.response if server responded) var currentError = error; var _iterator4 = _createForOfIteratorHelper(plugins), _step4; try { for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) { var plugin = _step4.value; try { if (typeof plugin.onResponse === 'function') { var result = plugin.onResponse(currentError); // Use returned value if provided, otherwise use current error if (result !== undefined) { currentError = result; } } } catch (pluginError) { if (config.logHandler) { config.logHandler('error', { name: 'PluginError', message: "Error in plugin onResponse (error handler): ".concat(pluginError.message), error: pluginError }); } } } } catch (err) { _iterator4.e(err); } finally { _iterator4.f(); } return Promise.reject(currentError); }); } instance.concurrencyQueue = new _concurrencyQueue.ConcurrencyQueue({ axios: instance, config: config, plugins: plugins }); return instance; } module.exports = exports.default;