binary-collections 2.0.11 → 2.0.13

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 (330) hide show
  1. package/binaries/binary-executor.cjs +89 -13
  2. package/binaries/clean-nodemodule.cjs +89 -13
  3. package/binaries/clean-nodemodules.cjs +89 -13
  4. package/binaries/dev.cjs +89 -13
  5. package/binaries/empty.cjs +89 -13
  6. package/binaries/git-reduce-size.cjs +89 -13
  7. package/binaries/javakill.cjs +89 -13
  8. package/binaries/kill-process.cjs +89 -13
  9. package/binaries/nodekill.cjs +89 -13
  10. package/binaries/prod.cjs +89 -13
  11. package/binaries/py.cjs +89 -13
  12. package/binaries/rmfind.cjs +89 -13
  13. package/binaries/rmx +15 -1
  14. package/binaries/rmx.cjs +89 -13
  15. package/binaries/rmx.cmd +12 -0
  16. package/binaries/submodule-token.cjs +89 -13
  17. package/binaries/test-cjs +9 -1
  18. package/binaries/test-cjs.cjs +89 -13
  19. package/binaries/test-cjs.cmd +16 -1
  20. package/binaries/test-esm +16 -0
  21. package/binaries/test-esm.cjs +254 -0
  22. package/binaries/test-esm.cmd +23 -0
  23. package/binaries/yarn-clean +1 -1
  24. package/binaries/yarn-clean.cjs +89 -13
  25. package/binaries/yarn-clean.cmd +1 -1
  26. package/binaries/yarn-clean.py +33 -15
  27. package/binaries/yc +131 -0
  28. package/binaries/yc.cjs +254 -0
  29. package/binaries/ycw +256 -0
  30. package/binaries/ycw.cjs +254 -0
  31. package/docs-src/binary-collections.md +34 -0
  32. package/docs-src/changelog.md +26 -0
  33. package/docs-src/clean-github-actions-caches.md +91 -2
  34. package/docs-src/copy-move-file.md +59 -0
  35. package/docs-src/del-gradle.md +17 -0
  36. package/docs-src/del-ps.md +28 -0
  37. package/docs-src/downloader.md +62 -0
  38. package/docs-src/env-helpers.md +29 -0
  39. package/docs-src/find-node-modules.md +17 -0
  40. package/docs-src/git-diff.md +33 -0
  41. package/docs-src/git-fix.md +34 -0
  42. package/docs-src/git-purge.md +17 -0
  43. package/docs-src/git-reduce-size.md +17 -0
  44. package/docs-src/git-undo.md +21 -0
  45. package/docs-src/kill-night-crows.md +26 -0
  46. package/docs-src/node-cache-cleaner.md +182 -0
  47. package/docs-src/node-executor.md +50 -0
  48. package/docs-src/node-package-packer.md +48 -0
  49. package/docs-src/npm-run-series.md +43 -0
  50. package/docs-src/package-resolutions-updater.md +22 -0
  51. package/docs-src/php-cs-fixer-staged.md +19 -0
  52. package/docs-src/print-directory-tree.md +35 -0
  53. package/docs-src/print-tarball-tree.md +55 -0
  54. package/docs-src/py.md +19 -0
  55. package/docs-src/remove-module.md +32 -0
  56. package/docs-src/rmfind-rmx.md +21 -0
  57. package/docs-src/rmpath.md +38 -0
  58. package/docs-src/run-by-checksum.md +87 -0
  59. package/docs-src/submodule-install.md +31 -0
  60. package/docs-src/submodule-remove.md +22 -0
  61. package/docs-src/submodule-token.md +17 -0
  62. package/docs-src/test-runners.md +21 -0
  63. package/docs-src/yarn-install.md +31 -0
  64. package/docs-src/yarn-reinstall.md +27 -0
  65. package/lib/binary-collections/config.cjs +126 -0
  66. package/lib/binary-collections/config.mjs +7 -0
  67. package/lib/binary-collections/executeScript.cjs +19 -0
  68. package/lib/binary-collections/executeScript.d.cts +12 -0
  69. package/lib/binary-collections/executeScript.mjs +6 -0
  70. package/lib/binary-collections/findScript.cjs +309 -0
  71. package/lib/binary-collections/findScript.d.cts +12 -0
  72. package/lib/binary-collections/findScript.mjs +7 -0
  73. package/lib/binary-collections/listScript.cjs +291 -0
  74. package/lib/binary-collections/listScript.d.cts +19 -0
  75. package/lib/binary-collections/listScript.mjs +7 -0
  76. package/lib/binary-collections.cjs +264 -157
  77. package/lib/binary-collections.mjs +26 -286
  78. package/lib/changelog.cjs +9 -14
  79. package/lib/changelog.mjs +2 -2
  80. package/lib/chunk-2MN4VPV2.mjs +246 -0
  81. package/lib/chunk-6C7KTYGZ.mjs +41 -0
  82. package/lib/{chunk-Z6JLYU2J.mjs → chunk-6RK5UCTP.mjs} +7 -12
  83. package/lib/chunk-CD3HF3LK.mjs +190 -0
  84. package/lib/chunk-FLYSZFLW.mjs +61 -0
  85. package/lib/{chunk-N436BNBK.mjs → chunk-GAGABICI.mjs} +19 -13
  86. package/lib/chunk-H44UWUFY.mjs +105 -0
  87. package/lib/chunk-KLKAIFKI.mjs +40 -0
  88. package/lib/chunk-LVSPEFU2.mjs +86 -0
  89. package/lib/{chunk-RWLXRTYP.mjs → chunk-MGPYPKIE.mjs} +2 -2
  90. package/lib/chunk-NGFK3EYW.mjs +28 -0
  91. package/lib/chunk-NQXUYO67.mjs +253 -0
  92. package/lib/chunk-NVEG3LEZ.mjs +143 -0
  93. package/lib/chunk-OBXLTXFJ.mjs +34 -0
  94. package/lib/chunk-OGXVGBRI.mjs +29 -0
  95. package/lib/chunk-OXV52GD5.mjs +62 -0
  96. package/lib/chunk-PXBMHE7O.mjs +35 -0
  97. package/lib/chunk-QD4T255Z.mjs +40 -0
  98. package/lib/chunk-QII2EKCS.mjs +26 -0
  99. package/lib/chunk-R5FJOR63.mjs +47 -0
  100. package/lib/chunk-RDGDLSPD.mjs +76 -0
  101. package/lib/chunk-RDN6HF5Z.mjs +79 -0
  102. package/lib/chunk-RJKTSUAX.mjs +123 -0
  103. package/lib/{chunk-XA3SNBPA.mjs → chunk-TBWXE7ST.mjs} +97 -38
  104. package/lib/chunk-UXCFNAR6.mjs +55 -0
  105. package/lib/{chunk-M3YIYRHT.mjs → chunk-UY5VUEA3.mjs} +1 -1
  106. package/lib/chunk-WSHVPGNM.mjs +44 -0
  107. package/lib/{chunk-66PAU5PS.mjs → chunk-X2B3X7D4.mjs} +10 -6
  108. package/lib/clean-github-actions-caches-cli.cjs +507 -0
  109. package/lib/clean-github-actions-caches-cli.mjs +74 -0
  110. package/lib/clean-github-actions-caches.cjs +246 -106
  111. package/lib/clean-github-actions-caches.d.cts +53 -1
  112. package/lib/clean-github-actions-caches.mjs +5 -130
  113. package/lib/cross-env/command.cjs +63 -0
  114. package/lib/cross-env/command.d.ts +8 -0
  115. package/lib/cross-env/command.js +45 -0
  116. package/lib/{ps/isWin.mjs → cross-env/command.mjs} +4 -5
  117. package/lib/cross-env/index.cjs +178 -0
  118. package/lib/cross-env/index.d.ts +8 -0
  119. package/lib/cross-env/index.js +102 -0
  120. package/lib/cross-env/index.mjs +101 -0
  121. package/lib/cross-env/variable.cjs +60 -0
  122. package/lib/cross-env/variable.d.ts +7 -0
  123. package/lib/cross-env/variable.js +59 -0
  124. package/lib/cross-env/variable.mjs +9 -0
  125. package/lib/del-gradle.cjs +8 -13
  126. package/lib/del-gradle.js +8 -8
  127. package/lib/del-gradle.mjs +1 -1
  128. package/lib/del-node-modules.cjs +185 -3
  129. package/lib/del-node-modules.js +25 -25
  130. package/lib/del-node-modules.mjs +6 -3
  131. package/lib/{del-ps.cjs → del-ps-cli.cjs} +38 -43
  132. package/lib/del-ps-cli.d.mts +1 -0
  133. package/lib/del-ps-cli.mjs +44 -0
  134. package/lib/del-yarn-caches.cjs +8 -13
  135. package/lib/del-yarn-caches.js +2 -2
  136. package/lib/del-yarn-caches.mjs +1 -1
  137. package/lib/downloader-cli.cjs +256 -0
  138. package/lib/downloader-cli.d.cts +2 -0
  139. package/lib/downloader-cli.mjs +90 -0
  140. package/lib/file/copy-cli.cjs +273 -0
  141. package/lib/file/copy-cli.d.mts +1 -0
  142. package/lib/file/copy-cli.mjs +59 -0
  143. package/lib/file/copy.cjs +56 -0
  144. package/lib/file/copy.d.mts +1 -0
  145. package/lib/file/copy.mjs +8 -0
  146. package/lib/file/move-cli.cjs +272 -0
  147. package/lib/file/move-cli.d.mts +1 -0
  148. package/lib/file/move-cli.mjs +59 -0
  149. package/lib/file/move.cjs +55 -0
  150. package/lib/file/move.d.mts +1 -0
  151. package/lib/file/move.mjs +8 -0
  152. package/lib/find-node-modules-cli.cjs +1 -1
  153. package/lib/find-node-modules-cli.js +1 -1
  154. package/lib/find-node-modules-cli.mjs +1 -1
  155. package/lib/find-node-modules.cjs +1 -1
  156. package/lib/find-node-modules.mjs +1 -1
  157. package/lib/free-chatgpt.cjs +27 -26
  158. package/lib/free-chatgpt.js +10 -10
  159. package/lib/free-chatgpt.mjs +2 -2
  160. package/lib/git/user-config.cjs +9 -14
  161. package/lib/git/user-config.mjs +2 -2
  162. package/lib/git-diff-cli.cjs +273 -66
  163. package/lib/git-diff-cli.mjs +5 -4
  164. package/lib/git-diff.cjs +273 -66
  165. package/lib/git-diff.d.ts +2 -1
  166. package/lib/git-diff.js +153 -39
  167. package/lib/git-diff.mjs +5 -4
  168. package/lib/git-fix.cjs +9 -14
  169. package/lib/git-fix.mjs +2 -2
  170. package/lib/git-purge.cjs +9 -14
  171. package/lib/git-purge.mjs +2 -2
  172. package/lib/index.cjs +1 -1
  173. package/lib/index.d.ts +1 -1
  174. package/lib/index.mjs +1 -1
  175. package/lib/kill-night-crows.cjs +7 -7
  176. package/lib/kill-night-crows.mjs +7 -7
  177. package/lib/node-cache-cleaner/npm.cjs +65 -0
  178. package/lib/node-cache-cleaner/npm.d.ts +2 -0
  179. package/lib/node-cache-cleaner/npm.js +41 -0
  180. package/lib/node-cache-cleaner/npm.mjs +10 -0
  181. package/lib/node-cache-cleaner/npx.cjs +89 -0
  182. package/lib/node-cache-cleaner/npx.d.ts +4 -0
  183. package/lib/node-cache-cleaner/npx.js +82 -0
  184. package/lib/{ps/index.d.mjs → node-cache-cleaner/npx.mjs} +6 -5
  185. package/lib/node-cache-cleaner/yarn.cjs +73 -0
  186. package/lib/node-cache-cleaner/yarn.d.ts +2 -0
  187. package/lib/node-cache-cleaner/yarn.js +62 -0
  188. package/lib/node-cache-cleaner/yarn.mjs +10 -0
  189. package/lib/node-cache-cleaner-cli.cjs +365 -0
  190. package/lib/node-cache-cleaner-cli.d.ts +2 -0
  191. package/lib/node-cache-cleaner-cli.js +57 -0
  192. package/lib/node-cache-cleaner-cli.mjs +60 -0
  193. package/lib/node-executor.cjs +272 -0
  194. package/lib/node-executor.d.cts +2 -0
  195. package/lib/node-executor.mjs +106 -0
  196. package/lib/node-package-packer/build-readme.cjs +150 -0
  197. package/lib/node-package-packer/build-readme.d.mts +10 -0
  198. package/lib/node-package-packer/build-readme.mjs +10 -0
  199. package/lib/node-package-packer/build-tarball.cjs +495 -0
  200. package/lib/node-package-packer/build-tarball.d.mts +33 -0
  201. package/lib/node-package-packer/build-tarball.mjs +175 -0
  202. package/lib/node-package-packer-cli.cjs +525 -0
  203. package/lib/node-package-packer-cli.d.mts +1 -0
  204. package/lib/node-package-packer-cli.mjs +34 -0
  205. package/lib/npm-run-series.cjs +28 -40
  206. package/lib/npm-run-series.mjs +21 -7
  207. package/lib/package-resolutions-updater-cli.cjs +255 -173
  208. package/lib/package-resolutions-updater-cli.mjs +19 -40
  209. package/lib/package-resolutions-updater.cjs +244 -141
  210. package/lib/package-resolutions-updater.d.mts +54 -1
  211. package/lib/package-resolutions-updater.mjs +8 -5
  212. package/lib/php-cs-fixer-staged.cjs +1 -1
  213. package/lib/php-cs-fixer-staged.mjs +1 -1
  214. package/lib/print-directory-tree.cjs +18 -20
  215. package/lib/print-directory-tree.mjs +11 -8
  216. package/lib/print-tarball-tree.cjs +262 -0
  217. package/lib/print-tarball-tree.d.mts +1 -0
  218. package/lib/print-tarball-tree.mjs +68 -0
  219. package/lib/ps/connected-domain.js +10 -10
  220. package/lib/ps/index.cjs +11 -11
  221. package/lib/ps/index.mjs +180 -174
  222. package/lib/ps/table-parser.d.ts +3 -4
  223. package/lib/ps/table-parser.js +15 -22
  224. package/lib/remove-module.cjs +19 -24
  225. package/lib/remove-module.mjs +2 -2
  226. package/lib/rm-node-module-cli.cjs +389 -0
  227. package/lib/rm-node-module-cli.d.cts +1 -0
  228. package/lib/rm-node-module-cli.mjs +92 -0
  229. package/lib/rm-node-modules.cjs +127 -0
  230. package/lib/rm-node-modules.d.cts +35 -0
  231. package/lib/{binary-collections-config.mjs → rm-node-modules.mjs} +3 -3
  232. package/lib/rmpath-cli.cjs +285 -0
  233. package/lib/rmpath-cli.d.mts +1 -0
  234. package/lib/rmpath-cli.mjs +23 -0
  235. package/lib/rmpath.cjs +6 -217
  236. package/lib/rmpath.mjs +5 -101
  237. package/lib/run-by-checksum/cache.cjs +69 -0
  238. package/lib/run-by-checksum/cache.d.ts +19 -0
  239. package/lib/run-by-checksum/cache.js +50 -0
  240. package/lib/run-by-checksum/cache.mjs +12 -0
  241. package/lib/run-by-checksum/hash.cjs +72 -0
  242. package/lib/run-by-checksum/hash.d.ts +14 -0
  243. package/lib/run-by-checksum/hash.js +85 -0
  244. package/lib/run-by-checksum/hash.mjs +10 -0
  245. package/lib/run-by-checksum/run.cjs +169 -0
  246. package/lib/run-by-checksum/run.d.ts +22 -0
  247. package/lib/run-by-checksum/run.js +93 -0
  248. package/lib/run-by-checksum/run.mjs +10 -0
  249. package/lib/run-by-checksum-cli.cjs +382 -0
  250. package/lib/run-by-checksum-cli.d.ts +2 -0
  251. package/lib/run-by-checksum-cli.js +43 -0
  252. package/lib/run-by-checksum-cli.mjs +56 -0
  253. package/lib/submodule-install.cjs +55 -47
  254. package/lib/submodule-install.mjs +48 -35
  255. package/lib/submodule-remove-cli.cjs +170 -4
  256. package/lib/submodule-remove-cli.js +5 -5
  257. package/lib/submodule-remove-cli.mjs +6 -4
  258. package/lib/utils/chatgpt.cjs +19 -13
  259. package/lib/utils/chatgpt.js +94 -94
  260. package/lib/utils/chatgpt.mjs +1 -1
  261. package/lib/utils/fetchResponse.cjs +24 -0
  262. package/lib/utils/fetchResponse.d.cts +25 -0
  263. package/lib/utils/fetchResponse.mjs +6 -0
  264. package/lib/utils/findEnvFiles.cjs +28 -46
  265. package/lib/utils/findEnvFiles.d.cts +19 -0
  266. package/lib/utils/findEnvFiles.mjs +3 -5
  267. package/lib/utils/findWorkspaceRoot.js +4 -4
  268. package/lib/utils/index.cjs +7 -12
  269. package/lib/utils/index.d.cts +2 -9
  270. package/lib/utils/index.mjs +1 -1
  271. package/lib/utils/isGithubTokenValid.js +7 -7
  272. package/lib/{ps/isWin.cjs → utils/isWindows.cjs} +12 -7
  273. package/lib/utils/isWindows.d.ts +5 -0
  274. package/lib/utils/isWindows.js +10 -0
  275. package/lib/utils/isWindows.mjs +10 -0
  276. package/lib/utils/runBash.cjs +53 -0
  277. package/lib/utils/runBash.d.cts +12 -0
  278. package/lib/utils/runBash.mjs +66 -0
  279. package/lib/yarn-per-branch-lock-installer.cjs +288 -0
  280. package/lib/yarn-per-branch-lock-installer.d.cts +2 -0
  281. package/lib/yarn-per-branch-lock-installer.mjs +122 -0
  282. package/lib/yarn-reinstall.cjs +8 -13
  283. package/lib/yarn-reinstall.mjs +1 -1
  284. package/package.json +91 -57
  285. package/readme.html +784 -0
  286. package/readme.md +107 -219
  287. package/releases/readme.md +6 -3
  288. package/test/README.md +2 -2
  289. package/test-project/workspaces/workspace-a/readme.md +20 -0
  290. package/test-project/workspaces/workspace-a/release/readme.md +42 -0
  291. package/test-project/workspaces/workspace-a/test/readme.md +12 -0
  292. package/test-project/workspaces/workspace-b/readme.md +94 -0
  293. package/test-project/workspaces/workspace-b/requirements.txt +1 -0
  294. package/test-project/workspaces/workspace-b/themes/hexo-theme-flowbite/readme.md +156 -0
  295. package/tmp/test-repo/README.md +2 -35
  296. package/tmp/test-repo-runChecksum/test-complex-glob/README.md +1 -0
  297. package/tmp/test-repo-runChecksum/test-mixed-args/README.md +1 -0
  298. package/lib/binary-collections-config.cjs +0 -15
  299. package/lib/chunk-2CBJCW7E.mjs +0 -81
  300. package/lib/chunk-4UHL4WVN.mjs +0 -136
  301. package/lib/chunk-6HHJRKFB.mjs +0 -59
  302. package/lib/chunk-6S4NXESK.mjs +0 -26
  303. package/lib/chunk-7XTEJHOE.mjs +0 -193
  304. package/lib/chunk-AJDD5DZM.mjs +0 -109
  305. package/lib/chunk-FCDQGYBF.mjs +0 -136
  306. package/lib/chunk-GEYA2USY.mjs +0 -207
  307. package/lib/chunk-GJTGHXRA.mjs +0 -356
  308. package/lib/chunk-ID2WBTE2.mjs +0 -80
  309. package/lib/chunk-JXFOHKDM.mjs +0 -239
  310. package/lib/chunk-NCXAP7AA.mjs +0 -31
  311. package/lib/chunk-PDSXF5HY.mjs +0 -187
  312. package/lib/chunk-TOIVAQF7.mjs +0 -136
  313. package/lib/chunk-V5SKYJUB.mjs +0 -136
  314. package/lib/chunk-WSRETQCA.mjs +0 -59
  315. package/lib/chunk-YYLIQQKF.mjs +0 -31
  316. package/lib/del-ps.js +0 -32
  317. package/lib/del-ps.mjs +0 -43
  318. package/lib/ps/index.d.cjs +0 -17
  319. package/lib/ps/index.d.ts +0 -2
  320. package/lib/ps/index.js +0 -254
  321. package/lib/ps/isWin.d.ts +0 -2
  322. package/lib/ps/isWin.js +0 -4
  323. package/lib/utils/findEnvFiles.d.ts +0 -8
  324. package/lib/utils/findEnvFiles.js +0 -121
  325. package/test/package.json +0 -20
  326. package/test-project/package.json +0 -16
  327. package/tmp/test-repo/package.json +0 -7
  328. package/tmp/typedoc/readme.md +0 -320
  329. /package/lib/{binary-collections-config.d.cts → binary-collections/config.d.cts} +0 -0
  330. /package/lib/{del-ps.d.ts → clean-github-actions-caches-cli.d.cts} +0 -0
