|
@@ -15,13 +15,82 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
const axios_1 = __importDefault(require("axios"));
|
|
const axios_1 = __importDefault(require("axios"));
|
|
|
const genbank_parser_1 = __importDefault(require("genbank-parser"));
|
|
const genbank_parser_1 = __importDefault(require("genbank-parser"));
|
|
|
const fast_xml_parser_1 = require("fast-xml-parser");
|
|
const fast_xml_parser_1 = require("fast-xml-parser");
|
|
|
-const jsonpath_plus_1 = require("jsonpath-plus");
|
|
|
|
|
|
|
+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 {
|
|
|
|
|
+ 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;
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
const getEsearch = (params) => __awaiter(void 0, void 0, void 0, function* () {
|
|
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 endpoint = (params === null || params === void 0 ? void 0 : params.endpoint) ? params.endpoint : 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi';
|
|
|
- const query = (params === null || params === void 0 ? void 0 : params.query) || '';
|
|
|
|
|
- const allowedParams = ['id', 'db', 'retmode', 'rettype'];
|
|
|
|
|
- const response = yield axios_1.default.get(`${endpoint}?${Object.keys(params).flatMap(k => allowedParams.includes(k) ? k + '=' + params[k] : []).join('&')}`);
|
|
|
|
|
- let results = Array.isArray(response.data) ? response.data.join('') : response.data;
|
|
|
|
|
|
|
+ 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'];
|
|
|
|
|
+ params = Object.assign(Object.assign({}, params), { retmax: 100000, retmode: 'xml' });
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (endpoint.match('efetch')) {
|
|
|
|
|
+ connType = 'get';
|
|
|
|
|
+ allowedParams = ['id', 'db', 'retmode', 'rettype', 'retmax'];
|
|
|
|
|
+ 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'];
|
|
|
|
|
+ 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);
|
|
|
|
|
+ response = yield axios_1.default.get(q);
|
|
|
|
|
+ default:
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ let json = Array.isArray(response.data) ? response.data.join('') : response.data;
|
|
|
if (params === null || params === void 0 ? void 0 : params.retmode) {
|
|
if (params === null || params === void 0 ? void 0 : params.retmode) {
|
|
|
switch (params.retmode) {
|
|
switch (params.retmode) {
|
|
|
case 'xml':
|
|
case 'xml':
|
|
@@ -30,21 +99,30 @@ const getEsearch = (params) => __awaiter(void 0, void 0, void 0, function* () {
|
|
|
alwaysCreateTextNode: false,
|
|
alwaysCreateTextNode: false,
|
|
|
attributeNamePrefix: "",
|
|
attributeNamePrefix: "",
|
|
|
textNodeName: "value",
|
|
textNodeName: "value",
|
|
|
- allowBooleanAttributes: true
|
|
|
|
|
|
|
+ allowBooleanAttributes: true,
|
|
|
});
|
|
});
|
|
|
- results = parser.parse(results);
|
|
|
|
|
|
|
+ json = parser.parse(json);
|
|
|
break;
|
|
break;
|
|
|
case 'gb':
|
|
case 'gb':
|
|
|
- results = (0, genbank_parser_1.default)(results);
|
|
|
|
|
|
|
+ json = (0, genbank_parser_1.default)(json);
|
|
|
break;
|
|
break;
|
|
|
default:
|
|
default:
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- // https://docs.jsonata.org/simple
|
|
|
|
|
- // if (query !== '') results = jsonata(query).evaluate(results)
|
|
|
|
|
- if (query !== '')
|
|
|
|
|
- results = (0, jsonpath_plus_1.JSONPath)({ path: query, json: results });
|
|
|
|
|
- return results;
|
|
|
|
|
|
|
+ json = renameKeys(json);
|
|
|
|
|
+ const results = [];
|
|
|
|
|
+ for (const query of queries) {
|
|
|
|
|
+ // https://www.npmjs.com/package/jsonpath-plus
|
|
|
|
|
+ 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); });
|
|
module.exports = (params) => __awaiter(void 0, void 0, void 0, function* () { return yield getEsearch(params); });
|