UNPKG

@sickrin/openalex-sdk

Version:

A TypeScript SDK for interacting with the OpenAlex API - forked and enhanced version

331 lines 14 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const fs_1 = __importDefault(require("fs")); const authors_1 = require("./utils/authors"); const exportCSV_1 = require("./utils/exportCSV"); const helpers_1 = require("./utils/helpers"); const http_1 = require("./utils/http"); const institutions_1 = require("./utils/institutions"); const sources_1 = require("./utils/sources"); const topics_1 = require("./utils/topics"); const works_1 = require("./utils/works"); class OpenAlex { constructor(email = null, apiKey = null) { this.url = 'https://api.openalex.org'; this.maxRetries = 3; this.retryDelay = 1000; this.retryHttpCodes = [429, 500, 502, 503, 504]; this.email = email; this.apiKey = apiKey; } async work(id, externalIds) { let url = ''; if (externalIds) url = `${this.url}/works/${externalIds}:${id}`; else url = `${this.url}/works/${id}`; const response = await (0, http_1.GET)(url); if (response.status === 200) { return response.data; } if (response.status === 404) { console.log(`Work with id ${id} not found`); } else { console.log(`Error ${response.status}: ${response.statusText}`); } return { id: id, biblio: {}, counts_by_year: [], }; } async works(searchParameters = { perPage: 25, page: 1, retriveAllPages: false, }) { const { retriveAllPages, searchField, search, toJson, toCsv, startPage, endPage, filter, groupBy: group_by, sortBy, AbstractArrayToString, chunkSize, } = searchParameters; let { perPage } = searchParameters; let { page } = searchParameters; (0, works_1.validateParameters)(retriveAllPages, startPage, endPage, searchField, chunkSize, toCsv, toJson); let url = (0, helpers_1.buildUrl)(this.url, 'works', search, searchField, filter, group_by, sortBy); let cursor = await (0, helpers_1.getCursorByPage)(url, page, perPage); if (retriveAllPages) { perPage = 200; cursor = '*'; } if (startPage && endPage) { page = startPage; cursor = await (0, helpers_1.getCursorByPage)(url, startPage, perPage); } url = (0, helpers_1.appendCursorToUrl)(url, perPage, cursor, retriveAllPages); const response = await (0, http_1.GET)(url); if (response.status === 200) { response.data.meta.page = page !== null && page !== void 0 ? page : 1; if (AbstractArrayToString) { response.data.results = response.data.results.map((work) => { if (work.abstract_inverted_index) work.abstract = (0, helpers_1.convertAbstractArrayToString)(work.abstract_inverted_index); delete work.abstract_inverted_index; return work; }); } if (startPage && endPage) { return (0, works_1.handleMultiplePages)(startPage, endPage, url, response, toJson, toCsv, AbstractArrayToString); } if (retriveAllPages) { if (chunkSize) (0, works_1.handleAllPagesInChunks)(url, response, toJson, toCsv, AbstractArrayToString, chunkSize); else return (0, works_1.handleAllPages)(url, response, toJson, toCsv, AbstractArrayToString); } if (toJson) fs_1.default.writeFileSync(`${toJson}.json`, JSON.stringify(response.data, null, 2)); if (toCsv) { (0, exportCSV_1.convertToCSV)(response.data.results, toCsv); } response.data.meta.url = url; return response.data; } else { throw new Error(`Error ${response.status}: ${response.statusText}`); } } async autoCompleteWorks(search) { const response = await (0, http_1.GET)(`${this.url}/autocomplete/works?q=${search}`); if (response.status === 200) { return response.data; } else { throw new Error(`Error ${response.status}: ${response.statusText}`); } } async ngram(id) { const response = await (0, http_1.GET)(`${this.url}/works/${id}/ngram`); if (response.status === 200) { return response.data; } else { throw new Error(`Error ${response.status}: ${response.statusText}`); } } async author(id, externalIds) { let url = ''; if (externalIds) url = `${this.url}/authors/${externalIds}:${id}`; else url = `${this.url}/authors/${id}`; const response = await (0, http_1.GET)(url); if (response.status === 200) { return response.data; } else { throw new Error(`Error ${response.status}: ${response.statusText}`); } } async authors(searchParameters = { perPage: 25, page: 1, retriveAllPages: false, }) { const { retriveAllPages, searchField, search, toJson, toCsv, startPage, endPage, filter, groupBy, sortBy, } = searchParameters; let { perPage } = searchParameters; let { page } = searchParameters; (0, authors_1.validateAuthorParameters)(retriveAllPages, startPage, endPage, searchField); let url = (0, helpers_1.buildUrl)(this.url, 'authors', search, searchField, filter, groupBy, sortBy); let cursor = await (0, helpers_1.getCursorByPage)(url, page, perPage); if (retriveAllPages) { perPage = 200; cursor = '*'; } if (startPage && endPage) { page = startPage; cursor = await (0, helpers_1.getCursorByPage)(url, startPage, perPage); } url = (0, helpers_1.appendCursorToUrl)(url, perPage, cursor, retriveAllPages); const response = await (0, http_1.GET)(url); if (response.status === 200) { response.data.meta.page = page !== null && page !== void 0 ? page : 1; if (startPage && endPage) { return (0, authors_1.handleMultipleAuthorsPages)(startPage, endPage, url, response, toJson, toCsv); } if (retriveAllPages) { return (0, authors_1.handleAllAuthorsPages)(url, response, toJson, toCsv); } if (toJson) fs_1.default.writeFileSync(`${toJson}.json`, JSON.stringify(response.data, null, 2)); if (toCsv) { (0, exportCSV_1.convertToCSV)(response.data.results, toCsv); } return response.data; } else { throw new Error(`Error ${response.status}: ${response.statusText}`); } } async source(id, externalIds) { let url = ''; if (externalIds) url = `${this.url}/sources/${externalIds}:${id}`; else url = `${this.url}/sources/${id}`; const response = await (0, http_1.GET)(url); if (response.status === 200) { return response.data; } else { throw new Error(`Error ${response.status}: ${response.statusText}`); } } async sources(searchParameters = { perPage: 25, page: 1, retriveAllPages: false, }) { const { retriveAllPages, searchField, search, toJson, toCsv, startPage, endPage, filter, groupBy, sortBy, } = searchParameters; let { perPage } = searchParameters; let { page } = searchParameters; (0, sources_1.validateSourcesParameters)(retriveAllPages, startPage, endPage, searchField); let url = (0, helpers_1.buildUrl)(this.url, 'sources', search, searchField, filter, groupBy, sortBy); let cursor = await (0, helpers_1.getCursorByPage)(url, page, perPage); if (retriveAllPages) { perPage = 200; cursor = '*'; } if (startPage && endPage) { page = startPage; cursor = await (0, helpers_1.getCursorByPage)(url, startPage, perPage); } url = (0, helpers_1.appendCursorToUrl)(url, perPage, cursor, retriveAllPages); const response = await (0, http_1.GET)(url); if (response.status === 200) { response.data.meta.page = page !== null && page !== void 0 ? page : 1; if (startPage && endPage) { return (0, sources_1.handleMultipleSourcesPages)(startPage, endPage, url, response, toJson, toCsv); } if (retriveAllPages) { return (0, sources_1.handleAllSourcesPages)(url, response, toJson, toCsv); } if (toJson) fs_1.default.writeFileSync(`${toJson}.json`, JSON.stringify(response.data, null, 2)); if (toCsv) { (0, exportCSV_1.convertToCSV)(response.data.results, toCsv); } return response.data; } else { throw new Error(`Error ${response.status}: ${response.statusText}`); } } async institution(id, externalIds) { let url = ''; if (externalIds) url = `${this.url}/institutions/${externalIds}:${id}`; else url = `${this.url}/institutions/${id}`; const response = await (0, http_1.GET)(url); if (response.status === 200) { return response.data; } else { throw new Error(`Error ${response.status}: ${response.statusText}`); } } async institutions(searchParameters = { perPage: 25, page: 1, retriveAllPages: false, }) { const { retriveAllPages, searchField, search, toJson, toCsv, startPage, endPage, filter, groupBy, sortBy, } = searchParameters; let { perPage } = searchParameters; let { page } = searchParameters; (0, institutions_1.validateInstitutionsParameters)(retriveAllPages, startPage, endPage, searchField); let url = (0, helpers_1.buildUrl)(this.url, 'institutions', search, searchField, filter, groupBy, sortBy); let cursor = await (0, helpers_1.getCursorByPage)(url, page, perPage); if (retriveAllPages) { perPage = 200; cursor = '*'; } if (startPage && endPage) { page = startPage; cursor = await (0, helpers_1.getCursorByPage)(url, startPage, perPage); } url = (0, helpers_1.appendCursorToUrl)(url, perPage, cursor, retriveAllPages); const response = await (0, http_1.GET)(url); if (response.status === 200) { response.data.meta.page = page !== null && page !== void 0 ? page : 1; if (startPage && endPage) { return (0, institutions_1.handleMultipleInstitutionsPages)(startPage, endPage, url, response, toJson, toCsv); } if (retriveAllPages) { return (0, institutions_1.handleAllInstitutionsPages)(url, response, toJson, toCsv); } if (toJson) fs_1.default.writeFileSync(`${toJson}.json`, JSON.stringify(response.data, null, 2)); if (toCsv) { (0, exportCSV_1.convertToCSV)(response.data.results, toCsv); } return response.data; } else { throw new Error(`Error ${response.status}: ${response.statusText}`); } } async topic(id) { if (!id) throw new Error('Topic id is required'); const response = await (0, http_1.GET)(`${this.url}/topics/${id}`); if (response.status === 200) { return response.data; } else { throw new Error(`Error ${response.status}: ${response.statusText}`); } } async topics(searchParameters = { perPage: 25, page: 1, retriveAllPages: false, }) { const { retriveAllPages, searchField, search, toJson, toCsv, startPage, endPage, filter, groupBy, sortBy, } = searchParameters; let { perPage } = searchParameters; let { page } = searchParameters; (0, topics_1.validateTopicsParameters)(retriveAllPages, startPage, endPage, searchField); let url = (0, helpers_1.buildUrl)(this.url, 'topics', search, searchField, filter, groupBy, sortBy); let cursor = await (0, helpers_1.getCursorByPage)(url, page, perPage); if (retriveAllPages) { perPage = 200; cursor = '*'; } if (startPage && endPage) { page = startPage; cursor = await (0, helpers_1.getCursorByPage)(url, startPage, perPage); } url = (0, helpers_1.appendCursorToUrl)(url, perPage, cursor, retriveAllPages); const response = await (0, http_1.GET)(url); if (response.status === 200) { response.data.meta.page = page !== null && page !== void 0 ? page : 1; if (startPage && endPage) { return (0, topics_1.handleMultipleTopicsPages)(startPage, endPage, url, response, toJson, toCsv); } if (retriveAllPages) { return (0, topics_1.handleAllTopicsPages)(url, response, toJson, toCsv); } if (toJson) fs_1.default.writeFileSync(`${toJson}.json`, JSON.stringify(response.data, null, 2)); if (toCsv) { (0, exportCSV_1.convertToCSV)(response.data.results, toCsv); } return response.data; } else { throw new Error(`Error ${response.status}: ${response.statusText}`); } } } exports.default = OpenAlex; //# sourceMappingURL=index.js.map