UNPKG

openalex-client

Version:

TypeScript SDK for OpenAlex academic database API

124 lines 3.56 kB
"use strict"; 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