npmshit
Version:
自动清理node_modules中无用的文件
98 lines • 4.01 kB
JavaScript
;
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