UNPKG

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
"use strict"; 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