pluggy-js
Version:
Client-side JavaScript toolkit for Pluggy's API.
120 lines (119 loc) • 4.96 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseApi = void 0;
const axios_1 = require("axios");
const utils_1 = require("./utils");
const version_1 = require("./version");
/**
* Helper function for JSON.parse(),
* to parse ISO date string values to Date objects.
*/
function jsonParseDateReviver(_key, value) {
return (0, utils_1.isIsoDateString)(value) ? (0, utils_1.parseIsoDate)(value) : value;
}
class BaseApi {
constructor(accessToken, baseUrl = 'https://api.pluggy.ai') {
if (!accessToken) {
throw new Error('Missing authorization for API communication');
}
this.apiKey = accessToken;
this.baseUrl = baseUrl;
}
getServiceInstance() {
if (!this.service) {
const config = {
headers: {
'Pluggy-User-Agent': `PluggyJs/${version_1.PLUGGY_JS_VERSION}`,
'X-API-KEY': this.apiKey,
'Content-Type': 'application/json',
},
transformResponse: data => {
// transform ISO string dates to Date
return JSON.parse(data, jsonParseDateReviver);
},
};
this.service = axios_1.default.create(config);
}
return this.service;
}
createGetRequest(endpoint, params) {
return __awaiter(this, void 0, void 0, function* () {
const url = `${this.baseUrl}/${endpoint}${this.mapToQueryString(params)}`;
return this.getServiceInstance()
.get(url)
.then((response) => __awaiter(this, void 0, void 0, function* () {
try {
const { data, status } = response;
if (status !== 200) {
return Promise.reject(data);
}
else {
return Promise.resolve(data);
}
}
catch (_a) {
const { statusText } = response;
return Promise.reject({ statusText });
}
}))
.catch(error => {
console.warn(`[API] HTTP request failed: ${error.message || ''}`, error);
return Promise.reject(error);
});
});
}
createPostRequest(endpoint, params, body) {
return this.createMutationRequest('post', endpoint, params, body);
}
createPutRequest(endpoint, params, body) {
return this.createMutationRequest('put', endpoint, params, body);
}
createPatchRequest(endpoint, params, body) {
return this.createMutationRequest('patch', endpoint, params, body);
}
createDeleteRequest(endpoint, params, body) {
return this.createMutationRequest('delete', endpoint, params, body);
}
createMutationRequest(method, endpoint, params, body) {
return __awaiter(this, void 0, void 0, function* () {
const url = `${this.baseUrl}/${endpoint}${this.mapToQueryString(params)}`;
if (body) {
Object.keys(body).forEach(key => body[key] === undefined ? delete body[key] : {});
}
const serviceMethod = this.getServiceInstance()[method];
return serviceMethod(url, body).then((response) => __awaiter(this, void 0, void 0, function* () {
try {
const { data, status } = response;
if (status < 200 || status >= 300) {
return Promise.reject(data);
}
return Promise.resolve(data);
}
catch (_a) {
const { statusText } = response;
return Promise.reject({ statusText });
}
}));
});
}
mapToQueryString(params) {
if (!params || Object.keys(params).length === 0) {
return '';
}
const query = Object.keys(params)
.filter(key => params[key] !== undefined && params[key] !== null)
.map(key => key + '=' + params[key])
.join('&');
return `?${query}`;
}
}
exports.BaseApi = BaseApi;