openalex-client
Version:
TypeScript SDK for OpenAlex academic database API
124 lines • 3.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseService = void 0;
class BaseService {
constructor(client) {
this.client = client;
}
/**
* Get a single entity by ID
*/
async get(id, params) {
const cleanId = this.cleanId(id);
const response = await this.client.get(`/${this.endpoint}/${cleanId}`, params);
return response.data;
}
/**
* Get multiple entities
*/
async list(params) {
const response = await this.client.get(`/${this.endpoint}`, params);
return response.data;
}
/**
* Search entities with autocomplete
*/
async autocomplete(query, params) {
const searchParams = {
q: query,
...params,
};
const response = await this.client.get(`/autocomplete/${this.endpoint}`, searchParams);
return response.data;
}
/**
* Get random entities
*/
async random(params) {
const response = await this.client.get(`/${this.endpoint}/random`, params);
return response.data;
}
/**
* Get entities with pagination support
*/
async *paginate(params) {
let page = params?.page || 1;
const perPage = params?.per_page || 25;
let hasMore = true;
while (hasMore) {
const response = await this.list({
...params,
page,
per_page: perPage,
});
for (const item of response.results) {
yield item;
}
hasMore =
response.results.length === perPage && response.results.length > 0;
page++;
}
}
/**
* Get all entities (use with caution for large datasets)
*/
async getAll(params) {
const results = [];
for await (const item of this.paginate(params)) {
results.push(item);
}
return results;
}
/**
* Build filter string from object
*/
buildFilter(filters) {
return Object.entries(filters)
.map(([key, value]) => {
if (Array.isArray(value)) {
return `${key}:${value.join("|")}`;
}
return `${key}:${value}`;
})
.join(",");
}
/**
* Clean and validate ID
*/
cleanId(id) {
// Remove OpenAlex URL prefix if present
if (id.startsWith("https://openalex.org/")) {
return id.replace("https://openalex.org/", "");
}
return id;
}
/**
* Build search parameters
*/
buildParams(params) {
if (!params)
return {};
const searchParams = {};
if (params.search)
searchParams.search = params.search;
if (params.filter)
searchParams.filter = this.buildFilter(params.filter);
if (params.sort)
searchParams.sort = params.sort;
if (params.group_by)
searchParams.group_by = params.group_by;
if (params.select)
searchParams.select = params.select;
if (params.page)
searchParams.page = params.page;
if (params.per_page)
searchParams.per_page = params.per_page;
if (params.cursor)
searchParams.cursor = params.cursor;
if (params.mailto)
searchParams.mailto = params.mailto;
return searchParams;
}
}
exports.BaseService = BaseService;
//# sourceMappingURL=base.js.map