UNPKG

@letruxux/web-search

Version:

Wrapper for web search engines libraries.

52 lines 1.79 kB
import { search as googleSearch, OrganicResult } from "google-sr"; import { search as bingSearch } from "bing-scraper"; import { search as ddgSearch } from "duck-duck-scrape"; function applySiteModifier(query, site) { return site ? `${query} site:${site}` : query; } export async function searchGoogle(config) { const query = applySiteModifier(config.query, config.site); const results = await googleSearch({ query, parsers: [OrganicResult] }); return results .filter((e) => e.title && e.link && typeof e.title === "string" && typeof e.link === "string") .map((result) => ({ title: result.title, url: result.link, snippet: result.description ?? "", image: undefined, })); } export async function searchBing(config) { const query = applySiteModifier(config.query, config.site); const { results } = await bingSearchPromise({ q: query }); return results.map((result) => ({ title: result.title, url: result.url, snippet: result.description, image: undefined, })); } export async function searchDuckDuckGo(config) { const query = applySiteModifier(config.query, config.site); const { results } = await ddgSearch(query); return results.map((result) => ({ title: result.title, url: result.url, snippet: result.description, image: result.icon || undefined, })); } /* helper */ function bingSearchPromise(options) { return new Promise((resolve, reject) => { bingSearch(options, (err, res) => { if (err || !res) { reject(err ? err : new Error("No results")); } else { resolve(res); } }); }); } //# sourceMappingURL=search.js.map