UNPKG

@reliverse/rse

Version:

@reliverse/rse is your all-in-one companion for bootstrapping and improving any kind of projects (especially web apps built with frameworks like Next.js) — whether you're kicking off something new or upgrading an existing app. It is also a little AI-power

94 lines (93 loc) 2.84 kB
import { readRseConfig } from "@reliverse/cfg"; import path from "@reliverse/pathkit"; import fs from "@reliverse/relifso"; import { relinka } from "@reliverse/relinka"; import { multiselectPrompt, confirmPrompt, selectPrompt } from "@reliverse/rempts"; import { destr } from "destr"; import { removeComments } from "../codemods/removeComments.js"; import { getUnusedDependencies } from "../codemods/removeUnusedDeps.js"; import { uninstallDependencies } from "./dependencies.js"; const defaultIgnoredDeps = [ // TODO: add default dependencies to ignore ]; export async function handleCleanup(cwd, configPath, isDev) { const ignoredDeps = new Set(defaultIgnoredDeps); try { const knipConfigPath = path.join(cwd, "knip.json"); if (await fs.pathExists(knipConfigPath)) { const knipConfig = destr( await fs.readFile(knipConfigPath, "utf-8") ); if (knipConfig?.ignoreDependencies) { knipConfig.ignoreDependencies.forEach((dep) => ignoredDeps.add(dep)); } } } catch (error) { relinka( "verbose", "Error reading Knip config:", error instanceof Error ? error.message : String(error) ); } try { const rules = await readRseConfig(configPath, isDev); if (rules?.ignoreDependencies) { rules.ignoreDependencies.forEach((dep) => ignoredDeps.add(dep)); } } catch (error) { relinka( "verbose", `Error reading ${configPath}:`, error instanceof Error ? error.message : String(error) ); } const action = await selectPrompt({ title: "Select cleanup action:", options: [ { label: "Remove all comments", value: "comments", hint: "Remove comments from all TypeScript/JavaScript files" }, { label: "Remove unused dependencies", value: "dependencies", hint: "Remove packages that aren't imported anywhere" } ] }); if (action === "comments") { const confirm = await confirmPrompt({ title: "Remove all comments from TypeScript/JavaScript files?", content: "This action cannot be undone.", defaultValue: false }); if (confirm) { await removeComments(cwd); } } else if (action === "dependencies") { const unusedDeps = await getUnusedDependencies( cwd, Array.from(ignoredDeps) ); if (unusedDeps.length === 0) { relinka("info", "No unused dependencies found!"); return; } const depsToRemove = await multiselectPrompt({ title: "Select dependencies to remove:", options: unusedDeps.map((dep) => ({ label: dep, value: dep })) }); if (depsToRemove.length > 0) { await uninstallDependencies(cwd, depsToRemove); relinka("success", `Removed ${depsToRemove.length} unused dependencies`); } } }