UNPKG

@letruxux/web-search

Version:

Wrapper for web search engines libraries.

66 lines (65 loc) 2.32 kB
export class BraveSearchApi { apiKey; baseUrl = "https://api.search.brave.com/res/v1/web/search"; constructor(apiKey) { this.apiKey = apiKey; } async search(config) { const query = this.applySiteModifier(config.query, config.site); const response = await fetch(`${this.baseUrl}?q=${encodeURIComponent(query)}`, { headers: { Accept: "application/json", "X-Subscription-Token": this.apiKey, }, }); if (!response.ok) { throw new Error(`Brave API error: ${response.status} ${response.statusText}`); } const data = await response.json(); return (data.web?.results?.map((result) => ({ title: result.title, url: result.url, snippet: result.description, image: result.profile?.img_url || undefined, })) || []); } applySiteModifier(query, site) { return site ? `${query} site:${site}` : query; } } export class SerpApi { apiKey; baseUrl = "https://serpapi.com/search"; constructor(apiKey) { this.apiKey = apiKey; } async search(config) { const query = this.applySiteModifier(config.query, config.site); const params = new URLSearchParams({ q: query, api_key: this.apiKey, engine: "google_light", // "bing", "duckduckgo", etc. }); const response = await fetch(`${this.baseUrl}?${params}`); if (!response.ok) { throw new Error(`SerpApi error: ${response.status} ${response.statusText}`); } const data = await response.json(); return (data.organic_results?.map((result) => ({ title: result.title, url: result.link, snippet: result.snippet, image: result.thumbnail || undefined, })) || []); } applySiteModifier(query, site) { return site ? `${query} site:${site}` : query; } } /* const brave = new BraveSearchApi("your-brave-api-key"); const serpApi = new SerpApi("your-serpapi-key"); const braveResults = await brave.search({ query: "test", site: "example.com" }); const serpResults = await serpApi.search({ query: "test", site: "example.com" }); */ //# sourceMappingURL=api-search.js.map