package/binaries/rmx CHANGED
@@ -55,16 +55,30 @@ rm -rf "$1" &
55
55
 
56
56
  # vowels=( a i u e o A I U E O )
57
57
  vowels=( a i u e o A I U E O 0 1 2 3 4 5 6 7 8 9 _ - . )
58
+
59
+ max_jobs=4 # set the maximum number of concurrent jobs
60
+
58
61
  for letter in {{a..z},{A..Z}}; do
59
62
  for vowel in "${vowels[@]}"; do
63
+
60
64
  toBeDeleted=( "$1/.${letter}*" "$1/@${letter}*" "$1/${letter}*" "$1/@${letter}${vowel}*" "$1/.${letter}${vowel}*" "$1/${letter}${vowel}*" )
65
+
61
66
  shuffled=( $(shuf -e "${toBeDeleted[@]}") )
67
+
62
68
  for fpath in "${shuffled[@]}"; do
69
+
63
70
  if [ -d "$1" ]; then
71
+
72
+ # wait for a slot to be free if we have reached the maximum number of concurrent jobs
73
+ while (( $(jobs -rp | wc -l) >= max_jobs )); do
74
+ wait -n
75
+ done
76
+
64
77
  rm -rf $fpath && echo "removed $fpath" || echo "cannot delete $fpath" &
