bccr-indicadores-economicos
Version:
Interfaz para consumo del servicio web de indicadores económicos del Banco Central de Costa Rica (BCCR).
314 lines (309 loc) • 10.9 kB
JavaScript
;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __esm = (fn, res) => function __init() {
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
};
var __commonJS = (cb, mod) => function __require() {
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
};
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
// src/util/responseUtil.ts
var import_xml2js, BCCR_VALUE_TAG, BCCR_DATE_TAG, BCCR_CODE_TAG, getSingleValueByTagName, getValuesByTagName, parseXMLStringToJSON, getResponseLength, getDataPoint, getDataSet, getResponseData;
var init_responseUtil = __esm({
"src/util/responseUtil.ts"() {
"use strict";
import_xml2js = require("xml2js");
BCCR_VALUE_TAG = "NUM_VALOR";
BCCR_DATE_TAG = "DES_FECHA";
BCCR_CODE_TAG = "COD_INDICADORINTERNO";
getSingleValueByTagName = (response, tagName) => {
try {
return parseXMLStringToJSON(response)[0][tagName][0];
} catch (e) {
throw new Error(
"Error while extracting value from single indicator data point."
);
}
};
getValuesByTagName = (response, tagName) => {
try {
return parseXMLStringToJSON(response).map((node) => node[tagName][0]);
} catch (e) {
throw new Error(
"Error while extracting values from indicator data set."
);
}
};
parseXMLStringToJSON = (XMLString) => {
let parseResult = [];
(0, import_xml2js.parseString)(XMLString, (partialErr, partialResult) => {
if (partialErr) {
throw new Error("Error while parsing BCCR web service response.");
}
(0, import_xml2js.parseString)(
partialResult.string["_"],
(jsonParsedErr, jsonParsedResult) => {
if (jsonParsedErr) {
throw new Error(
"Error while parsing BCCR web service response."
);
}
parseResult = jsonParsedResult.Datos_de_INGC011_CAT_INDICADORECONOMIC.INGC011_CAT_INDICADORECONOMIC;
}
);
});
return parseResult;
};
getResponseLength = (response) => {
try {
return parseXMLStringToJSON(response).length;
} catch (e) {
throw new Error(
"Empty response from BCCR web service. Validate indicator code, publication periodicity and indicator structure (compound or simple)."
);
}
};
getDataPoint = (dataPoint) => {
return {
code: getSingleValueByTagName(dataPoint, BCCR_CODE_TAG),
date: getSingleValueByTagName(dataPoint, BCCR_DATE_TAG),
value: parseFloat(getSingleValueByTagName(dataPoint, BCCR_VALUE_TAG))
};
};
getDataSet = (dataSet) => {
let targetDataSet = [];
const codes = getValuesByTagName(dataSet, BCCR_CODE_TAG);
const dates = getValuesByTagName(dataSet, BCCR_DATE_TAG);
const values = getValuesByTagName(dataSet, BCCR_VALUE_TAG);
for (let i = 0; i < getResponseLength(dataSet); i++) {
targetDataSet.push({
code: codes[i],
date: dates[i],
value: parseFloat(values[i])
});
}
return targetDataSet;
};
getResponseData = (res) => {
return new Promise((resolve, reject) => {
res.text().then((txt) => {
if (getResponseLength(txt) === 1) {
resolve(getDataPoint(txt));
} else {
resolve(getDataSet(txt));
}
}).catch((e) => {
reject(e);
});
});
};
}
});
// src/util/requestUtil.ts
var fetchBCCRWebService, fetchCurrentValueDate;
var init_requestUtil = __esm({
"src/util/requestUtil.ts"() {
"use strict";
init_responseUtil();
fetchBCCRWebService = (code, startDate, endDate, email, token) => {
return new Promise((resolve, reject) => __async(void 0, null, function* () {
const params = `/Indicadores/Suscripciones/WS/wsindicadoreseconomicos.asmx/ObtenerIndicadoresEconomicosXML?Indicador=${code}&FechaInicio=${startDate}&FechaFinal=${endDate}&Nombre=N&SubNiveles=S&CorreoElectronico=${email}&Token=${token}`;
try {
resolve(yield fetch("https://gee.bccr.fi.cr" + params));
} catch (e) {
reject(e);
}
}));
};
fetchCurrentValueDate = (code, email, token, targetDate = /* @__PURE__ */ new Date()) => {
return new Promise((resolve) => {
const formattedTargetDate = targetDate.toLocaleDateString(
"es-ES",
{
timeZone: "UTC"
}
);
fetchBCCRWebService(
code,
formattedTargetDate,
formattedTargetDate,
email,
token
).then((res) => res.text()).then((txt) => {
try {
getResponseLength(txt);
resolve(targetDate);
} catch (e) {
targetDate.setDate(targetDate.getDate() - 1);
resolve(
fetchCurrentValueDate(code, email, token, targetDate)
);
}
});
});
};
}
});
// src/util/validationUtil.ts
var import_types, validateCredentials, validateConstructorParameters, validateRequestParameters;
var init_validationUtil = __esm({
"src/util/validationUtil.ts"() {
"use strict";
import_types = require("util/types");
init_requestUtil();
init_responseUtil();
validateCredentials = (email, token) => {
const formattedDummyDate = (/* @__PURE__ */ new Date()).toLocaleDateString("es-ES", {
timeZone: "UTC"
});
fetchBCCRWebService(
"318",
formattedDummyDate,
formattedDummyDate,
email,
token
).then((response) => response.text()).then((txt) => {
try {
parseXMLStringToJSON(txt);
} catch (e) {
throw new Error(
"Bad credentials. Email or token (or both) rejected by BCCR web service."
);
}
});
};
validateConstructorParameters = (email, token) => {
if (!email.length) {
throw new Error(
"Found empty string as email constructor parameter. This parameter must be an string containing a valid email address."
);
}
if (!token.length) {
throw new Error(
"Found empty string as token constructor parameter. This parameter must be an string containing an alphanumerical value."
);
}
};
validateRequestParameters = (code, startDate, endDate) => {
if (!code.length) {
throw new Error(
"Found empty string as indicator code parameter. This parameter must be an string containing a numerical value."
);
}
if (isNaN(Number(code))) {
throw new Error(
"Indicator code parameter must be an string containing a numerical value."
);
}
if (startDate && !(0, import_types.isDate)(startDate)) {
throw new Error(
"startDate parameter must be a Date object instance."
);
}
if (endDate && !(0, import_types.isDate)(endDate)) {
throw new Error(
"endDate parameter must be a Date object instance."
);
}
if (startDate > /* @__PURE__ */ new Date() || endDate > /* @__PURE__ */ new Date()) {
throw new Error(
"endDate parameter nor startDate parameter can be dates in the future."
);
}
if (startDate > endDate) {
throw new Error("endDate parameter must a date after startDate parameter date.");
}
};
}
});
// src/BCCRWebService.ts
var require_BCCRWebService = __commonJS({
"src/BCCRWebService.ts"(exports2, module2) {
"use strict";
init_responseUtil();
init_validationUtil();
init_requestUtil();
module2.exports = class BCCRWebService {
/**
* Constructor method for BCCR web service consumption class.
* @param email Email registered before BCCR for web service.
* @param token Access token given by BCCR for web service.
*/
constructor(email, token) {
/**
* Method that manages BCCR indicator web service fetch logic.
* @param code Unique code corresponding to an BCCR financial indicator.
* @param startDate Request range start date.
* @param [endDate = startDate] Optional request range end date. If not provided the startDate parameter value is set as default.
*/
this.request = (code, startDate, endDate = startDate) => {
validateRequestParameters(code, startDate, endDate);
return new Promise((resolve, reject) => __async(this, null, function* () {
let formattedStartDate;
let formattedEndDate;
if (!(startDate || endDate)) {
const formattedTargetDate = (yield fetchCurrentValueDate(
code,
this.email,
this.token
)).toLocaleDateString("es-ES", { timeZone: "America/Costa_Rica" });
formattedStartDate = formattedEndDate = formattedTargetDate;
} else {
formattedStartDate = startDate.toLocaleDateString("es-ES", {
timeZone: "America/Costa_Rica"
});
formattedEndDate = endDate.toLocaleDateString("es-ES", {
timeZone: "America/Costa_Rica"
});
}
fetchBCCRWebService(
code,
formattedStartDate,
formattedEndDate,
this.email,
this.token
).then((response) => getResponseData(response)).then((data) => resolve(data)).catch((e) => reject(e));
}));
};
validateConstructorParameters(email, token);
validateCredentials(email, token);
this.email = email;
this.token = token;
}
};
}
});
// src/index.ts
var BCCRWebService = require_BCCRWebService();
var bccrWS = new BCCRWebService("andresmonterog@hotmail.com", "MOHDSTRRNE");
var test = () => __async(exports, null, function* () {
const startDate = new Date(2024, 0, 1);
const endDate = new Date(2024, 0, 5);
const rangedColonDollarSellPrice = yield bccrWS.request(
"318",
startDate,
endDate
);
console.log(rangedColonDollarSellPrice);
});
test();
//# sourceMappingURL=index.js.map