@sickrin/openalex-sdk
Version:
A TypeScript SDK for interacting with the OpenAlex API - forked and enhanced version
331 lines • 14 kB
JavaScript
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
;