78
+
65
79
  fi
66
80
  done
67
81
  done
68
82
  done
69
83
 
70
- wait
84
+ wait
package/binaries/rmx.cjs CHANGED
@@ -12,9 +12,11 @@
12
12
  * - fs:
13
13
  * Used to check whether files exist.
14
14
  */
15
- const { spawnSync } = require("child_process");
16
- const path = require("path");
17
- const fs = require("fs");
15
+ const { spawnSync } = require('child_process');
16
+ const path = require('path');
17
+ const fs = require('fs');
18
+ const which = require('which');
19
+ const { isWindows } = require('../src/utils/isWindows.js');
18
20
 
19
21
  /**
20
22
  * __dirname
@@ -49,7 +51,7 @@ const base = path.basename(__filename, path.extname(__filename));
49
51
  * .sh
50
52
  * executable file without extension
51
53
  */
52
- const candidates = process.platform === "win32" ? [".cmd", ".bat", ".ps1", ".vbs"] : [".sh", ""];
54
+ const candidates = process.platform === 'win32' ? ['.cmd', '.bat', '.ps1', '.vbs'] : ['.sh', ''];
53
55
 
54
56
  /**
55
57
  * Search for the first matching script
@@ -72,13 +74,32 @@ let found = null;
72
74
 
73
75
  for (const ext of candidates) {
74
76
  const script = path.join(binDir, base + ext);
75
-
76
- if (fs.existsSync(script)) {
77
+ const exists = fs.existsSync(script);
78
+ // console.log(`Checking for ${script}: ${exists ? 'found' : 'not found'}`);
79
+ if (exists) {
77
80
  found = script;
78
81
  break;
79
82
  }
80
83
  }
81
84
 
85
+ /**
86
+ * If no matching script was found,
87
+ * try check if `bash` is available and if so, check for a .sh script.
88
+ */
89
+ if (!found) {
90
+ try {
91
+ spawnSync('bash', ['--version'], { stdio: 'ignore' });
92
+ const bashScript = [path.join(binDir, base), path.join(binDir, base + '.sh')].find((script) =>
93
+ fs.existsSync(script)
94
+ );
95
+ if (bashScript) {
96
+ found = bashScript;
97
+ }
98
+ } catch {
99
+ // bash is not available, do nothing
100
+ }
101
+ }
102
+
82
103
  /**
83
104
  * If no matching script was found,
84
105
  * print an error and exit with failure code 1.
@@ -92,8 +113,9 @@ if (!found) {
92
113
  * Detect special script types
93
114
  * that require a shell/interpreter.
94
115
  */
