binary-collections 2.0.10 → 2.0.12

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 (290) hide show
  1. package/.opencode/package.json +5 -0
  2. package/.puppeterrc.cjs +25 -0
  3. package/binaries/binary-executor.cjs +138 -3
  4. package/binaries/clean-nodemodule.cjs +138 -3
  5. package/binaries/clean-nodemodules.cjs +138 -3
  6. package/binaries/dev.cjs +138 -3
  7. package/binaries/empty.cjs +138 -3
  8. package/binaries/git-reduce-size.cjs +138 -3
  9. package/binaries/javakill.cjs +138 -3
  10. package/binaries/kill-night-crows.bat +7 -0
  11. package/binaries/kill-night-crows.ps1 +172 -0
  12. package/binaries/kill-process.cjs +138 -3
  13. package/binaries/nodekill.cjs +138 -3
  14. package/binaries/prod.cjs +138 -3
  15. package/binaries/py +111 -0
  16. package/binaries/py.cjs +178 -0
  17. package/binaries/py.cmd +49 -0
  18. package/binaries/rmfind.cjs +138 -3
  19. package/binaries/rmx +15 -1
  20. package/binaries/rmx.cjs +138 -3
  21. package/binaries/rmx.cmd +12 -0
  22. package/binaries/submodule-token.cjs +138 -3
  23. package/binaries/test-cjs +18 -0
  24. package/binaries/test-cjs.cjs +178 -0
  25. package/binaries/test-cjs.cmd +26 -0
  26. package/binaries/test-esm +16 -0
  27. package/binaries/test-esm.cjs +178 -0
  28. package/binaries/test-esm.cmd +23 -0
  29. package/binaries/yarn-clean +32 -0
  30. package/binaries/yarn-clean.cjs +178 -0
  31. package/binaries/yarn-clean.cmd +30 -0
  32. package/binaries/yarn-clean.py +166 -0
  33. package/binaries/yc +110 -0
  34. package/binaries/yc.cjs +178 -0
  35. package/lib/binary-collections/config.cjs +126 -0
  36. package/lib/binary-collections/config.mjs +7 -0
  37. package/lib/binary-collections/executeScript.cjs +19 -0
  38. package/lib/binary-collections/executeScript.d.cts +12 -0
  39. package/lib/binary-collections/executeScript.mjs +6 -0
  40. package/lib/binary-collections/findScript.cjs +284 -0
  41. package/lib/binary-collections/findScript.d.cts +12 -0
  42. package/lib/binary-collections/findScript.mjs +7 -0
  43. package/lib/binary-collections/listScript.cjs +266 -0
  44. package/lib/binary-collections/listScript.d.cts +19 -0
  45. package/lib/binary-collections/listScript.mjs +7 -0
  46. package/lib/binary-collections.cjs +342 -194
  47. package/lib/binary-collections.mjs +22 -268
  48. package/lib/changelog.cjs +61 -13
  49. package/lib/changelog.mjs +1 -1
  50. package/lib/{chunk-E6FDDAOO.mjs → chunk-2LSRSEXF.mjs} +2 -2
  51. package/lib/chunk-34IQDTLZ.mjs +27 -0
  52. package/lib/chunk-3HFFECCI.mjs +27 -0
  53. package/lib/{chunk-V3N3JEUF.mjs → chunk-5RTXZVCW.mjs} +60 -13
  54. package/lib/chunk-66KDU4TX.mjs +268 -0
  55. package/lib/chunk-6PU7BAHB.mjs +61 -0
  56. package/lib/{chunk-6HHJRKFB.mjs → chunk-BZWVHODJ.mjs} +4 -1
  57. package/lib/chunk-C6D2TTYU.mjs +32 -0
  58. package/lib/chunk-FB2WKVJD.mjs +158 -0
  59. package/lib/{chunk-66PAU5PS.mjs → chunk-G5UUEWUO.mjs} +9 -5
  60. package/lib/{chunk-HO6GHCOB.mjs → chunk-GAGABICI.mjs} +198 -63
  61. package/lib/chunk-H44UWUFY.mjs +105 -0
  62. package/lib/chunk-NCZPTKDV.mjs +79 -0
  63. package/lib/chunk-NGFK3EYW.mjs +28 -0
  64. package/lib/chunk-NVEG3LEZ.mjs +143 -0
  65. package/lib/chunk-OGXVGBRI.mjs +29 -0
  66. package/lib/chunk-OXV52GD5.mjs +62 -0
  67. package/lib/{chunk-PDSXF5HY.mjs → chunk-PDN26I7O.mjs} +1 -0
  68. package/lib/chunk-PXBMHE7O.mjs +35 -0
  69. package/lib/chunk-R5FJOR63.mjs +47 -0
  70. package/lib/chunk-SPTECFE5.mjs +180 -0
  71. package/lib/chunk-UXCFNAR6.mjs +55 -0
  72. package/lib/chunk-V2IBPCEV.mjs +39 -0
  73. package/lib/chunk-XPJGCDOD.mjs +14 -0
  74. package/lib/{chunk-AI4CVPJ7.mjs → chunk-ZDMWBSYF.mjs} +4 -4
  75. package/lib/chunk-ZOWVMII3.mjs +228 -0
  76. package/lib/clean-github-actions-caches-cli.cjs +465 -0
  77. package/lib/clean-github-actions-caches-cli.d.cts +1 -0
  78. package/lib/clean-github-actions-caches-cli.mjs +56 -0
  79. package/lib/clean-github-actions-caches.cjs +152 -160
  80. package/lib/clean-github-actions-caches.d.cts +15 -1
  81. package/lib/clean-github-actions-caches.mjs +4 -130
  82. package/lib/cross-env/command.cjs +63 -0
  83. package/lib/cross-env/command.d.ts +8 -0
  84. package/lib/cross-env/command.js +45 -0
  85. package/lib/cross-env/command.mjs +9 -0
  86. package/lib/cross-env/index.cjs +178 -0
  87. package/lib/cross-env/index.d.ts +8 -0
  88. package/lib/cross-env/index.js +102 -0
  89. package/lib/cross-env/index.mjs +101 -0
  90. package/lib/cross-env/variable.cjs +60 -0
  91. package/lib/cross-env/variable.d.ts +7 -0
  92. package/lib/cross-env/variable.js +59 -0
  93. package/lib/cross-env/variable.mjs +9 -0
  94. package/lib/del-gradle.cjs +61 -13
  95. package/lib/del-gradle.js +9 -8
  96. package/lib/del-gradle.mjs +1 -1
  97. package/lib/del-node-modules.cjs +143 -148
  98. package/lib/del-node-modules.js +210 -14
  99. package/lib/del-node-modules.mjs +148 -17
  100. package/lib/del-ps.cjs +61 -13
  101. package/lib/del-ps.js +9 -8
  102. package/lib/del-ps.mjs +1 -1
  103. package/lib/del-yarn-caches.cjs +61 -13
  104. package/lib/del-yarn-caches.js +2 -2
  105. package/lib/del-yarn-caches.mjs +1 -1
  106. package/lib/file/copy-cli.cjs +92 -0
  107. package/lib/file/copy-cli.d.mts +1 -0
  108. package/lib/file/copy-cli.mjs +55 -0
  109. package/lib/file/copy.cjs +56 -0
  110. package/lib/file/copy.d.mts +1 -0
  111. package/lib/file/copy.mjs +8 -0
  112. package/lib/file/move-cli.cjs +91 -0
  113. package/lib/file/move-cli.d.mts +1 -0
  114. package/lib/file/move-cli.mjs +55 -0
  115. package/lib/file/move.cjs +55 -0
  116. package/lib/file/move.d.mts +1 -0
  117. package/lib/file/move.mjs +8 -0
  118. package/lib/find-node-modules-cli.js +2 -1
  119. package/lib/free-chatgpt.cjs +259 -47
  120. package/lib/free-chatgpt.js +10 -10
  121. package/lib/free-chatgpt.mjs +2 -2
  122. package/lib/git/gitattributes.cjs +1 -0
  123. package/lib/git/gitattributes.d.cts +7 -2
  124. package/lib/git/gitattributes.mjs +1 -1
  125. package/lib/git/line-endings.cjs +2 -1
  126. package/lib/git/line-endings.mjs +2 -2
  127. package/lib/git/undo-commit-cli.cjs +110 -0
  128. package/lib/git/undo-commit-cli.d.ts +1 -0
  129. package/lib/git/undo-commit-cli.js +4 -0
  130. package/lib/git/undo-commit-cli.mjs +14 -0
  131. package/lib/git/undo-commit.cjs +81 -0
  132. package/lib/git/undo-commit.d.cts +1 -0
  133. package/lib/git/undo-commit.mjs +7 -0
  134. package/lib/git/undo-staged-cli.cjs +110 -0
  135. package/lib/git/undo-staged-cli.d.ts +1 -0
  136. package/lib/git/undo-staged-cli.js +4 -0
  137. package/lib/git/undo-staged-cli.mjs +14 -0
  138. package/lib/git/undo-staged.cjs +81 -0
  139. package/lib/git/undo-staged.d.cts +1 -0
  140. package/lib/git/undo-staged.mjs +7 -0
  141. package/lib/git/user-config.cjs +61 -14
  142. package/lib/git/user-config.mjs +2 -2
  143. package/lib/git-diff-cli.cjs +427 -75
  144. package/lib/git-diff-cli.d.ts +1 -0
  145. package/lib/git-diff-cli.js +1 -0
  146. package/lib/git-diff-cli.mjs +6 -4
  147. package/lib/git-diff.cjs +426 -75
  148. package/lib/git-diff.d.ts +2 -1
  149. package/lib/git-diff.js +91 -34
  150. package/lib/git-diff.mjs +5 -4
  151. package/lib/git-fix.cjs +64 -16
  152. package/lib/git-fix.mjs +10 -10
  153. package/lib/git-purge.cjs +61 -13
  154. package/lib/git-purge.mjs +1 -1
  155. package/lib/index.d.ts +1 -1
  156. package/lib/kill-night-crows.cjs +87 -0
  157. package/lib/kill-night-crows.d.mts +1 -0
  158. package/lib/kill-night-crows.mjs +65 -0
  159. package/lib/node-cache-cleaner/npm.cjs +65 -0
  160. package/lib/node-cache-cleaner/npm.d.ts +2 -0
  161. package/lib/node-cache-cleaner/npm.js +41 -0
  162. package/lib/node-cache-cleaner/npm.mjs +10 -0
  163. package/lib/node-cache-cleaner/npx.cjs +89 -0
  164. package/lib/node-cache-cleaner/npx.d.ts +4 -0
  165. package/lib/node-cache-cleaner/npx.js +82 -0
  166. package/lib/{ps/index.d.mjs → node-cache-cleaner/npx.mjs} +6 -5
  167. package/lib/node-cache-cleaner/yarn.cjs +73 -0
  168. package/lib/node-cache-cleaner/yarn.d.ts +2 -0
  169. package/lib/node-cache-cleaner/yarn.js +62 -0
  170. package/lib/node-cache-cleaner/yarn.mjs +10 -0
  171. package/lib/node-cache-cleaner-cli.cjs +182 -0
  172. package/lib/node-cache-cleaner-cli.d.ts +2 -0
  173. package/lib/node-cache-cleaner-cli.js +60 -0
  174. package/lib/node-cache-cleaner-cli.mjs +56 -0
  175. package/lib/node-executor.cjs +91 -0
  176. package/lib/node-executor.d.cts +2 -0
  177. package/lib/node-executor.mjs +103 -0
  178. package/lib/npm-run-series.cjs +79 -39
  179. package/lib/npm-run-series.mjs +20 -6
  180. package/lib/package-resolutions-updater-cli.cjs +645 -0
  181. package/lib/package-resolutions-updater-cli.d.mts +1 -0
  182. package/lib/package-resolutions-updater-cli.mjs +102 -0
  183. package/lib/package-resolutions-updater.cjs +259 -133
  184. package/lib/package-resolutions-updater.d.mts +51 -1
  185. package/lib/package-resolutions-updater.mjs +18 -294
  186. package/lib/php-cs-fixer-staged.cjs +105 -0
  187. package/lib/php-cs-fixer-staged.d.cts +2 -0
  188. package/lib/php-cs-fixer-staged.mjs +117 -0
  189. package/lib/print-directory-tree.cjs +62 -14
  190. package/lib/print-directory-tree.mjs +2 -2
  191. package/lib/ps/connected-domain.d.ts +1 -1
  192. package/lib/ps/connected-domain.js +10 -10
  193. package/lib/ps/index.cjs +1 -1
  194. package/lib/ps/index.mjs +177 -171
  195. package/lib/ps/isWin.js +1 -1
  196. package/lib/ps/table-parser.js +6 -6
  197. package/lib/remove-module.cjs +61 -13
  198. package/lib/remove-module.mjs +1 -1
  199. package/lib/rm-node-module-cli.cjs +222 -0
  200. package/lib/rm-node-module-cli.d.cts +1 -0
  201. package/lib/rm-node-module-cli.mjs +89 -0
  202. package/lib/rm-node-modules.cjs +127 -0
  203. package/lib/rm-node-modules.d.cts +35 -0
  204. package/lib/{binary-collections-config.mjs → rm-node-modules.mjs} +3 -3
  205. package/lib/rmpath.cjs +63 -15
  206. package/lib/rmpath.mjs +2 -2
  207. package/lib/submodule-install.cjs +107 -47
  208. package/lib/submodule-install.mjs +48 -35
  209. package/lib/submodule-remove-cli.cjs +6 -3
  210. package/lib/submodule-remove-cli.js +3 -3
  211. package/lib/submodule-remove-cli.mjs +2 -3
  212. package/lib/submodule-remove.cjs +4 -1
  213. package/lib/submodule-remove.mjs +1 -1
  214. package/lib/utils/chatgpt.cjs +198 -34
  215. package/lib/utils/chatgpt.js +260 -93
  216. package/lib/utils/chatgpt.mjs +1 -1
  217. package/lib/utils/findEnvFiles.cjs +89 -0
  218. package/lib/utils/findEnvFiles.d.cts +19 -0
  219. package/lib/utils/findEnvFiles.mjs +6 -0
  220. package/lib/utils/findWorkspaceRoot.cjs +70 -0
  221. package/lib/utils/findWorkspaceRoot.d.ts +9 -0
  222. package/lib/utils/findWorkspaceRoot.js +57 -0
  223. package/lib/utils/findWorkspaceRoot.mjs +40 -0
  224. package/lib/utils/index.cjs +60 -13
  225. package/lib/utils/index.mjs +1 -1
  226. package/lib/utils/isGithubTokenValid.cjs +64 -0
  227. package/lib/utils/isGithubTokenValid.d.ts +7 -0
  228. package/lib/utils/isGithubTokenValid.js +48 -0
  229. package/lib/utils/isGithubTokenValid.mjs +36 -0
  230. package/lib/{ps/index.d.cjs → utils/isWindows.cjs} +17 -3
  231. package/lib/utils/isWindows.d.ts +5 -0
  232. package/lib/utils/isWindows.js +10 -0
  233. package/lib/utils/isWindows.mjs +8 -0
  234. package/lib/utils/runBash.cjs +53 -0
  235. package/lib/utils/runBash.d.cts +12 -0
  236. package/lib/utils/runBash.mjs +66 -0
  237. package/lib/yarn-per-branch-lock-installer.cjs +97 -0
  238. package/lib/yarn-per-branch-lock-installer.d.cts +2 -0
  239. package/lib/yarn-per-branch-lock-installer.mjs +109 -0
  240. package/lib/yarn-reinstall.cjs +61 -13
  241. package/lib/yarn-reinstall.mjs +1 -1
  242. package/package.json +133 -110
  243. package/readme.html +784 -0
  244. package/readme.md +116 -229
  245. package/releases/readme.md +1 -1
  246. package/requirements.txt +1 -0
  247. package/test/README.md +2 -2
  248. package/test-project/package.json +8 -2
  249. package/test-project/workspaces/workspace-a/package.json +135 -0
  250. package/test-project/workspaces/workspace-a/readme.md +20 -0
  251. package/test-project/workspaces/workspace-a/release/readme.md +42 -0
  252. package/test-project/workspaces/workspace-a/test/demo/package.json +25 -0
  253. package/test-project/workspaces/workspace-a/test/readme.md +12 -0
  254. package/test-project/workspaces/workspace-b/package.json +139 -0
  255. package/test-project/workspaces/workspace-b/readme.md +94 -0
  256. package/test-project/workspaces/workspace-b/requirements.txt +1 -0
  257. package/test-project/workspaces/workspace-b/test/sample-project/package.json +7 -0
  258. package/test-project/workspaces/workspace-b/themes/hexo-theme-flowbite/package.json +96 -0
  259. package/test-project/workspaces/workspace-b/themes/hexo-theme-flowbite/readme.md +156 -0
  260. package/tmp/rm-node-modules-test-project/package.json +17 -0
  261. package/tmp/rm-node-modules-test-project/packages/workspace-a/package.json +16 -0
  262. package/tmp/rm-node-modules-test-project/packages/workspace-b/package.json +16 -0
  263. package/tmp/test-repo/README.md +2 -35
  264. package/tmp/test-repo/package.json +13 -3
  265. package/docs-src/clean-github-actions-caches.md +0 -26
  266. package/docs-src/free-chatgpt.md +0 -26
  267. package/lib/binary-collections-config.cjs +0 -15
  268. package/lib/chunk-4EWQC6GZ.mjs +0 -382
  269. package/lib/chunk-4ZI7BQKQ.mjs +0 -381
  270. package/lib/chunk-5J2BEPY5.mjs +0 -83
  271. package/lib/chunk-AGZYRDC2.mjs +0 -323
  272. package/lib/chunk-BDCHCWHD.mjs +0 -136
  273. package/lib/chunk-BEZKJ25G.mjs +0 -140
  274. package/lib/chunk-DI5MDPSN.mjs +0 -386
  275. package/lib/chunk-GJTGHXRA.mjs +0 -356
  276. package/lib/chunk-HMRMTYZM.mjs +0 -40
  277. package/lib/chunk-HN52G2YL.mjs +0 -305
  278. package/lib/chunk-LEM5OMRP.mjs +0 -384
  279. package/lib/chunk-O6SWBEOQ.mjs +0 -81
  280. package/lib/chunk-RCP7DHVY.mjs +0 -190
  281. package/lib/chunk-SBNDSKG5.mjs +0 -136
  282. package/lib/chunk-U6SO4QEV.mjs +0 -320
  283. package/lib/chunk-XD6BJK6Q.mjs +0 -351
  284. package/lib/chunk-YXSFGA2D.mjs +0 -383
  285. package/lib/git/gitattributes.d.ts +0 -33
  286. package/lib/git/gitattributes.js +0 -223
  287. package/lib/ps/index.d.ts +0 -2
  288. package/lib/ps/index.js +0 -253
  289. package/tmp/typedoc/readme.md +0 -320
  290. /package/lib/{binary-collections-config.d.cts → binary-collections/config.d.cts} +0 -0
