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 };