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.
- package/.opencode/package.json +5 -0
- package/.puppeterrc.cjs +25 -0
- package/binaries/binary-executor.cjs +138 -3
- package/binaries/clean-nodemodule.cjs +138 -3
- package/binaries/clean-nodemodules.cjs +138 -3
- package/binaries/dev.cjs +138 -3
- package/binaries/empty.cjs +138 -3
- package/binaries/git-reduce-size.cjs +138 -3
- package/binaries/javakill.cjs +138 -3
- package/binaries/kill-night-crows.bat +7 -0
- package/binaries/kill-night-crows.ps1 +172 -0
- package/binaries/kill-process.cjs +138 -3
- package/binaries/nodekill.cjs +138 -3
- package/binaries/prod.cjs +138 -3
- package/binaries/py +111 -0
- package/binaries/py.cjs +178 -0
- package/binaries/py.cmd +49 -0
- package/binaries/rmfind.cjs +138 -3
- package/binaries/rmx +15 -1
- package/binaries/rmx.cjs +138 -3
- package/binaries/rmx.cmd +12 -0
- package/binaries/submodule-token.cjs +138 -3
- package/binaries/test-cjs +18 -0
- package/binaries/test-cjs.cjs +178 -0
- package/binaries/test-cjs.cmd +26 -0
- package/binaries/test-esm +16 -0
- package/binaries/test-esm.cjs +178 -0
- package/binaries/test-esm.cmd +23 -0
- package/binaries/yarn-clean +32 -0
- package/binaries/yarn-clean.cjs +178 -0
- package/binaries/yarn-clean.cmd +30 -0
- package/binaries/yarn-clean.py +166 -0
- package/binaries/yc +110 -0
- package/binaries/yc.cjs +178 -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 +284 -0
- package/lib/binary-collections/findScript.d.cts +12 -0
- package/lib/binary-collections/findScript.mjs +7 -0
- package/lib/binary-collections/listScript.cjs +266 -0
- package/lib/binary-collections/listScript.d.cts +19 -0
- package/lib/binary-collections/listScript.mjs +7 -0
- package/lib/binary-collections.cjs +342 -194
- package/lib/binary-collections.mjs +22 -268
- package/lib/changelog.cjs +61 -13
- package/lib/changelog.mjs +1 -1
- package/lib/{chunk-E6FDDAOO.mjs → chunk-2LSRSEXF.mjs} +2 -2
- package/lib/chunk-34IQDTLZ.mjs +27 -0
- package/lib/chunk-3HFFECCI.mjs +27 -0
- package/lib/{chunk-V3N3JEUF.mjs → chunk-5RTXZVCW.mjs} +60 -13
- package/lib/chunk-66KDU4TX.mjs +268 -0
- package/lib/chunk-6PU7BAHB.mjs +61 -0
- package/lib/{chunk-6HHJRKFB.mjs → chunk-BZWVHODJ.mjs} +4 -1
- package/lib/chunk-C6D2TTYU.mjs +32 -0
- package/lib/chunk-FB2WKVJD.mjs +158 -0
- package/lib/{chunk-66PAU5PS.mjs → chunk-G5UUEWUO.mjs} +9 -5
- package/lib/{chunk-HO6GHCOB.mjs → chunk-GAGABICI.mjs} +198 -63
- package/lib/chunk-H44UWUFY.mjs +105 -0
- package/lib/chunk-NCZPTKDV.mjs +79 -0
- package/lib/chunk-NGFK3EYW.mjs +28 -0
- package/lib/chunk-NVEG3LEZ.mjs +143 -0
- package/lib/chunk-OGXVGBRI.mjs +29 -0
- package/lib/chunk-OXV52GD5.mjs +62 -0
- package/lib/{chunk-PDSXF5HY.mjs → chunk-PDN26I7O.mjs} +1 -0
- package/lib/chunk-PXBMHE7O.mjs +35 -0
- package/lib/chunk-R5FJOR63.mjs +47 -0
- package/lib/chunk-SPTECFE5.mjs +180 -0
- package/lib/chunk-UXCFNAR6.mjs +55 -0
- package/lib/chunk-V2IBPCEV.mjs +39 -0
- package/lib/chunk-XPJGCDOD.mjs +14 -0
- package/lib/{chunk-AI4CVPJ7.mjs → chunk-ZDMWBSYF.mjs} +4 -4
- package/lib/chunk-ZOWVMII3.mjs +228 -0
- package/lib/clean-github-actions-caches-cli.cjs +465 -0
- package/lib/clean-github-actions-caches-cli.d.cts +1 -0
- package/lib/clean-github-actions-caches-cli.mjs +56 -0
- package/lib/clean-github-actions-caches.cjs +152 -160
- package/lib/clean-github-actions-caches.d.cts +15 -1
- package/lib/clean-github-actions-caches.mjs +4 -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/cross-env/command.mjs +9 -0
- 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 +61 -13
- package/lib/del-gradle.js +9 -8
- package/lib/del-gradle.mjs +1 -1
- package/lib/del-node-modules.cjs +143 -148
- package/lib/del-node-modules.js +210 -14
- package/lib/del-node-modules.mjs +148 -17
- package/lib/del-ps.cjs +61 -13
- package/lib/del-ps.js +9 -8
- package/lib/del-ps.mjs +1 -1
- package/lib/del-yarn-caches.cjs +61 -13
- package/lib/del-yarn-caches.js +2 -2
- package/lib/del-yarn-caches.mjs +1 -1
- package/lib/file/copy-cli.cjs +92 -0
- package/lib/file/copy-cli.d.mts +1 -0
- package/lib/file/copy-cli.mjs +55 -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 +91 -0
- package/lib/file/move-cli.d.mts +1 -0
- package/lib/file/move-cli.mjs +55 -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.js +2 -1
- package/lib/free-chatgpt.cjs +259 -47
- package/lib/free-chatgpt.js +10 -10
- package/lib/free-chatgpt.mjs +2 -2
- package/lib/git/gitattributes.cjs +1 -0
- package/lib/git/gitattributes.d.cts +7 -2
- package/lib/git/gitattributes.mjs +1 -1
- package/lib/git/line-endings.cjs +2 -1
- package/lib/git/line-endings.mjs +2 -2
- package/lib/git/undo-commit-cli.cjs +110 -0
- package/lib/git/undo-commit-cli.d.ts +1 -0
- package/lib/git/undo-commit-cli.js +4 -0
- package/lib/git/undo-commit-cli.mjs +14 -0
- package/lib/git/undo-commit.cjs +81 -0
- package/lib/git/undo-commit.d.cts +1 -0
- package/lib/git/undo-commit.mjs +7 -0
- package/lib/git/undo-staged-cli.cjs +110 -0
- package/lib/git/undo-staged-cli.d.ts +1 -0
- package/lib/git/undo-staged-cli.js +4 -0
- package/lib/git/undo-staged-cli.mjs +14 -0
- package/lib/git/undo-staged.cjs +81 -0
- package/lib/git/undo-staged.d.cts +1 -0
- package/lib/git/undo-staged.mjs +7 -0
- package/lib/git/user-config.cjs +61 -14
- package/lib/git/user-config.mjs +2 -2
- package/lib/git-diff-cli.cjs +427 -75
- package/lib/git-diff-cli.d.ts +1 -0
- package/lib/git-diff-cli.js +1 -0
- package/lib/git-diff-cli.mjs +6 -4
- package/lib/git-diff.cjs +426 -75
- package/lib/git-diff.d.ts +2 -1
- package/lib/git-diff.js +91 -34
- package/lib/git-diff.mjs +5 -4
- package/lib/git-fix.cjs +64 -16
- package/lib/git-fix.mjs +10 -10
- package/lib/git-purge.cjs +61 -13
- package/lib/git-purge.mjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/kill-night-crows.cjs +87 -0
- package/lib/kill-night-crows.d.mts +1 -0
- package/lib/kill-night-crows.mjs +65 -0
- 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 +182 -0
- package/lib/node-cache-cleaner-cli.d.ts +2 -0
- package/lib/node-cache-cleaner-cli.js +60 -0
- package/lib/node-cache-cleaner-cli.mjs +56 -0
- package/lib/node-executor.cjs +91 -0
- package/lib/node-executor.d.cts +2 -0
- package/lib/node-executor.mjs +103 -0
- package/lib/npm-run-series.cjs +79 -39
- package/lib/npm-run-series.mjs +20 -6
- package/lib/package-resolutions-updater-cli.cjs +645 -0
- package/lib/package-resolutions-updater-cli.d.mts +1 -0
- package/lib/package-resolutions-updater-cli.mjs +102 -0
- package/lib/package-resolutions-updater.cjs +259 -133
- package/lib/package-resolutions-updater.d.mts +51 -1
- package/lib/package-resolutions-updater.mjs +18 -294
- package/lib/php-cs-fixer-staged.cjs +105 -0
- package/lib/php-cs-fixer-staged.d.cts +2 -0
- package/lib/php-cs-fixer-staged.mjs +117 -0
- package/lib/print-directory-tree.cjs +62 -14
- package/lib/print-directory-tree.mjs +2 -2
- package/lib/ps/connected-domain.d.ts +1 -1
- package/lib/ps/connected-domain.js +10 -10
- package/lib/ps/index.cjs +1 -1
- package/lib/ps/index.mjs +177 -171
- package/lib/ps/isWin.js +1 -1
- package/lib/ps/table-parser.js +6 -6
- package/lib/remove-module.cjs +61 -13
- package/lib/remove-module.mjs +1 -1
- package/lib/rm-node-module-cli.cjs +222 -0
- package/lib/rm-node-module-cli.d.cts +1 -0
- package/lib/rm-node-module-cli.mjs +89 -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.cjs +63 -15
- package/lib/rmpath.mjs +2 -2
- package/lib/submodule-install.cjs +107 -47
- package/lib/submodule-install.mjs +48 -35
- package/lib/submodule-remove-cli.cjs +6 -3
- package/lib/submodule-remove-cli.js +3 -3
- package/lib/submodule-remove-cli.mjs +2 -3
- package/lib/submodule-remove.cjs +4 -1
- package/lib/submodule-remove.mjs +1 -1
- package/lib/utils/chatgpt.cjs +198 -34
- package/lib/utils/chatgpt.js +260 -93
- package/lib/utils/chatgpt.mjs +1 -1
- package/lib/utils/findEnvFiles.cjs +89 -0
- package/lib/utils/findEnvFiles.d.cts +19 -0
- package/lib/utils/findEnvFiles.mjs +6 -0
- package/lib/utils/findWorkspaceRoot.cjs +70 -0
- package/lib/utils/findWorkspaceRoot.d.ts +9 -0
- package/lib/utils/findWorkspaceRoot.js +57 -0
- package/lib/utils/findWorkspaceRoot.mjs +40 -0
- package/lib/utils/index.cjs +60 -13
- package/lib/utils/index.mjs +1 -1
- package/lib/utils/isGithubTokenValid.cjs +64 -0
- package/lib/utils/isGithubTokenValid.d.ts +7 -0
- package/lib/utils/isGithubTokenValid.js +48 -0
- package/lib/utils/isGithubTokenValid.mjs +36 -0
- package/lib/{ps/index.d.cjs → utils/isWindows.cjs} +17 -3
- package/lib/utils/isWindows.d.ts +5 -0
- package/lib/utils/isWindows.js +10 -0
- package/lib/utils/isWindows.mjs +8 -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 +97 -0
- package/lib/yarn-per-branch-lock-installer.d.cts +2 -0
- package/lib/yarn-per-branch-lock-installer.mjs +109 -0
- package/lib/yarn-reinstall.cjs +61 -13
- package/lib/yarn-reinstall.mjs +1 -1
- package/package.json +133 -110
- package/readme.html +784 -0
- package/readme.md +116 -229
- package/releases/readme.md +1 -1
- package/requirements.txt +1 -0
- package/test/README.md +2 -2
- package/test-project/package.json +8 -2
- package/test-project/workspaces/workspace-a/package.json +135 -0
- 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/demo/package.json +25 -0
- package/test-project/workspaces/workspace-a/test/readme.md +12 -0
- package/test-project/workspaces/workspace-b/package.json +139 -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/test/sample-project/package.json +7 -0
- package/test-project/workspaces/workspace-b/themes/hexo-theme-flowbite/package.json +96 -0
- package/test-project/workspaces/workspace-b/themes/hexo-theme-flowbite/readme.md +156 -0
- package/tmp/rm-node-modules-test-project/package.json +17 -0
- package/tmp/rm-node-modules-test-project/packages/workspace-a/package.json +16 -0
- package/tmp/rm-node-modules-test-project/packages/workspace-b/package.json +16 -0
- package/tmp/test-repo/README.md +2 -35
- package/tmp/test-repo/package.json +13 -3
- package/docs-src/clean-github-actions-caches.md +0 -26
- package/docs-src/free-chatgpt.md +0 -26
- package/lib/binary-collections-config.cjs +0 -15
- package/lib/chunk-4EWQC6GZ.mjs +0 -382
- package/lib/chunk-4ZI7BQKQ.mjs +0 -381
- package/lib/chunk-5J2BEPY5.mjs +0 -83
- package/lib/chunk-AGZYRDC2.mjs +0 -323
- package/lib/chunk-BDCHCWHD.mjs +0 -136
- package/lib/chunk-BEZKJ25G.mjs +0 -140
- package/lib/chunk-DI5MDPSN.mjs +0 -386
- package/lib/chunk-GJTGHXRA.mjs +0 -356
- package/lib/chunk-HMRMTYZM.mjs +0 -40
- package/lib/chunk-HN52G2YL.mjs +0 -305
- package/lib/chunk-LEM5OMRP.mjs +0 -384
- package/lib/chunk-O6SWBEOQ.mjs +0 -81
- package/lib/chunk-RCP7DHVY.mjs +0 -190
- package/lib/chunk-SBNDSKG5.mjs +0 -136
- package/lib/chunk-U6SO4QEV.mjs +0 -320
- package/lib/chunk-XD6BJK6Q.mjs +0 -351
- package/lib/chunk-YXSFGA2D.mjs +0 -383
- package/lib/git/gitattributes.d.ts +0 -33
- package/lib/git/gitattributes.js +0 -223
- package/lib/ps/index.d.ts +0 -2
- package/lib/ps/index.js +0 -253
- package/tmp/typedoc/readme.md +0 -320
- /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"
|