package/lib/del-gradle.js CHANGED
@@ -1,15 +1,16 @@
1
- const glob = require("glob");
2
- const path = require("upath");
3
- const { del } = require("./utils/index.cjs");
4
- const globStream = new glob.Glob(["**/build.gradle"], {
1
+ "use strict";
2
+ const glob = require('glob');
3
+ const path = require('upath');
4
+ const { del } = require('./utils/index.cjs');
5
+ const globStream = new glob.Glob(['**/build.gradle'], {
5
6
  withFileTypes: false,
6
7
  cwd: process.cwd(),
7
- ignore: ["**/node_modules/**", "**/vendor/**"]
8
+ ignore: ['**/node_modules/**', '**/vendor/**']
8
9
  });
9
- globStream.stream().on("data", (result) => {
10
+ globStream.stream().on('data', (result) => {
10
11
  const fullPath = path.resolve(process.cwd(), result);
11
12
  const base = path.dirname(fullPath);
12
- const buildFolder = path.join(base, "build");
13
- console.log("delete build folder", buildFolder);
13
+ const buildFolder = path.join(base, 'build');
14
+ console.log('delete build folder', buildFolder);
14
15
  del(buildFolder);
15
16
  });
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from 'module'; const require = createRequire(import.meta.url);
2
2
  import {
3
3
  require_utils
4
- } from "./chunk-V3N3JEUF.mjs";
4
+ } from "./chunk-5RTXZVCW.mjs";
5
5
  import {
6
6
  __require,
7
7
  init_esm_shims
@@ -1,156 +1,151 @@
1
- var __getOwnPropNames = Object.getOwnPropertyNames;
2
- var __esm = (fn, res) => function __init() {
3
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
4
- };
5
- var __commonJS = (cb, mod) => function __require() {
6
- return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
7
- };
8
-
9
- // node_modules/tsup/assets/cjs_shims.js
10
- var init_cjs_shims = __esm({
11
- "node_modules/tsup/assets/cjs_shims.js"() {
12
- }
1
+ #!/usr/bin/env node
2
+ // src/del-node-modules.js
3
+ var fs = require("fs");
4
+ var fsp = fs.promises;
5
+ var path = require("path");
6
+ var os = require("os");
7
+ var minimist = require("minimist");
8
+ var argv = minimist(process.argv.slice(2), {
9
+ boolean: ["force", "help"],
10
+ alias: { h: "help", f: "force", c: "concurrent" },
11
+ default: { force: false, concurrent: 2 }
13
12
  });
14
-
15
- // src/utils/index.cjs
16
- var require_utils = __commonJS({
17
- "src/utils/index.cjs"(exports2, module2) {
18
- init_cjs_shims();
19
- var fs = require("fs");
20
- var path = require("upath");
21
- var argv = require("minimist")(process.argv.slice(2));
22
- var { exec } = require("child_process");
23
- var { URL: URL2 } = require("url");
24
- var { promisify } = require("util");
25
- var execAsync = promisify(exec);
26
- async function parseGitRemotes() {
27
- try {
28
- const { stdout } = await execAsync("git remote -v");
29
- const lines = stdout.split("\n");
30
- const remotes = {};
31
- lines.forEach((line) => {
32
- const [name, url] = line.split(" ");
33
- if (name && url) {
34
- const [repoUrl] = url.split(" ");
35
- try {
36
- const parsedUrl = new URL2(repoUrl);
37
- const pathParts = parsedUrl.pathname.split("/").filter(Boolean);
38
- if (parsedUrl.hostname === "github.com" && pathParts.length === 2) {
39
- let repoPath = pathParts.join("/");
40
- if (repoPath.endsWith(".git")) {
41
- repoPath = repoPath.slice(0, -4);
42
- }
43
- remotes[name] = repoPath;
44
- }
45
- } catch (e) {
46
- console.error("URL Parsing Error:", e.message);
47
- }
48
- }
49
- });
50
- return remotes;
51
- } catch (error) {
52
- console.error("Error:", error.message);
53
- return {};
54
- }
55
- }
56
- module2.exports.parseGitRemotes = parseGitRemotes;
57
- function joinPathPreserveDriveLetter(...segments) {
58
- let fullPath = require("path").join(...segments);
59
- if (/^[a-z]:\\/.test(fullPath)) {
60
- fullPath = fullPath.charAt(0).toUpperCase() + fullPath.slice(1);
13
+ if (argv.help) {
14
+ console.log(`Usage: clean-node [--force] [-c|--concurrent N]
15
+ By default runs in dry-run mode. Use --force to actually delete.
16
+ Use -c/--concurrent to set concurrent removals (default 2).`);
17
+ process.exit(0);
18
+ }
19
+ var DRY_RUN = !argv.force;
20
+ var defaultConcurrency = Math.max(2, os.cpus().length || 2);
21
+ var CONCURRENCY = Math.max(1, Number(argv.concurrent || argv.c || defaultConcurrency));
22
+ var customChars = "@.";
23
+ var vowels = "aeiouAEIOU";
24
+ var alnum = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
25
+ var combined = alnum + vowels + customChars;
26
+ var ROOT = process.cwd();
27
+ async function isSymlinkAsync(p) {
28
+ try {
29
+ return (await fsp.lstat(p)).isSymbolicLink();
30
+ } catch {
31
+ return false;
32
+ }
33
+ }
34
+ async function removeAsync(target) {
35
+ if (await isSymlinkAsync(target)) {
36
+ console.log("Skipping symlink", target);
37
+ return;
38
+ }
39
+ if (DRY_RUN) {
40
+ console.log("Would remove", target);
41
+ return;
42
+ }
43
+ try {
44
+ await fsp.rm(target, { recursive: true, force: true });
45
+ console.log("Deleting", target);
46
+ } catch (e) {
47
+ console.error("Failed:", target, e.message);
48
+ }
49
+ }
50
+ function runWithConcurrency(tasks, concurrency) {
51
+ return new Promise((resolve, reject) => {
52
+ let i = 0;
53
+ let active = 0;
54
+ let done = 0;
55
+ const total = tasks.length;
56
+ if (total === 0) return resolve();
57
+ function next() {
58
+ if (done === total) return resolve();
59
+ while (active < concurrency && i < total) {
60
+ const idx = i++;
61
+ active++;
62
+ Promise.resolve().then(() => tasks[idx]()).then(() => {
63
+ active--;
64
+ done++;
65
+ next();
66
+ }).catch((err) => reject(err));
61
67
  }
62
- return fullPath;
63
- }
64
- module2.exports.joinPathPreserveDriveLetter = joinPathPreserveDriveLetter;
65
- function getArgs() {
66
- return argv;
67
68
  }
68
- module2.exports.getArgs = getArgs;
69
- function del(fullPath) {
70
- if (fs.statSync(fullPath).isDirectory()) {
71
- const subdir = fs.readdirSync(fullPath).map((dirPath) => path.resolve(fullPath, dirPath));
72
- for (let i = 0; i < subdir.length; i++) {
73
- del(subdir[i]);
74
- }
75
- } else {
76
- try {
77
- fs.rmSync(fullPath, { recursive: true, force: true, retryDelay: 7e3 });
78
- console.log("deleted", fullPath);
79
- } catch (_) {
80
- console.log("failed delete", fullPath);
81
- }
69
+ next();
70
+ });
71
+ }
72
+ function walk(dir, callback, { skipNodeModulesChildren = false } = {}) {
73
+ let entries;
74
+ try {
75
+ entries = fs.readdirSync(dir, { withFileTypes: true });
76
+ } catch {
77
+ return;
78
+ }
79
+ for (const entry of entries) {
80
+ const fullPath = path.join(dir, entry.name);
81
+ if (entry.isSymbolicLink()) continue;
82
+ if (skipNodeModulesChildren && dir.includes("node_modules")) continue;
83
+ callback(fullPath, entry);
84
+ if (entry.isDirectory()) {
85
+ if (skipNodeModulesChildren && entry.name === "node_modules") {
86
+ continue;
82
87
  }
88
+ walk(fullPath, callback, { skipNodeModulesChildren });
83
89
  }
84
- module2.exports.del = del;
85
- function delStream2(globStream) {
86
- globStream.stream().on("data", (result) => {
87
- const fullPath = path.resolve(process.cwd(), result);
88
- if (fs.statSync(fullPath).isDirectory()) {
89
- const subdir = fs.readdirSync(fullPath).map((dirPath) => path.resolve(fullPath, dirPath));
90
- for (let i = 0; i < subdir.length; i++) {
91
- del(subdir[i]);
92
- }
93
- }
94
- del(fullPath);
95
- });
90
+ }
91
+ }
92
+ async function processNodeModules(dir) {
93
+ console.log("Found:", dir);
94
+ let items;
95
+ try {
96
+ items = fs.readdirSync(dir, { withFileTypes: true });
97
+ } catch {
98
+ return;
99
+ }
100
+ const targets = items.filter((entry) => entry.name.length && combined.includes(entry.name[0]));
101
+ const tasks = targets.map((entry) => async () => {
102
+ const name = entry.name;
103
+ const target = path.join(dir, name);
104
+ if (entry.isSymbolicLink && entry.isSymbolicLink()) {
105
+ console.log("Skipping symlink", target);
106
+ return;
96
107
  }
97
- module2.exports.delStream = delStream2;
98
- function getFileTreeString(hashArray) {
99
- const tree = {};
100
- const hashMap = {};
101
- for (const entry of hashArray) {
102
- const [filePath, hash] = entry.split(" ");
103
- hashMap[filePath] = hash;
104
- const parts = filePath.split("/");
105
- let current = tree;
106
- for (let i = 0; i < parts.length; i++) {
107
- const part = parts[i];
108
- if (i === parts.length - 1) {
109
- current[part] = null;
110
- } else {
111
- current[part] = current[part] || {};
112
- current = current[part];
113
- }
114
- }
115
- }
116
- function printNode(node, prefix = "", parentPath = "") {
117
- const keys = Object.keys(node).sort();
118
- let lines = [];
119
- keys.forEach((key, idx) => {
120
- const isLast = idx === keys.length - 1;
121
- const branch = isLast ? "\u2514\u2500\u2500 " : "\u251C\u2500\u2500 ";
122
- const currentPath = parentPath ? parentPath + "/" + key : key;
123
- if (node[key] === null) {
124
- lines.push(prefix + branch + key + " [" + (hashMap[currentPath] || "") + "]");
125
- } else {
126
- lines.push(prefix + branch + key + "/");
127
- lines = lines.concat(printNode(node[key], prefix + (isLast ? " " : "\u2502 "), currentPath));
128
- }
129
- });
130
- return lines;
131
- }
132
- return printNode(tree, "", "").join("\n");
108
+ await removeAsync(target);
109
+ });
110
+ await runWithConcurrency(tasks, CONCURRENCY);
111
+ await removeAsync(dir);
112
+ }
113
+ async function main() {
114
+ const nodeModulesDirs = [];
115
+ walk(ROOT, (fullPath, entry) => {
116
+ if (entry.isDirectory() && entry.name === "node_modules") {
117
+ nodeModulesDirs.push(fullPath);
133
118
  }
134
- module2.exports.getFileTreeString = getFileTreeString;
135
- var delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
136
- module2.exports.delay = delay;
119
+ });
120
+ for (const dir of nodeModulesDirs) {
121
+ await processNodeModules(dir);
137
122
  }
138
- });
139
-
140
- // src/del-node-modules.js
141
- init_cjs_shims();
142
- var glob = require("glob");
143
- var { delStream } = require_utils();
144
- var globalIgnore = [
145
- // ignore .git .github folder
146
- "**/.git*",
147
- // ignore composer folder
148
- "**/vendor/**"
149
- ];
150
- console.log("cleaning node_modules in", process.cwd());
151
- var g3 = new glob.Glob("**/node_modules", {
152
- withFileTypes: false,
153
- cwd: process.cwd(),
154
- ignore: globalIgnore
155
- });
156
- delStream(g3);
123
+ const packageLocks = [];
124
+ const yarnLocks = [];
125
+ const yarnCaches = [];
126
+ walk(
127
+ ROOT,
128
+ (fullPath, entry) => {
129
+ const base = path.basename(fullPath);
130
+ if (base === "package-lock.json") packageLocks.push(fullPath);
131
+ if (base === "yarn.lock") yarnLocks.push(fullPath);
132
+ if (entry.isDirectory() && fullPath.endsWith(path.join(".yarn", "cache"))) yarnCaches.push(fullPath);
133
+ },
134
+ { skipNodeModulesChildren: true }
135
+ );
136
+ if (DRY_RUN) {
137
+ console.log("Would remove package-lock.json files:");
138
+ for (const p of packageLocks) console.log(p);
139
+ console.log("Would remove yarn.lock files:");
140
+ for (const p of yarnLocks) console.log(p);
141
+ console.log("Would remove .yarn/cache directories:");
142
+ for (const p of yarnCaches) console.log(p);
143
+ } else {
144
+ const allTasks = [];
145
+ allTasks.push(...packageLocks.map((p) => async () => removeAsync(p)));
146
+ allTasks.push(...yarnLocks.map((p) => async () => removeAsync(p)));
147
+ allTasks.push(...yarnCaches.map((p) => async () => removeAsync(p)));
148
+ await runWithConcurrency(allTasks, CONCURRENCY);
149
+ }
150
+ }
151
+ main();
@@ -1,15 +1,211 @@
1
- const glob = require("glob");
2
- const { delStream } = require("./utils/index.cjs");
3
- const globalIgnore = [
4
- // ignore .git .github folder
5
- "**/.git*",
6
- // ignore composer folder
7
- "**/vendor/**"
8
- ];
9
- console.log("cleaning node_modules in", process.cwd());
10
- const g3 = new glob.Glob("**/node_modules", {
11
- withFileTypes: false,
12
- cwd: process.cwd(),
13
- ignore: globalIgnore
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ const fs = require('fs');
12
+ const fsp = fs.promises;
13
+ const path = require('path');
14
+ const os = require('os');
15
+ const minimist = require('minimist');
16
+ // ----------------------
17
+ // CLI
18
+ // ----------------------
19
+ const argv = minimist(process.argv.slice(2), {
20
+ boolean: ['force', 'help'],
21
+ alias: { h: 'help', f: 'force', c: 'concurrent' },
22
+ default: { force: false, concurrent: 2 }
14
23
  });
15
- delStream(g3);
24
+ if (argv.help) {
25
+ console.log(`Usage: clean-node [--force] [-c|--concurrent N]
26
+ By default runs in dry-run mode. Use --force to actually delete.
27
+ Use -c/--concurrent to set concurrent removals (default 2).`);
28
+ process.exit(0);
29
+ }
30
+ const DRY_RUN = !argv.force;
31
+ const defaultConcurrency = Math.max(2, os.cpus().length || 2);
32
+ const CONCURRENCY = Math.max(1, Number(argv.concurrent || argv.c || defaultConcurrency));
33
+ // ----------------------
34
+ // CONSTANTS
35
+ // ----------------------
36
+ const customChars = '@.';
37
+ const vowels = 'aeiouAEIOU';
38
+ const alnum = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
39
+ const combined = alnum + vowels + customChars;
40
+ const ROOT = process.cwd();
41
+ // ----------------------
42
+ // HELPERS
43
+ // ----------------------
44
+ function isSymlinkAsync(p) {
45
+ return __awaiter(this, void 0, void 0, function* () {
46
+ try {
47
+ return (yield fsp.lstat(p)).isSymbolicLink();
48
+ }
49
+ catch (_a) {
50
+ return false;
51
+ }
52
+ });
53
+ }
54
+ function removeAsync(target) {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ if (yield isSymlinkAsync(target)) {
57
+ console.log('Skipping symlink', target);
58
+ return;
59
+ }
60
+ if (DRY_RUN) {
61
+ console.log('Would remove', target);
62
+ return;
63
+ }
64
+ try {
65
+ yield fsp.rm(target, { recursive: true, force: true });
66
+ console.log('Deleting', target);
67
+ }
68
+ catch (e) {
69
+ console.error('Failed:', target, e.message);
70
+ }
71
+ });
72
+ }
73
+ function runWithConcurrency(tasks, concurrency) {
74
+ return new Promise((resolve, reject) => {
75
+ let i = 0;
76
+ let active = 0;
77
+ let done = 0;
78
+ const total = tasks.length;
79
+ if (total === 0)
80
+ return resolve();
81
+ function next() {
82
+ if (done === total)
83
+ return resolve();
84
+ while (active < concurrency && i < total) {
85
+ const idx = i++;
86
+ active++;
87
+ Promise.resolve()
88
+ .then(() => tasks[idx]())
89
+ .then(() => {
90
+ active--;
91
+ done++;
92
+ next();
93
+ })
94
+ .catch((err) => reject(err));
95
+ }
96
+ }
97
+ next();
98
+ });
99
+ }
100
+ // `removeAsync` is the single deletion path; synchronous removals were
101
+ // removed in favor of collecting targets and executing them with
102
+ // `runWithConcurrency` so all deletions respect `DRY_RUN` and concurrency.
103
+ /**
104
+ * Walk (no symlink traversal)
105
+ */
106
+ function walk(dir, callback, { skipNodeModulesChildren = false } = {}) {
107
+ let entries;
108
+ try {
109
+ entries = fs.readdirSync(dir, { withFileTypes: true });
110
+ }
111
+ catch (_a) {
112
+ return;
113
+ }
114
+ for (const entry of entries) {
115
+ const fullPath = path.join(dir, entry.name);
116
+ // 🚫 never follow symlinks
117
+ if (entry.isSymbolicLink())
118
+ continue;
119
+ // skip inside node_modules/*
120
+ if (skipNodeModulesChildren && dir.includes('node_modules'))
121
+ continue;
122
+ callback(fullPath, entry);
123
+ if (entry.isDirectory()) {
124
+ if (skipNodeModulesChildren && entry.name === 'node_modules') {
125
+ continue;
126
+ }
127
+ walk(fullPath, callback, { skipNodeModulesChildren });
128
+ }
129
+ }
130
+ }
131
+ // ----------------------
132
+ // NODE_MODULES HANDLER
133
+ // ----------------------
134
+ function processNodeModules(dir) {
135
+ return __awaiter(this, void 0, void 0, function* () {
136
+ console.log('Found:', dir);
137
+ let items;
138
+ try {
139
+ items = fs.readdirSync(dir, { withFileTypes: true });
140
+ }
141
+ catch (_a) {
142
+ return;
143
+ }
144
+ // determine targets whose first char is in the allowed combined set
145
+ const targets = items.filter((entry) => entry.name.length && combined.includes(entry.name[0]));
146
+ const tasks = targets.map((entry) => () => __awaiter(this, void 0, void 0, function* () {
147
+ const name = entry.name;
148
+ const target = path.join(dir, name);
149
+ // 🚫 skip symlinks entirely (Dirent gives this cheaply)
150
+ if (entry.isSymbolicLink && entry.isSymbolicLink()) {
151
+ console.log('Skipping symlink', target);
152
+ return;
153
+ }
154
+ yield removeAsync(target);
155
+ }));
156
+ // run with limited concurrency
157
+ yield runWithConcurrency(tasks, CONCURRENCY);
158
+ yield removeAsync(dir);
159
+ });
160
+ }
161
+ // ----------------------
162
+ // MAIN
163
+ // ----------------------
164
+ function main() {
165
+ return __awaiter(this, void 0, void 0, function* () {
166
+ const nodeModulesDirs = [];
167
+ // find node_modules
168
+ walk(ROOT, (fullPath, entry) => {
169
+ if (entry.isDirectory() && entry.name === 'node_modules') {
170
+ nodeModulesDirs.push(fullPath);
171
+ }
172
+ });
173
+ for (const dir of nodeModulesDirs) {
174
+ // process each node_modules directory, await to avoid too many parallel top-level ops
175
+ // (internals already limit concurrency)
176
+ yield processNodeModules(dir);
177
+ }
178
+ // collect package/yarn targets then remove them with concurrency
179
+ const packageLocks = [];
180
+ const yarnLocks = [];
181
+ const yarnCaches = [];
182
+ walk(ROOT, (fullPath, entry) => {
183
+ const base = path.basename(fullPath);
184
+ if (base === 'package-lock.json')
185
+ packageLocks.push(fullPath);
186
+ if (base === 'yarn.lock')
187
+ yarnLocks.push(fullPath);
188
+ if (entry.isDirectory() && fullPath.endsWith(path.join('.yarn', 'cache')))
189
+ yarnCaches.push(fullPath);
190
+ }, { skipNodeModulesChildren: true });
191
+ if (DRY_RUN) {
192
+ console.log('Would remove package-lock.json files:');
193
+ for (const p of packageLocks)
194
+ console.log(p);
195
+ console.log('Would remove yarn.lock files:');
196
+ for (const p of yarnLocks)
197
+ console.log(p);
198
+ console.log('Would remove .yarn/cache directories:');
199
+ for (const p of yarnCaches)
200
+ console.log(p);
201
+ }
202
+ else {
203
+ const allTasks = [];
204
+ allTasks.push(...packageLocks.map((p) => () => __awaiter(this, void 0, void 0, function* () { return removeAsync(p); })));
205
+ allTasks.push(...yarnLocks.map((p) => () => __awaiter(this, void 0, void 0, function* () { return removeAsync(p); })));
206
+ allTasks.push(...yarnCaches.map((p) => () => __awaiter(this, void 0, void 0, function* () { return removeAsync(p); })));
207
+ yield runWithConcurrency(allTasks, CONCURRENCY);
208
+ }
209
+ });
210
+ }
211
+ main();