@contentstack/management
Version:
The Content Management API is used to manage the content of your Contentstack account
286 lines (280 loc) • 12.5 kB
JavaScript
;
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;