Sylvatica.

Back to Library

NPM

js 1/27/2026
14
const axios = require('axios');

async function searchNpm(query) {
    if (!query) {
        throw new Error("Query cannot be empty for NPM search.");
    }

    try {
        const searchUrl = `https://registry.npmjs.com/-/v1/search?text=${encodeURIComponent(query)}`;
        const response = await axios.get(searchUrl, {
            headers: {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
            },
            timeout: 15000
        });

        const { objects } = response.data;

        if (!objects || objects.length === 0) {
            return [];
        }

        const results = objects.map(obj => {
            const pkg = obj.package;
            return {
                name: pkg.name,
                version: pkg.version,
                description: pkg.description || 'No description provided.',
                keywords: pkg.keywords || [],
                author: pkg.author ? pkg.author.name : 'N/A',
                date: pkg.date,
                links: {
                    npm: pkg.links.npm,
                    homepage: pkg.links.homepage || 'N/A',
                    repository: pkg.links.repository || 'N/A',
                }
            };
        });

        return results;

    } catch (error) {
        if (axios.isAxiosError(error)) {
            const errorMessage = error.response ? `Status: ${error.response.status}, Data: ${JSON.stringify(error.response.data)}` : error.message;
            throw new Error(`NPM search failed: ${errorMessage}`);
        } else {
            throw new Error(`An unexpected error occurred during NPM search: ${error.message}`);
        }
    }
}

module.exports = { searchNpm };