UNPKG

npmshit

Version:

自动清理node_modules中无用的文件

98 lines 4.01 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const path_1 = __importDefault(require("path")); const commander_1 = __importDefault(require("commander")); const cli_spinner_1 = require("cli-spinner"); const { version, description } = require("../package.json"); const index_1 = require("./index"); const readline_1 = __importDefault(require("readline")); function prompt(q) { const rl = readline_1.default.createInterface({ input: process.stdin, output: process.stdout, }); return new Promise(resolve => { rl.question(q, answer => { rl.close(); resolve(answer); }); }); } function sleep(ms) { ms = ms > 0 ? ms : 0; return new Promise(resolve => { setTimeout(resolve, ms); }); } function logRes(ret, list) { if (list) { ret.fileList.forEach(n => console.log(n)); } console.log(`包总数:${ret.packageCount},可删除文件:${ret.fileCount},可释放空间:${index_1.humanFileSize(ret.size)}`); console.log(`原始大小:${index_1.humanFileSize(ret.totalSize)},占比:${((ret.size / ret.totalSize) * 100).toFixed(1)}%`); console.log(`通过package.json压缩节省:${index_1.humanFileSize(ret.packageFreeSize)}`); } function spinner(title, fn, delay = 2000) { return __awaiter(this, void 0, void 0, function* () { const start = Date.now(); const spinner = new cli_spinner_1.Spinner(title); spinner.setSpinnerString(18); spinner.start(); const ret = yield fn; const time = Date.now() - start; yield sleep(delay - time); spinner.stop(); process.stdout.write("\n"); return ret; }); } const env = commander_1.default .version(version, "-v, --version") .option("-l, --list", "list only") .description(description) .parse(process.argv); function main(env) { return __awaiter(this, void 0, void 0, function* () { const dir = path_1.default.resolve(process.cwd(), "node_modules"); try { yield index_1.statAsync(dir); } catch (error) { throw new Error("当前目录没有 node_modules"); } const listFile = index_1.listFiles(dir); const ret = yield spinner("努力扫描中...", listFile, env.list ? 0 : 2000); if (ret.size < 1) { console.log("恭喜! node_modules 目录很干净"); return; } logRes(ret, env.list); if (env.list) return; const del = yield prompt("是否确定执行删除操作: (y/N) "); const confirmDelete = del.toLowerCase() === "y"; if (!confirmDelete) return; const rms = ret.fileList.map(it => { console.log("删除文件:%s", it); return index_1.unlinkAsync(it).catch(err => 0); }); yield Promise.all(rms); yield Promise.all(ret.dirList.map(n => index_1.rmdir(n))); ret.packageFileList.forEach(n => index_1.reducePackageJson(n, true)); console.log("删除完成!释放空间:", index_1.humanFileSize(ret.size)); }); } main(env).catch(err => console.error(err.message || err)); //# sourceMappingURL=cli.js.map