"use strict"; 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()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const axios_1 = __importDefault(require("axios")); const genbank_parser_1 = __importDefault(require("genbank-parser")); const fast_xml_parser_1 = require("fast-xml-parser"); const jsonata_1 = __importDefault(require("jsonata")); const simpleJSON = (json) => { if (Array.isArray(json)) { if (json.length === 1) { return simpleJSON(json[0]); } else { return json; } } else if (typeof json === 'object') { if (Object.keys(json).length === 1 && typeof json[Object.keys(json)[0]] === 'object') { return simpleJSON(json[Object.keys(json)[0]]); } else { return json; } } else { return json; } }; const renameKeys = (json) => { if (Array.isArray(json)) { return json.map(e => renameKeys(e)); } else if (typeof json === 'object') { const newObj = {}; Object.keys(json).map(key => { let tmp; if (typeof json[key] === 'object') { tmp = renameKeys(json[key]); } else { tmp = json[key]; } newObj[key.replace(/-/g, "_")] = tmp; }); return newObj; } else { return json; } }; const getEsearch = (params) => __awaiter(void 0, void 0, void 0, function* () { const endpoint = (params === null || params === void 0 ? void 0 : params.endpoint) ? params.endpoint : 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi'; const queries = Array.isArray(params === null || params === void 0 ? void 0 : params.query) ? params === null || params === void 0 ? void 0 : params.query : [params === null || params === void 0 ? void 0 : params.query]; params.id = Array.isArray(params === null || params === void 0 ? void 0 : params.id) ? params.id.join(',') : params.id; let allowedParams; let connType = 'get'; if (endpoint.match('esearch')) { allowedParams = ['db', 'term', 'retmax', 'retstart', 'api_key']; params = Object.assign(Object.assign({}, params), { retmax: 100000, retmode: 'xml' }); } else if (endpoint.match('efetch')) { connType = 'get'; allowedParams = ['id', 'db', 'retmode', 'rettype', 'retmax', 'api_key']; const retmode = (params === null || params === void 0 ? void 0 : params.rettype) === 'fasta' || (params === null || params === void 0 ? void 0 : params.rettype) === 'gb' ? 'txt' : 'xml'; params = Object.assign(Object.assign({}, params), { retmax: 10000, retmode }); } else if (endpoint.match('esummary')) { allowedParams = ['id', 'db', 'retmode', 'rettype', 'retstart', 'version', 'api_key']; params = Object.assign(Object.assign({}, params), { retmax: 10000, retmode: 'xml', version: '2.0' }); } let response = ''; switch (connType) { case 'post': let postParam = {}; Object.keys(params).flatMap(k => allowedParams.includes(k) ? postParam[k] = params[k] : []); response = yield axios_1.default.post(endpoint, postParam); break; case 'get': const q = `${endpoint}?${Object.keys(params).flatMap(k => allowedParams.includes(k) ? k + '=' + params[k] : []).join('&')}`; console.log(q); let block = 0; let ctrl = true; while (ctrl && block <= 5) { try { response = yield axios_1.default.get(q); ctrl = false; } catch (error) { } block++; if (block === 6) { console.log("Dropping !!! ", q); } } default: break; } let json = Array.isArray(response.data) ? response.data.join('') : response.data; if (params === null || params === void 0 ? void 0 : params.retmode) { switch (params.retmode) { case 'xml': const parser = new fast_xml_parser_1.XMLParser({ ignoreAttributes: false, alwaysCreateTextNode: false, attributeNamePrefix: "", textNodeName: "value", allowBooleanAttributes: true, }); json = parser.parse(json); break; case 'gb': json = (0, genbank_parser_1.default)(json); break; default: break; } } json = renameKeys(json); const results = []; for (const query of queries) { let result; if (query !== '') { result = { query, value: (0, jsonata_1.default)(query).evaluate(json) /*simpleJSON(JSONPath({path: query, json})) */ }; } else { result = ''; } results.push(result); } return simpleJSON(results); }); module.exports = (params) => __awaiter(void 0, void 0, void 0, function* () { return yield getEsearch(params); });