dep-oracle 1.2.0 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/README.md +33 -8
  2. package/dist/action/index.js +398 -16
  3. package/dist/badge-5Z3WAD2B.js +89 -0
  4. package/dist/badge-5Z3WAD2B.js.map +1 -0
  5. package/dist/chunk-32B3QIPY.js +1505 -0
  6. package/dist/chunk-32B3QIPY.js.map +1 -0
  7. package/dist/chunk-7DST6SNA.js +258 -0
  8. package/dist/chunk-7DST6SNA.js.map +1 -0
  9. package/dist/{chunk-TXSNFX3N.js → chunk-DLWG22RC.js} +403 -17
  10. package/dist/chunk-DLWG22RC.js.map +1 -0
  11. package/dist/chunk-HX6MGNBD.js +271 -0
  12. package/dist/chunk-HX6MGNBD.js.map +1 -0
  13. package/dist/chunk-IVXGOPRU.js +145 -0
  14. package/dist/chunk-IVXGOPRU.js.map +1 -0
  15. package/dist/chunk-SP3VYPXX.js +218 -0
  16. package/dist/chunk-SP3VYPXX.js.map +1 -0
  17. package/dist/chunk-T5EVLWZM.js +4234 -0
  18. package/dist/chunk-T5EVLWZM.js.map +1 -0
  19. package/dist/chunk-UMB5MJHL.js +239 -0
  20. package/dist/chunk-UMB5MJHL.js.map +1 -0
  21. package/dist/cli/index.js +163 -6499
  22. package/dist/cli/index.js.map +1 -1
  23. package/dist/index.js +9 -84
  24. package/dist/index.js.map +1 -1
  25. package/dist/mcp/server.js +33 -12
  26. package/dist/mcp/server.js.map +1 -1
  27. package/dist/npm-UB54H37N.js +9 -0
  28. package/dist/npm-UB54H37N.js.map +1 -0
  29. package/dist/orchestrator-VOOYKDPT.js +8 -0
  30. package/dist/orchestrator-VOOYKDPT.js.map +1 -0
  31. package/dist/python-U4G2GK4J.js +9 -0
  32. package/dist/python-U4G2GK4J.js.map +1 -0
  33. package/dist/server-WONIBSG4.js +640 -0
  34. package/dist/server-WONIBSG4.js.map +1 -0
  35. package/dist/store-Z5UANEBB.js +8 -0
  36. package/dist/store-Z5UANEBB.js.map +1 -0
  37. package/dist/trust-score-YXYDFVPZ.js +8 -0
  38. package/dist/trust-score-YXYDFVPZ.js.map +1 -0
  39. package/package.json +1 -1
  40. package/server.json +2 -2
  41. package/dist/chunk-TXSNFX3N.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/analyzers/zombie-detector.ts","../src/analyzers/blast-radius.ts","../src/analyzers/typosquat-registry.ts","../src/analyzers/typosquat.ts","../src/analyzers/migration-advisor.ts"],"sourcesContent":["import type { RegistryData, GitHubData } from '../parsers/schema.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ZombieSeverity = 'none' | 'warning' | 'critical';\n\nexport interface ZombieResult {\n isZombie: boolean;\n severity: ZombieSeverity;\n lastActivity: Date | null;\n reason: string;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst MONTHS_12 = 12;\nconst MONTHS_24 = 24;\n\n// ---------------------------------------------------------------------------\n// ZombieDetector\n// ---------------------------------------------------------------------------\n\nexport class ZombieDetector {\n /**\n * Detect whether a package shows signs of abandonment (\"zombie\" status).\n *\n * Rules applied in priority order:\n * 1. Deprecated flag on the registry -> critical\n * 2. 0 active maintainers (contributorCount === 0) -> critical\n * 3. No commits in 24+ months -> critical\n * 4. No commits in 12+ months AND no publish in 12+ months -> warning\n */\n detect(\n registry: RegistryData | null,\n github: GitHubData | null,\n ): ZombieResult {\n const now = new Date();\n const reasons: string[] = [];\n\n // Track the most recent activity date from any source\n let lastActivity: Date | null = null;\n\n // -----------------------------------------------------------------------\n // Parse dates\n // -----------------------------------------------------------------------\n let lastPublishDate: Date | null = null;\n let monthsSincePublish: number | null = null;\n\n if (registry !== null && registry.lastPublishDate !== null) {\n lastPublishDate = new Date(registry.lastPublishDate);\n monthsSincePublish = monthsBetween(lastPublishDate, now);\n lastActivity = laterDate(lastActivity, lastPublishDate);\n }\n\n let lastCommitDate: Date | null = null;\n let monthsSinceCommit: number | null = null;\n\n if (github !== null && github.lastCommitDate !== null) {\n lastCommitDate = new Date(github.lastCommitDate);\n monthsSinceCommit = monthsBetween(lastCommitDate, now);\n lastActivity = laterDate(lastActivity, lastCommitDate);\n }\n\n // -----------------------------------------------------------------------\n // Rule 1: Deprecated\n // -----------------------------------------------------------------------\n if (registry !== null && registry.deprecated !== null) {\n reasons.push('Package is marked as deprecated');\n return {\n isZombie: true,\n severity: 'critical',\n lastActivity,\n reason: reasons.join('; '),\n };\n }\n\n // -----------------------------------------------------------------------\n // Rule 2: Zero active maintainers\n // -----------------------------------------------------------------------\n if (github !== null && github.contributorCount === 0) {\n reasons.push('0 active maintainers/contributors');\n return {\n isZombie: true,\n severity: 'critical',\n lastActivity,\n reason: reasons.join('; '),\n };\n }\n\n // -----------------------------------------------------------------------\n // Rule 3: No commits in 24+ months\n // -----------------------------------------------------------------------\n if (monthsSinceCommit !== null && monthsSinceCommit >= MONTHS_24) {\n reasons.push(\n `No commits in ${Math.round(monthsSinceCommit)} months, last commit ${formatDate(lastCommitDate!)}`,\n );\n return {\n isZombie: true,\n severity: 'critical',\n lastActivity,\n reason: reasons.join('; '),\n };\n }\n\n // -----------------------------------------------------------------------\n // Rule 4: No commits in 12+ months AND no publish in 12+ months\n // -----------------------------------------------------------------------\n const commitStale =\n monthsSinceCommit !== null && monthsSinceCommit >= MONTHS_12;\n const publishStale =\n monthsSincePublish !== null && monthsSincePublish >= MONTHS_12;\n\n if (commitStale && publishStale) {\n const parts: string[] = [];\n if (monthsSinceCommit !== null) {\n parts.push(`No commits in ${Math.round(monthsSinceCommit)} months`);\n }\n if (lastPublishDate !== null) {\n parts.push(`last publish ${formatDate(lastPublishDate)}`);\n }\n return {\n isZombie: true,\n severity: 'warning',\n lastActivity,\n reason: parts.join(', '),\n };\n }\n\n // Also flag warning when only one signal is available and it is stale\n if (commitStale && monthsSincePublish === null) {\n reasons.push(\n `No commits in ${Math.round(monthsSinceCommit!)} months (registry data unavailable)`,\n );\n return {\n isZombie: true,\n severity: 'warning',\n lastActivity,\n reason: reasons.join('; '),\n };\n }\n\n if (publishStale && monthsSinceCommit === null) {\n reasons.push(\n `No publish in ${Math.round(monthsSincePublish!)} months (GitHub data unavailable)`,\n );\n return {\n isZombie: true,\n severity: 'warning',\n lastActivity,\n reason: reasons.join('; '),\n };\n }\n\n // -----------------------------------------------------------------------\n // Not a zombie\n // -----------------------------------------------------------------------\n return {\n isZombie: false,\n severity: 'none',\n lastActivity,\n reason: 'Package is actively maintained',\n };\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction monthsBetween(from: Date, to: Date): number {\n const years = to.getFullYear() - from.getFullYear();\n const months = to.getMonth() - from.getMonth();\n const days = to.getDate() - from.getDate();\n return years * 12 + months + (days < 0 ? -0.5 : 0);\n}\n\nfunction laterDate(a: Date | null, b: Date | null): Date | null {\n if (a === null) return b;\n if (b === null) return a;\n return a.getTime() >= b.getTime() ? a : b;\n}\n\nfunction formatDate(d: Date): string {\n return d.toISOString().slice(0, 10);\n}\n","import { readdir, readFile } from 'node:fs/promises';\nimport { join, relative, extname } from 'node:path';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface BlastRadiusResult {\n /** Number of source files that import the package. */\n affectedFiles: number;\n /** Relative paths of the affected files. */\n affectedFilesList: string[];\n /** Percentage of all source files affected (0-100). */\n percentage: number;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst SOURCE_EXTENSIONS = new Set(['.js', '.ts', '.jsx', '.tsx', '.mjs', '.mts', '.cjs', '.cts']);\n\nconst IGNORED_DIRS = new Set([\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n 'out',\n 'coverage',\n '.next',\n '.nuxt',\n '__pycache__',\n '.turbo',\n]);\n\n// ---------------------------------------------------------------------------\n// BlastRadiusCalculator\n// ---------------------------------------------------------------------------\n\nexport class BlastRadiusCalculator {\n /**\n * Scan all source files under `projectDir` and count how many import\n * `packageName` (including sub-path imports like `packageName/sub`).\n */\n async calculate(\n packageName: string,\n projectDir: string,\n ): Promise<BlastRadiusResult> {\n const sourceFiles = await this.collectSourceFiles(projectDir);\n\n if (sourceFiles.length === 0) {\n return { affectedFiles: 0, affectedFilesList: [], percentage: 0 };\n }\n\n const importPattern = this.buildImportPattern(packageName);\n const affectedFilesList: string[] = [];\n\n // Read files in parallel (batched to avoid overwhelming the file system)\n const BATCH_SIZE = 50;\n for (let i = 0; i < sourceFiles.length; i += BATCH_SIZE) {\n const batch = sourceFiles.slice(i, i + BATCH_SIZE);\n const results = await Promise.all(\n batch.map(async (filePath) => {\n const matches = await this.fileContainsImport(filePath, importPattern);\n return { filePath, matches };\n }),\n );\n\n for (const { filePath, matches } of results) {\n if (matches) {\n affectedFilesList.push(relative(projectDir, filePath));\n }\n }\n }\n\n const percentage =\n sourceFiles.length > 0\n ? Math.round((affectedFilesList.length / sourceFiles.length) * 10000) / 100\n : 0;\n\n return {\n affectedFiles: affectedFilesList.length,\n affectedFilesList: affectedFilesList.sort(),\n percentage,\n };\n }\n\n // -------------------------------------------------------------------------\n // Internal helpers\n // -------------------------------------------------------------------------\n\n /**\n * Build a RegExp that matches all common import/require styles for a\n * given package name, including sub-path imports.\n *\n * Matches:\n * import ... from 'packageName'\n * import ... from 'packageName/sub'\n * import 'packageName'\n * require('packageName')\n * require('packageName/sub')\n * import('packageName') (dynamic import)\n */\n private buildImportPattern(packageName: string): RegExp {\n // Escape special regex chars in the package name (e.g. @scope/name)\n const escaped = packageName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n\n // Match the package name optionally followed by a sub-path.\n // The pattern must NOT match packages that merely start with the same\n // prefix (e.g. \"chalk\" should not match \"chalk-animation\").\n // We allow the name to be followed by: /, quote end, or nothing.\n const pkgPattern = `${escaped}(?:/[^'\"]*)?`;\n\n return new RegExp(\n [\n // ESM static: import ... from 'pkg' or import ... from \"pkg\"\n `from\\\\s+['\"]${pkgPattern}['\"]`,\n // ESM bare: import 'pkg' / import \"pkg\"\n `import\\\\s+['\"]${pkgPattern}['\"]`,\n // CJS require: require('pkg') or require(\"pkg\")\n `require\\\\s*\\\\(\\\\s*['\"]${pkgPattern}['\"]\\\\s*\\\\)`,\n // Dynamic import: import('pkg')\n `import\\\\s*\\\\(\\\\s*['\"]${pkgPattern}['\"]\\\\s*\\\\)`,\n ].join('|'),\n );\n }\n\n /**\n * Check whether a file's content matches the import pattern.\n */\n private async fileContainsImport(\n filePath: string,\n pattern: RegExp,\n ): Promise<boolean> {\n try {\n const content = await readFile(filePath, 'utf-8');\n return pattern.test(content);\n } catch {\n // File unreadable — skip silently\n return false;\n }\n }\n\n /**\n * Recursively collect all source files under `dir`, skipping\n * node_modules and other non-source directories.\n */\n private async collectSourceFiles(dir: string): Promise<string[]> {\n const files: string[] = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n const promises: Promise<void>[] = [];\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n\n if (entry.isDirectory()) {\n if (!IGNORED_DIRS.has(entry.name) && !entry.name.startsWith('.')) {\n promises.push(\n this.collectSourceFiles(fullPath).then((subFiles) => {\n files.push(...subFiles);\n }),\n );\n }\n } else if (entry.isFile() && SOURCE_EXTENSIONS.has(extname(entry.name))) {\n files.push(fullPath);\n }\n }\n\n await Promise.all(promises);\n } catch {\n // Directory unreadable — return empty\n }\n\n return files;\n }\n}\n","/**\n * Dynamic npm registry fetcher for popular packages.\n *\n * Fetches the top N most popular packages from the npm registry search API\n * and caches the results to a local JSON file. This supplements the hardcoded\n * POPULAR_PACKAGES list in the TyposquatDetector for more comprehensive\n * typosquat detection.\n *\n * Design decisions:\n * - Uses native `fetch` (Node 20+) -- zero additional dependencies.\n * - Caches to `~/.dep-oracle/popular-packages.json` with configurable TTL.\n * - Rate-limited to max 2 requests/second between pagination calls.\n * - Fails gracefully: returns an empty array on network/parse errors so\n * the caller can fall back to the hardcoded list.\n */\n\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { homedir } from 'node:os';\nimport { createLogger } from '../utils/logger.js';\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst NPM_SEARCH_BASE =\n 'https://registry.npmjs.org/-/v1/search?text=boost-exact:false&popularity=1.0&quality=0.0&maintenance=0.0';\nconst PAGE_SIZE = 250;\nconst DEFAULT_COUNT = 5000;\nconst DEFAULT_CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000; // 7 days\nconst RATE_LIMIT_DELAY_MS = 500; // 2 requests per second\n\nconst CACHE_DIR = join(homedir(), '.dep-oracle');\nconst CACHE_FILE = join(CACHE_DIR, 'popular-packages.json');\n\nconst log = createLogger('registry-fetch');\n\n// ---------------------------------------------------------------------------\n// Cache schema\n// ---------------------------------------------------------------------------\n\ninterface PopularPackagesCache {\n fetchedAt: string; // ISO-8601\n packages: string[];\n}\n\n// ---------------------------------------------------------------------------\n// npm search API response shape (subset)\n// ---------------------------------------------------------------------------\n\ninterface NpmSearchResult {\n objects: Array<{\n package: {\n name: string;\n };\n }>;\n total: number;\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Sleep for `ms` milliseconds. Used for rate-limiting between pages.\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n/**\n * Read the cache file and return its contents, or `null` if missing/corrupt.\n */\nfunction readCache(): PopularPackagesCache | null {\n try {\n if (!existsSync(CACHE_FILE)) return null;\n const raw = readFileSync(CACHE_FILE, 'utf-8');\n const parsed = JSON.parse(raw) as PopularPackagesCache;\n\n // Basic shape validation\n if (\n typeof parsed.fetchedAt !== 'string' ||\n !Array.isArray(parsed.packages)\n ) {\n return null;\n }\n\n return parsed;\n } catch {\n return null;\n }\n}\n\n/**\n * Write the cache file atomically (best-effort).\n */\nfunction writeCache(data: PopularPackagesCache): void {\n try {\n mkdirSync(CACHE_DIR, { recursive: true });\n writeFileSync(CACHE_FILE, JSON.stringify(data, null, 2), 'utf-8');\n } catch {\n log.warn('Failed to write popular-packages cache file');\n }\n}\n\n/**\n * Fetch a single page of results from the npm search API.\n */\nasync function fetchPage(from: number): Promise<NpmSearchResult> {\n const url = `${NPM_SEARCH_BASE}&size=${PAGE_SIZE}&from=${from}`;\n const response = await fetch(url, {\n headers: {\n 'Accept': 'application/json',\n },\n signal: AbortSignal.timeout(30_000),\n });\n\n if (!response.ok) {\n throw new Error(\n `npm search API returned ${response.status} ${response.statusText}`,\n );\n }\n\n return (await response.json()) as NpmSearchResult;\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Fetch top N popular packages from the npm registry and cache the results.\n * Uses npm's search API to find the most popular packages.\n *\n * This is used to supplement the hardcoded POPULAR_PACKAGES list\n * in the TyposquatDetector for more comprehensive detection.\n *\n * @param options.count Number of packages to fetch (default: 5000).\n * @param options.cacheTtlMs Cache time-to-live in milliseconds (default: 7 days).\n * @returns Array of package names sorted by popularity. Returns an empty\n * array on failure (offline, rate-limited, etc.) so the caller\n * can safely fall back to the hardcoded list.\n */\nexport async function fetchPopularPackages(options?: {\n count?: number;\n cacheTtlMs?: number;\n}): Promise<string[]> {\n const count = options?.count ?? DEFAULT_COUNT;\n const cacheTtlMs = options?.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;\n\n // 1. Check cache first\n const cached = readCache();\n if (cached) {\n const cacheAge = Date.now() - new Date(cached.fetchedAt).getTime();\n if (cacheAge < cacheTtlMs && cached.packages.length > 0) {\n log.info(\n `Using cached popular packages (${cached.packages.length} packages, ` +\n `cached ${Math.round(cacheAge / 1000 / 60 / 60)} hours ago)`,\n );\n return cached.packages;\n }\n log.info('Popular packages cache expired, fetching fresh data...');\n }\n\n // 2. Fetch from registry\n try {\n const totalPages = Math.ceil(count / PAGE_SIZE);\n const packages: string[] = [];\n const seen = new Set<string>();\n\n for (let page = 0; page < totalPages; page++) {\n const from = page * PAGE_SIZE;\n\n log.info(\n `Fetching popular packages from npm registry... (page ${page + 1}/${totalPages})`,\n );\n\n const result = await fetchPage(from);\n\n // Extract package names, deduplicating\n for (const obj of result.objects) {\n const name = obj.package.name;\n if (!seen.has(name)) {\n seen.add(name);\n packages.push(name);\n }\n }\n\n // If the API returned fewer results than the page size, we have\n // reached the end of available results\n if (result.objects.length < PAGE_SIZE) {\n log.info(\n `npm registry returned all available results (${packages.length} packages)`,\n );\n break;\n }\n\n // We have enough\n if (packages.length >= count) {\n break;\n }\n\n // Rate limit: wait between pages (skip wait after the last page)\n if (page < totalPages - 1) {\n await sleep(RATE_LIMIT_DELAY_MS);\n }\n }\n\n // Trim to the requested count\n const trimmed = packages.slice(0, count);\n\n // 3. Write to cache\n const cacheData: PopularPackagesCache = {\n fetchedAt: new Date().toISOString(),\n packages: trimmed,\n };\n writeCache(cacheData);\n\n log.info(`Fetched and cached ${trimmed.length} popular packages from npm registry`);\n return trimmed;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n log.warn(`Failed to fetch popular packages from npm registry: ${message}`);\n log.warn('Falling back to hardcoded popular packages list');\n\n // If we have a stale cache, return it as a best-effort fallback\n if (cached && cached.packages.length > 0) {\n log.info(\n `Returning stale cached data (${cached.packages.length} packages) as fallback`,\n );\n return cached.packages;\n }\n\n return [];\n }\n}\n","import { fetchPopularPackages } from './typosquat-registry.js';\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface TyposquatResult {\n /** Whether the package name looks suspiciously similar to a popular package. */\n isRisky: boolean;\n /** List of popular packages that are suspiciously close. */\n similarPackages: string[];\n /** Minimum Levenshtein distance found (0 = exact match). */\n distance: number;\n}\n\n// ---------------------------------------------------------------------------\n// Top 1000+ popular npm packages (curated list, organized by category)\n// ---------------------------------------------------------------------------\n\nconst POPULAR_PACKAGES: readonly string[] = [\n // ---------------------------------------------------------------------------\n // Core frameworks — React ecosystem\n // ---------------------------------------------------------------------------\n 'react', 'react-dom', 'react-router', 'react-router-dom', 'react-redux',\n 'react-hook-form', 'react-query', 'react-select', 'react-table',\n 'react-dnd', 'react-dnd-html5-backend', 'react-beautiful-dnd',\n 'react-virtualized', 'react-window', 'react-spring',\n 'react-transition-group', 'react-modal', 'react-toastify',\n 'react-icons', 'react-helmet', 'react-helmet-async',\n 'react-intl', 'react-i18next', 'react-dropzone',\n 'react-datepicker', 'react-color', 'react-slider',\n 'react-markdown', 'react-syntax-highlighter', 'react-copy-to-clipboard',\n 'react-error-boundary', 'react-hot-toast', 'react-loading-skeleton',\n 'react-player', 'react-responsive', 'react-use',\n 'react-aria', 'react-paginate', 'react-infinite-scroll-component',\n 'react-lazy-load-image-component', 'react-card-flip',\n 'react-countup', 'react-fast-compare', 'react-is',\n 'create-react-app', 'react-scripts', 'react-app-rewired',\n 'react-refresh', 'react-dev-utils',\n\n // ---------------------------------------------------------------------------\n // Core frameworks — Redux ecosystem\n // ---------------------------------------------------------------------------\n 'redux', 'redux-thunk', 'redux-saga', 'redux-persist',\n 'redux-toolkit', 'redux-observable', 'redux-form',\n 'redux-actions', 'redux-logger', 'redux-devtools-extension',\n 'reselect', 'redux-immutable',\n\n // ---------------------------------------------------------------------------\n // Core frameworks — Next.js / Gatsby / Remix / Astro\n // ---------------------------------------------------------------------------\n 'next', 'nextjs', 'next-auth', 'next-seo', 'next-i18next',\n 'next-compose-plugins', 'next-images', 'next-transpile-modules',\n 'gatsby', 'gatsby-plugin-image', 'gatsby-plugin-sharp',\n 'gatsby-transformer-sharp', 'gatsby-source-filesystem',\n 'gatsby-plugin-react-helmet', 'gatsby-plugin-manifest',\n 'gatsby-plugin-offline', 'gatsby-plugin-mdx',\n 'remix', 'remix-run', '@remix-run/node', '@remix-run/react',\n '@remix-run/serve', '@remix-run/dev',\n 'astro', '@astrojs/react', '@astrojs/vue', '@astrojs/svelte',\n '@astrojs/tailwind', '@astrojs/node', '@astrojs/vercel',\n\n // ---------------------------------------------------------------------------\n // Core frameworks — Vue ecosystem\n // ---------------------------------------------------------------------------\n 'vue', 'vuex', 'vue-router', 'nuxt', 'nuxt3',\n 'pinia', 'vue-loader', 'vue-template-compiler',\n '@vue/cli-service', '@vue/compiler-sfc', '@vue/reactivity',\n 'vue-i18n', 'vue-meta', 'vuetify', 'quasar',\n 'vuepress', 'vitepress', 'vue-demi', 'unplugin-vue-components',\n\n // ---------------------------------------------------------------------------\n // Core frameworks — Angular ecosystem\n // ---------------------------------------------------------------------------\n 'angular', '@angular/core', '@angular/common', '@angular/compiler',\n '@angular/forms', '@angular/router', '@angular/platform-browser',\n '@angular/platform-browser-dynamic', '@angular/animations',\n '@angular/cdk', '@angular/material', '@angular/cli',\n '@angular/http', '@angular/platform-server',\n 'zone.js', 'rxjs',\n\n // ---------------------------------------------------------------------------\n // Core frameworks — Svelte / SolidJS / Preact / Lit / Ember / misc\n // ---------------------------------------------------------------------------\n 'svelte', '@sveltejs/kit', '@sveltejs/adapter-auto',\n '@sveltejs/adapter-node', '@sveltejs/adapter-static', '@sveltejs/vite-plugin-svelte',\n 'solid-js', '@solidjs/router', '@solidjs/meta',\n 'preact', 'preact-render-to-string', 'preact-router',\n 'lit', 'lit-html', 'lit-element',\n 'ember-cli', 'ember-source', '@ember/test-helpers',\n 'stencil', '@stencil/core',\n 'alpine', 'alpinejs', 'htmx.org', 'stimulus', '@hotwired/turbo',\n 'qwik', '@builder.io/qwik', '@builder.io/qwik-city',\n\n // ---------------------------------------------------------------------------\n // Build tools / bundlers\n // ---------------------------------------------------------------------------\n 'webpack', 'webpack-cli', 'webpack-dev-server', 'webpack-merge',\n 'webpack-bundle-analyzer', 'webpack-dev-middleware', 'webpack-hot-middleware',\n 'html-webpack-plugin', 'mini-css-extract-plugin', 'copy-webpack-plugin',\n 'terser-webpack-plugin', 'css-minimizer-webpack-plugin',\n 'rollup', '@rollup/plugin-node-resolve', '@rollup/plugin-commonjs',\n '@rollup/plugin-typescript', '@rollup/plugin-json', '@rollup/plugin-babel',\n '@rollup/plugin-terser', '@rollup/plugin-alias', '@rollup/plugin-replace',\n 'esbuild', 'esbuild-register', 'esbuild-loader',\n 'parcel', '@parcel/transformer-sass', '@parcel/packager-ts',\n 'vite', 'vitest', '@vitejs/plugin-react', '@vitejs/plugin-vue',\n 'turbo', 'turbopack', 'turborepo',\n 'tsup', 'unbuild', 'microbundle',\n 'swc', '@swc/core', '@swc/cli', '@swc/helpers',\n 'babel-core', '@babel/core', '@babel/preset-env', '@babel/preset-react',\n '@babel/preset-typescript', '@babel/plugin-transform-runtime',\n '@babel/runtime', '@babel/parser', '@babel/traverse',\n '@babel/generator', '@babel/types', '@babel/template',\n '@babel/plugin-proposal-decorators', '@babel/plugin-proposal-class-properties',\n 'babel-loader', 'babel-plugin-module-resolver',\n 'babel-plugin-styled-components', 'babel-jest',\n 'metro', 'metro-react-native-babel-preset',\n\n // ---------------------------------------------------------------------------\n // TypeScript ecosystem\n // ---------------------------------------------------------------------------\n 'typescript', 'ts-node', 'tsx', 'ts-jest', 'ts-loader',\n 'ts-morph', 'ts-prune', 'ts-patch', 'ts-toolbelt',\n 'tslib', 'tsconfig-paths', 'tsc-watch', 'tsutils',\n 'typedoc', 'type-fest', 'utility-types', 'ts-essentials',\n 'ttypescript', 'dts-bundle-generator', 'api-extractor',\n\n // ---------------------------------------------------------------------------\n // Testing frameworks & utilities\n // ---------------------------------------------------------------------------\n 'jest', 'jest-cli', 'jest-environment-jsdom', 'jest-circus',\n 'jest-extended', 'jest-mock-extended', 'jest-when',\n 'jest-image-snapshot',\n 'mocha', 'chai', 'chai-as-promised', 'chai-http', 'chai-spies',\n 'jasmine', 'jasmine-core', 'karma', 'karma-chrome-launcher',\n 'karma-jasmine', 'karma-webpack',\n 'vitest', '@vitest/coverage-v8', '@vitest/ui',\n 'cypress', 'cypress-real-events', 'cypress-axe',\n 'playwright', '@playwright/test', 'playwright-core',\n 'puppeteer', 'puppeteer-core', 'puppeteer-extra',\n 'sinon', 'sinon-chai', 'nock', 'msw',\n 'supertest', 'ava', 'tape', 'tap',\n 'nyc', 'c8', 'istanbul', 'istanbul-lib-coverage',\n '@testing-library/react', '@testing-library/jest-dom',\n '@testing-library/user-event', '@testing-library/vue',\n '@testing-library/angular', '@testing-library/svelte',\n '@testing-library/dom', '@testing-library/react-hooks',\n 'enzyme', 'enzyme-adapter-react-16', 'react-test-renderer',\n 'storybook', '@storybook/react', '@storybook/vue3',\n '@storybook/addon-actions', '@storybook/addon-essentials',\n '@storybook/addon-links', '@storybook/testing-library',\n 'faker', '@faker-js/faker', 'chance', 'casual',\n 'expect', 'should', 'power-assert', 'assert',\n 'testcafe', 'nightwatch', 'webdriverio', 'selenium-webdriver',\n 'detox', 'appium',\n\n // ---------------------------------------------------------------------------\n // Linting & formatting\n // ---------------------------------------------------------------------------\n 'eslint', 'prettier', 'stylelint', 'tslint',\n 'eslint-config-airbnb', 'eslint-config-airbnb-base',\n 'eslint-config-standard', 'eslint-config-prettier',\n 'eslint-config-next', 'eslint-config-react-app',\n 'eslint-plugin-react', 'eslint-plugin-react-hooks',\n 'eslint-plugin-jsx-a11y', 'eslint-plugin-import',\n 'eslint-plugin-prettier', 'eslint-plugin-jest',\n 'eslint-plugin-testing-library', 'eslint-plugin-vue',\n 'eslint-plugin-node', 'eslint-plugin-security',\n 'eslint-plugin-unicorn', 'eslint-plugin-sonarjs',\n 'eslint-plugin-simple-import-sort', 'eslint-plugin-unused-imports',\n '@typescript-eslint/parser', '@typescript-eslint/eslint-plugin',\n 'eslint-import-resolver-typescript', 'eslint-plugin-cypress',\n 'stylelint-config-standard', 'stylelint-order',\n 'husky', 'lint-staged', 'commitlint',\n '@commitlint/cli', '@commitlint/config-conventional',\n 'editorconfig', 'sort-package-json',\n 'oxlint', 'biome', '@biomejs/biome',\n\n // ---------------------------------------------------------------------------\n // HTTP clients & servers\n // ---------------------------------------------------------------------------\n 'express', 'express-session', 'express-validator',\n 'express-async-errors', 'express-async-handler',\n 'fastify', '@fastify/cors', '@fastify/helmet', '@fastify/jwt',\n '@fastify/rate-limit', '@fastify/multipart', '@fastify/static',\n '@fastify/swagger', '@fastify/cookie', '@fastify/session',\n 'koa', 'koa-router', 'koa-bodyparser', 'koa-cors', 'koa-static',\n 'hapi', '@hapi/hapi', '@hapi/joi', '@hapi/boom', '@hapi/inert',\n 'restify', 'polka', 'micro', 'sirv',\n 'axios', 'got', 'node-fetch', 'undici', 'request',\n 'superagent', 'isomorphic-fetch', 'cross-fetch',\n 'ky', 'wretch', 'redaxios', 'ofetch',\n 'http-proxy', 'http-proxy-middleware', 'express-http-proxy',\n 'connect', 'serve-handler', 'sirv-cli', 'http-server',\n 'json-server', 'miragejs', 'mockoon',\n 'needle', 'phin', 'bent', 'centra',\n\n // ---------------------------------------------------------------------------\n // Utility libraries\n // ---------------------------------------------------------------------------\n 'lodash', 'lodash-es', 'lodash.get', 'lodash.set', 'lodash.merge',\n 'lodash.clonedeep', 'lodash.debounce', 'lodash.throttle',\n 'lodash.isempty', 'lodash.isequal', 'lodash.pick', 'lodash.omit',\n 'lodash.uniq', 'lodash.flatten', 'lodash.camelcase',\n 'underscore', 'ramda', 'immer', 'immutable',\n 'uuid', 'nanoid', 'shortid', 'cuid', 'ulid',\n 'deepmerge', 'deep-equal', 'fast-deep-equal', 'object-assign',\n 'just-debounce-it', 'just-throttle', 'just-clone',\n 'change-case', 'camelcase', 'snake-case', 'param-case',\n 'pluralize', 'humanize-string', 'titleize', 'decamelize',\n 'type-is', 'is-plain-object', 'is-number', 'is-string',\n 'escape-string-regexp', 'escape-html', 'he', 'entities',\n 'defu', 'destr', 'klona', 'rfdc',\n 'invariant', 'tiny-invariant', 'warning',\n\n // ---------------------------------------------------------------------------\n // CLI tools & frameworks\n // ---------------------------------------------------------------------------\n 'chalk', 'colors', 'picocolors', 'colorette', 'ansi-colors',\n 'commander', 'yargs', 'meow', 'inquirer', 'prompts',\n 'cac', 'citty', 'cleye', 'caporal',\n 'ora', 'listr', 'listr2', 'progress', 'cli-progress',\n 'figlet', 'boxen', 'cli-table3', 'table',\n 'terminal-link', 'open', 'opn',\n 'update-notifier', 'pkg-up', 'read-pkg', 'read-pkg-up',\n 'find-up', 'locate-path', 'resolve-from', 'import-from',\n 'execa', 'shelljs', 'cross-spawn', 'cross-env',\n 'which', 'shx', 'npm-run-all', 'concurrently',\n 'cfonts', 'gradient-string', 'log-symbols', 'cli-spinners',\n 'wrap-ansi', 'slice-ansi', 'cliui', 'y18n',\n 'arg', 'mri', 'minimist', 'nopt',\n\n // ---------------------------------------------------------------------------\n // Logging libraries\n // ---------------------------------------------------------------------------\n 'winston', 'winston-daily-rotate-file', 'winston-transport',\n 'pino', 'pino-pretty', 'pino-http',\n 'bunyan', 'morgan', 'debug',\n 'log4js', 'loglevel', 'signale',\n 'consola', 'npmlog', 'fancy-log', 'roarr',\n 'tslog', 'tracer', 'electron-log',\n\n // ---------------------------------------------------------------------------\n // Database / ORM\n // ---------------------------------------------------------------------------\n 'mongoose', 'mongoose-paginate-v2', 'mongoose-lean-virtuals',\n 'sequelize', 'sequelize-cli', 'sequelize-typescript',\n 'typeorm', 'typeorm-naming-strategies',\n 'prisma', '@prisma/client', 'prisma-client-js',\n 'knex', 'objection', 'bookshelf',\n 'drizzle-orm', 'drizzle-kit',\n 'mikro-orm', '@mikro-orm/core', '@mikro-orm/postgresql',\n 'pg', 'pg-pool', 'pg-promise', 'pg-cursor',\n 'mysql', 'mysql2', 'mariadb',\n 'sqlite3', 'better-sqlite3', 'sql.js',\n 'redis', 'ioredis', 'redis-om',\n 'mongodb', 'mongodb-memory-server',\n 'cassandra-driver', 'couchbase', 'nano', 'pouchdb',\n 'nedb', 'lowdb', 'level', 'levelup', 'leveldown',\n 'dexie', 'idb', 'localforage',\n 'elasticsearch', '@elastic/elasticsearch',\n 'mssql', 'tedious', 'oracledb',\n 'kysely', 'slonik', 'massive',\n 'typegoose', '@typegoose/typegoose',\n 'waterline', 'sails',\n\n // ---------------------------------------------------------------------------\n // Validation\n // ---------------------------------------------------------------------------\n 'zod', 'joi', 'yup', 'ajv', 'class-validator',\n 'superstruct', 'io-ts', 'runtypes', 'ow',\n 'validator', 'express-validator',\n 'fastest-validator', 'fluent-json-schema',\n 'valibot', 'typebox', '@sinclair/typebox',\n 'class-transformer', 'json-schema', 'tv4',\n 'is-my-json-valid', 'schema-utils',\n\n // ---------------------------------------------------------------------------\n // Security / auth\n // ---------------------------------------------------------------------------\n 'jsonwebtoken', 'bcrypt', 'bcryptjs', 'passport',\n 'helmet', 'cors', 'csurf', 'express-rate-limit',\n 'jose', 'oauth', 'passport-jwt', 'passport-local',\n 'passport-google-oauth20', 'passport-facebook', 'passport-github2',\n 'express-jwt', 'jwks-rsa', 'node-jose',\n 'csrf-csrf', 'hpp', 'xss-clean', 'express-mongo-sanitize',\n 'rate-limiter-flexible', 'bottleneck',\n 'speakeasy', 'otplib', 'node-2fa',\n 'crypto-random-string', 'secure-random-password',\n 'grant', 'oidc-provider', 'openid-client',\n '@auth/core', 'next-auth', 'lucia', 'arctic',\n 'keycloak-js', 'auth0', '@auth0/auth0-react',\n 'supertokens-node', 'clerk', '@clerk/nextjs',\n 'iron-session', 'cookie-session', 'express-session',\n\n // ---------------------------------------------------------------------------\n // File / stream utilities\n // ---------------------------------------------------------------------------\n 'fs-extra', 'graceful-fs', 'memfs', 'vinyl-fs',\n 'glob', 'globby', 'fast-glob', 'picomatch', 'micromatch',\n 'minimatch', 'multimatch', 'anymatch',\n 'chokidar', 'watchpack', 'nsfw', 'fb-watchman',\n 'rimraf', 'mkdirp', 'make-dir', 'del', 'trash',\n 'copy', 'cpy', 'ncp', 'cpx',\n 'archiver', 'tar', 'tar-fs', 'decompress', 'extract-zip',\n 'adm-zip', 'jszip', 'yazl', 'yauzl',\n 'multer', 'formidable', 'busboy', 'multiparty',\n 'through2', 'highland', 'pump', 'pumpify',\n 'concat-stream', 'get-stream', 'into-stream',\n 'readable-stream', 'stream-buffers', 'bl',\n 'vinyl', 'vinyl-source-stream', 'vinyl-buffer',\n 'tmp', 'temp-dir', 'tempy', 'temp-write',\n 'proper-lockfile', 'lockfile', 'write-file-atomic',\n 'papaparse', 'csv-parse', 'csv-parser', 'fast-csv',\n 'xlsx', 'exceljs', 'sheetjs',\n\n // ---------------------------------------------------------------------------\n // Template engines\n // ---------------------------------------------------------------------------\n 'ejs', 'pug', 'handlebars', 'mustache', 'nunjucks',\n 'hbs', 'eta', 'liquid', 'liquidjs', 'dot', 'art-template',\n 'consolidate', 'marko', 'edge.js',\n\n // ---------------------------------------------------------------------------\n // Markdown / HTML parsing\n // ---------------------------------------------------------------------------\n 'marked', 'markdown-it', 'remark', 'remark-html', 'remark-gfm',\n 'rehype', 'rehype-stringify', 'rehype-raw',\n 'unified', 'unist-util-visit',\n 'gray-matter', 'front-matter',\n 'cheerio', 'jsdom', 'htmlparser2', 'parse5',\n 'dompurify', 'isomorphic-dompurify', 'sanitize-html', 'xss',\n 'turndown', 'showdown', 'snarkdown',\n 'mdx', '@mdx-js/react', '@mdx-js/loader',\n 'mdast-util-from-markdown', 'micromark',\n 'highlight.js', 'prismjs', 'shiki',\n\n // ---------------------------------------------------------------------------\n // Config / env\n // ---------------------------------------------------------------------------\n 'dotenv', 'dotenv-expand', 'dotenv-flow', 'dotenv-safe',\n 'config', 'convict', 'nconf', 'rc',\n 'cosmiconfig', 'lilconfig',\n 'cross-env', 'env-cmd', 'envalid', 'znv',\n 'c12', 'unconfig', 'jiti',\n\n // ---------------------------------------------------------------------------\n // Process / task management\n // ---------------------------------------------------------------------------\n 'concurrently', 'npm-run-all', 'npm-run-all2',\n 'execa', 'shelljs', 'cross-spawn', 'child-process-promise',\n 'pm2', 'nodemon', 'ts-node-dev', 'node-dev',\n 'forever', 'supervisor',\n 'workerpool', 'piscina', 'tinypool',\n 'throng', 'sticky-cluster',\n 'signal-exit', 'exit-hook', 'async-exit-hook',\n 'tasuku',\n\n // ---------------------------------------------------------------------------\n // Crypto / encoding\n // ---------------------------------------------------------------------------\n 'crypto-js', 'argon2', 'base64-js', 'buffer',\n 'tweetnacl', 'libsodium-wrappers', 'sodium-native',\n 'hash.js', 'sha.js', 'md5', 'sha1', 'sha256',\n 'scrypt-js', 'pbkdf2',\n 'base64url', 'base-x', 'bs58', 'bech32',\n 'uint8arrays', 'multihashes', 'multibase',\n 'elliptic', 'secp256k1', 'noble-secp256k1',\n 'node-forge', 'openpgp', 'sshpk',\n 'jsencrypt', 'node-rsa',\n\n // ---------------------------------------------------------------------------\n // WebSocket\n // ---------------------------------------------------------------------------\n 'ws', 'socket.io', 'socket.io-client',\n 'sockjs', 'sockjs-client', 'faye-websocket',\n 'primus', 'engine.io', 'engine.io-client',\n 'uWebSockets.js', 'websocket', 'isomorphic-ws',\n 'reconnecting-websocket', '@trpc/server', '@trpc/client',\n '@trpc/react-query', '@trpc/next',\n\n // ---------------------------------------------------------------------------\n // GraphQL\n // ---------------------------------------------------------------------------\n 'graphql', 'graphql-tag', 'graphql-tools',\n 'apollo-server', 'apollo-server-express', 'apollo-server-core',\n '@apollo/client', '@apollo/server', '@apollo/gateway',\n '@apollo/federation', '@apollo/subgraph',\n 'graphql-yoga', 'mercurius', 'type-graphql',\n 'nexus', 'pothos', '@pothos/core',\n 'graphql-request', 'graphql-ws', 'graphql-subscriptions',\n 'graphql-scalars', 'graphql-upload', 'graphql-relay',\n 'graphql-shield', 'graphql-middleware', 'graphql-depth-limit',\n 'urql', '@urql/core', '@urql/exchange-graphcache',\n 'dataloader', 'graphql-codegen',\n '@graphql-codegen/cli', '@graphql-codegen/typescript',\n 'genql', 'gql-tag-operations-preset',\n\n // ---------------------------------------------------------------------------\n // CSS-in-JS / styling\n // ---------------------------------------------------------------------------\n 'styled-components', 'emotion', '@emotion/react', '@emotion/styled',\n '@emotion/css', '@emotion/server', '@emotion/cache',\n 'tailwindcss', '@tailwindcss/forms', '@tailwindcss/typography',\n '@tailwindcss/aspect-ratio', '@tailwindcss/container-queries',\n 'postcss', 'postcss-preset-env', 'postcss-import', 'postcss-nested',\n 'postcss-modules', 'postcss-loader',\n 'autoprefixer', 'cssnano', 'postcss-flexbugs-fixes',\n 'sass', 'node-sass', 'sass-loader', 'less', 'less-loader',\n 'css-loader', 'style-loader', 'css-modules-typescript-loader',\n 'styled-jsx', 'linaria', '@linaria/core', 'vanilla-extract',\n '@vanilla-extract/css', '@vanilla-extract/recipes',\n 'stitches', '@stitches/react',\n 'classnames', 'clsx', 'cva', 'class-variance-authority',\n 'tailwind-merge', 'tailwind-variants',\n 'stylis', 'polished', 'color', 'tinycolor2',\n 'normalize.css', 'modern-normalize', 'sanitize.css',\n 'windicss', 'unocss',\n\n // ---------------------------------------------------------------------------\n // State management\n // ---------------------------------------------------------------------------\n 'mobx', 'mobx-react', 'mobx-react-lite', 'mobx-state-tree',\n 'zustand', 'jotai', 'recoil', 'valtio', 'xstate',\n 'effector', 'effector-react', 'nanostores',\n '@preact/signals', '@preact/signals-react',\n 'ngrx', '@ngrx/store', '@ngrx/effects',\n 'akita', '@datorama/akita',\n 'legend-state', 'pullstate',\n\n // ---------------------------------------------------------------------------\n // Animation / UI component libraries\n // ---------------------------------------------------------------------------\n 'framer-motion', 'react-spring', 'react-motion',\n 'gsap', 'animejs', 'anime', 'popmotion', 'motion',\n 'lottie-web', 'lottie-react', 'react-lottie',\n 'velocity-animate', 'animate.css',\n '@headlessui/react', '@headlessui/vue',\n '@radix-ui/react-dialog', '@radix-ui/react-dropdown-menu',\n '@radix-ui/react-popover', '@radix-ui/react-tooltip',\n '@radix-ui/react-select', '@radix-ui/react-tabs',\n '@radix-ui/react-accordion', '@radix-ui/react-checkbox',\n '@radix-ui/react-slider', '@radix-ui/react-switch',\n '@radix-ui/react-avatar', '@radix-ui/react-scroll-area',\n 'antd', 'ant-design-vue',\n '@ant-design/icons', '@ant-design/pro-components',\n 'bootstrap', 'react-bootstrap',\n '@chakra-ui/react', '@chakra-ui/icons',\n 'primereact', 'primevue',\n 'element-plus', 'element-ui',\n 'semantic-ui-react', 'semantic-ui-css',\n 'rsuite', 'blueprint', '@blueprintjs/core',\n 'react-aria-components', 'ariakit',\n 'flowbite', 'flowbite-react', 'daisyui',\n 'mantine', '@mantine/core', '@mantine/hooks',\n '@mantine/form', '@mantine/notifications',\n 'shadcn-ui', 'cmdk',\n\n // ---------------------------------------------------------------------------\n // Image processing\n // ---------------------------------------------------------------------------\n 'sharp', 'jimp', 'canvas', 'fabric',\n 'pngjs', 'jpeg-js', 'bmp-js',\n 'image-size', 'probe-image-size',\n 'gm', 'imagemin', 'imagemin-pngquant', 'imagemin-mozjpeg',\n 'responsive-loader', 'next-optimized-images',\n 'blurhash', 'plaiceholder',\n 'qrcode', 'jsqr', 'bwip-js',\n 'pica', 'cropperjs', 'react-cropper',\n 'exif-parser', 'piexifjs',\n 'svg-captcha', 'svgo', 'svg-parser',\n '@svgr/core', '@svgr/webpack',\n\n // ---------------------------------------------------------------------------\n // Email / messaging\n // ---------------------------------------------------------------------------\n 'nodemailer', 'nodemailer-sendgrid-transport',\n '@sendgrid/mail', '@sendgrid/client',\n 'mailgun-js', '@mailgun/mailgun-js',\n 'postmark', '@postmark/postmark',\n 'email-templates', 'mjml',\n 'react-email', '@react-email/components',\n 'juice', 'html-to-text',\n 'twilio', 'vonage', '@vonage/server-sdk',\n 'firebase-admin', 'web-push', 'onesignal-node',\n '@slack/web-api', '@slack/bolt',\n 'discord.js', 'telegraf', 'node-telegram-bot-api',\n 'whatsapp-web.js',\n\n // ---------------------------------------------------------------------------\n // Cloud SDKs — AWS\n // ---------------------------------------------------------------------------\n 'aws-sdk', '@aws-sdk/client-s3', '@aws-sdk/client-dynamodb',\n '@aws-sdk/client-sqs', '@aws-sdk/client-sns',\n '@aws-sdk/client-lambda', '@aws-sdk/client-ses',\n '@aws-sdk/client-iam', '@aws-sdk/client-ec2',\n '@aws-sdk/client-ecs', '@aws-sdk/client-cloudformation',\n '@aws-sdk/client-cloudwatch', '@aws-sdk/client-secrets-manager',\n '@aws-sdk/client-ssm', '@aws-sdk/client-sts',\n '@aws-sdk/client-cognito-identity-provider',\n '@aws-sdk/client-kms', '@aws-sdk/client-kinesis',\n '@aws-sdk/lib-dynamodb', '@aws-sdk/s3-request-presigner',\n '@aws-sdk/credential-providers', '@aws-sdk/smithy-client',\n 'aws-amplify', '@aws-amplify/ui-react',\n 'serverless', 'serverless-offline', 'serverless-webpack',\n 'aws-cdk-lib', 'constructs',\n 'sst', '@serverless-stack/resources',\n\n // ---------------------------------------------------------------------------\n // Cloud SDKs — GCP\n // ---------------------------------------------------------------------------\n '@google-cloud/storage', '@google-cloud/firestore',\n '@google-cloud/pubsub', '@google-cloud/bigquery',\n '@google-cloud/functions-framework', '@google-cloud/logging',\n '@google-cloud/secret-manager', '@google-cloud/tasks',\n '@google-cloud/translate', '@google-cloud/vision',\n '@google-cloud/text-to-speech', '@google-cloud/speech',\n 'firebase', 'firebase-admin', 'firebase-functions',\n 'firebase-tools', '@firebase/app', '@firebase/auth',\n '@firebase/firestore', '@firebase/storage',\n 'googleapis', 'google-auth-library',\n\n // ---------------------------------------------------------------------------\n // Cloud SDKs — Azure / misc cloud\n // ---------------------------------------------------------------------------\n '@azure/storage-blob', '@azure/identity', '@azure/keyvault-secrets',\n '@azure/cosmos', '@azure/service-bus', '@azure/event-hubs',\n '@azure/functions', '@azure/msal-node', '@azure/msal-browser',\n '@azure/msal-react', '@azure/core-rest-pipeline',\n 'supabase', '@supabase/supabase-js', '@supabase/auth-helpers-nextjs',\n 'cloudflare', '@cloudflare/workers-types', 'wrangler',\n 'vercel', '@vercel/analytics', '@vercel/og', '@vercel/kv',\n 'netlify-cli', '@netlify/functions',\n 'digitalocean', 'heroku',\n\n // ---------------------------------------------------------------------------\n // Monitoring / APM / error tracking\n // ---------------------------------------------------------------------------\n '@sentry/node', '@sentry/browser', '@sentry/react',\n '@sentry/nextjs', '@sentry/vue', '@sentry/tracing',\n 'newrelic', '@newrelic/native-metrics',\n 'prom-client', 'express-prom-bundle',\n 'elastic-apm-node', '@elastic/apm-rum',\n 'dd-trace', 'hot-shots',\n '@opentelemetry/api', '@opentelemetry/sdk-node',\n '@opentelemetry/sdk-trace-node', '@opentelemetry/exporter-trace-otlp-http',\n '@opentelemetry/instrumentation-http', '@opentelemetry/instrumentation-express',\n 'applicationinsights', 'raygun', 'bugsnag',\n '@bugsnag/js', '@bugsnag/plugin-react',\n 'rollbar', 'logrocket', 'posthog-js', 'posthog-node',\n 'clinic', 'autocannon', '0x',\n\n // ---------------------------------------------------------------------------\n // Caching\n // ---------------------------------------------------------------------------\n 'node-cache', 'lru-cache', 'quick-lru', 'tiny-lru',\n 'keyv', '@keyv/redis', '@keyv/mongo',\n 'cacheable-request', 'apicache',\n 'memcached', 'catbox', '@hapi/catbox-redis',\n 'flat-cache', 'file-system-cache', 'cache-manager',\n 'stale-while-revalidate-cache',\n\n // ---------------------------------------------------------------------------\n // Queue / job processing\n // ---------------------------------------------------------------------------\n 'bull', 'bullmq', 'bee-queue', 'agenda',\n 'amqplib', 'amqp-connection-manager',\n 'kafkajs', 'node-rdkafka',\n 'celery-node', 'rsmq', 'sqs-consumer',\n 'p-queue', 'p-limit', 'p-map', 'p-retry', 'p-throttle',\n 'p-all', 'p-settle', 'p-props', 'p-event',\n 'async', 'neo-async', 'fastq',\n 'cron', 'node-cron', 'node-schedule', 'later',\n 'bree', 'croner',\n\n // ---------------------------------------------------------------------------\n // Serialization / schema / data formats\n // ---------------------------------------------------------------------------\n 'protobufjs', 'google-protobuf', '@grpc/grpc-js', '@grpc/proto-loader',\n 'avro-js', 'avsc',\n 'msgpack', 'msgpack-lite', '@msgpack/msgpack',\n 'flatbuffers', 'cbor', 'bson',\n 'yaml', 'js-yaml', 'toml', '@iarna/toml',\n 'ini', 'json5', 'jsonc-parser', 'strip-json-comments',\n 'qs', 'query-string', 'querystring', 'url-parse',\n 'form-data', 'formdata-polyfill', 'multipart-parser',\n\n // ---------------------------------------------------------------------------\n // Date / time\n // ---------------------------------------------------------------------------\n 'date-fns', 'date-fns-tz', 'dayjs', 'moment', 'moment-timezone',\n 'luxon', 'ms', 'humanize-duration', 'pretty-ms',\n 'chrono-node', 'spacetime', 'timeago.js',\n '@internationalized/date', 'fecha', 'dateformat',\n 'rrule',\n\n // ---------------------------------------------------------------------------\n // Math / science / numbers\n // ---------------------------------------------------------------------------\n 'mathjs', 'decimal.js', 'bignumber.js', 'big.js',\n 'bn.js', 'fraction.js', 'currency.js',\n 'dinero.js', 'accounting', 'numeral',\n 'd3-scale', 'd3-array', 'd3-format',\n 'simple-statistics', 'regression', 'ml-regression',\n 'seedrandom', 'chance',\n\n // ---------------------------------------------------------------------------\n // Compression\n // ---------------------------------------------------------------------------\n 'compression', 'pako', 'lz-string',\n 'lz4', 'snappy', 'brotli', 'iltorb',\n 'compressing', 'tar-stream', 'gunzip-maybe',\n 'archiver', 'unzipper', 'node-gzip',\n\n // ---------------------------------------------------------------------------\n // Networking / DNS / low-level\n // ---------------------------------------------------------------------------\n 'dns-packet', 'dns-over-http', 'native-dns',\n 'ip', 'ip-address', 'cidr-matcher', 'ipaddr.js',\n 'mac-address', 'public-ip', 'internal-ip',\n 'is-online', 'is-reachable', 'ping', 'tcp-ping',\n 'net-ping', 'raw-socket', 'pcap',\n 'socks', 'socks-proxy-agent', 'https-proxy-agent',\n 'http-proxy-agent', 'pac-proxy-agent', 'proxy-agent',\n 'tunnel', 'global-agent', 'agent-base',\n 'ssh2', 'node-ssh',\n 'ftp', 'basic-ftp', 'ssh2-sftp-client',\n\n // ---------------------------------------------------------------------------\n // Package managers / monorepo tools\n // ---------------------------------------------------------------------------\n 'npm', 'yarn', 'pnpm', 'bun',\n 'lerna', 'nx', '@nrwl/workspace', '@nrwl/react', '@nrwl/node',\n 'changesets', '@changesets/cli', '@changesets/changelog-github',\n 'rush', '@microsoft/rush', 'bolt',\n 'syncpack', 'ultra-runner', 'wireit',\n 'verdaccio', 'npm-registry-fetch', 'pacote',\n 'np', 'release-it', 'semantic-release', 'standard-version',\n 'auto', 'bumpp', 'publish-please',\n\n // ---------------------------------------------------------------------------\n // Documentation\n // ---------------------------------------------------------------------------\n 'typedoc', 'jsdoc', 'documentation',\n 'docusaurus', '@docusaurus/core', '@docusaurus/preset-classic',\n 'vuepress', 'vitepress', 'docsify', 'docsify-cli',\n 'storybook', 'swagger-ui-express', 'swagger-jsdoc',\n 'redoc', 'spectaql', 'apidoc',\n 'compodoc', 'esdoc',\n\n // ---------------------------------------------------------------------------\n // Internationalization (i18n)\n // ---------------------------------------------------------------------------\n 'i18next', 'react-i18next', 'i18next-http-backend',\n 'i18next-browser-languagedetector', 'i18next-fs-backend',\n 'vue-i18n', '@nuxtjs/i18n',\n 'react-intl', '@formatjs/intl', '@formatjs/cli',\n 'globalize', 'messageformat', 'gettext-parser',\n 'polyglot', 'lingui', '@lingui/core', '@lingui/react',\n 'rosetta', 'typesafe-i18n',\n 'intl-messageformat', 'intl-pluralrules',\n\n // ---------------------------------------------------------------------------\n // Accessibility\n // ---------------------------------------------------------------------------\n 'axe-core', '@axe-core/react', '@axe-core/playwright',\n 'pa11y', 'pa11y-ci', 'lighthouse',\n 'eslint-plugin-jsx-a11y', 'react-axe',\n 'ally.js', 'focus-trap', 'focus-trap-react', 'focus-visible',\n 'aria-query', 'dom-accessibility-api',\n\n // ---------------------------------------------------------------------------\n // Editor / rich text\n // ---------------------------------------------------------------------------\n 'prosemirror-state', 'prosemirror-view', 'prosemirror-model',\n 'prosemirror-transform', 'prosemirror-commands',\n 'tiptap', '@tiptap/core', '@tiptap/react', '@tiptap/vue-3',\n '@tiptap/starter-kit', '@tiptap/extension-link',\n 'slate', 'slate-react', 'slate-history',\n 'quill', 'react-quill', 'quill-delta',\n 'draft-js', 'draftjs-to-html', 'react-draft-wysiwyg',\n 'lexical', '@lexical/react',\n 'tinymce', '@tinymce/tinymce-react',\n 'ckeditor5', '@ckeditor/ckeditor5-react', '@ckeditor/ckeditor5-build-classic',\n 'codemirror', '@codemirror/state', '@codemirror/view',\n '@codemirror/lang-javascript', '@codemirror/lang-python',\n 'monaco-editor', '@monaco-editor/react',\n 'ace-builds', 'react-ace',\n 'editorjs', '@editorjs/editorjs',\n\n // ---------------------------------------------------------------------------\n // PDF / document generation\n // ---------------------------------------------------------------------------\n 'pdfkit', 'pdf-lib', 'pdfjs-dist', 'react-pdf',\n 'jspdf', 'jspdf-autotable', 'html2canvas', 'html2pdf.js',\n 'docx', 'officegen', 'xlsx', 'exceljs',\n 'pptxgenjs',\n 'latex.js', 'katex', 'mathjax',\n 'csv-writer', 'csv-stringify', 'fast-csv',\n\n // ---------------------------------------------------------------------------\n // Payment processing\n // ---------------------------------------------------------------------------\n 'stripe', '@stripe/stripe-js', '@stripe/react-stripe-js',\n 'paypal-rest-sdk', '@paypal/checkout-server-sdk',\n '@paypal/react-paypal-js', 'braintree', 'braintree-web',\n 'square', 'adyen-api', 'razorpay',\n 'coinbase-commerce-node', 'ethers', 'web3', 'web3-eth',\n '@solana/web3.js', 'bitcoinjs-lib',\n 'commerce.js', 'snipcart', 'medusa-core',\n\n // ---------------------------------------------------------------------------\n // Analytics\n // ---------------------------------------------------------------------------\n 'posthog-js', 'posthog-node',\n 'mixpanel', 'mixpanel-browser',\n 'amplitude-js', '@amplitude/analytics-browser',\n '@segment/analytics-next', 'analytics-node',\n 'matomo-tracker', 'plausible-tracker',\n 'react-ga', 'react-ga4', 'ga-4-react',\n 'universal-analytics', '@google-analytics/data',\n 'rudder-sdk-js',\n 'launchdarkly-node-server-sdk',\n 'statsig-node', 'growthbook', '@growthbook/growthbook-react',\n 'flagsmith', 'unleash-client',\n\n // ---------------------------------------------------------------------------\n // CMS / headless CMS\n // ---------------------------------------------------------------------------\n 'contentful', '@contentful/rich-text-react-renderer',\n 'strapi', '@strapi/strapi', '@strapi/plugin-users-permissions',\n 'sanity', '@sanity/client', '@sanity/image-url',\n 'directus', '@directus/sdk',\n 'ghost-admin-api', '@tryghost/content-api',\n 'prismic', '@prismicio/client', '@prismicio/react',\n 'storyblok-js-client', '@storyblok/react',\n 'keystone', '@keystone-6/core',\n 'payload', 'tinacms', 'decap-cms',\n 'wpapi',\n 'hygraph',\n\n // ---------------------------------------------------------------------------\n // SSR / SSG / meta-frameworks\n // ---------------------------------------------------------------------------\n 'eleventy', '@11ty/eleventy',\n 'hexo',\n 'gridsome', 'scully', '@scullyio/init',\n 'blitz', 'redwood', '@redwoodjs/core',\n 'fresh', 'analog',\n\n // ---------------------------------------------------------------------------\n // DevOps / Docker / CI-CD\n // ---------------------------------------------------------------------------\n 'dockerode', 'docker-compose',\n '@kubernetes/client-node',\n '@pulumi/aws', '@pulumi/gcp',\n '@actions/core', '@actions/github',\n '@actions/exec', '@actions/io', '@actions/cache',\n 'danger', 'semantic-release',\n 'env-ci', 'ci-info', 'is-ci',\n 'dotenv-vault', 'infisical',\n\n // ---------------------------------------------------------------------------\n // Scoped popular — @types/*\n // ---------------------------------------------------------------------------\n '@types/node', '@types/react', '@types/react-dom',\n '@types/jest', '@types/mocha', '@types/chai',\n '@types/express', '@types/lodash', '@types/underscore',\n '@types/uuid', '@types/validator', '@types/semver',\n '@types/jsonwebtoken', '@types/bcrypt', '@types/bcryptjs',\n '@types/cors', '@types/helmet', '@types/morgan',\n '@types/multer', '@types/busboy', '@types/formidable',\n '@types/fs-extra', '@types/glob', '@types/rimraf', '@types/mkdirp',\n '@types/ws', '@types/qs', '@types/cookie-parser',\n '@types/body-parser', '@types/compression', '@types/serve-static',\n '@types/supertest', '@types/sinon', '@types/debug',\n '@types/mime', '@types/mime-types',\n '@types/cheerio', '@types/jsdom', '@types/luxon',\n '@types/inquirer', '@types/yargs', '@types/minimist',\n '@types/shelljs', '@types/through2', '@types/pump',\n '@types/pug', '@types/ejs', '@types/mustache',\n '@types/js-yaml', '@types/ini', '@types/json5',\n '@types/escape-html', '@types/http-errors',\n '@types/http-proxy', '@types/http-proxy-middleware',\n '@types/connect', '@types/koa', '@types/koa-router',\n '@types/passport', '@types/passport-jwt', '@types/passport-local',\n '@types/sharp', '@types/canvas', '@types/d3',\n '@types/three', '@types/jquery', '@types/backbone',\n '@types/async', '@types/bluebird',\n '@types/nodemailer', '@types/pg', '@types/mysql',\n\n // ---------------------------------------------------------------------------\n // Scoped popular — @mui/* (Material UI)\n // ---------------------------------------------------------------------------\n '@mui/material', '@mui/icons-material', '@mui/system',\n '@mui/lab', '@mui/styles', '@mui/x-date-pickers',\n '@mui/x-data-grid', '@mui/base', '@mui/joy',\n\n // ---------------------------------------------------------------------------\n // Scoped popular — @tanstack/*\n // ---------------------------------------------------------------------------\n '@tanstack/react-query', '@tanstack/react-query-devtools',\n '@tanstack/react-table', '@tanstack/react-virtual',\n '@tanstack/react-router', '@tanstack/query-core',\n '@tanstack/vue-query', '@tanstack/solid-query',\n '@tanstack/react-form',\n\n // ---------------------------------------------------------------------------\n // Scoped popular — @nestjs/*\n // ---------------------------------------------------------------------------\n '@nestjs/core', '@nestjs/common', '@nestjs/platform-express',\n '@nestjs/swagger', '@nestjs/typeorm', '@nestjs/mongoose',\n '@nestjs/jwt', '@nestjs/passport', '@nestjs/config',\n '@nestjs/graphql', '@nestjs/microservices', '@nestjs/websockets',\n '@nestjs/testing', '@nestjs/cli', '@nestjs/cqrs',\n '@nestjs/bull', '@nestjs/schedule', '@nestjs/throttler',\n\n // ---------------------------------------------------------------------------\n // Scoped popular — @next/*, @reduxjs/*, @octokit/*, misc ecosystem\n // ---------------------------------------------------------------------------\n '@next/font', '@next/mdx', '@next/bundle-analyzer',\n '@next/env', '@next/eslint-plugin-next',\n\n '@reduxjs/toolkit',\n\n '@octokit/core', '@octokit/rest', '@octokit/graphql',\n '@octokit/auth-token', '@octokit/request',\n\n '@sindresorhus/is', '@sindresorhus/slugify',\n\n '@t3-oss/env-nextjs', '@t3-oss/env-core',\n\n // ---------------------------------------------------------------------------\n // Visualization / charting\n // ---------------------------------------------------------------------------\n 'd3', 'd3-selection', 'd3-scale', 'd3-shape', 'd3-axis',\n 'd3-transition', 'd3-geo', 'd3-hierarchy',\n 'chart.js', 'react-chartjs-2',\n 'echarts', 'echarts-for-react',\n 'three', '@react-three/fiber', '@react-three/drei',\n 'highcharts', 'highcharts-react-official',\n 'recharts', 'nivo', '@nivo/core', '@nivo/bar', '@nivo/line',\n 'victory', 'victory-core',\n 'plotly.js', 'react-plotly.js', 'vega', 'vega-lite',\n 'apexcharts', 'react-apexcharts',\n 'visx', '@visx/shape', '@visx/scale', '@visx/group',\n 'mapbox-gl', 'react-map-gl', 'leaflet', 'react-leaflet',\n '@deck.gl/core', '@deck.gl/react',\n 'ol', 'cesium', 'globe.gl',\n\n // ---------------------------------------------------------------------------\n // Forms / drag-and-drop\n // ---------------------------------------------------------------------------\n 'formik', 'react-hook-form', '@hookform/resolvers',\n 'final-form', 'react-final-form',\n 'react-jsonschema-form', '@rjsf/core',\n 'react-dnd', 'react-dnd-html5-backend',\n 'react-beautiful-dnd', '@dnd-kit/core', '@dnd-kit/sortable',\n 'sortablejs', 'vuedraggable', 'interact.js', 'dragula',\n\n // ---------------------------------------------------------------------------\n // Misc popular / low-level / legacy\n // ---------------------------------------------------------------------------\n 'bluebird', 'q', 'when', 'rsvp',\n 'async', 'neo-async',\n 'semver', 'yargs-parser',\n 'mime', 'mime-types', 'content-type', 'content-disposition',\n 'body-parser', 'cookie-parser', 'cookie', 'tough-cookie',\n 'compression', 'serve-static', 'serve-favicon',\n 'http-errors', 'on-finished', 'raw-body',\n 'path-to-regexp', 'path-parse', 'path-exists',\n 'string-width', 'strip-ansi', 'ansi-regex', 'ansi-styles',\n 'supports-color', 'has-flag', 'color-convert', 'color-name',\n 'resolve', 'resolve-from', 'resolve-cwd', 'enhanced-resolve',\n 'source-map', 'source-map-support', 'source-map-js',\n 'acorn', 'acorn-walk', 'espree', 'esprima',\n 'estree-walker', 'escodegen', 'recast', 'ast-types',\n 'magic-string', 'merge-stream', 'merge2',\n 'which', 'which-module', 'require-directory',\n 'require-main-filename', 'set-blocking',\n 'once', 'wrappy', 'inherits', 'util-deprecate',\n 'graceful-fs', 'jsonfile', 'universalify',\n 'lru-cache', 'yallist', 'minipass', 'minizlib',\n 'whatwg-url', 'tr46', 'webidl-conversions',\n 'iconv-lite', 'safer-buffer', 'string_decoder',\n 'node-gyp', 'node-pre-gyp', 'prebuild-install', 'prebuildify',\n 'nan', 'node-addon-api', 'napi-macros', 'bindings',\n 'env-paths', 'xdg-basedir', 'os-tmpdir', 'os-homedir',\n 'electron', 'electron-builder', 'electron-forge',\n 'electron-store', 'electron-updater',\n 'tauri', '@tauri-apps/api', '@tauri-apps/cli',\n 'react-native', 'expo', 'expo-cli', 'expo-router',\n '@react-native-community/cli', 'react-native-web',\n 'react-native-gesture-handler', 'react-native-reanimated',\n 'react-native-screens', 'react-native-safe-area-context',\n '@react-navigation/native', '@react-navigation/stack',\n '@react-navigation/bottom-tabs',\n 'nativescript', 'capacitor', '@capacitor/core', '@capacitor/cli',\n 'ionic', '@ionic/core', '@ionic/react', '@ionic/vue',\n\n // ---------------------------------------------------------------------------\n // jQuery / legacy frameworks\n // ---------------------------------------------------------------------------\n 'jquery', 'backbone', 'knockout', 'dojo',\n 'mootools', 'prototype', 'zepto',\n 'requirejs', 'systemjs', 'amd-loader',\n\n // ---------------------------------------------------------------------------\n // Deprecated / known-risky / compromised (useful for detection)\n // ---------------------------------------------------------------------------\n 'event-stream', 'flatmap-stream', 'node-uuid',\n 'coffee-script', 'coffeescript', 'bower',\n 'uglify-js', 'terser', 'clean-css',\n 'left-pad', 'is-promise', 'is-buffer',\n 'ua-parser-js', 'coa', 'rc', 'colors',\n 'node-ipc', 'peacenotwar', 'es5-ext',\n 'faker', 'request', 'tslint',\n 'node-pre-gyp', 'npm-lifecycle',\n\n // ---------------------------------------------------------------------------\n // Popular Python packages (PyPI)\n // ---------------------------------------------------------------------------\n 'requests', 'flask', 'django', 'fastapi', 'numpy', 'pandas',\n 'scipy', 'matplotlib', 'tensorflow', 'torch', 'scikit-learn',\n 'keras', 'pytorch-lightning', 'xgboost', 'lightgbm',\n 'pytest', 'black', 'mypy', 'ruff', 'pylint', 'flake8', 'isort',\n 'celery', 'redis', 'sqlalchemy', 'alembic', 'pydantic',\n 'httpx', 'aiohttp', 'uvicorn', 'gunicorn', 'starlette',\n 'boto3', 'botocore', 'awscli', 'google-cloud-storage', 'azure-storage-blob',\n 'pillow', 'opencv-python', 'beautifulsoup4', 'lxml', 'scrapy',\n 'cryptography', 'paramiko', 'fabric', 'ansible',\n 'click', 'typer', 'rich', 'tqdm', 'colorama', 'tabulate',\n 'setuptools', 'wheel', 'pip', 'twine', 'poetry', 'pdm', 'hatch',\n 'jinja2', 'mako', 'markupsafe', 'werkzeug',\n 'psycopg2', 'pymongo', 'motor', 'peewee', 'tortoise-orm',\n 'marshmallow', 'attrs', 'dataclasses-json',\n 'sentry-sdk', 'prometheus-client', 'opentelemetry-api',\n 'transformers', 'huggingface-hub', 'tokenizers', 'datasets',\n 'langchain', 'openai', 'anthropic', 'tiktoken',\n 'pytest-cov', 'pytest-asyncio', 'pytest-mock', 'coverage',\n 'pyyaml', 'toml', 'python-dotenv', 'decouple',\n 'arrow', 'pendulum', 'python-dateutil',\n 'stripe', 'twilio', 'sendgrid',\n 'selenium', 'playwright', 'httptools',\n 'orjson', 'ujson', 'msgpack',\n 'networkx', 'sympy', 'statsmodels',\n] as const;\n\n// ---------------------------------------------------------------------------\n// TyposquatDetector\n// ---------------------------------------------------------------------------\n\nexport class TyposquatDetector {\n private readonly popularPackages: ReadonlySet<string>;\n private readonly popularList: readonly string[];\n\n constructor(extraPopularPackages?: string[]) {\n const combined = [...POPULAR_PACKAGES, ...(extraPopularPackages ?? [])];\n this.popularList = combined;\n this.popularPackages = new Set(combined);\n }\n\n /**\n * Async factory that creates a TyposquatDetector enriched with popular\n * packages fetched from the npm registry.\n *\n * The fetched list is cached locally (`~/.dep-oracle/popular-packages.json`)\n * with a 7-day TTL. If the fetch fails (offline, rate-limited, etc.) the\n * detector falls back to the hardcoded POPULAR_PACKAGES list only.\n *\n * Usage:\n * ```ts\n * const detector = await TyposquatDetector.createWithRegistry();\n * const result = detector.check('lod-ash');\n * ```\n */\n static async createWithRegistry(options?: {\n fetchPopular?: boolean;\n }): Promise<TyposquatDetector> {\n const shouldFetch = options?.fetchPopular ?? true;\n\n if (!shouldFetch) {\n return new TyposquatDetector();\n }\n\n const registryPackages = await fetchPopularPackages();\n return new TyposquatDetector(registryPackages);\n }\n\n /**\n * Check whether `packageName` looks like a typosquat of a popular package.\n * Returns risk assessment with details.\n */\n check(packageName: string): TyposquatResult {\n // If the package itself is a known popular package, it is safe\n if (this.popularPackages.has(packageName)) {\n return { isRisky: false, similarPackages: [], distance: 0 };\n }\n\n const similarPackages: string[] = [];\n let minDistance = Infinity;\n\n for (const popular of this.popularList) {\n const distance = levenshtein(packageName, popular);\n\n // Flag if Levenshtein distance is 1 or 2\n if (distance >= 1 && distance <= 2) {\n if (distance < minDistance) {\n minDistance = distance;\n }\n if (!similarPackages.includes(popular)) {\n similarPackages.push(popular);\n }\n }\n }\n\n // Also check common typosquat patterns even if Levenshtein > 2\n const patternMatches = this.checkTyposquatPatterns(packageName);\n for (const match of patternMatches) {\n if (!similarPackages.includes(match)) {\n similarPackages.push(match);\n const d = levenshtein(packageName, match);\n if (d < minDistance) {\n minDistance = d;\n }\n }\n }\n\n const isRisky = similarPackages.length > 0;\n\n return {\n isRisky,\n similarPackages: similarPackages.sort(),\n distance: isRisky ? minDistance : 0,\n };\n }\n\n // -------------------------------------------------------------------------\n // Pattern-based detection\n // -------------------------------------------------------------------------\n\n /**\n * Check for common typosquat patterns that may not be caught by\n * Levenshtein alone (e.g. adding -js, -node suffix).\n */\n private checkTyposquatPatterns(packageName: string): string[] {\n const matches: string[] = [];\n\n for (const popular of this.popularList) {\n // Skip exact matches\n if (packageName === popular) continue;\n\n // Pattern: added suffix (-js, -node, -lib, -pkg, -core)\n const suffixes = ['-js', '-node', '-lib', '-pkg', '-core', 'js', '-new'];\n for (const suffix of suffixes) {\n if (packageName === popular + suffix) {\n matches.push(popular);\n break;\n }\n if (packageName + suffix === popular) {\n matches.push(popular);\n break;\n }\n }\n\n // Pattern: doubled letters (e.g. \"expresss\" vs \"express\")\n if (this.isDoubledLetter(packageName, popular)) {\n matches.push(popular);\n continue;\n }\n\n // Pattern: missing letter (e.g. \"expres\" vs \"express\")\n if (this.isMissingLetter(packageName, popular)) {\n matches.push(popular);\n continue;\n }\n\n // Pattern: transposed adjacent letters (e.g. \"exrpess\" vs \"express\")\n if (this.isTransposed(packageName, popular)) {\n matches.push(popular);\n continue;\n }\n\n // Pattern: homoglyph / common substitution (e.g. \"1odash\" vs \"lodash\")\n if (this.isHomoglyph(packageName, popular)) {\n matches.push(popular);\n continue;\n }\n }\n\n return matches;\n }\n\n /**\n * Check if `input` is `target` with one letter doubled.\n * e.g. \"expresss\" -> \"express\"\n */\n private isDoubledLetter(input: string, target: string): boolean {\n if (input.length !== target.length + 1) return false;\n\n let skipped = false;\n let j = 0;\n for (let i = 0; i < input.length; i++) {\n if (j >= target.length) {\n // Extra char at end — check it is the same as previous\n if (!skipped && i > 0 && input[i] === input[i - 1]) return true;\n return false;\n }\n if (input[i] === target[j]) {\n j++;\n } else if (!skipped && i > 0 && input[i] === input[i - 1]) {\n skipped = true;\n // Don't advance j — this is the doubled letter\n } else {\n return false;\n }\n }\n return j === target.length;\n }\n\n /**\n * Check if `input` is `target` with one letter removed.\n * e.g. \"expres\" -> \"express\"\n */\n private isMissingLetter(input: string, target: string): boolean {\n if (input.length !== target.length - 1) return false;\n\n let skipped = false;\n let j = 0;\n for (let i = 0; i < target.length; i++) {\n if (j >= input.length) {\n return !skipped;\n }\n if (input[j] === target[i]) {\n j++;\n } else if (!skipped) {\n skipped = true;\n // Skip this target char\n } else {\n return false;\n }\n }\n return j === input.length;\n }\n\n /**\n * Check if `input` is `target` with two adjacent letters swapped.\n * e.g. \"exrpess\" -> \"express\"\n */\n private isTransposed(input: string, target: string): boolean {\n if (input.length !== target.length) return false;\n\n let diffCount = 0;\n let firstDiff = -1;\n\n for (let i = 0; i < input.length; i++) {\n if (input[i] !== target[i]) {\n diffCount++;\n if (diffCount === 1) {\n firstDiff = i;\n } else if (diffCount === 2) {\n // Check if this is a transposition of adjacent characters\n if (\n i === firstDiff + 1 &&\n input[firstDiff] === target[i] &&\n input[i] === target[firstDiff]\n ) {\n // Valid transposition — continue checking the rest\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n }\n\n return diffCount === 2;\n }\n\n /**\n * Check for common character substitutions (homoglyphs).\n * e.g. \"1odash\" vs \"lodash\", \"rn\" vs \"m\"\n */\n private isHomoglyph(input: string, target: string): boolean {\n if (input.length !== target.length) return false;\n\n const substitutions: Record<string, string[]> = {\n 'l': ['1', 'i', '|'],\n 'o': ['0'],\n '0': ['o'],\n '1': ['l', 'i'],\n 'i': ['1', 'l'],\n 'e': ['3'],\n 's': ['5'],\n 'a': ['4', '@'],\n 'g': ['9'],\n 'b': ['6'],\n };\n\n let subCount = 0;\n\n for (let i = 0; i < input.length; i++) {\n if (input[i] !== target[i]) {\n const allowed = substitutions[target[i]];\n if (allowed && allowed.includes(input[i])) {\n subCount++;\n if (subCount > 2) return false; // Allow up to 2 substitutions\n } else {\n return false;\n }\n }\n }\n\n return subCount >= 1 && subCount <= 2;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Levenshtein distance\n// ---------------------------------------------------------------------------\n\n/**\n * Compute the Levenshtein (edit) distance between two strings.\n * Uses the classic dynamic-programming approach with O(min(m,n)) space.\n */\nfunction levenshtein(a: string, b: string): number {\n // Ensure `a` is the shorter string for space optimization\n if (a.length > b.length) {\n [a, b] = [b, a];\n }\n\n const m = a.length;\n const n = b.length;\n\n // Edge cases\n if (m === 0) return n;\n if (n === 0) return m;\n\n // Previous and current row of distances\n let prev = new Array<number>(m + 1);\n let curr = new Array<number>(m + 1);\n\n // Initialize the base row\n for (let i = 0; i <= m; i++) {\n prev[i] = i;\n }\n\n for (let j = 1; j <= n; j++) {\n curr[0] = j;\n\n for (let i = 1; i <= m; i++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n curr[i] = Math.min(\n prev[i] + 1, // deletion\n curr[i - 1] + 1, // insertion\n prev[i - 1] + cost, // substitution\n );\n }\n\n // Swap rows\n [prev, curr] = [curr, prev];\n }\n\n return prev[m];\n}\n","// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type MigrationDifficulty = 'easy' | 'moderate' | 'hard';\n\nexport interface MigrationSuggestion {\n /** Name of the alternative package. */\n alternative: string;\n /** Short description of the alternative and migration path. */\n description: string;\n /** Estimated difficulty of migrating to this alternative. */\n difficulty: MigrationDifficulty;\n}\n\n/** Internal entry in the migration map. */\ninterface MigrationEntry {\n alternative: string;\n description: string;\n difficulty: MigrationDifficulty;\n}\n\n// ---------------------------------------------------------------------------\n// Migration map — hardcoded knowledge base of common replacements\n// ---------------------------------------------------------------------------\n\nconst MIGRATION_MAP: Record<string, MigrationEntry[]> = {\n // Date/time libraries\n 'moment': [\n {\n alternative: 'dayjs',\n description: 'Lightweight Moment.js alternative with compatible API. Drop-in replacement for most use cases.',\n difficulty: 'easy',\n },\n {\n alternative: 'date-fns',\n description: 'Modular date utility library. Tree-shakeable, functional API. Requires rewriting date manipulation calls.',\n difficulty: 'moderate',\n },\n {\n alternative: 'luxon',\n description: 'Modern date/time library by a Moment.js maintainer. Immutable, chainable API with timezone support.',\n difficulty: 'moderate',\n },\n ],\n\n // HTTP client libraries\n 'request': [\n {\n alternative: 'got',\n description: 'Feature-rich HTTP client with retry, pagination, and stream support. Promise-based API.',\n difficulty: 'moderate',\n },\n {\n alternative: 'axios',\n description: 'Popular HTTP client for browser and Node.js. Interceptors, transforms, and cancellation support.',\n difficulty: 'easy',\n },\n {\n alternative: 'node-fetch',\n description: 'Lightweight Fetch API implementation for Node.js. Minimal API surface.',\n difficulty: 'moderate',\n },\n {\n alternative: 'undici',\n description: 'Official Node.js HTTP/1.1 client. High performance, built into Node 18+.',\n difficulty: 'moderate',\n },\n ],\n\n // Color/terminal output\n 'colors': [\n {\n alternative: 'chalk',\n description: 'Most popular terminal string styling library. Clean, chainable API.',\n difficulty: 'easy',\n },\n {\n alternative: 'picocolors',\n description: 'Tiny (< 3KB) terminal color library. Fastest option, no dependencies.',\n difficulty: 'easy',\n },\n {\n alternative: 'colorette',\n description: 'Lightweight terminal color library. Similar API to picocolors.',\n difficulty: 'easy',\n },\n ],\n\n // Compromised packages\n 'event-stream': [\n {\n alternative: 'highland',\n description: 'High-level stream library. Manages backpressure and provides functional stream composition.',\n difficulty: 'moderate',\n },\n {\n alternative: 'through2',\n description: 'Thin wrapper around Node.js streams. Simple transform/writable stream creation.',\n difficulty: 'easy',\n },\n ],\n\n // Utility belts\n 'underscore': [\n {\n alternative: 'lodash',\n description: 'Superset of underscore functionality. Drop-in replacement with better performance.',\n difficulty: 'easy',\n },\n {\n alternative: 'ramda',\n description: 'Functional programming utility library. Curried by default, immutable data focus.',\n difficulty: 'hard',\n },\n ],\n\n 'lodash': [\n {\n alternative: 'es-toolkit',\n description: 'Modern TypeScript utility library. Drop-in replacement for common lodash functions, tree-shakeable.',\n difficulty: 'easy',\n },\n {\n alternative: 'ramda',\n description: 'Functional programming utility library. Different paradigm — curried, point-free style.',\n difficulty: 'hard',\n },\n {\n alternative: 'radash',\n description: 'Modern lodash alternative with TypeScript-first design. Smaller bundle, zero dependencies.',\n difficulty: 'moderate',\n },\n ],\n\n // Build tools\n 'bower': [\n {\n alternative: 'npm',\n description: 'Default Node.js package manager. Bower is deprecated — migrate packages to npm.',\n difficulty: 'hard',\n },\n {\n alternative: 'yarn',\n description: 'Alternative package manager with workspaces. Bower packages need to be republished.',\n difficulty: 'hard',\n },\n ],\n\n // Language / transpilers\n 'coffee-script': [\n {\n alternative: 'typescript',\n description: 'Typed superset of JavaScript. Industry standard, excellent tooling support.',\n difficulty: 'hard',\n },\n ],\n 'coffeescript': [\n {\n alternative: 'typescript',\n description: 'Typed superset of JavaScript. Industry standard, excellent tooling support.',\n difficulty: 'hard',\n },\n ],\n\n // Minifiers\n 'uglify-js': [\n {\n alternative: 'terser',\n description: 'Fork of uglify-es with ES6+ support. Drop-in replacement for most configurations.',\n difficulty: 'easy',\n },\n {\n alternative: 'esbuild',\n description: 'Extremely fast bundler and minifier written in Go. 10-100x faster than terser.',\n difficulty: 'moderate',\n },\n ],\n\n // UUID generation\n 'node-uuid': [\n {\n alternative: 'uuid',\n description: 'Official successor package. Same maintainers, just renamed. Direct drop-in replacement.',\n difficulty: 'easy',\n },\n ],\n\n // Code coverage\n 'istanbul': [\n {\n alternative: 'nyc',\n description: 'Istanbul CLI wrapper. Easier configuration and integration with test runners.',\n difficulty: 'easy',\n },\n {\n alternative: 'c8',\n description: 'Native V8 code coverage. Uses built-in Node.js coverage, no instrumentation needed.',\n difficulty: 'easy',\n },\n ],\n\n // Linting\n 'tslint': [\n {\n alternative: 'eslint',\n description: 'TSLint is deprecated. Use ESLint with @typescript-eslint/parser for TypeScript linting.',\n difficulty: 'moderate',\n },\n ],\n\n // Promise libraries\n 'bluebird': [\n {\n alternative: 'native-promises',\n description: 'Native Promise API is now performant enough for most use cases. Remove bluebird and use built-in Promise.',\n difficulty: 'moderate',\n },\n ],\n\n // Test runners\n 'mocha': [\n {\n alternative: 'vitest',\n description: 'Vite-native test runner. Fast, ESM-first, Jest-compatible API. Built-in coverage and watch mode.',\n difficulty: 'moderate',\n },\n {\n alternative: 'jest',\n description: 'Zero-config testing framework. Snapshot testing, mocking, and coverage built in.',\n difficulty: 'moderate',\n },\n ],\n\n // Callback utilities\n 'async': [\n {\n alternative: 'p-map',\n description: 'Promise-based concurrent mapping. Use with async/await for cleaner control flow.',\n difficulty: 'moderate',\n },\n {\n alternative: 'p-limit',\n description: 'Promise-based concurrency limiter. Modern replacement for async.parallelLimit.',\n difficulty: 'easy',\n },\n ],\n\n // Legacy HTTP frameworks\n 'restify': [\n {\n alternative: 'fastify',\n description: 'High-performance web framework. Schema-based validation, plugin architecture.',\n difficulty: 'moderate',\n },\n {\n alternative: 'express',\n description: 'Most popular Node.js web framework. Large ecosystem, extensive middleware.',\n difficulty: 'moderate',\n },\n ],\n\n 'hapi': [\n {\n alternative: 'fastify',\n description: 'High-performance alternative with similar plugin architecture. Built-in validation and serialization.',\n difficulty: 'moderate',\n },\n ],\n\n // Template engines\n 'jade': [\n {\n alternative: 'pug',\n description: 'Jade was renamed to Pug. Same syntax, same maintainers. Update the package name.',\n difficulty: 'easy',\n },\n ],\n\n // Glob / file matching\n 'glob': [\n {\n alternative: 'fast-glob',\n description: 'Faster glob implementation. Returns promises by default, supports negation patterns.',\n difficulty: 'easy',\n },\n {\n alternative: 'globby',\n description: 'User-friendly glob matching built on fast-glob. Supports gitignore and multiple patterns.',\n difficulty: 'easy',\n },\n ],\n\n // Deprecated request-related\n 'superagent': [\n {\n alternative: 'got',\n description: 'Modern HTTP client with better error handling, retry support, and TypeScript types.',\n difficulty: 'moderate',\n },\n {\n alternative: 'undici',\n description: 'Official Node.js HTTP client. Built into Node 18+, high performance.',\n difficulty: 'moderate',\n },\n ],\n\n // Process management\n 'nodemon': [\n {\n alternative: 'tsx',\n description: 'TypeScript execute with watch mode. Built on esbuild, instant restarts.',\n difficulty: 'easy',\n },\n ],\n\n // Shortid (deprecated)\n 'shortid': [\n {\n alternative: 'nanoid',\n description: 'Smaller, faster, URL-safe unique ID generator. Drop-in replacement, better entropy.',\n difficulty: 'easy',\n },\n {\n alternative: 'cuid',\n description: 'Collision-resistant unique IDs. Designed for horizontal scaling and security.',\n difficulty: 'easy',\n },\n ],\n\n // Crypto\n 'crypto-js': [\n {\n alternative: 'node:crypto',\n description: 'Built-in Node.js crypto module. No external dependency, maintained by Node.js core team.',\n difficulty: 'moderate',\n },\n ],\n\n // Body parsing (standalone)\n 'body-parser': [\n {\n alternative: 'express',\n description: 'body-parser is built into Express 4.16+. Use express.json() and express.urlencoded() directly.',\n difficulty: 'easy',\n },\n ],\n\n // YAML\n 'js-yaml': [\n {\n alternative: 'yaml',\n description: 'Full YAML 1.2 support with better error messages and TypeScript types.',\n difficulty: 'easy',\n },\n ],\n\n // Rimraf\n 'rimraf': [\n {\n alternative: 'fs.rm',\n description: 'Built-in Node.js fs.rm with recursive option (Node 14.14+). No external dependency needed.',\n difficulty: 'easy',\n },\n ],\n\n // Mkdirp\n 'mkdirp': [\n {\n alternative: 'fs.mkdir',\n description: 'Built-in Node.js fs.mkdir with recursive option (Node 10.12+). No external dependency needed.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // left-pad (infamous, now unnecessary)\n // ---------------------------------------------------------------------------\n 'left-pad': [\n {\n alternative: 'String.prototype.padStart',\n description: 'Built-in ES2017 String method. Native replacement, zero dependencies.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // querystring (deprecated Node.js built-in)\n // ---------------------------------------------------------------------------\n 'querystring': [\n {\n alternative: 'URLSearchParams',\n description: 'Web-standard URL query string API built into Node.js. Handles encoding/decoding correctly.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // request-promise / request-promise-native (deprecated with request)\n // ---------------------------------------------------------------------------\n 'request-promise': [\n {\n alternative: 'got',\n description: 'Modern HTTP client with native Promise support, retries, and hooks. request is fully deprecated.',\n difficulty: 'moderate',\n },\n {\n alternative: 'axios',\n description: 'Promise-based HTTP client for Node.js and browsers. Familiar interceptor API.',\n difficulty: 'easy',\n },\n {\n alternative: 'undici',\n description: 'Official Node.js HTTP client built into Node 18+. High performance, standards-based.',\n difficulty: 'moderate',\n },\n ],\n\n 'request-promise-native': [\n {\n alternative: 'got',\n description: 'Modern HTTP client with native Promise support. No wrapper needed, request is deprecated.',\n difficulty: 'moderate',\n },\n {\n alternative: 'undici',\n description: 'Official Node.js HTTP client built into Node 18+. Standards-based fetch API.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // node-sass (deprecated in favor of Dart Sass)\n // ---------------------------------------------------------------------------\n 'node-sass': [\n {\n alternative: 'sass',\n description: 'Dart Sass is the primary implementation of Sass. node-sass is deprecated. API is compatible for most use cases.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // PhantomJS (abandoned)\n // ---------------------------------------------------------------------------\n 'phantomjs': [\n {\n alternative: 'playwright',\n description: 'Modern browser automation by Microsoft. Supports Chromium, Firefox, and WebKit. Actively maintained.',\n difficulty: 'hard',\n },\n {\n alternative: 'puppeteer',\n description: 'Chrome/Chromium automation by Google. Headless browser testing and scraping.',\n difficulty: 'hard',\n },\n ],\n\n 'phantomjs-prebuilt': [\n {\n alternative: 'playwright',\n description: 'Modern browser automation supporting multiple browsers. PhantomJS is abandoned and insecure.',\n difficulty: 'hard',\n },\n {\n alternative: 'puppeteer',\n description: 'Headless Chrome automation. Direct replacement for PhantomJS browser scripting use cases.',\n difficulty: 'hard',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // merge (unmaintained shallow merge)\n // ---------------------------------------------------------------------------\n 'merge': [\n {\n alternative: 'deepmerge',\n description: 'Deep merge utility with support for arrays, Maps, and Sets. Actively maintained.',\n difficulty: 'easy',\n },\n {\n alternative: 'lodash.merge',\n description: 'Well-tested deep merge from lodash. Handles circular references and complex objects.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // minimatch (old versions with ReDoS)\n // ---------------------------------------------------------------------------\n 'minimatch': [\n {\n alternative: 'picomatch',\n description: 'Fast and accurate glob matcher. Better performance and no ReDoS vulnerabilities.',\n difficulty: 'easy',\n },\n {\n alternative: 'micromatch',\n description: 'Feature-rich glob matcher built on picomatch. Supports extended globs and brace expansion.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // har-validator (deprecated)\n // ---------------------------------------------------------------------------\n 'har-validator': [\n {\n alternative: 'har-schema',\n description: 'Use the HAR schema directly with ajv or zod for validation. har-validator is unmaintained.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // graphql-tools (old monolithic Apollo package)\n // ---------------------------------------------------------------------------\n 'graphql-tools': [\n {\n alternative: '@graphql-tools/schema',\n description: 'Modular GraphQL Tools packages. Import only what you need from the scoped @graphql-tools/* packages.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // enzyme (React testing, abandoned)\n // ---------------------------------------------------------------------------\n 'enzyme': [\n {\n alternative: '@testing-library/react',\n description: 'Testing Library encourages testing user behavior instead of implementation details. React recommended approach.',\n difficulty: 'hard',\n },\n ],\n\n 'enzyme-adapter-react-16': [\n {\n alternative: '@testing-library/react',\n description: 'Enzyme adapters are no longer maintained for newer React. Testing Library works with all React versions.',\n difficulty: 'hard',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // sinon (test doubles)\n // ---------------------------------------------------------------------------\n 'sinon': [\n {\n alternative: 'vitest',\n description: 'Vitest includes built-in vi.fn(), vi.spyOn(), and vi.mock() for mocking. No separate library needed.',\n difficulty: 'moderate',\n },\n {\n alternative: 'jest',\n description: 'Jest includes built-in jest.fn(), jest.spyOn(), and jest.mock(). No separate mocking library needed.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // karma (test runner for browsers)\n // ---------------------------------------------------------------------------\n 'karma': [\n {\n alternative: 'vitest',\n description: 'Fast Vite-native test runner with browser mode. Replaces Karma for both unit and browser testing.',\n difficulty: 'hard',\n },\n {\n alternative: 'jest',\n description: 'Zero-config test framework with jsdom for DOM testing. No browser process required.',\n difficulty: 'hard',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // jasmine\n // ---------------------------------------------------------------------------\n 'jasmine': [\n {\n alternative: 'vitest',\n description: 'Modern test runner with Jest-compatible API. Faster execution, ESM support, built-in coverage.',\n difficulty: 'moderate',\n },\n {\n alternative: 'jest',\n description: 'Feature-rich test framework. Similar describe/it syntax, built-in mocking and assertions.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // tape\n // ---------------------------------------------------------------------------\n 'tape': [\n {\n alternative: 'vitest',\n description: 'Modern test runner with a rich assertion API. Supports TAP output via reporters if needed.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // ava\n // ---------------------------------------------------------------------------\n 'ava': [\n {\n alternative: 'vitest',\n description: 'Vitest offers similar parallel test execution with better IDE integration and watch mode.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // nyc (Istanbul CLI)\n // ---------------------------------------------------------------------------\n 'nyc': [\n {\n alternative: 'c8',\n description: 'Native V8 code coverage using NODE_V8_COVERAGE. No instrumentation, faster and more accurate.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // node-fetch / cross-fetch / isomorphic-fetch (native fetch in Node 18+)\n // ---------------------------------------------------------------------------\n 'node-fetch': [\n {\n alternative: 'native fetch',\n description: 'Node.js 18+ includes a global fetch() based on undici. No polyfill needed for modern Node.',\n difficulty: 'easy',\n },\n ],\n\n 'cross-fetch': [\n {\n alternative: 'native fetch',\n description: 'Node.js 18+ and all modern browsers support fetch() natively. Polyfill no longer needed.',\n difficulty: 'easy',\n },\n ],\n\n 'isomorphic-fetch': [\n {\n alternative: 'native fetch',\n description: 'Global fetch() is available in Node.js 18+ and all modern browsers. Remove the polyfill.',\n difficulty: 'easy',\n },\n ],\n\n 'isomorphic-unfetch': [\n {\n alternative: 'native fetch',\n description: 'Minimal fetch polyfill no longer needed. Node.js 18+ ships native fetch globally.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // express-validator\n // ---------------------------------------------------------------------------\n 'express-validator': [\n {\n alternative: 'zod',\n description: 'TypeScript-first schema validation. Framework-agnostic, composable schemas, great type inference.',\n difficulty: 'moderate',\n },\n {\n alternative: 'valibot',\n description: 'Tiny, tree-shakeable schema validation library. Similar API to zod with smaller bundle size.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // cls-hooked (async context)\n // ---------------------------------------------------------------------------\n 'cls-hooked': [\n {\n alternative: 'AsyncLocalStorage',\n description: 'Built-in Node.js AsyncLocalStorage (stable since Node 16). No external dependency for async context propagation.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // dotenv\n // ---------------------------------------------------------------------------\n 'dotenv': [\n {\n alternative: 'node --env-file',\n description: 'Node.js 20.6+ supports --env-file flag natively. No library needed for .env loading.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // chalk (for simple coloring)\n // ---------------------------------------------------------------------------\n 'chalk': [\n {\n alternative: 'picocolors',\n description: 'Tiny (< 3KB), dependency-free terminal color library. 2x faster than chalk, covers most use cases.',\n difficulty: 'easy',\n },\n {\n alternative: 'colorette',\n description: 'Lightweight terminal coloring. Simple API compatible with chalk basic usage patterns.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // commander / yargs (CLI argument parsing)\n // ---------------------------------------------------------------------------\n 'commander': [\n {\n alternative: 'citty',\n description: 'Elegant CLI builder from UnJS. TypeScript-first, minimal API with sub-command support.',\n difficulty: 'moderate',\n },\n {\n alternative: 'clipanion',\n description: 'Type-safe CLI framework used by Yarn. Advanced features like command routing and validation.',\n difficulty: 'moderate',\n },\n ],\n\n 'yargs': [\n {\n alternative: 'citty',\n description: 'Lightweight CLI builder from UnJS. Cleaner API, TypeScript types, smaller footprint than yargs.',\n difficulty: 'moderate',\n },\n {\n alternative: 'commander',\n description: 'Popular CLI framework with a simpler API. Less configuration overhead than yargs.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // inquirer / prompts (interactive CLI prompts)\n // ---------------------------------------------------------------------------\n 'inquirer': [\n {\n alternative: '@clack/prompts',\n description: 'Beautiful CLI prompts with minimal API. Better UX with spinners, grouping, and cancel handling.',\n difficulty: 'moderate',\n },\n ],\n\n 'prompts': [\n {\n alternative: '@clack/prompts',\n description: 'Modern interactive prompt library with better DX. Structured prompt flows with cancel support.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // listr (task runner)\n // ---------------------------------------------------------------------------\n 'listr': [\n {\n alternative: 'listr2',\n description: 'Actively maintained fork of listr. Better TypeScript support, new renderers, and task management.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Logging libraries\n // ---------------------------------------------------------------------------\n 'debug': [\n {\n alternative: 'pino',\n description: 'Fast structured JSON logger. Better for production observability than debug-style logging.',\n difficulty: 'moderate',\n },\n {\n alternative: 'consola',\n description: 'Elegant console logger from UnJS. Supports log levels, reporters, and structured output.',\n difficulty: 'easy',\n },\n ],\n\n 'bunyan': [\n {\n alternative: 'pino',\n description: 'Fastest Node.js JSON logger. Same structured JSON approach as bunyan, 5x faster.',\n difficulty: 'moderate',\n },\n ],\n\n 'log4js': [\n {\n alternative: 'pino',\n description: 'High-performance structured logger. Modern alternative to log4js with async I/O and transports.',\n difficulty: 'moderate',\n },\n ],\n\n 'signale': [\n {\n alternative: 'consola',\n description: 'Elegant console logger from UnJS. Beautiful output, pluggable reporters, TypeScript support.',\n difficulty: 'easy',\n },\n ],\n\n 'winston': [\n {\n alternative: 'pino',\n description: 'Significantly faster JSON logger. Simpler transport system, lower overhead in production.',\n difficulty: 'moderate',\n },\n ],\n\n 'morgan': [\n {\n alternative: 'pino-http',\n description: 'HTTP logger middleware for pino. Structured JSON request logging with automatic request IDs.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // ORM / Query builders\n // ---------------------------------------------------------------------------\n 'mongoose': [\n {\n alternative: 'prisma',\n description: 'Type-safe ORM with auto-generated client. Schema-first approach, migrations, and studio GUI.',\n difficulty: 'hard',\n },\n {\n alternative: 'drizzle-orm',\n description: 'Lightweight TypeScript ORM. SQL-like syntax, zero overhead, excellent type inference.',\n difficulty: 'hard',\n },\n ],\n\n 'sequelize': [\n {\n alternative: 'prisma',\n description: 'Modern type-safe ORM. Better TypeScript support, declarative schema, and migration tooling.',\n difficulty: 'hard',\n },\n {\n alternative: 'drizzle-orm',\n description: 'SQL-like TypeScript ORM. Closer to raw SQL than Sequelize, excellent performance.',\n difficulty: 'hard',\n },\n ],\n\n 'typeorm': [\n {\n alternative: 'prisma',\n description: 'More stable and actively maintained ORM. Better migration system and type safety.',\n difficulty: 'hard',\n },\n {\n alternative: 'drizzle-orm',\n description: 'Lightweight alternative with SQL-like API. Better TypeScript inference and query performance.',\n difficulty: 'hard',\n },\n ],\n\n 'knex': [\n {\n alternative: 'drizzle-orm',\n description: 'TypeScript-first query builder with ORM features. Similar SQL-like API with full type safety.',\n difficulty: 'moderate',\n },\n {\n alternative: 'kysely',\n description: 'Type-safe SQL query builder. End-to-end type safety from database schema to query results.',\n difficulty: 'moderate',\n },\n ],\n\n 'bookshelf': [\n {\n alternative: 'prisma',\n description: 'Modern ORM replacing Bookshelf/Knex stack. Auto-generated types, declarative relations, migrations.',\n difficulty: 'hard',\n },\n ],\n\n 'waterline': [\n {\n alternative: 'prisma',\n description: 'Sails.js ORM is rarely maintained. Prisma offers modern schema management and type safety.',\n difficulty: 'hard',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Authentication\n // ---------------------------------------------------------------------------\n 'passport': [\n {\n alternative: 'lucia-auth',\n description: 'Modern, lightweight auth library. Session-based authentication with clear API, no magic.',\n difficulty: 'hard',\n },\n {\n alternative: 'better-auth',\n description: 'Framework-agnostic TypeScript auth library. Built-in support for OAuth, email/password, and MFA.',\n difficulty: 'hard',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Password hashing\n // ---------------------------------------------------------------------------\n 'bcrypt': [\n {\n alternative: 'argon2',\n description: 'Winner of the Password Hashing Competition. More secure than bcrypt, resistant to GPU attacks.',\n difficulty: 'easy',\n },\n ],\n\n 'bcryptjs': [\n {\n alternative: 'argon2',\n description: 'Argon2 is the recommended password hashing algorithm. Better security profile than bcrypt variants.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Session management\n // ---------------------------------------------------------------------------\n 'express-session': [\n {\n alternative: 'iron-session',\n description: 'Encrypted stateless sessions using signed and encrypted cookies. No server-side session store needed.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // CORS / Security middleware\n // ---------------------------------------------------------------------------\n 'cors': [\n {\n alternative: 'helmet',\n description: 'Comprehensive security middleware that includes CORS handling along with other HTTP security headers.',\n difficulty: 'easy',\n },\n ],\n\n 'csurf': [\n {\n alternative: 'csrf-csrf',\n description: 'csurf is deprecated due to security issues. csrf-csrf implements the double-submit cookie pattern securely.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // File upload\n // ---------------------------------------------------------------------------\n 'multer': [\n {\n alternative: 'busboy',\n description: 'Low-level multipart parser. More control over file handling, better streaming support.',\n difficulty: 'moderate',\n },\n {\n alternative: 'formidable',\n description: 'Full-featured form/file parser. Streaming, plugins, and better memory management than multer.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // WebSocket\n // ---------------------------------------------------------------------------\n 'socket.io': [\n {\n alternative: 'ws',\n description: 'Lightweight WebSocket implementation. No protocol overhead, better for performance-critical applications.',\n difficulty: 'moderate',\n },\n {\n alternative: 'socket.io',\n description: 'If you need fallbacks and rooms, keep socket.io but upgrade to v4+ for improved performance.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // HTTP clients (alternatives to axios/got)\n // ---------------------------------------------------------------------------\n 'axios': [\n {\n alternative: 'ky',\n description: 'Tiny HTTP client built on fetch. Simpler API, automatic retries, hooks, and smaller bundle.',\n difficulty: 'moderate',\n },\n {\n alternative: 'ofetch',\n description: 'Universal fetch client from UnJS. Works in Node, browser, and workers with auto-parsing.',\n difficulty: 'moderate',\n },\n ],\n\n 'got': [\n {\n alternative: 'ofetch',\n description: 'Lightweight universal fetch from UnJS. Simpler API with auto-retry, auto-parse, and type safety.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Job scheduling / queues\n // ---------------------------------------------------------------------------\n 'node-cron': [\n {\n alternative: 'croner',\n description: 'Modern cron scheduler with timezone support, overrun protection, and better pattern parsing.',\n difficulty: 'easy',\n },\n ],\n\n 'agenda': [\n {\n alternative: 'bullmq',\n description: 'Redis-based job queue with better reliability. Supports delayed jobs, retries, and rate limiting.',\n difficulty: 'moderate',\n },\n ],\n\n 'bull': [\n {\n alternative: 'bullmq',\n description: 'Next generation of Bull by the same author. Better TypeScript support, flows, and worker threads.',\n difficulty: 'moderate',\n },\n ],\n\n 'kue': [\n {\n alternative: 'bullmq',\n description: 'Kue is unmaintained. BullMQ is the modern Redis-based queue with job scheduling and retries.',\n difficulty: 'moderate',\n },\n ],\n\n 'bee-queue': [\n {\n alternative: 'bullmq',\n description: 'BullMQ offers more features than bee-queue: job flows, rate limiting, and better error handling.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Redis clients\n // ---------------------------------------------------------------------------\n 'redis': [\n {\n alternative: 'ioredis',\n description: 'Full-featured Redis client with cluster support, Lua scripting, and pipelining. Better performance.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // MongoDB native driver\n // ---------------------------------------------------------------------------\n 'mongodb': [\n {\n alternative: 'mongoose',\n description: 'Schema-based ODM for MongoDB. Adds validation, middleware, and population to raw driver.',\n difficulty: 'moderate',\n },\n {\n alternative: 'prisma',\n description: 'Type-safe ORM with MongoDB support. Auto-generated client, declarative schema.',\n difficulty: 'hard',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // memcached\n // ---------------------------------------------------------------------------\n 'memcached': [\n {\n alternative: 'ioredis',\n description: 'Redis is a superset of memcached features with persistence, pub/sub, and data structures.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Build tools / bundlers\n // ---------------------------------------------------------------------------\n 'webpack': [\n {\n alternative: 'vite',\n description: 'Next-gen frontend build tool. Instant dev server with HMR, Rollup-based production builds.',\n difficulty: 'hard',\n },\n {\n alternative: 'rspack',\n description: 'Rust-based webpack-compatible bundler. Drop-in replacement with 5-10x build speed improvement.',\n difficulty: 'moderate',\n },\n ],\n\n 'rollup': [\n {\n alternative: 'vite',\n description: 'Vite uses Rollup under the hood for production. Better DX with dev server and plugin ecosystem.',\n difficulty: 'moderate',\n },\n ],\n\n 'parcel': [\n {\n alternative: 'vite',\n description: 'Similar zero-config philosophy with better plugin ecosystem and community support.',\n difficulty: 'moderate',\n },\n ],\n\n 'gulp': [\n {\n alternative: 'npm scripts',\n description: 'Replace gulp tasks with npm scripts in package.json. Use concurrently for parallel tasks.',\n difficulty: 'moderate',\n },\n {\n alternative: 'vite',\n description: 'Modern build tool that replaces custom gulp build pipelines. Plugin-based, zero-config defaults.',\n difficulty: 'hard',\n },\n ],\n\n 'grunt': [\n {\n alternative: 'npm scripts',\n description: 'Replace Grunt tasks with npm scripts. Modern tooling eliminates the need for task runners.',\n difficulty: 'moderate',\n },\n ],\n\n 'browserify': [\n {\n alternative: 'vite',\n description: 'Modern bundler with ESM-first approach. Replaces browserify with faster builds and HMR.',\n difficulty: 'hard',\n },\n {\n alternative: 'esbuild',\n description: 'Extremely fast JavaScript bundler. Simple API, handles CommonJS and ESM bundling.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Transpilers / TypeScript execution\n // ---------------------------------------------------------------------------\n 'babel': [\n {\n alternative: 'swc',\n description: 'Rust-based JavaScript/TypeScript compiler. 20x faster than Babel, compatible plugin API.',\n difficulty: 'moderate',\n },\n {\n alternative: 'esbuild',\n description: 'Go-based transpiler and bundler. Handles JSX, TypeScript, and modern JS transforms.',\n difficulty: 'moderate',\n },\n ],\n\n '@babel/core': [\n {\n alternative: 'swc',\n description: 'Rust-based compiler. Drop-in replacement for most Babel configurations, dramatically faster.',\n difficulty: 'moderate',\n },\n {\n alternative: 'esbuild',\n description: 'Extremely fast transpiler. Handles TypeScript, JSX, and most modern JS features.',\n difficulty: 'moderate',\n },\n ],\n\n 'ts-node': [\n {\n alternative: 'tsx',\n description: 'TypeScript execute powered by esbuild. Instant startup, ESM support, watch mode included.',\n difficulty: 'easy',\n },\n ],\n\n 'ts-jest': [\n {\n alternative: 'vitest',\n description: 'Vite-native test runner with built-in TypeScript support. No separate transformer needed.',\n difficulty: 'moderate',\n },\n {\n alternative: '@swc/jest',\n description: 'SWC-based Jest transformer. 10x faster TypeScript compilation than ts-jest.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Email\n // ---------------------------------------------------------------------------\n 'nodemailer': [\n {\n alternative: 'resend',\n description: 'Modern email API built for developers. Simple SDK, React Email support, better deliverability.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Template engines\n // ---------------------------------------------------------------------------\n 'nunjucks': [\n {\n alternative: 'edge.js',\n description: 'Modern template engine for Node.js. Better error messages, tag-based components, TypeScript support.',\n difficulty: 'moderate',\n },\n {\n alternative: 'eta',\n description: 'Lightweight, fast template engine. Supports async, partials, and configurable syntax.',\n difficulty: 'moderate',\n },\n ],\n\n 'ejs': [\n {\n alternative: 'eta',\n description: 'Faster and lighter EJS alternative. Compatible syntax with better async support and security.',\n difficulty: 'easy',\n },\n ],\n\n 'pug': [\n {\n alternative: 'edge.js',\n description: 'Modern tag-based template engine. Cleaner syntax, better error reporting, component support.',\n difficulty: 'moderate',\n },\n ],\n\n 'handlebars': [\n {\n alternative: 'edge.js',\n description: 'Modern template engine with better control flow. No need for custom helpers for basic logic.',\n difficulty: 'moderate',\n },\n {\n alternative: 'eta',\n description: 'Lightweight template engine with configurable delimiters. Supports async and partials.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Markdown\n // ---------------------------------------------------------------------------\n 'marked': [\n {\n alternative: 'markdown-it',\n description: 'Pluggable Markdown parser. Better extensibility, CommonMark compliance, and plugin ecosystem.',\n difficulty: 'easy',\n },\n {\n alternative: '@mdx-js/mdx',\n description: 'MDX enables JSX in Markdown. Ideal for content-driven apps with interactive components.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // DOM parsing / manipulation\n // ---------------------------------------------------------------------------\n 'cheerio': [\n {\n alternative: 'linkedom',\n description: 'Fast, lightweight DOM implementation. Standards-compliant, smaller bundle, better performance.',\n difficulty: 'moderate',\n },\n ],\n\n 'jsdom': [\n {\n alternative: 'happy-dom',\n description: 'Faster alternative to jsdom. 2-3x performance improvement, good compatibility with testing libraries.',\n difficulty: 'easy',\n },\n {\n alternative: 'linkedom',\n description: 'Lightweight DOM implementation. Faster than jsdom with smaller memory footprint.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Browser automation / E2E testing\n // ---------------------------------------------------------------------------\n 'puppeteer': [\n {\n alternative: 'playwright',\n description: 'Multi-browser automation (Chrome, Firefox, WebKit). Better auto-wait, tracing, and test generation.',\n difficulty: 'moderate',\n },\n ],\n\n 'cypress': [\n {\n alternative: 'playwright',\n description: 'Multi-browser E2E testing. Faster execution, better parallelization, and cross-browser support.',\n difficulty: 'hard',\n },\n ],\n\n 'selenium-webdriver': [\n {\n alternative: 'playwright',\n description: 'Modern browser automation with auto-wait and multi-browser support. No WebDriver protocol overhead.',\n difficulty: 'hard',\n },\n ],\n\n 'webdriverio': [\n {\n alternative: 'playwright',\n description: 'Simpler API with built-in assertions. No WebDriver dependency, faster test execution.',\n difficulty: 'hard',\n },\n ],\n\n 'protractor': [\n {\n alternative: 'playwright',\n description: 'Protractor is deprecated. Playwright supports Angular apps and offers modern test tooling.',\n difficulty: 'hard',\n },\n ],\n\n 'nightmare': [\n {\n alternative: 'playwright',\n description: 'Nightmare is unmaintained. Playwright offers reliable browser automation across all modern browsers.',\n difficulty: 'hard',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Image processing\n // ---------------------------------------------------------------------------\n 'sharp': [\n {\n alternative: '@napi-rs/image',\n description: 'Rust-based image processing via N-API. No native dependency issues, cross-platform binaries.',\n difficulty: 'moderate',\n },\n ],\n\n 'jimp': [\n {\n alternative: 'sharp',\n description: 'libvips-based image processor. 10x faster than jimp for resizing, converting, and transforming images.',\n difficulty: 'moderate',\n },\n ],\n\n 'gm': [\n {\n alternative: 'sharp',\n description: 'No external GraphicsMagick/ImageMagick install required. Faster processing with libvips.',\n difficulty: 'moderate',\n },\n ],\n\n 'imagemagick': [\n {\n alternative: 'sharp',\n description: 'Native Node.js image processing without system dependency. Faster and easier to deploy.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Timezone / Date utilities\n // ---------------------------------------------------------------------------\n 'moment-timezone': [\n {\n alternative: 'luxon',\n description: 'Built-in IANA timezone support via Intl API. No separate timezone data bundle needed.',\n difficulty: 'moderate',\n },\n {\n alternative: 'date-fns-tz',\n description: 'Timezone support for date-fns. Modular, tree-shakeable, uses native Intl API.',\n difficulty: 'moderate',\n },\n ],\n\n 'chrono-node': [\n {\n alternative: 'date-fns',\n description: 'Comprehensive date utility library. Use date-fns/parse for structured date parsing.',\n difficulty: 'moderate',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Promise libraries (legacy)\n // ---------------------------------------------------------------------------\n 'q': [\n {\n alternative: 'native promises',\n description: 'Native Promise/async-await is standard since ES2015. Remove Q and use built-in Promise API.',\n difficulty: 'moderate',\n },\n ],\n\n 'when': [\n {\n alternative: 'native promises',\n description: 'Native Promise with async/await covers all when.js use cases. No polyfill library needed.',\n difficulty: 'moderate',\n },\n ],\n\n 'rsvp': [\n {\n alternative: 'native promises',\n description: 'RSVP is no longer needed. Native Promise API is performant and universally supported.',\n difficulty: 'moderate',\n },\n ],\n\n 'es6-promise': [\n {\n alternative: 'native promises',\n description: 'ES6 Promise polyfill is unnecessary. All supported Node.js versions have native Promise.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // String similarity\n // ---------------------------------------------------------------------------\n 'string-similarity': [\n {\n alternative: 'fastest-levenshtein',\n description: 'Fastest Levenshtein distance implementation. Better performance for string comparison use cases.',\n difficulty: 'easy',\n },\n ],\n\n 'leven': [\n {\n alternative: 'fastest-levenshtein',\n description: 'Faster Levenshtein distance calculation with the same simple API.',\n difficulty: 'easy',\n },\n ],\n\n // ---------------------------------------------------------------------------\n // Additional commonly encountered packages\n // ---------------------------------------------------------------------------\n 'request-promise-any': [\n {\n alternative: 'got',\n description: 'Modern HTTP client with promise support. request ecosystem is fully deprecated.',\n difficulty: 'moderate',\n },\n ],\n\n 'uuid': [\n {\n alternative: 'crypto.randomUUID',\n description: 'Built-in Node.js 19+ and Web Crypto API. No dependency needed for UUID v4 generation.',\n difficulty: 'easy',\n },\n ],\n\n 'form-data': [\n {\n alternative: 'native FormData',\n description: 'Node.js 18+ includes global FormData. No polyfill needed for modern Node versions.',\n difficulty: 'easy',\n },\n ],\n\n 'node-abort-controller': [\n {\n alternative: 'native AbortController',\n description: 'AbortController is global in Node.js 16+. Remove the polyfill package.',\n difficulty: 'easy',\n },\n ],\n\n 'object-assign': [\n {\n alternative: 'Object.assign / spread',\n description: 'Native Object.assign() and spread syntax are available in all modern environments.',\n difficulty: 'easy',\n },\n ],\n\n 'array-flatten': [\n {\n alternative: 'Array.prototype.flat',\n description: 'Native Array.flat() is available since ES2019. No utility package needed.',\n difficulty: 'easy',\n },\n ],\n\n 'string.prototype.trimstart': [\n {\n alternative: 'String.prototype.trimStart',\n description: 'Native trimStart() is available since ES2019. Remove the polyfill.',\n difficulty: 'easy',\n },\n ],\n\n 'string.prototype.trimend': [\n {\n alternative: 'String.prototype.trimEnd',\n description: 'Native trimEnd() is available since ES2019. Remove the polyfill.',\n difficulty: 'easy',\n },\n ],\n};\n\n// ---------------------------------------------------------------------------\n// MigrationAdvisor\n// ---------------------------------------------------------------------------\n\nexport class MigrationAdvisor {\n private readonly migrationMap: Record<string, MigrationEntry[]>;\n\n constructor(extraMappings?: Record<string, MigrationEntry[]>) {\n this.migrationMap = { ...MIGRATION_MAP, ...extraMappings };\n }\n\n /**\n * Look up migration suggestions for a given package.\n *\n * @param packageName - The npm package to find alternatives for.\n * @param reason - Why the migration is being suggested (e.g. \"zombie\", \"low trust score\").\n * This is included in the description for context.\n * @returns Array of migration suggestions, empty if no known alternatives exist.\n */\n suggest(packageName: string, reason: string): MigrationSuggestion[] {\n const normalized = packageName.toLowerCase().trim();\n const entries = this.migrationMap[normalized];\n\n if (!entries || entries.length === 0) {\n return [];\n }\n\n return entries.map((entry) => ({\n alternative: entry.alternative,\n description: `${entry.description} (Reason for migration: ${reason})`,\n difficulty: entry.difficulty,\n }));\n }\n\n /**\n * Check whether any migration suggestions exist for a package.\n */\n hasSuggestions(packageName: string): boolean {\n const normalized = packageName.toLowerCase().trim();\n return normalized in this.migrationMap;\n }\n\n /**\n * Return the list of all packages that have known migration paths.\n */\n getSupportedPackages(): string[] {\n return Object.keys(this.migrationMap).sort();\n }\n}\n"],"mappings":"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","names":["join","join"]}