@datocms/rest-client-utils
Version:
Utilities for DatoCMS REST API clients
84 lines • 3.01 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ApiError = exports.TimeoutError = void 0;
function isErrorBody(body) {
if (typeof body !== 'object' || body === null || !('data' in body)) {
return false;
}
const bodyWithData = body;
if (!Array.isArray(bodyWithData.data)) {
return false;
}
const bodyWithDataList = bodyWithData;
if (bodyWithDataList.data.length === 0) {
return false;
}
const firstEl = bodyWithDataList.data[0];
if (typeof firstEl !== 'object' ||
firstEl === null ||
!('id' in firstEl) ||
!('type' in firstEl) ||
!('attributes' in firstEl) ||
firstEl.type !== 'api_error') {
return false;
}
return true;
}
class TimeoutError extends Error {
constructor(initObject) {
super('API Error!');
Object.setPrototypeOf(this, new.target.prototype);
if ('captureStackTrace' in Error) {
Error.captureStackTrace(this, ApiError);
}
else {
this.stack = new Error().stack;
}
this.request = initObject.request;
this.preCallStack = initObject.preCallStack;
this.message = `${initObject.request.method} ${initObject.request.url}: Timeout error`;
if (this.preCallStack) {
this.stack += `\nCaused By:\n${this.preCallStack}`;
}
}
}
exports.TimeoutError = TimeoutError;
class ApiError extends Error {
constructor(initObject) {
super('API Error!');
Object.setPrototypeOf(this, new.target.prototype);
if ('captureStackTrace' in Error) {
Error.captureStackTrace(this, ApiError);
}
else {
this.stack = new Error().stack;
}
this.request = initObject.request;
this.response = initObject.response;
this.preCallStack = initObject.preCallStack;
let message = `${initObject.request.method} ${initObject.request.url}: ${this.response.status} ${this.response.statusText}`;
if (this.errors.length > 0) {
message += `\n\n${JSON.stringify(this.errors, null, 2)}`;
}
this.message = message;
if (this.preCallStack) {
this.stack += `\nCaused By:\n${this.preCallStack}`;
}
}
get errors() {
if (!isErrorBody(this.response.body)) {
return [];
}
return this.response.body.data;
}
findError(codeOrCodes, filterDetails) {
const codes = Array.isArray(codeOrCodes) ? codeOrCodes : [codeOrCodes];
return this.errors.find((error) => codes.includes(error.attributes.code) &&
(!filterDetails ||
(typeof filterDetails === 'function'
? filterDetails(error.attributes.details)
: Object.entries(filterDetails).every(([key, value]) => error.attributes.details[key] === value))));
}
}
exports.ApiError = ApiError;
//# sourceMappingURL=errors.js.map