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
@@ -0,0 +1,178 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Built-in Node.js modules:
5
+ *
6
+ * - child_process:
7
+ * Used to launch external scripts/programs.
8
+ *
9
+ * - path:
10
+ * Safely handles file paths across operating systems.
11
+ *
12
+ * - fs:
13
+ * Used to check whether files exist.
14
+ */
15
+ const { spawnSync } = require("child_process");
16
+ const path = require("path");
17
+ const fs = require("fs");
18
+
19
+ /**
20
+ * __dirname
21
+ * Absolute directory path of this launcher script.
22
+ *
23
+ * __filename
24
+ * Absolute path of this launcher file itself.
25
+ *
26
+ * base
27
+ * Filename without extension.
28
+ *
29
+ * Example:
30
+ * File = "/tools/mytool.js"
31
+ *
32
+ * binDir = "/tools"
33
+ * base = "mytool"
34
+ */
35
+ const binDir = __dirname;
36
+ const base = path.basename(__filename, path.extname(__filename));
37
+
38
+ /**
39
+ * Determine which script extensions to search for
40
+ * based on the current operating system.
41
+ *
42
+ * Windows:
43
+ * .cmd
44
+ * .bat
45
+ * .ps1
46
+ * .vbs
47
+ *
48
+ * Linux/macOS:
49
+ * .sh
50
+ * executable file without extension
51
+ */
52
+ const candidates = process.platform === "win32" ? [".cmd", ".bat", ".ps1", ".vbs"] : [".sh", ""];
53
+
54
+ /**
55
+ * Search for the first matching script
56
+ * in the same directory as this launcher.
57
+ *
58
+ * Example:
59
+ * If base = "mytool"
60
+ *
61
+ * Windows checks:
62
+ * mytool.cmd
63
+ * mytool.bat
64
+ * mytool.ps1
65
+ * mytool.vbs
66
+ *
67
+ * Linux/macOS checks:
68
+ * mytool.sh
69
+ * mytool
70
+ */
71
+ let found = null;
72
+
73
+ for (const ext of candidates) {
74
+ const script = path.join(binDir, base + ext);
75
+
76
+ if (fs.existsSync(script)) {
77
+ found = script;
78
+ break;
79
+ }
80
+ }
81
+
82
+ /**
83
+ * If no matching script was found,
84
+ * print an error and exit with failure code 1.
85
+ */
86
+ if (!found) {
87
+ console.error(`No script found for ${base} in ${binDir}`);
88
+ process.exit(1);
89
+ }
90
+
91
+ /**
92
+ * Detect special script types
93
+ * that require a shell/interpreter.
94
+ */
95
+ const isPs1 = found.endsWith(".ps1");
96
+ const isCmd = found.endsWith(".cmd");
97
+
98
+ /**
99
+ * cmd
100
+ * The executable program to launch.
101
+ *
102
+ * args
103
+ * Arguments passed to the executable.
104
+ */
105
+ let cmd, args;
106
+
107
+ /**
108
+ * PowerShell scripts:
109
+ *
110
+ * Run through powershell.exe because .ps1 files
111
+ * are not directly executable like binaries.
112
+ *
113
+ * Flags:
114
+ * -NoProfile
115
+ * Prevent loading user profile scripts.
116
+ *
117
+ * -ExecutionPolicy Bypass
118
+ * Allow script execution even if policy blocks it.
119
+ *
120
+ * -File
121
+ * Specifies the script to execute.
122
+ *
123
+ * process.argv.slice(2)
124
+ * Forward all user-provided command-line arguments.
125
+ */
126
+ if (isPs1) {
127
+ cmd = "powershell.exe";
128
+
129
+ args = ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File", found, ...process.argv.slice(2)];
130
+
131
+ /**
132
+ * CMD batch files:
133
+ *
134
+ * Run through cmd.exe using:
135
+ * /c
136
+ * which means:
137
+ * "execute command and terminate"
138
+ */
139
+ } else if (isCmd) {
140
+ cmd = "cmd.exe";
141
+
142
+ args = ["/c", found, ...process.argv.slice(2)];
143
+
144
+ /**
145
+ * Other scripts:
146
+ *
147
+ * Usually:
148
+ * - shell scripts (.sh)
149
+ * - executable binaries
150
+ *
151
+ * These can be executed directly.
152
+ */
153
+ } else {
154
+ cmd = found;
155
+ args = process.argv.slice(2);
156
+ }
157
+
158
+ /**
159
+ * Execute the selected script synchronously.
160
+ *
161
+ * stdio: "inherit"
162
+ * Shares the current terminal with the child process,
163
+ * so stdout/stderr/input behave normally.
164
+ *
165
+ * spawnSync waits until the child process exits.
166
+ */
167
+ const result = spawnSync(cmd, args, {
168
+ stdio: "inherit"
169
+ });
170
+
171
+ /**
172
+ * Exit using the same exit code
173
+ * returned by the child process.
174
+ *
175
+ * If result.status is null/undefined,
176
+ * default to exit code 1.
177
+ */
178
+ process.exit(result.status ?? 1);
@@ -0,0 +1,23 @@
1
+ @echo off
2
+ setlocal
3
+
4
+ :: Detect GitHub Actions or GitLab CI
5
+ set "CI_ARG="
6
+
7
+ if defined GITHUB_ACTIONS (
8
+ set "CI_ARG=--ci"
9
+ )
10
+
11
+ if defined GITLAB_CI (
12
+ set "CI_ARG=--ci"
13
+ )
14
+
15
+ node --experimental-vm-modules node_modules/jest/bin/jest.js ^
16
+ --runInBand ^
17
+ --forceExit ^
18
+ --testTimeout=120000 ^
19
+ --testPathIgnorePatterns="\\.(ts|js|cjs)$" ^
20
+ %CI_ARG% ^
21
+ %*
22
+
23
+ endlocal
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env bash
2
+
3
+ set -euo pipefail
4
+
5
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
+
7
+ CURRENT_FILE_PATH="$(realpath "$0")"
8
+ echo "Current file path: $CURRENT_FILE_PATH"
9
+
10
+ CANDIDATES=(
11
+ "$SCRIPT_DIR/../bin/yarn-clean.py"
12
+ "$SCRIPT_DIR/../binaries/yarn-clean.py"
13
+ )
14
+
15
+ TARGET=""
16
+
17
+ for f in "${CANDIDATES[@]}"; do
18
+ if [[ -f "$f" ]]; then
19
+ TARGET="$f"
20
+ break
21
+ fi
22
+ done
23
+
24
+ if [[ -z "$TARGET" ]]; then
25
+ echo "Error: yarn-clean.py not found in expected locations:" >&2
26
+ printf ' - %s\n' "${CANDIDATES[@]}" >&2
27
+ exit 1
28
+ fi
29
+
30
+ echo "Using script: $TARGET"
31
+
32
+ "$SCRIPT_DIR/py" "$TARGET" "$@"
@@ -0,0 +1,178 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Built-in Node.js modules:
5
+ *
6
+ * - child_process:
7
+ * Used to launch external scripts/programs.
8
+ *
9
+ * - path:
10
+ * Safely handles file paths across operating systems.
11
+ *
12
+ * - fs:
13
+ * Used to check whether files exist.
14
+ */
15
+ const { spawnSync } = require("child_process");
16
+ const path = require("path");
17
+ const fs = require("fs");
18
+
19
+ /**
20
+ * __dirname
21
+ * Absolute directory path of this launcher script.
22
+ *
23
+ * __filename
24
+ * Absolute path of this launcher file itself.
25
+ *
26
+ * base
27
+ * Filename without extension.
28
+ *
29
+ * Example:
30
+ * File = "/tools/mytool.js"
31
+ *
32
+ * binDir = "/tools"
33
+ * base = "mytool"
34
+ */
35
+ const binDir = __dirname;
36
+ const base = path.basename(__filename, path.extname(__filename));
37
+
38
+ /**
39
+ * Determine which script extensions to search for
40
+ * based on the current operating system.
41
+ *
42
+ * Windows:
43
+ * .cmd
44
+ * .bat
45
+ * .ps1
46
+ * .vbs
47
+ *
48
+ * Linux/macOS:
49
+ * .sh
50
+ * executable file without extension
51
+ */
52
+ const candidates = process.platform === "win32" ? [".cmd", ".bat", ".ps1", ".vbs"] : [".sh", ""];
53
+
54
+ /**
55
+ * Search for the first matching script
56
+ * in the same directory as this launcher.
57
+ *
58
+ * Example:
59
+ * If base = "mytool"
60
+ *
61
+ * Windows checks:
62
+ * mytool.cmd
63
+ * mytool.bat
64
+ * mytool.ps1
65
+ * mytool.vbs
66
+ *
67
+ * Linux/macOS checks:
68
+ * mytool.sh
69
+ * mytool
70
+ */
71
+ let found = null;
72
+
73
+ for (const ext of candidates) {
74
+ const script = path.join(binDir, base + ext);
75
+
76
+ if (fs.existsSync(script)) {
77
+ found = script;
78
+ break;
79
+ }
80
+ }
81
+
82
+ /**
83
+ * If no matching script was found,
84
+ * print an error and exit with failure code 1.
85
+ */
86
+ if (!found) {
87
+ console.error(`No script found for ${base} in ${binDir}`);
88
+ process.exit(1);
89
+ }
90
+
91
+ /**
92
+ * Detect special script types
93
+ * that require a shell/interpreter.
94
+ */
95
+ const isPs1 = found.endsWith(".ps1");
96
+ const isCmd = found.endsWith(".cmd");
97
+
98
+ /**
99
+ * cmd
100
+ * The executable program to launch.
101
+ *
102
+ * args
103
+ * Arguments passed to the executable.
104
+ */
105
+ let cmd, args;
106
+
107
+ /**
108
+ * PowerShell scripts:
109
+ *
110
+ * Run through powershell.exe because .ps1 files
111
+ * are not directly executable like binaries.
112
+ *
113
+ * Flags:
114
+ * -NoProfile
115
+ * Prevent loading user profile scripts.
116
+ *
117
+ * -ExecutionPolicy Bypass
118
+ * Allow script execution even if policy blocks it.
119
+ *
120
+ * -File
121
+ * Specifies the script to execute.
122
+ *
123
+ * process.argv.slice(2)
124
+ * Forward all user-provided command-line arguments.
125
+ */
126
+ if (isPs1) {
127
+ cmd = "powershell.exe";
128
+
129
+ args = ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File", found, ...process.argv.slice(2)];
130
+
131
+ /**
132
+ * CMD batch files:
133
+ *
134
+ * Run through cmd.exe using:
135
+ * /c
136
+ * which means:
137
+ * "execute command and terminate"
138
+ */
139
+ } else if (isCmd) {
140
+ cmd = "cmd.exe";
141
+
142
+ args = ["/c", found, ...process.argv.slice(2)];
143
+
144
+ /**
145
+ * Other scripts:
146
+ *
147
+ * Usually:
148
+ * - shell scripts (.sh)
149
+ * - executable binaries
150
+ *
151
+ * These can be executed directly.
152
+ */
153
+ } else {
154
+ cmd = found;
155
+ args = process.argv.slice(2);
156
+ }
157
+
158
+ /**
159
+ * Execute the selected script synchronously.
160
+ *
161
+ * stdio: "inherit"
162
+ * Shares the current terminal with the child process,
163
+ * so stdout/stderr/input behave normally.
164
+ *
165
+ * spawnSync waits until the child process exits.
166
+ */
167
+ const result = spawnSync(cmd, args, {
168
+ stdio: "inherit"
169
+ });
170
+
171
+ /**
172
+ * Exit using the same exit code
173
+ * returned by the child process.
174
+ *
175
+ * If result.status is null/undefined,
176
+ * default to exit code 1.
177
+ */
178
+ process.exit(result.status ?? 1);
@@ -0,0 +1,30 @@
1
+ @echo off
2
+ setlocal enabledelayedexpansion
3
+
4
+ REM Get directory of this .bat file
5
+ set "SCRIPT_DIR=%~dp0"
6
+
7
+ echo Current file path: %~f0
8
+
9
+ set "TARGET="
10
+
11
+ set "CANDIDATE1=%SCRIPT_DIR%..\bin\yarn-clean.py"
12
+ set "CANDIDATE2=%SCRIPT_DIR%..\binaries\yarn-clean.py"
13
+
14
+ if exist "%CANDIDATE1%" (
15
+ set "TARGET=%CANDIDATE1%"
16
+ ) else if exist "%CANDIDATE2%" (
17
+ set "TARGET=%CANDIDATE2%"
18
+ )
19
+
20
+ if "%TARGET%"=="" (
21
+ echo Error: yarn-clean.py not found in expected locations:
22
+ echo - %CANDIDATE1%
23
+ echo - %CANDIDATE2%
24
+ exit /b 1
25
+ )
26
+
27
+ echo Using script: %TARGET%
28
+
29
+ REM Run Python script with all arguments
30
+ "%SCRIPT_DIR%py.cmd" "%TARGET%" %*
@@ -0,0 +1,166 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+ import shutil
5
+ from concurrent.futures import ThreadPoolExecutor, as_completed
6
+ from pathlib import Path
7
+ import json
8
+ import glob
9
+ from typing import Union
10
+
11
+
12
+ # -------------------------
13
+ # IGNORE RULES
14
+ # -------------------------
15
+ IGNORE_DIR_NAMES = {".git", "tmp", "dist", "build", "out", "coverage", ".cache"}
16
+
17
+
18
+ # -------------------------
19
+ # DELETE HELPERS
20
+ # -------------------------
21
+ def delete_dir(path: Path) -> tuple[str, Path]:
22
+ shutil.rmtree(path, ignore_errors=True)
23
+ return ("dir", path)
24
+
25
+
26
+ def delete_file(path: Path) -> tuple[str, Path]:
27
+ path.unlink(missing_ok=True)
28
+ return ("file", path)
29
+
30
+
31
+ # -------------------------
32
+ # CLEAN FUNCTION
33
+ # -------------------------
34
+ def clean(base_dir: Union[str, Path]) -> None:
35
+ root = Path(base_dir).resolve()
36
+
37
+ node_modules_dirs: list[Path] = []
38
+ yarn_lock_files: list[Path] = []
39
+
40
+ print(f"Scanning: {root}")
41
+
42
+ for current_root, dirs, files in os.walk(root, topdown=True):
43
+ current = Path(current_root)
44
+
45
+ # -------------------------
46
+ # IGNORE DIRECTORIES
47
+ # -------------------------
48
+ dirs[:] = [
49
+ d for d in dirs
50
+ if d not in IGNORE_DIR_NAMES and not d.startswith(".deploy_")
51
+ ]
52
+
53
+ # Skip node_modules scanning deeper
54
+ if "node_modules" in dirs:
55
+ node_modules_dirs.append(current / "node_modules")
56
+ dirs.remove("node_modules")
57
+
58
+ if "yarn.lock" in files:
59
+ yarn_lock_files.append(current / "yarn.lock")
60
+
61
+ print(f"Found node_modules: {len(node_modules_dirs)}")
62
+ print(f"Found yarn.lock: {len(yarn_lock_files)}")
63
+ print()
64
+
65
+ deleted_dirs = 0
66
+ deleted_files = 0
67
+
68
+ max_workers = min(32, (os.cpu_count() or 1) * 4)
69
+
70
+ with ThreadPoolExecutor(max_workers=max_workers) as executor:
71
+ futures = [
72
+ *(executor.submit(delete_dir, path) for path in node_modules_dirs),
73
+ *(executor.submit(delete_file, path) for path in yarn_lock_files),
74
+ ]
75
+
76
+ for future in as_completed(futures):
77
+ kind, path = future.result()
78
+
79
+ if kind == "dir":
80
+ deleted_dirs += 1
81
+ print(f"[DIR ] Deleted: {path}")
82
+ else:
83
+ deleted_files += 1
84
+ print(f"[FILE] Deleted: {path}")
85
+
86
+ print()
87
+ print("Done.")
88
+ print(f"Deleted node_modules: {deleted_dirs}")
89
+ print(f"Deleted yarn.lock: {deleted_files}")
90
+
91
+
92
+ # -------------------------
93
+ # WORKSPACE COLLECTOR
94
+ # -------------------------
95
+ def collect_workspace_dirs(
96
+ start_root: Union[str, Path],
97
+ include_start_root: bool = False,
98
+ ) -> list[Path]:
99
+ visited = set()
100
+ results = set()
101
+
102
+ start_root = Path(start_root).resolve()
103
+ stack = [start_root]
104
+
105
+ while stack:
106
+ pkg_dir = stack.pop()
107
+
108
+ if pkg_dir in visited:
109
+ continue
110
+
111
+ visited.add(pkg_dir)
112
+
113
+ pkg_file = pkg_dir / "package.json"
114
+ if not pkg_file.is_file():
115
+ continue
116
+
117
+ if include_start_root or pkg_dir != start_root:
118
+ results.add(pkg_dir)
119
+
120
+ try:
121
+ data = json.loads(pkg_file.read_text(encoding="utf-8"))
122
+ except Exception:
123
+ continue
124
+
125
+ ws_field = data.get("workspaces")
126
+ patterns = []
127
+
128
+ if isinstance(ws_field, dict):
129
+ patterns = ws_field.get("packages", [])
130
+ elif isinstance(ws_field, list):
131
+ patterns = ws_field
132
+
133
+ for pattern in patterns:
134
+ matches = glob.glob(str(pkg_dir / pattern), recursive=True)
135
+
136
+ for m in matches:
137
+ p = Path(m)
138
+
139
+ # skip symlinks
140
+ if p.is_symlink():
141
+ continue
142
+
143
+ p_res = p.resolve()
144
+
145
+ if p_res.is_dir() and p_res not in visited:
146
+ stack.append(p_res)
147
+
148
+ return sorted(results, key=lambda p: (len(p.parts), str(p)), reverse=True)
149
+
150
+
151
+ # -------------------------
152
+ # MAIN
153
+ # -------------------------
154
+ if __name__ == "__main__":
155
+ workspace_dirs = collect_workspace_dirs(Path("."))
156
+
157
+ for d in workspace_dirs:
158
+ if Path(d / "node_modules").is_dir() or (d / "yarn.lock").is_file():
159
+ print(f"Cleaning workspace package: {d}")
160
+ clean(d)
161
+ else:
162
+ print(f"Skipping workspace package (no node_modules or yarn.lock): {d}")
163
+
164
+ # root cleanup
165
+ shutil.rmtree(Path(".") / "node_modules", ignore_errors=True)
166
+ (Path(".") / "yarn.lock").unlink(missing_ok=True)
package/binaries/yc ADDED
@@ -0,0 +1,110 @@
1
+ #!/bin/bash
2
+ set -u
3
+
4
+ cwd="$(pwd)"
5
+ max_jobs=4
6
+
7
+ # colors
8
+ GREEN='\033[0;32m'
9
+ RED='\033[0;31m'
10
+ GRAY='\033[0;90m'
11
+ BLUE='\033[0;34m'
12
+ NC='\033[0m'
13
+
14
+ timestamp() {
15
+ date "+%Y-%m-%d %H:%M:%S"
16
+ }
17
+
18
+ relative_path() {
19
+ local path="$1"
20
+
21
+ path="${path#"$cwd"/}"
22
+
23
+ [[ "$path" == "$cwd" ]] && path="."
24
+
25
+ echo "$path"
26
+ }
27
+
28
+ log() {
29
+ local level="$1"
30
+ shift
31
+
32
+ local color="$NC"
33
+
34
+ case "$level" in
35
+ OK) color="$GREEN" ;;
36
+ FAIL) color="$RED" ;;
37
+ SKIP) color="$GRAY" ;;
38
+ INFO) color="$BLUE" ;;
39
+ esac
40
+
41
+ echo -e "${color}[$(timestamp)] [$level] $*${NC}"
42
+ }
43
+
44
+ cleanup_letter() {
45
+ local letter="$1"
46
+
47
+ shopt -s nullglob
48
+
49
+ local targets=(
50
+ "${cwd}/node_modules/${letter}"*
51
+ "${cwd}/node_modules/@types/${letter}"*
52
+ "${cwd}/node_modules/@${letter}"*
53
+ )
54
+
55
+ local removed_any=0
56
+
57
+ for path in "${targets[@]}"; do
58
+ local rel
59
+ rel="$(relative_path "$path")"
60
+
61
+ if rm -rf "$path"; then
62
+ log OK "$rel"
63
+ removed_any=1
64
+ else
65
+ log FAIL "$rel"
66
+ fi
67
+ done
68
+
69
+ if (( removed_any == 0 )); then
70
+ log SKIP "'${letter}'"
71
+ fi
72
+ }
73
+
74
+ export -f cleanup_letter
75
+ export -f log
76
+ export -f timestamp
77
+ export -f relative_path
78
+
79
+ export cwd
80
+ export GREEN RED GRAY BLUE NC
81
+
82
+ log INFO "Cleaning $(relative_path "${cwd}/node_modules")"
83
+
84
+ running=0
85
+
86
+ for letter in $(printf "%s\n" {a..z} | shuf); do
87
+ cleanup_letter "$letter" &
88
+
89
+ ((running++))
90
+
91
+ if (( running >= max_jobs )); then
92
+ wait -n
93
+ ((running--))
94
+ fi
95
+ done
96
+
97
+ wait
98
+
99
+ log INFO "Removing remaining node_modules"
100
+
101
+ final_target="${cwd}/node_modules"
102
+ final_rel="$(relative_path "$final_target")"
103
+
104
+ if rm -rf "$final_target"; then
105
+ log OK "$final_rel"
106
+ else
107
+ log FAIL "$final_rel"
108
+ fi
109
+
110
+ log INFO "Done"