esearch.js 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. "use strict";
  2. var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
  3. function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
  4. return new (P || (P = Promise))(function (resolve, reject) {
  5. function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
  6. function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
  7. function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
  8. step((generator = generator.apply(thisArg, _arguments || [])).next());
  9. });
  10. };
  11. var __importDefault = (this && this.__importDefault) || function (mod) {
  12. return (mod && mod.__esModule) ? mod : { "default": mod };
  13. };
  14. Object.defineProperty(exports, "__esModule", { value: true });
  15. const axios_1 = __importDefault(require("axios"));
  16. const genbank_parser_1 = __importDefault(require("genbank-parser"));
  17. const fast_xml_parser_1 = require("fast-xml-parser");
  18. const jsonata_1 = __importDefault(require("jsonata"));
  19. const simpleJSON = (json) => {
  20. if (Array.isArray(json)) {
  21. if (json.length === 1) {
  22. return simpleJSON(json[0]);
  23. }
  24. else {
  25. return json;
  26. }
  27. }
  28. else if (typeof json === 'object') {
  29. if (Object.keys(json).length === 1 && typeof json[Object.keys(json)[0]] === 'object') {
  30. return simpleJSON(json[Object.keys(json)[0]]);
  31. }
  32. else {
  33. return json;
  34. }
  35. }
  36. else {
  37. return json;
  38. }
  39. };
  40. const renameKeys = (json) => {
  41. if (Array.isArray(json)) {
  42. return json.map(e => renameKeys(e));
  43. }
  44. else if (typeof json === 'object') {
  45. const newObj = {};
  46. Object.keys(json).map(key => {
  47. let tmp;
  48. if (typeof json[key] === 'object') {
  49. tmp = renameKeys(json[key]);
  50. }
  51. else {
  52. tmp = json[key];
  53. }
  54. newObj[key.replace(/-/g, "_")] = tmp;
  55. });
  56. return newObj;
  57. }
  58. else {
  59. return json;
  60. }
  61. };
  62. const getEsearch = (params) => __awaiter(void 0, void 0, void 0, function* () {
  63. const endpoint = (params === null || params === void 0 ? void 0 : params.endpoint) ? params.endpoint : 'https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi';
  64. 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];
  65. params.id = Array.isArray(params === null || params === void 0 ? void 0 : params.id) ? params.id.join(',') : params.id;
  66. let allowedParams;
  67. let connType = 'get';
  68. if (endpoint.match('esearch')) {
  69. allowedParams = ['db', 'term', 'retmax', 'retstart', 'api_key'];
  70. params = Object.assign(Object.assign({}, params), { retmax: 100000, retmode: 'xml' });
  71. }
  72. else if (endpoint.match('efetch')) {
  73. connType = 'get';
  74. allowedParams = ['id', 'db', 'retmode', 'rettype', 'retmax', 'api_key'];
  75. const retmode = (params === null || params === void 0 ? void 0 : params.rettype) === 'fasta' || (params === null || params === void 0 ? void 0 : params.rettype) === 'gb' ? 'txt' : 'xml';
  76. params = Object.assign(Object.assign({}, params), { retmax: 10000, retmode });
  77. }
  78. else if (endpoint.match('esummary')) {
  79. allowedParams = ['id', 'db', 'retmode', 'rettype', 'retstart', 'version', 'api_key'];
  80. params = Object.assign(Object.assign({}, params), { retmax: 10000, retmode: 'xml', version: '2.0' });
  81. }
  82. let response = '';
  83. switch (connType) {
  84. case 'post':
  85. let postParam = {};
  86. Object.keys(params).flatMap(k => allowedParams.includes(k) ? postParam[k] = params[k] : []);
  87. response = yield axios_1.default.post(endpoint, postParam);
  88. break;
  89. case 'get':
  90. const q = `${endpoint}?${Object.keys(params).flatMap(k => allowedParams.includes(k) ? k + '=' + params[k] : []).join('&')}`;
  91. console.log(q);
  92. let block = 0;
  93. let ctrl = true;
  94. while (ctrl && block <= 5) {
  95. try {
  96. response = yield axios_1.default.get(q);
  97. ctrl = false;
  98. }
  99. catch (error) { }
  100. block++;
  101. if (block === 6) {
  102. console.log("Dropping !!! ", q);
  103. }
  104. }
  105. default:
  106. break;
  107. }
  108. let json = Array.isArray(response.data) ? response.data.join('') : response.data;
  109. if (params === null || params === void 0 ? void 0 : params.retmode) {
  110. switch (params.retmode) {
  111. case 'xml':
  112. const parser = new fast_xml_parser_1.XMLParser({
  113. ignoreAttributes: false,
  114. alwaysCreateTextNode: false,
  115. attributeNamePrefix: "",
  116. textNodeName: "value",
  117. allowBooleanAttributes: true,
  118. });
  119. json = parser.parse(json);
  120. break;
  121. case 'gb':
  122. json = (0, genbank_parser_1.default)(json);
  123. break;
  124. default:
  125. break;
  126. }
  127. }
  128. json = renameKeys(json);
  129. const results = [];
  130. for (const query of queries) {
  131. let result;
  132. if (query !== '') {
  133. result = { query, value: (0, jsonata_1.default)(query).evaluate(json) /*simpleJSON(JSONPath({path: query, json})) */ };
  134. }
  135. else {
  136. result = '';
  137. }
  138. results.push(result);
  139. }
  140. return simpleJSON(results);
  141. });
  142. module.exports = (params) => __awaiter(void 0, void 0, void 0, function* () { return yield getEsearch(params); });