95
- const isPs1 = found.endsWith(".ps1");
96
- const isCmd = found.endsWith(".cmd");
116
+ const isPs1 = found.endsWith('.ps1');
117
+ const isCmd = found.endsWith('.cmd');
118
+ const isUnixShell = found.endsWith('.sh') || path.extname(found) === '';
97
119
 
98
120
  /**
99
121
  * cmd
@@ -124,9 +146,9 @@ let cmd, args;
124
146
  * Forward all user-provided command-line arguments.
125
147
  */
126
148
  if (isPs1) {
127
- cmd = "powershell.exe";
149
+ cmd = 'powershell.exe';
128
150
 
129
- args = ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File", found, ...process.argv.slice(2)];
151
+ args = ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', found, ...process.argv.slice(2)];
130
152
 
131
153
  /**
132
154
  * CMD batch files:
@@ -137,9 +159,9 @@ if (isPs1) {
137
159
  * "execute command and terminate"
138
160
  */
139
161
  } else if (isCmd) {
140
- cmd = "cmd.exe";
162
+ cmd = 'cmd.exe';
141
163
 
142
- args = ["/c", found, ...process.argv.slice(2)];
164
+ args = ['/c', found, ...process.argv.slice(2)];
143
165
 
144
166
  /**
145
167
  * Other scripts:
@@ -150,11 +172,65 @@ if (isPs1) {
150
172
  *
151
173
  * These can be executed directly.
152
174
  */
175
+ } else if (isUnixShell) {
176
+ // Capture shebang scripts (no extension) and .sh scripts
177
+ const shebang = fs.readFileSync(found, 'utf8').split('\n')[0].trim();
178
+ const interpreter = shebang.startsWith('#!')
179
+ ? shebang
180
+ .slice(2)
181
+ .trim()
182
+ .replace(/^\/usr\/bin\/env\s+/, '')
183
+ .replace(/^\/bin\/env\s+/, '')
184
+ .replace(/^\/usr\/bin\//, '')
185
+ .replace(/^\/bin\//, '')
186
+ : null;
187
+
188
+ if (interpreter) {
189
+ const resolvedOrNull = which.sync(interpreter, { nothrow: true });
190
+ if (!resolvedOrNull) {
191
+ if (['bash', 'sh'].includes(interpreter) && isWindows()) {
192
+ const locationsToCheck = [
193
+ 'C:\\Program Files\\Git\\usr\\bin',
194
+ 'C:\\Program Files\\Git\\bin',
195
+ 'C:\\Program Files (x86)\\Git\\usr\\bin',
196
+ 'C:\\msys64\\usr\\bin',
197
+ 'C:\\msys64\\bin',
198
+ 'C:\\cygwin64\\bin',
199
+ 'C:\\cygwin\\bin',
200
+ 'C:\\MinGW\\bin',
201
+ 'C:\\MinGW\\msys\\1.0\\bin'
202
+ ];
203
+ for (const location of locationsToCheck) {
204
+ const potentialPath = path.join(location, 'bash.exe');
205
+ if (fs.existsSync(potentialPath)) {
206
+ cmd = potentialPath;
207
+ args = [found, ...process.argv.slice(2)];
208
+ break;
209
+ }
210
+ }
211
+ }
212
+ } else {
213
+ cmd = resolvedOrNull || interpreter;
214
+ args = [found, ...process.argv.slice(2)];
215
+ }
216
+ } else {
217
+ cmd = found;
218
+ args = process.argv.slice(2);
219
+ }
153
220
  } else {
154
221
  cmd = found;
155
222
  args = process.argv.slice(2);
156
223
  }
157
224
 
225
+ console.log(
226
+ `Executing: ${path.isAbsolute(cmd) ? path.relative(process.cwd(), cmd) : cmd} ${args
227
+ .map((f) => {
228
+ if (path.isAbsolute(f)) return path.relative(process.cwd(), f);
229
+ return f;
230
+ })
231
+ .join(' ')}`
232
+ );
233
+
158
234
  /**
159
235
  * Execute the selected script synchronously.
160
236
  *
@@ -165,7 +241,7 @@ if (isPs1) {
165
241
  * spawnSync waits until the child process exits.
166
242
  */
167
243
  const result = spawnSync(cmd, args, {
168
- stdio: "inherit"
244
+ stdio: 'inherit'
169
245
  });
170
246
 
171
247
  /**
@@ -0,0 +1,12 @@
1
+ @echo off
2
+ setlocal
3
+
4
+ set "SCRIPT_DIR=%~dp0"
5
+
6
+ where bash >nul 2>&1
7
+ if errorlevel 1 (
8
+ echo Error: bash not found in PATH.
9
+ exit /b 1
10
+ )
11
+
12
+ bash "%SCRIPT_DIR%rmx" %*
@@ -12,9 +12,11 @@
12
12
  * - fs:
13
13
  * Used to check whether files exist.
14
14
  */
15
- const { spawnSync } = require("child_process");
16
- const path = require("path");
17
- const fs = require("fs");
15
+ const { spawnSync } = require('child_process');
16
+ const path = require('path');
17
+ const fs = require('fs');
18
+ const which = require('which');
19
+ const { isWindows } = require('../src/utils/isWindows.js');
18
20
 
19
21
  /**
20
22
  * __dirname
@@ -49,7 +51,7 @@ const base = path.basename(__filename, path.extname(__filename));
49
51
  * .sh
50
52
  * executable file without extension
51
53
  */
52
- const candidates = process.platform === "win32" ? [".cmd", ".bat", ".ps1", ".vbs"] : [".sh", ""];
54
+ const candidates = process.platform === 'win32' ? ['.cmd', '.bat', '.ps1', '.vbs'] : ['.sh', ''];
53
55
 
54
56
  /**
55
57
  * Search for the first matching script
@@ -72,13 +74,32 @@ let found = null;
72
74
 
73
75
  for (const ext of candidates) {
74
76
  const script = path.join(binDir, base + ext);
75
-
76
- if (fs.existsSync(script)) {
77
+ const exists = fs.existsSync(script);
78
+ // console.log(`Checking for ${script}: ${exists ? 'found' : 'not found'}`);
79
+ if (exists) {
77
80
  found = script;
78
81
  break;
79
82
  }
80
83
  }
81
84
 
85
+ /**
86
+ * If no matching script was found,
87
+ * try check if `bash` is available and if so, check for a .sh script.
88
+ */
89
+ if (!found) {
90
+ try {
91
+ spawnSync('bash', ['--version'], { stdio: 'ignore' });
92
+ const bashScript = [path.join(binDir, base), path.join(binDir, base + '.sh')].find((script) =>
93
+ fs.existsSync(script)
94
+ );
95
+ if (bashScript) {
96
+ found = bashScript;
97
+ }
98
+ } catch {
99
+ // bash is not available, do nothing
100
+ }
101
+ }
102
+
82
103
  /**
83
104
  * If no matching script was found,
84
105
  * print an error and exit with failure code 1.
@@ -92,8 +113,9 @@ if (!found) {
92
113
  * Detect special script types
93
114
  * that require a shell/interpreter.
94
115
  */
95
- const isPs1 = found.endsWith(".ps1");
96
- const isCmd = found.endsWith(".cmd");
116
+ const isPs1 = found.endsWith('.ps1');
117
+ const isCmd = found.endsWith('.cmd');
118
+ const isUnixShell = found.endsWith('.sh') || path.extname(found) === '';
97
119
 
98
120
  /**
99
121
  * cmd
@@ -124,9 +146,9 @@ let cmd, args;
124
146
  * Forward all user-provided command-line arguments.
125
147
  */
126
148
  if (isPs1) {
127
- cmd = "powershell.exe";
149
+ cmd = 'powershell.exe';
128
150
 
129
- args = ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File", found, ...process.argv.slice(2)];
151
+ args = ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', found, ...process.argv.slice(2)];
130
152
 
131
153
  /**
132
154
  * CMD batch files:
@@ -137,9 +159,9 @@ if (isPs1) {
137
159
  * "execute command and terminate"
138
160
  */
139
161
  } else if (isCmd) {
140
- cmd = "cmd.exe";
162
+ cmd = 'cmd.exe';
141
163
 
142
- args = ["/c", found, ...process.argv.slice(2)];
164
+ args = ['/c', found, ...process.argv.slice(2)];
143
165
 
144
166
  /**
145
167
  * Other scripts:
@@ -150,11 +172,65 @@ if (isPs1) {
150
172
  *
151
173
  * These can be executed directly.
152
174
  */
175
+ } else if (isUnixShell) {
176
+ // Capture shebang scripts (no extension) and .sh scripts
177
+ const shebang = fs.readFileSync(found, 'utf8').split('\n')[0].trim();
178
+ const interpreter = shebang.startsWith('#!')
179
+ ? shebang
180
+ .slice(2)
181
+ .trim()
182
+ .replace(/^\/usr\/bin\/env\s+/, '')
183
+ .replace(/^\/bin\/env\s+/, '')
184
+ .replace(/^\/usr\/bin\//, '')
185
+ .replace(/^\/bin\//, '')
186
+ : null;
187
+
188
+ if (interpreter) {
189
+ const resolvedOrNull = which.sync(interpreter, { nothrow: true });
190
+ if (!resolvedOrNull) {
191
+ if (['bash', 'sh'].includes(interpreter) && isWindows()) {
192
+ const locationsToCheck = [
193
+ 'C:\\Program Files\\Git\\usr\\bin',
194
+ 'C:\\Program Files\\Git\\bin',
195
+ 'C:\\Program Files (x86)\\Git\\usr\\bin',
196
+ 'C:\\msys64\\usr\\bin',
197
+ 'C:\\msys64\\bin',
198
+ 'C:\\cygwin64\\bin',
199
+ 'C:\\cygwin\\bin',
200
+ 'C:\\MinGW\\bin',
201
+ 'C:\\MinGW\\msys\\1.0\\bin'
202
+ ];
203
+ for (const location of locationsToCheck) {
204
+ const potentialPath = path.join(location, 'bash.exe');
205
+ if (fs.existsSync(potentialPath)) {
206
+ cmd = potentialPath;
207
+ args = [found, ...process.argv.slice(2)];
208
+ break;
209
+ }
210
+ }
211
+ }
212
+ } else {
213
+ cmd = resolvedOrNull || interpreter;
214
+ args = [found, ...process.argv.slice(2)];
215
+ }
216
+ } else {
217
+ cmd = found;
218
+ args = process.argv.slice(2);
219
+ }
153
220
  } else {
154
221
  cmd = found;
155
222
  args = process.argv.slice(2);
156
223
  }
157
224
 
225
+ console.log(
226
+ `Executing: ${path.isAbsolute(cmd) ? path.relative(process.cwd(), cmd) : cmd} ${args
227
+ .map((f) => {
228
+ if (path.isAbsolute(f)) return path.relative(process.cwd(), f);
229
+ return f;
230
+ })
231
+ .join(' ')}`
232
+ );
233
+
158
234
  /**
159
235
  * Execute the selected script synchronously.
160
236
  *
@@ -165,7 +241,7 @@ if (isPs1) {
165
241
  * spawnSync waits until the child process exits.
166
242
  */
167
243
  const result = spawnSync(cmd, args, {
168
- stdio: "inherit"
244
+ stdio: 'inherit'
169
245
  });
170
246
 
171
247
  /**
package/binaries/test-cjs CHANGED
@@ -1,10 +1,18 @@
1
1
  #!/usr/bin/env bash
2
2
 
3
+ # Detect GitHub Actions or GitLab CI
4
+ CI_ARG=""
5
+
6
+ if [[ -n "${GITHUB_ACTIONS:-}" || -n "${GITLAB_CI:-}" ]]; then
7
+ CI_ARG="--ci"
8
+ fi
9
+
3
10
  # Run Jest while forwarding all arguments
4
- npx jest \
11
+ npx -y jest \
5
12
  --runInBand \
6
13
  --forceExit \
7
14
  --testTimeout=120000 \
8
15
  --testPathIgnorePatterns="\\.mjs$" \
9
16
  --detectOpenHandles \
17
+ ${CI_ARG:+$CI_ARG} \
10
18
  "$@"
@@ -12,9 +12,11 @@
12
12
  * - fs:
13
13
  * Used to check whether files exist.
14
14
  */
15
- const { spawnSync } = require("child_process");
16
- const path = require("path");
17
- const fs = require("fs");
15
+ const { spawnSync } = require('child_process');
16
+ const path = require('path');
17
+ const fs = require('fs');
18
+ const which = require('which');
19
+ const { isWindows } = require('../src/utils/isWindows.js');
18
20
 
19
21
  /**
20
22
  * __dirname
@@ -49,7 +51,7 @@ const base = path.basename(__filename, path.extname(__filename));
49
51
  * .sh
50
52
  * executable file without extension
51
53
  */
52
- const candidates = process.platform === "win32" ? [".cmd", ".bat", ".ps1", ".vbs"] : [".sh", ""];
54
+ const candidates = process.platform === 'win32' ? ['.cmd', '.bat', '.ps1', '.vbs'] : ['.sh', ''];
53
55
 
54
56
  /**
55
57
  * Search for the first matching script
@@ -72,13 +74,32 @@ let found = null;
72
74
 
73
75
  for (const ext of candidates) {
74
76
  const script = path.join(binDir, base + ext);
75
-
76
- if (fs.existsSync(script)) {
77
+ const exists = fs.existsSync(script);
78
+ // console.log(`Checking for ${script}: ${exists ? 'found' : 'not found'}`);
79
+ if (exists) {
77
80
  found = script;
78
81
  break;
79
82
  }
80
83
  }
81
84
 
85
+ /**
86
+ * If no matching script was found,
87
+ * try check if `bash` is available and if so, check for a .sh script.
88
+ */
89
+ if (!found) {
90
+ try {
91
+ spawnSync('bash', ['--version'], { stdio: 'ignore' });
92
+ const bashScript = [path.join(binDir, base), path.join(binDir, base + '.sh')].find((script) =>
93
+ fs.existsSync(script)
94
+ );
95
+ if (bashScript) {
96
+ found = bashScript;
97
+ }
98
+ } catch {
99
+ // bash is not available, do nothing
100
+ }
101
+ }
102
+
82
103
  /**
83
104
  * If no matching script was found,
84
105
  * print an error and exit with failure code 1.
@@ -92,8 +113,9 @@ if (!found) {
92
113
  * Detect special script types
93
114
  * that require a shell/interpreter.
94
115
  */
95
- const isPs1 = found.endsWith(".ps1");
96
- const isCmd = found.endsWith(".cmd");
116
+ const isPs1 = found.endsWith('.ps1');
117
+ const isCmd = found.endsWith('.cmd');
118
+ const isUnixShell = found.endsWith('.sh') || path.extname(found) === '';
97
119
 
98
120
  /**
99
121
  * cmd
@@ -124,9 +146,9 @@ let cmd, args;
124
146
  * Forward all user-provided command-line arguments.
125
147
  */
126
148
  if (isPs1) {
127
- cmd = "powershell.exe";
149
+ cmd = 'powershell.exe';
128
150
 
129
- args = ["-NoProfile", "-ExecutionPolicy", "Bypass", "-File", found, ...process.argv.slice(2)];
151
+ args = ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', found, ...process.argv.slice(2)];
130
152
 
131
153
  /**
132
154
  * CMD batch files:
@@ -137,9 +159,9 @@ if (isPs1) {
137
159
  * "execute command and terminate"
138
160
  */
139
161
  } else if (isCmd) {
140
- cmd = "cmd.exe";
162
+ cmd = 'cmd.exe';
141
163
 
142
- args = ["/c", found, ...process.argv.slice(2)];
164
+ args = ['/c', found, ...process.argv.slice(2)];
143
165
 
144
166
  /**
145
167
  * Other scripts:
@@ -150,11 +172,65 @@ if (isPs1) {
150
172
  *
151
173
  * These can be executed directly.
152
174
  */
175
+ } else if (isUnixShell) {
176
+ // Capture shebang scripts (no extension) and .sh scripts
177
+ const shebang = fs.readFileSync(found, 'utf8').split('\n')[0].trim();
178
+ const interpreter = shebang.startsWith('#!')
179
+ ? shebang
180
+ .slice(2)
181
+ .trim()
182
+ .replace(/^\/usr\/bin\/env\s+/, '')
183
+ .replace(/^\/bin\/env\s+/, '')
184
+ .replace(/^\/usr\/bin\//, '')
185
+ .replace(/^\/bin\//, '')
186
+ : null;
187
+
188
+ if (interpreter) {
189
+ const resolvedOrNull = which.sync(interpreter, { nothrow: true });
190
+ if (!resolvedOrNull) {
191
+ if (['bash', 'sh'].includes(interpreter) && isWindows()) {
192
+ const locationsToCheck = [
193
+ 'C:\\Program Files\\Git\\usr\\bin',
194
+ 'C:\\Program Files\\Git\\bin',
195
+ 'C:\\Program Files (x86)\\Git\\usr\\bin',
196
+ 'C:\\msys64\\usr\\bin',
197
+ 'C:\\msys64\\bin',
198
+ 'C:\\cygwin64\\bin',
199
+ 'C:\\cygwin\\bin',
200
+ 'C:\\MinGW\\bin',
201
+ 'C:\\MinGW\\msys\\1.0\\bin'
202
+ ];
203
+ for (const location of locationsToCheck) {
204
+ const potentialPath = path.join(location, 'bash.exe');
205
+ if (fs.existsSync(potentialPath)) {
206
+ cmd = potentialPath;
207
+ args = [found, ...process.argv.slice(2)];
208
+ break;
209
+ }
210
+ }
211
+ }
212
+ } else {
213
+ cmd = resolvedOrNull || interpreter;
214
+ args = [found, ...process.argv.slice(2)];
215
+ }
216
+ } else {
217
+ cmd = found;
218
+ args = process.argv.slice(2);
219
+ }
153
220
  } else {
154
221
  cmd = found;
155
222
  args = process.argv.slice(2);
156
223
  }
157
224
 
225
+ console.log(
226
+ `Executing: ${path.isAbsolute(cmd) ? path.relative(process.cwd(), cmd) : cmd} ${args
227
+ .map((f) => {
228
+ if (path.isAbsolute(f)) return path.relative(process.cwd(), f);
229
+ return f;
230
+ })
231
+ .join(' ')}`
232
+ );
233
+
158
234
  /**
159
235
  * Execute the selected script synchronously.
160
236
  *
@@ -165,7 +241,7 @@ if (isPs1) {
165
241
  * spawnSync waits until the child process exits.
166
242
  */
167
243
  const result = spawnSync(cmd, args, {
168
- stdio: "inherit"
244
+ stdio: 'inherit'
169
245
  });
170
246
 
171
247
  /**
@@ -1,11 +1,26 @@
1
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
+ )
2
14
 
3
15
  :: Run the specific Jest test file while ignoring .mjs files.
4
16
  :: Use caret (^) for line continuation in Windows CMD.
5
- npx jest ^
17
+ npx -y jest ^
6
18
  --runInBand ^
7
19
  --forceExit ^
8
20
  --testTimeout=120000 ^
9
21
  --testPathIgnorePatterns="\\.mjs$" ^
10
22
  --detectOpenHandles ^
23
+ %CI_ARG% ^
11
24
  %*
25
+
26
+ endlocal
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env bash
2
+
3
+ # Detect GitHub Actions or GitLab CI
4
+ CI_ARG=""
5
+
6
+ if [[ -n "${GITHUB_ACTIONS:-}" || -n "${GITLAB_CI:-}" ]]; then
7
+ CI_ARG="--ci"
8
+ fi
9
+
10
+ node --experimental-vm-modules node_modules/jest/bin/jest.js \
11
+ --runInBand \
12
+ --forceExit \
13
+ --testTimeout=120000 \
14
+ --testPathIgnorePatterns="\\.(ts|js|cjs)$" \
15
+ ${CI_ARG:+$CI_ARG} \
16
+ "$@"