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.
- package/binaries/binary-executor.cjs +89 -13
- package/binaries/clean-nodemodule.cjs +89 -13
- package/binaries/clean-nodemodules.cjs +89 -13
- package/binaries/dev.cjs +89 -13
- package/binaries/empty.cjs +89 -13
- package/binaries/git-reduce-size.cjs +89 -13
- package/binaries/javakill.cjs +89 -13
- package/binaries/kill-process.cjs +89 -13
- package/binaries/nodekill.cjs +89 -13
- package/binaries/prod.cjs +89 -13
- package/binaries/py.cjs +89 -13
- package/binaries/rmfind.cjs +89 -13
- package/binaries/rmx +15 -1
- package/binaries/rmx.cjs +89 -13
- package/binaries/rmx.cmd +12 -0
- package/binaries/submodule-token.cjs +89 -13
- package/binaries/test-cjs +9 -1
- package/binaries/test-cjs.cjs +89 -13
- package/binaries/test-cjs.cmd +16 -1
- package/binaries/test-esm +16 -0
- package/binaries/test-esm.cjs +254 -0
- package/binaries/test-esm.cmd +23 -0
- package/binaries/yarn-clean +1 -1
- package/binaries/yarn-clean.cjs +89 -13
- package/binaries/yarn-clean.cmd +1 -1
- package/binaries/yarn-clean.py +33 -15
- package/binaries/yc +131 -0
- package/binaries/yc.cjs +254 -0
- package/binaries/ycw +256 -0
- package/binaries/ycw.cjs +254 -0
- package/docs-src/binary-collections.md +34 -0
- package/docs-src/changelog.md +26 -0
- package/docs-src/clean-github-actions-caches.md +91 -2
- package/docs-src/copy-move-file.md +59 -0
- package/docs-src/del-gradle.md +17 -0
- package/docs-src/del-ps.md +28 -0
- package/docs-src/downloader.md +62 -0
- package/docs-src/env-helpers.md +29 -0
- package/docs-src/find-node-modules.md +17 -0
- package/docs-src/git-diff.md +33 -0
- package/docs-src/git-fix.md +34 -0
- package/docs-src/git-purge.md +17 -0
- package/docs-src/git-reduce-size.md +17 -0
- package/docs-src/git-undo.md +21 -0
- package/docs-src/kill-night-crows.md +26 -0
- package/docs-src/node-cache-cleaner.md +182 -0
- package/docs-src/node-executor.md +50 -0
- package/docs-src/node-package-packer.md +48 -0
- package/docs-src/npm-run-series.md +43 -0
- package/docs-src/package-resolutions-updater.md +22 -0
- package/docs-src/php-cs-fixer-staged.md +19 -0
- package/docs-src/print-directory-tree.md +35 -0
- package/docs-src/print-tarball-tree.md +55 -0
- package/docs-src/py.md +19 -0
- package/docs-src/remove-module.md +32 -0
- package/docs-src/rmfind-rmx.md +21 -0
- package/docs-src/rmpath.md +38 -0
- package/docs-src/run-by-checksum.md +87 -0
- package/docs-src/submodule-install.md +31 -0
- package/docs-src/submodule-remove.md +22 -0
- package/docs-src/submodule-token.md +17 -0
- package/docs-src/test-runners.md +21 -0
- package/docs-src/yarn-install.md +31 -0
- package/docs-src/yarn-reinstall.md +27 -0
- package/lib/binary-collections/config.cjs +126 -0
- package/lib/binary-collections/config.mjs +7 -0
- package/lib/binary-collections/executeScript.cjs +19 -0
- package/lib/binary-collections/executeScript.d.cts +12 -0
- package/lib/binary-collections/executeScript.mjs +6 -0
- package/lib/binary-collections/findScript.cjs +309 -0
- package/lib/binary-collections/findScript.d.cts +12 -0
- package/lib/binary-collections/findScript.mjs +7 -0
- package/lib/binary-collections/listScript.cjs +291 -0
- package/lib/binary-collections/listScript.d.cts +19 -0
- package/lib/binary-collections/listScript.mjs +7 -0
- package/lib/binary-collections.cjs +264 -157
- package/lib/binary-collections.mjs +26 -286
- package/lib/changelog.cjs +9 -14
- package/lib/changelog.mjs +2 -2
- package/lib/chunk-2MN4VPV2.mjs +246 -0
- package/lib/chunk-6C7KTYGZ.mjs +41 -0
- package/lib/{chunk-Z6JLYU2J.mjs → chunk-6RK5UCTP.mjs} +7 -12
- package/lib/chunk-CD3HF3LK.mjs +190 -0
- package/lib/chunk-FLYSZFLW.mjs +61 -0
- package/lib/{chunk-N436BNBK.mjs → chunk-GAGABICI.mjs} +19 -13
- package/lib/chunk-H44UWUFY.mjs +105 -0
- package/lib/chunk-KLKAIFKI.mjs +40 -0
- package/lib/chunk-LVSPEFU2.mjs +86 -0
- package/lib/{chunk-RWLXRTYP.mjs → chunk-MGPYPKIE.mjs} +2 -2
- package/lib/chunk-NGFK3EYW.mjs +28 -0
- package/lib/chunk-NQXUYO67.mjs +253 -0
- package/lib/chunk-NVEG3LEZ.mjs +143 -0
- package/lib/chunk-OBXLTXFJ.mjs +34 -0
- package/lib/chunk-OGXVGBRI.mjs +29 -0
- package/lib/chunk-OXV52GD5.mjs +62 -0
- package/lib/chunk-PXBMHE7O.mjs +35 -0
- package/lib/chunk-QD4T255Z.mjs +40 -0
- package/lib/chunk-QII2EKCS.mjs +26 -0
- package/lib/chunk-R5FJOR63.mjs +47 -0
- package/lib/chunk-RDGDLSPD.mjs +76 -0
- package/lib/chunk-RDN6HF5Z.mjs +79 -0
- package/lib/chunk-RJKTSUAX.mjs +123 -0
- package/lib/{chunk-XA3SNBPA.mjs → chunk-TBWXE7ST.mjs} +97 -38
- package/lib/chunk-UXCFNAR6.mjs +55 -0
- package/lib/{chunk-M3YIYRHT.mjs → chunk-UY5VUEA3.mjs} +1 -1
- package/lib/chunk-WSHVPGNM.mjs +44 -0
- package/lib/{chunk-66PAU5PS.mjs → chunk-X2B3X7D4.mjs} +10 -6
- package/lib/clean-github-actions-caches-cli.cjs +507 -0
- package/lib/clean-github-actions-caches-cli.mjs +74 -0
- package/lib/clean-github-actions-caches.cjs +246 -106
- package/lib/clean-github-actions-caches.d.cts +53 -1
- package/lib/clean-github-actions-caches.mjs +5 -130
- package/lib/cross-env/command.cjs +63 -0
- package/lib/cross-env/command.d.ts +8 -0
- package/lib/cross-env/command.js +45 -0
- package/lib/{ps/isWin.mjs → cross-env/command.mjs} +4 -5
- package/lib/cross-env/index.cjs +178 -0
- package/lib/cross-env/index.d.ts +8 -0
- package/lib/cross-env/index.js +102 -0
- package/lib/cross-env/index.mjs +101 -0
- package/lib/cross-env/variable.cjs +60 -0
- package/lib/cross-env/variable.d.ts +7 -0
- package/lib/cross-env/variable.js +59 -0
- package/lib/cross-env/variable.mjs +9 -0
- package/lib/del-gradle.cjs +8 -13
- package/lib/del-gradle.js +8 -8
- package/lib/del-gradle.mjs +1 -1
- package/lib/del-node-modules.cjs +185 -3
- package/lib/del-node-modules.js +25 -25
- package/lib/del-node-modules.mjs +6 -3
- package/lib/{del-ps.cjs → del-ps-cli.cjs} +38 -43
- package/lib/del-ps-cli.d.mts +1 -0
- package/lib/del-ps-cli.mjs +44 -0
- package/lib/del-yarn-caches.cjs +8 -13
- package/lib/del-yarn-caches.js +2 -2
- package/lib/del-yarn-caches.mjs +1 -1
- package/lib/downloader-cli.cjs +256 -0
- package/lib/downloader-cli.d.cts +2 -0
- package/lib/downloader-cli.mjs +90 -0
- package/lib/file/copy-cli.cjs +273 -0
- package/lib/file/copy-cli.d.mts +1 -0
- package/lib/file/copy-cli.mjs +59 -0
- package/lib/file/copy.cjs +56 -0
- package/lib/file/copy.d.mts +1 -0
- package/lib/file/copy.mjs +8 -0
- package/lib/file/move-cli.cjs +272 -0
- package/lib/file/move-cli.d.mts +1 -0
- package/lib/file/move-cli.mjs +59 -0
- package/lib/file/move.cjs +55 -0
- package/lib/file/move.d.mts +1 -0
- package/lib/file/move.mjs +8 -0
- package/lib/find-node-modules-cli.cjs +1 -1
- package/lib/find-node-modules-cli.js +1 -1
- package/lib/find-node-modules-cli.mjs +1 -1
- package/lib/find-node-modules.cjs +1 -1
- package/lib/find-node-modules.mjs +1 -1
- package/lib/free-chatgpt.cjs +27 -26
- package/lib/free-chatgpt.js +10 -10
- package/lib/free-chatgpt.mjs +2 -2
- package/lib/git/user-config.cjs +9 -14
- package/lib/git/user-config.mjs +2 -2
- package/lib/git-diff-cli.cjs +273 -66
- package/lib/git-diff-cli.mjs +5 -4
- package/lib/git-diff.cjs +273 -66
- package/lib/git-diff.d.ts +2 -1
- package/lib/git-diff.js +153 -39
- package/lib/git-diff.mjs +5 -4
- package/lib/git-fix.cjs +9 -14
- package/lib/git-fix.mjs +2 -2
- package/lib/git-purge.cjs +9 -14
- package/lib/git-purge.mjs +2 -2
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.mjs +1 -1
- package/lib/kill-night-crows.cjs +7 -7
- package/lib/kill-night-crows.mjs +7 -7
- package/lib/node-cache-cleaner/npm.cjs +65 -0
- package/lib/node-cache-cleaner/npm.d.ts +2 -0
- package/lib/node-cache-cleaner/npm.js +41 -0
- package/lib/node-cache-cleaner/npm.mjs +10 -0
- package/lib/node-cache-cleaner/npx.cjs +89 -0
- package/lib/node-cache-cleaner/npx.d.ts +4 -0
- package/lib/node-cache-cleaner/npx.js +82 -0
- package/lib/{ps/index.d.mjs → node-cache-cleaner/npx.mjs} +6 -5
- package/lib/node-cache-cleaner/yarn.cjs +73 -0
- package/lib/node-cache-cleaner/yarn.d.ts +2 -0
- package/lib/node-cache-cleaner/yarn.js +62 -0
- package/lib/node-cache-cleaner/yarn.mjs +10 -0
- package/lib/node-cache-cleaner-cli.cjs +365 -0
- package/lib/node-cache-cleaner-cli.d.ts +2 -0
- package/lib/node-cache-cleaner-cli.js +57 -0
- package/lib/node-cache-cleaner-cli.mjs +60 -0
- package/lib/node-executor.cjs +272 -0
- package/lib/node-executor.d.cts +2 -0
- package/lib/node-executor.mjs +106 -0
- package/lib/node-package-packer/build-readme.cjs +150 -0
- package/lib/node-package-packer/build-readme.d.mts +10 -0
- package/lib/node-package-packer/build-readme.mjs +10 -0
- package/lib/node-package-packer/build-tarball.cjs +495 -0
- package/lib/node-package-packer/build-tarball.d.mts +33 -0
- package/lib/node-package-packer/build-tarball.mjs +175 -0
- package/lib/node-package-packer-cli.cjs +525 -0
- package/lib/node-package-packer-cli.d.mts +1 -0
- package/lib/node-package-packer-cli.mjs +34 -0
- package/lib/npm-run-series.cjs +28 -40
- package/lib/npm-run-series.mjs +21 -7
- package/lib/package-resolutions-updater-cli.cjs +255 -173
- package/lib/package-resolutions-updater-cli.mjs +19 -40
- package/lib/package-resolutions-updater.cjs +244 -141
- package/lib/package-resolutions-updater.d.mts +54 -1
- package/lib/package-resolutions-updater.mjs +8 -5
- package/lib/php-cs-fixer-staged.cjs +1 -1
- package/lib/php-cs-fixer-staged.mjs +1 -1
- package/lib/print-directory-tree.cjs +18 -20
- package/lib/print-directory-tree.mjs +11 -8
- package/lib/print-tarball-tree.cjs +262 -0
- package/lib/print-tarball-tree.d.mts +1 -0
- package/lib/print-tarball-tree.mjs +68 -0
- package/lib/ps/connected-domain.js +10 -10
- package/lib/ps/index.cjs +11 -11
- package/lib/ps/index.mjs +180 -174
- package/lib/ps/table-parser.d.ts +3 -4
- package/lib/ps/table-parser.js +15 -22
- package/lib/remove-module.cjs +19 -24
- package/lib/remove-module.mjs +2 -2
- package/lib/rm-node-module-cli.cjs +389 -0
- package/lib/rm-node-module-cli.d.cts +1 -0
- package/lib/rm-node-module-cli.mjs +92 -0
- package/lib/rm-node-modules.cjs +127 -0
- package/lib/rm-node-modules.d.cts +35 -0
- package/lib/{binary-collections-config.mjs → rm-node-modules.mjs} +3 -3
- package/lib/rmpath-cli.cjs +285 -0
- package/lib/rmpath-cli.d.mts +1 -0
- package/lib/rmpath-cli.mjs +23 -0
- package/lib/rmpath.cjs +6 -217
- package/lib/rmpath.mjs +5 -101
- package/lib/run-by-checksum/cache.cjs +69 -0
- package/lib/run-by-checksum/cache.d.ts +19 -0
- package/lib/run-by-checksum/cache.js +50 -0
- package/lib/run-by-checksum/cache.mjs +12 -0
- package/lib/run-by-checksum/hash.cjs +72 -0
- package/lib/run-by-checksum/hash.d.ts +14 -0
- package/lib/run-by-checksum/hash.js +85 -0
- package/lib/run-by-checksum/hash.mjs +10 -0
- package/lib/run-by-checksum/run.cjs +169 -0
- package/lib/run-by-checksum/run.d.ts +22 -0
- package/lib/run-by-checksum/run.js +93 -0
- package/lib/run-by-checksum/run.mjs +10 -0
- package/lib/run-by-checksum-cli.cjs +382 -0
- package/lib/run-by-checksum-cli.d.ts +2 -0
- package/lib/run-by-checksum-cli.js +43 -0
- package/lib/run-by-checksum-cli.mjs +56 -0
- package/lib/submodule-install.cjs +55 -47
- package/lib/submodule-install.mjs +48 -35
- package/lib/submodule-remove-cli.cjs +170 -4
- package/lib/submodule-remove-cli.js +5 -5
- package/lib/submodule-remove-cli.mjs +6 -4
- package/lib/utils/chatgpt.cjs +19 -13
- package/lib/utils/chatgpt.js +94 -94
- package/lib/utils/chatgpt.mjs +1 -1
- package/lib/utils/fetchResponse.cjs +24 -0
- package/lib/utils/fetchResponse.d.cts +25 -0
- package/lib/utils/fetchResponse.mjs +6 -0
- package/lib/utils/findEnvFiles.cjs +28 -46
- package/lib/utils/findEnvFiles.d.cts +19 -0
- package/lib/utils/findEnvFiles.mjs +3 -5
- package/lib/utils/findWorkspaceRoot.js +4 -4
- package/lib/utils/index.cjs +7 -12
- package/lib/utils/index.d.cts +2 -9
- package/lib/utils/index.mjs +1 -1
- package/lib/utils/isGithubTokenValid.js +7 -7
- package/lib/{ps/isWin.cjs → utils/isWindows.cjs} +12 -7
- package/lib/utils/isWindows.d.ts +5 -0
- package/lib/utils/isWindows.js +10 -0
- package/lib/utils/isWindows.mjs +10 -0
- package/lib/utils/runBash.cjs +53 -0
- package/lib/utils/runBash.d.cts +12 -0
- package/lib/utils/runBash.mjs +66 -0
- package/lib/yarn-per-branch-lock-installer.cjs +288 -0
- package/lib/yarn-per-branch-lock-installer.d.cts +2 -0
- package/lib/yarn-per-branch-lock-installer.mjs +122 -0
- package/lib/yarn-reinstall.cjs +8 -13
- package/lib/yarn-reinstall.mjs +1 -1
- package/package.json +91 -57
- package/readme.html +784 -0
- package/readme.md +107 -219
- package/releases/readme.md +6 -3
- package/test/README.md +2 -2
- package/test-project/workspaces/workspace-a/readme.md +20 -0
- package/test-project/workspaces/workspace-a/release/readme.md +42 -0
- package/test-project/workspaces/workspace-a/test/readme.md +12 -0
- package/test-project/workspaces/workspace-b/readme.md +94 -0
- package/test-project/workspaces/workspace-b/requirements.txt +1 -0
- package/test-project/workspaces/workspace-b/themes/hexo-theme-flowbite/readme.md +156 -0
- package/tmp/test-repo/README.md +2 -35
- package/tmp/test-repo-runChecksum/test-complex-glob/README.md +1 -0
- package/tmp/test-repo-runChecksum/test-mixed-args/README.md +1 -0
- package/lib/binary-collections-config.cjs +0 -15
- package/lib/chunk-2CBJCW7E.mjs +0 -81
- package/lib/chunk-4UHL4WVN.mjs +0 -136
- package/lib/chunk-6HHJRKFB.mjs +0 -59
- package/lib/chunk-6S4NXESK.mjs +0 -26
- package/lib/chunk-7XTEJHOE.mjs +0 -193
- package/lib/chunk-AJDD5DZM.mjs +0 -109
- package/lib/chunk-FCDQGYBF.mjs +0 -136
- package/lib/chunk-GEYA2USY.mjs +0 -207
- package/lib/chunk-GJTGHXRA.mjs +0 -356
- package/lib/chunk-ID2WBTE2.mjs +0 -80
- package/lib/chunk-JXFOHKDM.mjs +0 -239
- package/lib/chunk-NCXAP7AA.mjs +0 -31
- package/lib/chunk-PDSXF5HY.mjs +0 -187
- package/lib/chunk-TOIVAQF7.mjs +0 -136
- package/lib/chunk-V5SKYJUB.mjs +0 -136
- package/lib/chunk-WSRETQCA.mjs +0 -59
- package/lib/chunk-YYLIQQKF.mjs +0 -31
- package/lib/del-ps.js +0 -32
- package/lib/del-ps.mjs +0 -43
- package/lib/ps/index.d.cjs +0 -17
- package/lib/ps/index.d.ts +0 -2
- package/lib/ps/index.js +0 -254
- package/lib/ps/isWin.d.ts +0 -2
- package/lib/ps/isWin.js +0 -4
- package/lib/utils/findEnvFiles.d.ts +0 -8
- package/lib/utils/findEnvFiles.js +0 -121
- package/test/package.json +0 -20
- package/test-project/package.json +0 -16
- package/tmp/test-repo/package.json +0 -7
- package/tmp/typedoc/readme.md +0 -320
- /package/lib/{binary-collections-config.d.cts → binary-collections/config.d.cts} +0 -0
- /package/lib/{del-ps.d.ts → clean-github-actions-caches-cli.d.cts} +0 -0
|
@@ -0,0 +1,254 @@
|
|
|
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
|
+
const which = require('which');
|
|
19
|
+
const { isWindows } = require('../src/utils/isWindows.js');
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* __dirname
|
|
23
|
+
* Absolute directory path of this launcher script.
|
|
24
|
+
*
|
|
25
|
+
* __filename
|
|
26
|
+
* Absolute path of this launcher file itself.
|
|
27
|
+
*
|
|
28
|
+
* base
|
|
29
|
+
* Filename without extension.
|
|
30
|
+
*
|
|
31
|
+
* Example:
|
|
32
|
+
* File = "/tools/mytool.js"
|
|
33
|
+
*
|
|
34
|
+
* binDir = "/tools"
|
|
35
|
+
* base = "mytool"
|
|
36
|
+
*/
|
|
37
|
+
const binDir = __dirname;
|
|
38
|
+
const base = path.basename(__filename, path.extname(__filename));
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Determine which script extensions to search for
|
|
42
|
+
* based on the current operating system.
|
|
43
|
+
*
|
|
44
|
+
* Windows:
|
|
45
|
+
* .cmd
|
|
46
|
+
* .bat
|
|
47
|
+
* .ps1
|
|
48
|
+
* .vbs
|
|
49
|
+
*
|
|
50
|
+
* Linux/macOS:
|
|
51
|
+
* .sh
|
|
52
|
+
* executable file without extension
|
|
53
|
+
*/
|
|
54
|
+
const candidates = process.platform === 'win32' ? ['.cmd', '.bat', '.ps1', '.vbs'] : ['.sh', ''];
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Search for the first matching script
|
|
58
|
+
* in the same directory as this launcher.
|
|
59
|
+
*
|
|
60
|
+
* Example:
|
|
61
|
+
* If base = "mytool"
|
|
62
|
+
*
|
|
63
|
+
* Windows checks:
|
|
64
|
+
* mytool.cmd
|
|
65
|
+
* mytool.bat
|
|
66
|
+
* mytool.ps1
|
|
67
|
+
* mytool.vbs
|
|
68
|
+
*
|
|
69
|
+
* Linux/macOS checks:
|
|
70
|
+
* mytool.sh
|
|
71
|
+
* mytool
|
|
72
|
+
*/
|
|
73
|
+
let found = null;
|
|
74
|
+
|
|
75
|
+
for (const ext of candidates) {
|
|
76
|
+
const script = path.join(binDir, base + ext);
|
|
77
|
+
const exists = fs.existsSync(script);
|
|
78
|
+
// console.log(`Checking for ${script}: ${exists ? 'found' : 'not found'}`);
|
|
79
|
+
if (exists) {
|
|
80
|
+
found = script;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
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
|
+
|
|
103
|
+
/**
|
|
104
|
+
* If no matching script was found,
|
|
105
|
+
* print an error and exit with failure code 1.
|
|
106
|
+
*/
|
|
107
|
+
if (!found) {
|
|
108
|
+
console.error(`No script found for ${base} in ${binDir}`);
|
|
109
|
+
process.exit(1);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Detect special script types
|
|
114
|
+
* that require a shell/interpreter.
|
|
115
|
+
*/
|
|
116
|
+
const isPs1 = found.endsWith('.ps1');
|
|
117
|
+
const isCmd = found.endsWith('.cmd');
|
|
118
|
+
const isUnixShell = found.endsWith('.sh') || path.extname(found) === '';
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* cmd
|
|
122
|
+
* The executable program to launch.
|
|
123
|
+
*
|
|
124
|
+
* args
|
|
125
|
+
* Arguments passed to the executable.
|
|
126
|
+
*/
|
|
127
|
+
let cmd, args;
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* PowerShell scripts:
|
|
131
|
+
*
|
|
132
|
+
* Run through powershell.exe because .ps1 files
|
|
133
|
+
* are not directly executable like binaries.
|
|
134
|
+
*
|
|
135
|
+
* Flags:
|
|
136
|
+
* -NoProfile
|
|
137
|
+
* Prevent loading user profile scripts.
|
|
138
|
+
*
|
|
139
|
+
* -ExecutionPolicy Bypass
|
|
140
|
+
* Allow script execution even if policy blocks it.
|
|
141
|
+
*
|
|
142
|
+
* -File
|
|
143
|
+
* Specifies the script to execute.
|
|
144
|
+
*
|
|
145
|
+
* process.argv.slice(2)
|
|
146
|
+
* Forward all user-provided command-line arguments.
|
|
147
|
+
*/
|
|
148
|
+
if (isPs1) {
|
|
149
|
+
cmd = 'powershell.exe';
|
|
150
|
+
|
|
151
|
+
args = ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', found, ...process.argv.slice(2)];
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* CMD batch files:
|
|
155
|
+
*
|
|
156
|
+
* Run through cmd.exe using:
|
|
157
|
+
* /c
|
|
158
|
+
* which means:
|
|
159
|
+
* "execute command and terminate"
|
|
160
|
+
*/
|
|
161
|
+
} else if (isCmd) {
|
|
162
|
+
cmd = 'cmd.exe';
|
|
163
|
+
|
|
164
|
+
args = ['/c', found, ...process.argv.slice(2)];
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Other scripts:
|
|
168
|
+
*
|
|
169
|
+
* Usually:
|
|
170
|
+
* - shell scripts (.sh)
|
|
171
|
+
* - executable binaries
|
|
172
|
+
*
|
|
173
|
+
* These can be executed directly.
|
|
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
|
+
}
|
|
220
|
+
} else {
|
|
221
|
+
cmd = found;
|
|
222
|
+
args = process.argv.slice(2);
|
|
223
|
+
}
|
|
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
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Execute the selected script synchronously.
|
|
236
|
+
*
|
|
237
|
+
* stdio: "inherit"
|
|
238
|
+
* Shares the current terminal with the child process,
|
|
239
|
+
* so stdout/stderr/input behave normally.
|
|
240
|
+
*
|
|
241
|
+
* spawnSync waits until the child process exits.
|
|
242
|
+
*/
|
|
243
|
+
const result = spawnSync(cmd, args, {
|
|
244
|
+
stdio: 'inherit'
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Exit using the same exit code
|
|
249
|
+
* returned by the child process.
|
|
250
|
+
*
|
|
251
|
+
* If result.status is null/undefined,
|
|
252
|
+
* default to exit code 1.
|
|
253
|
+
*/
|
|
254
|
+
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
|
package/binaries/yarn-clean
CHANGED
package/binaries/yarn-clean.cjs
CHANGED
|
@@ -12,9 +12,11 @@
|
|
|
12
12
|
* - fs:
|
|
13
13
|
* Used to check whether files exist.
|
|
14
14
|
*/
|
|
15
|
-
const { spawnSync } = require(
|
|
16
|
-
const path = require(
|
|
17
|
-
const fs = require(
|
|
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 ===
|
|
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
|
-
|
|
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(
|
|
96
|
-
const isCmd = found.endsWith(
|
|
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 =
|
|
149
|
+
cmd = 'powershell.exe';
|
|
128
150
|
|
|
129
|
-
args = [
|
|
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 =
|
|
162
|
+
cmd = 'cmd.exe';
|
|
141
163
|
|
|
142
|
-
args = [
|
|
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:
|
|
244
|
+
stdio: 'inherit'
|
|
169
245
|
});
|
|
170
246
|
|
|
171
247
|
/**
|
package/binaries/yarn-clean.cmd
CHANGED
package/binaries/yarn-clean.py
CHANGED
|
@@ -9,6 +9,15 @@ import glob
|
|
|
9
9
|
from typing import Union
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
# -------------------------
|
|
13
|
+
# IGNORE RULES
|
|
14
|
+
# -------------------------
|
|
15
|
+
IGNORE_DIR_NAMES = {".git", "tmp", "dist", "build", "out", "coverage", ".cache"}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
# -------------------------
|
|
19
|
+
# DELETE HELPERS
|
|
20
|
+
# -------------------------
|
|
12
21
|
def delete_dir(path: Path) -> tuple[str, Path]:
|
|
13
22
|
shutil.rmtree(path, ignore_errors=True)
|
|
14
23
|
return ("dir", path)
|
|
@@ -19,6 +28,9 @@ def delete_file(path: Path) -> tuple[str, Path]:
|
|
|
19
28
|
return ("file", path)
|
|
20
29
|
|
|
21
30
|
|
|
31
|
+
# -------------------------
|
|
32
|
+
# CLEAN FUNCTION
|
|
33
|
+
# -------------------------
|
|
22
34
|
def clean(base_dir: Union[str, Path]) -> None:
|
|
23
35
|
root = Path(base_dir).resolve()
|
|
24
36
|
|
|
@@ -27,14 +39,20 @@ def clean(base_dir: Union[str, Path]) -> None:
|
|
|
27
39
|
|
|
28
40
|
print(f"Scanning: {root}")
|
|
29
41
|
|
|
30
|
-
# Collect targets
|
|
31
42
|
for current_root, dirs, files in os.walk(root, topdown=True):
|
|
32
43
|
current = Path(current_root)
|
|
33
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
|
|
34
54
|
if "node_modules" in dirs:
|
|
35
55
|
node_modules_dirs.append(current / "node_modules")
|
|
36
|
-
|
|
37
|
-
# Prevent recursive scan into node_modules
|
|
38
56
|
dirs.remove("node_modules")
|
|
39
57
|
|
|
40
58
|
if "yarn.lock" in files:
|
|
@@ -71,15 +89,13 @@ def clean(base_dir: Union[str, Path]) -> None:
|
|
|
71
89
|
print(f"Deleted yarn.lock: {deleted_files}")
|
|
72
90
|
|
|
73
91
|
|
|
92
|
+
# -------------------------
|
|
93
|
+
# WORKSPACE COLLECTOR
|
|
94
|
+
# -------------------------
|
|
74
95
|
def collect_workspace_dirs(
|
|
75
96
|
start_root: Union[str, Path],
|
|
76
97
|
include_start_root: bool = False,
|
|
77
98
|
) -> list[Path]:
|
|
78
|
-
"""Return workspace package directories sorted by longest path first.
|
|
79
|
-
|
|
80
|
-
This walks workspace globs declared in each package.json it finds,
|
|
81
|
-
recursively, stopping at directories already visited to avoid cycles.
|
|
82
|
-
"""
|
|
83
99
|
visited = set()
|
|
84
100
|
results = set()
|
|
85
101
|
|
|
@@ -120,7 +136,7 @@ def collect_workspace_dirs(
|
|
|
120
136
|
for m in matches:
|
|
121
137
|
p = Path(m)
|
|
122
138
|
|
|
123
|
-
#
|
|
139
|
+
# skip symlinks
|
|
124
140
|
if p.is_symlink():
|
|
125
141
|
continue
|
|
126
142
|
|
|
@@ -129,20 +145,22 @@ def collect_workspace_dirs(
|
|
|
129
145
|
if p_res.is_dir() and p_res not in visited:
|
|
130
146
|
stack.append(p_res)
|
|
131
147
|
|
|
132
|
-
return sorted(
|
|
133
|
-
results,
|
|
134
|
-
key=lambda p: (len(p.parts), str(p)),
|
|
135
|
-
reverse=True,
|
|
136
|
-
)
|
|
148
|
+
return sorted(results, key=lambda p: (len(p.parts), str(p)), reverse=True)
|
|
137
149
|
|
|
138
150
|
|
|
151
|
+
# -------------------------
|
|
152
|
+
# MAIN
|
|
153
|
+
# -------------------------
|
|
139
154
|
if __name__ == "__main__":
|
|
140
155
|
workspace_dirs = collect_workspace_dirs(Path("."))
|
|
156
|
+
|
|
141
157
|
for d in workspace_dirs:
|
|
142
158
|
if Path(d / "node_modules").is_dir() or (d / "yarn.lock").is_file():
|
|
143
159
|
print(f"Cleaning workspace package: {d}")
|
|
144
160
|
clean(d)
|
|
145
161
|
else:
|
|
146
162
|
print(f"Skipping workspace package (no node_modules or yarn.lock): {d}")
|
|
163
|
+
|
|
164
|
+
# root cleanup
|
|
147
165
|
shutil.rmtree(Path(".") / "node_modules", ignore_errors=True)
|
|
148
|
-
(Path(".") / "yarn.lock").unlink(missing_ok=True)
|
|
166
|
+
(Path(".") / "yarn.lock").unlink(missing_ok=True)
|
package/binaries/yc
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
set -u
|
|
3
|
+
|
|
4
|
+
cwd="$(pwd)"
|
|
5
|
+
max_jobs=4
|
|
6
|
+
|
|
7
|
+
usage() {
|
|
8
|
+
cat <<EOF
|
|
9
|
+
Usage: $(basename "$0") [options]
|
|
10
|
+
|
|
11
|
+
Options:
|
|
12
|
+
-h, --help Show this help message
|
|
13
|
+
-c, --concurrent <num> Maximum parallel jobs (default: 4)
|
|
14
|
+
|
|
15
|
+
Description:
|
|
16
|
+
Clean node_modules directories grouped by letter (a-z) in parallel.
|
|
17
|
+
EOF
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
while [[ $# -gt 0 ]]; do
|
|
21
|
+
case "$1" in
|
|
22
|
+
-h|--help) usage; exit 0 ;;
|
|
23
|
+
-c|--concurrent) max_jobs="$2"; shift 2 ;;
|
|
24
|
+
*) shift ;;
|
|
25
|
+
esac
|
|
26
|
+
done
|
|
27
|
+
|
|
28
|
+
# colors
|
|
29
|
+
GREEN='\033[0;32m'
|
|
30
|
+
RED='\033[0;31m'
|
|
31
|
+
GRAY='\033[0;90m'
|
|
32
|
+
BLUE='\033[0;34m'
|
|
33
|
+
NC='\033[0m'
|
|
34
|
+
|
|
35
|
+
timestamp() {
|
|
36
|
+
date "+%Y-%m-%d %H:%M:%S"
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
relative_path() {
|
|
40
|
+
local path="$1"
|
|
41
|
+
|
|
42
|
+
path="${path#"$cwd"/}"
|
|
43
|
+
|
|
44
|
+
[[ "$path" == "$cwd" ]] && path="."
|
|
45
|
+
|
|
46
|
+
echo "$path"
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
log() {
|
|
50
|
+
local level="$1"
|
|
51
|
+
shift
|
|
52
|
+
|
|
53
|
+
local color="$NC"
|
|
54
|
+
|
|
55
|
+
case "$level" in
|
|
56
|
+
OK) color="$GREEN" ;;
|
|
57
|
+
FAIL) color="$RED" ;;
|
|
58
|
+
SKIP) color="$GRAY" ;;
|
|
59
|
+
INFO) color="$BLUE" ;;
|
|
60
|
+
esac
|
|
61
|
+
|
|
62
|
+
echo -e "[${GRAY}$(timestamp)${NC}] [${color}${level}${NC}] $*"
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
cleanup_letter() {
|
|
66
|
+
local letter="$1"
|
|
67
|
+
|
|
68
|
+
shopt -s nullglob
|
|
69
|
+
|
|
70
|
+
local targets=(
|
|
71
|
+
"${cwd}/node_modules/${letter}"*
|
|
72
|
+
"${cwd}/node_modules/@types/${letter}"*
|
|
73
|
+
"${cwd}/node_modules/@${letter}"*
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
local removed_any=0
|
|
77
|
+
|
|
78
|
+
for path in "${targets[@]}"; do
|
|
79
|
+
local rel
|
|
80
|
+
rel="$(relative_path "$path")"
|
|
81
|
+
|
|
82
|
+
if rm -rf "$path"; then
|
|
83
|
+
log OK "$rel"
|
|
84
|
+
removed_any=1
|
|
85
|
+
else
|
|
86
|
+
log FAIL "$rel"
|
|
87
|
+
fi
|
|
88
|
+
done
|
|
89
|
+
|
|
90
|
+
if (( removed_any == 0 )); then
|
|
91
|
+
log SKIP "'${letter}'"
|
|
92
|
+
fi
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export -f cleanup_letter
|
|
96
|
+
export -f log
|
|
97
|
+
export -f timestamp
|
|
98
|
+
export -f relative_path
|
|
99
|
+
|
|
100
|
+
export cwd
|
|
101
|
+
export GREEN RED GRAY BLUE NC
|
|
102
|
+
|
|
103
|
+
log INFO "Cleaning $(relative_path "${cwd}/node_modules")"
|
|
104
|
+
|
|
105
|
+
running=0
|
|
106
|
+
|
|
107
|
+
for letter in $(printf "%s\n" {a..z} | shuf); do
|
|
108
|
+
cleanup_letter "$letter" &
|
|
109
|
+
|
|
110
|
+
((running++))
|
|
111
|
+
|
|
112
|
+
if (( running >= max_jobs )); then
|
|
113
|
+
wait -n
|
|
114
|
+
((running--))
|
|
115
|
+
fi
|
|
116
|
+
done
|
|
117
|
+
|
|
118
|
+
wait
|
|
119
|
+
|
|
120
|
+
log INFO "Removing remaining node_modules"
|
|
121
|
+
|
|
122
|
+
final_target="${cwd}/node_modules"
|
|
123
|
+
final_rel="$(relative_path "$final_target")"
|
|
124
|
+
|
|
125
|
+
if rm -rf "$final_target"; then
|
|
126
|
+
log OK "$final_rel"
|
|
127
|
+
else
|
|
128
|
+
log FAIL "$final_rel"
|
|
129
|
+
fi
|
|
130
|
+
|
|
131
|
+
log INFO "Done"
|