binary-collections 2.0.9 → 2.0.11
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/.puppeterrc.cjs +25 -0
- package/binaries/binary-executor.cjs +178 -0
- package/{bin → binaries}/clean-nodemodule +0 -0
- package/binaries/clean-nodemodule.cjs +178 -0
- package/binaries/clean-nodemodule.cmd +4 -0
- package/{bin → binaries}/clean-nodemodules +0 -0
- package/binaries/clean-nodemodules.cjs +178 -0
- package/binaries/clean-nodemodules.cmd +5 -0
- package/{bin → binaries}/dev +0 -0
- package/binaries/dev.cjs +178 -0
- package/{bin → binaries}/empty +0 -0
- package/binaries/empty.cjs +178 -0
- package/{bin → binaries}/git-reduce-size +0 -0
- package/binaries/git-reduce-size.cjs +178 -0
- package/binaries/javakill.cjs +178 -0
- package/{bin → binaries}/javakill.cmd +0 -0
- package/binaries/kill-night-crows.bat +7 -0
- package/binaries/kill-night-crows.ps1 +172 -0
- package/{bin → binaries}/kill-process +0 -0
- package/binaries/kill-process.cjs +178 -0
- package/binaries/nodekill.cjs +178 -0
- package/{bin → binaries}/nodekill.ps1 +0 -0
- package/{bin → binaries}/prod +0 -0
- package/binaries/prod.cjs +178 -0
- package/binaries/py +111 -0
- package/binaries/py.cjs +178 -0
- package/binaries/py.cmd +49 -0
- package/{bin → binaries}/rmfind +0 -0
- package/binaries/rmfind.cjs +178 -0
- package/{bin → binaries}/rmx +0 -0
- package/binaries/rmx.cjs +178 -0
- package/{bin → binaries}/submodule-token +0 -0
- package/binaries/submodule-token.cjs +178 -0
- package/binaries/test-cjs +10 -0
- package/binaries/test-cjs.cjs +178 -0
- package/binaries/test-cjs.cmd +11 -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 +148 -0
- package/docs-src/clean-github-actions-caches.md +26 -0
- package/docs-src/free-chatgpt.md +26 -0
- package/lib/binary-collections-config.cjs +3 -2
- package/lib/binary-collections-config.mjs +2 -2
- package/lib/binary-collections.cjs +513 -105
- package/lib/binary-collections.mjs +178 -117
- package/lib/changelog.cjs +64 -16
- package/lib/changelog.mjs +177 -171
- package/lib/{chunk-VVEZVNIV.mjs → chunk-2CBJCW7E.mjs} +3 -3
- package/lib/chunk-34IQDTLZ.mjs +27 -0
- package/lib/chunk-3HFFECCI.mjs +27 -0
- package/lib/chunk-4UHL4WVN.mjs +136 -0
- package/lib/{chunk-4BYBVEYC.mjs → chunk-66PAU5PS.mjs} +5 -4
- package/lib/chunk-6HHJRKFB.mjs +59 -0
- package/lib/chunk-6S4NXESK.mjs +26 -0
- package/lib/chunk-7XTEJHOE.mjs +193 -0
- package/lib/{chunk-ZYAQRPUL.mjs → chunk-7YD7IPFF.mjs} +2 -2
- package/lib/{chunk-SH3L6HHV.mjs → chunk-A2JQXI5Z.mjs} +2 -2
- package/lib/{chunk-EGSSKVDH.mjs → chunk-A3VUZEJK.mjs} +1 -1
- package/lib/chunk-AJDD5DZM.mjs +109 -0
- package/lib/chunk-BZWVHODJ.mjs +62 -0
- package/lib/chunk-FCDQGYBF.mjs +136 -0
- package/lib/chunk-FKI7IEB5.mjs +172 -0
- package/lib/chunk-GEYA2USY.mjs +207 -0
- package/lib/chunk-GJTGHXRA.mjs +356 -0
- package/lib/{chunk-YV7DO3YV.mjs → chunk-HLGOWBEO.mjs} +1 -1
- package/lib/chunk-ID2WBTE2.mjs +80 -0
- package/lib/chunk-JXFOHKDM.mjs +239 -0
- package/lib/{chunk-YX5U7XDR.mjs → chunk-M3YIYRHT.mjs} +6 -5
- package/lib/chunk-N436BNBK.mjs +514 -0
- package/lib/chunk-NCXAP7AA.mjs +31 -0
- package/lib/chunk-PDN26I7O.mjs +188 -0
- package/lib/{chunk-JGR2NW6D.mjs → chunk-PDSXF5HY.mjs} +3 -3
- package/lib/{chunk-AASHBCRW.mjs → chunk-QQ4A6DLD.mjs} +8 -0
- package/lib/{chunk-ONIBBBQ3.mjs → chunk-RWLXRTYP.mjs} +4 -3
- package/lib/chunk-TOIVAQF7.mjs +136 -0
- package/lib/chunk-V5SKYJUB.mjs +136 -0
- package/lib/chunk-WSRETQCA.mjs +59 -0
- package/lib/chunk-XA3SNBPA.mjs +184 -0
- package/lib/chunk-XVBFFVCJ.mjs +209 -0
- package/lib/chunk-YYLIQQKF.mjs +31 -0
- package/lib/{chunk-APBWENF6.mjs → chunk-Z6JLYU2J.mjs} +63 -16
- package/lib/chunk-ZDMWBSYF.mjs +81 -0
- package/lib/clean-github-actions-caches.cjs +291 -148
- package/lib/clean-github-actions-caches.mjs +4 -3
- package/lib/del-gradle.cjs +63 -15
- package/lib/del-gradle.js +2 -1
- package/lib/del-gradle.mjs +2 -2
- package/lib/del-node-modules.cjs +143 -148
- package/lib/del-node-modules.js +210 -14
- package/lib/del-node-modules.mjs +149 -18
- package/lib/del-ps.cjs +90 -21
- package/lib/del-ps.js +3 -2
- package/lib/del-ps.mjs +7 -5
- package/lib/del-yarn-caches.cjs +87 -18
- package/lib/del-yarn-caches.js +38 -3
- package/lib/del-yarn-caches.mjs +6 -6
- package/lib/find-node-modules-cli.cjs +5 -4
- package/lib/find-node-modules-cli.js +2 -1
- package/lib/find-node-modules-cli.mjs +2 -2
- package/lib/find-node-modules.cjs +4 -3
- package/lib/{find-node-modules.d.ts → find-node-modules.d.cts} +1 -1
- package/lib/find-node-modules.mjs +2 -2
- package/lib/free-chatgpt.cjs +754 -0
- package/lib/free-chatgpt.js +51 -0
- package/lib/free-chatgpt.mjs +50 -0
- package/lib/git/gitattributes.cjs +2 -1
- package/lib/git/{gitattributes.d.ts → gitattributes.d.cts} +7 -2
- package/lib/git/gitattributes.mjs +2 -2
- package/lib/git/line-endings.cjs +298 -64
- package/lib/git/line-endings.mjs +4 -4
- package/lib/git/normalize.cjs +26 -36
- package/lib/git/normalize.mjs +2 -2
- package/lib/git/permissions.cjs +77 -11
- package/lib/git/permissions.mjs +3 -3
- package/lib/git/pull-strategy.cjs +76 -9
- package/lib/git/pull-strategy.mjs +3 -3
- 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 +313 -83
- package/lib/git/user-config.mjs +4 -4
- package/lib/git/utils.cjs +40 -60
- package/lib/git/utils.mjs +2 -2
- package/lib/git-diff-cli.cjs +857 -0
- package/lib/git-diff-cli.js +16 -0
- package/lib/git-diff-cli.mjs +17 -0
- package/lib/git-diff.cjs +862 -58
- package/lib/git-diff.d.ts +38 -83
- package/lib/git-diff.js +152 -0
- package/lib/git-diff.mjs +23 -85
- package/lib/git-fix.cjs +733 -97
- package/lib/git-fix.mjs +10 -9
- package/lib/git-purge.cjs +64 -16
- package/lib/git-purge.d.cts +1 -0
- package/lib/git-purge.mjs +43 -37
- package/lib/index.cjs +7 -6
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -5
- package/lib/index.mjs +4 -4
- 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/npm-run-series.cjs +63 -16
- package/lib/npm-run-series.mjs +42 -36
- package/lib/package-resolutions-updater-cli.cjs +560 -0
- package/lib/package-resolutions-updater-cli.d.mts +1 -0
- package/lib/package-resolutions-updater-cli.mjs +124 -0
- package/lib/package-resolutions-updater.cjs +178 -158
- package/lib/package-resolutions-updater.d.mts +32 -1
- package/lib/package-resolutions-updater.mjs +17 -338
- 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 +320 -207
- package/lib/print-directory-tree.mjs +3 -3
- package/lib/ps/connected-domain.cjs +25 -2
- package/lib/ps/connected-domain.d.ts +10 -2
- package/lib/ps/connected-domain.js +5 -2
- package/lib/ps/connected-domain.mjs +8 -4
- package/lib/ps/index.cjs +345 -322
- package/lib/ps/index.d.mjs +1 -1
- package/lib/ps/index.js +2 -1
- package/lib/ps/index.mjs +179 -182
- package/lib/ps/isWin.cjs +24 -1
- package/lib/ps/isWin.d.ts +1 -1
- package/lib/ps/isWin.js +3 -1
- package/lib/ps/isWin.mjs +8 -4
- package/lib/ps/table-parser.cjs +167 -159
- package/lib/ps/table-parser.d.ts +5 -0
- package/lib/ps/table-parser.js +10 -4
- package/lib/ps/table-parser.mjs +9 -5
- package/lib/remove-module.cjs +310 -0
- package/lib/remove-module.d.mts +1 -0
- package/lib/remove-module.mjs +111 -0
- package/lib/rmpath.cjs +322 -0
- package/lib/rmpath.d.mts +3 -0
- package/lib/rmpath.mjs +108 -0
- package/lib/submodule-install.cjs +311 -86
- package/lib/submodule-install.mjs +53 -5
- package/lib/submodule-remove-cli.cjs +107 -0
- package/lib/submodule-remove-cli.d.ts +1 -0
- package/lib/submodule-remove-cli.js +31 -0
- package/lib/submodule-remove-cli.mjs +28 -0
- package/lib/submodule-remove.cjs +46 -0
- package/lib/submodule-remove.d.cts +2 -0
- package/lib/submodule-remove.mjs +6 -0
- package/lib/utils/chatgpt.cjs +541 -0
- package/lib/utils/chatgpt.d.ts +31 -0
- package/lib/utils/chatgpt.js +708 -0
- package/lib/utils/chatgpt.mjs +8 -0
- package/lib/utils/findEnvFiles.cjs +107 -0
- package/lib/utils/findEnvFiles.d.ts +8 -0
- package/lib/utils/findEnvFiles.js +121 -0
- package/lib/utils/findEnvFiles.mjs +8 -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.cjs → utils/index.cjs} +61 -14
- package/lib/{utils.mjs → utils/index.mjs} +2 -2
- 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/yarn-reinstall.cjs +220 -38
- package/lib/yarn-reinstall.mjs +2 -2
- package/package.json +138 -104
- package/readme.md +48 -75
- package/releases/readme.md +36 -0
- package/requirements.txt +1 -0
- package/test/README.md +101 -0
- package/test/package.json +2 -1
- package/test-project/readme.md +26 -0
- package/tmp/test-repo/README.md +35 -0
- package/tmp/test-repo/package.json +1 -1
- package/tmp/typedoc/readme.md +320 -0
- package/bin/bash-dummy +0 -56
- package/bin/bash-dummy.cmd +0 -25
- package/bin/dir-tree.cmd +0 -7
- package/bin/git-diff +0 -4
- package/bin/git-diff.cmd +0 -7
- package/bin/git-fix +0 -36
- package/bin/git-fix.cmd +0 -7
- package/bin/rmpath +0 -70
- package/bin/submodule-install.txt +0 -118
- package/bin/submodule-remove +0 -46
- package/bin/submodule.txt +0 -172
- package/lib/binary-collections-config.d.mts +0 -18
- package/lib/binary-collections-config.js +0 -39
- package/lib/binary-collections.d.mts +0 -137
- package/lib/binary-collections.d.ts +0 -137
- package/lib/changelog.d.mts +0 -2
- package/lib/changelog.js +0 -226
- package/lib/chunk-DPKAJKFO.mjs +0 -171
- package/lib/chunk-G3THLIDT.mjs +0 -200
- package/lib/chunk-W3ENOM53.mjs +0 -18
- package/lib/clean-github-actions-caches.d.mts +0 -169
- package/lib/clean-github-actions-caches.d.ts +0 -169
- package/lib/del-gradle.d.mts +0 -2
- package/lib/del-node-modules.d.mts +0 -2
- package/lib/del-ps.d.mts +0 -2
- package/lib/del-yarn-caches.d.mts +0 -2
- package/lib/find-node-modules-cli.d.mts +0 -1
- package/lib/find-node-modules.d.mts +0 -13
- package/lib/find-node-modules.js +0 -53
- package/lib/git/gitattributes.d.mts +0 -35
- package/lib/git/gitattributes.js +0 -223
- package/lib/git/line-endings.d.mts +0 -83
- package/lib/git/line-endings.d.ts +0 -83
- package/lib/git/normalize.d.mts +0 -43
- package/lib/git/normalize.d.ts +0 -43
- package/lib/git/permissions.d.mts +0 -17
- package/lib/git/permissions.d.ts +0 -17
- package/lib/git/pull-strategy.d.mts +0 -15
- package/lib/git/pull-strategy.d.ts +0 -15
- package/lib/git/user-config.d.mts +0 -105
- package/lib/git/user-config.d.ts +0 -105
- package/lib/git/utils.d.mts +0 -69
- package/lib/git/utils.d.ts +0 -69
- package/lib/git-diff.d.mts +0 -84
- package/lib/git-fix.d.mts +0 -141
- package/lib/git-fix.d.ts +0 -141
- package/lib/git-purge.d.mts +0 -2
- package/lib/git-purge.js +0 -59
- package/lib/index.d.mts +0 -1
- package/lib/npm-run-series.d.mts +0 -1
- package/lib/npm-run-series.js +0 -86
- package/lib/package-resolutions-updater.d.ts +0 -352
- package/lib/print-directory-tree.d.mts +0 -234
- package/lib/print-directory-tree.d.ts +0 -234
- package/lib/ps/connected-domain.d.mts +0 -3
- package/lib/ps/index.d.d.mts +0 -26
- package/lib/ps/index.d.d.ts +0 -26
- package/lib/ps/index.d.mts +0 -26
- package/lib/ps/isWin.d.mts +0 -3
- package/lib/ps/table-parser.d.mts +0 -3
- package/lib/submodule-install.d.mts +0 -121
- package/lib/submodule-install.d.ts +0 -121
- package/lib/utils.d.mts +0 -40
- package/lib/utils.js +0 -181
- package/lib/yarn-reinstall.d.mts +0 -49
- package/lib/yarn-reinstall.d.ts +0 -49
- package/src/package-resolutions-updater.mjs +0 -350
- package/src/print-directory-tree.cjs +0 -234
- package/src/ps/index.js +0 -286
- package/src/yarn-reinstall.cjs +0 -49
- /package/{bin → binaries}/nodekill +0 -0
- /package/{bin → binaries}/nodekill.cmd +0 -0
- /package/lib/{binary-collections-config.d.ts → binary-collections-config.d.cts} +0 -0
- /package/lib/{changelog.d.ts → changelog.d.cts} +0 -0
- /package/lib/{git-purge.d.ts → free-chatgpt.d.ts} +0 -0
- /package/lib/{git-diff.d.cts → git-diff-cli.d.ts} +0 -0
- /package/lib/{npm-run-series.d.ts → npm-run-series.d.cts} +0 -0
- /package/lib/{utils.d.ts → utils/index.d.cts} +0 -0
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
$isAdmin = ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole(
|
|
2
|
+
[Security.Principal.WindowsBuiltInRole]::Administrator
|
|
3
|
+
)
|
|
4
|
+
|
|
5
|
+
if (-not $isAdmin) {
|
|
6
|
+
$scriptPath = $PSCommandPath
|
|
7
|
+
if (-not $scriptPath) {
|
|
8
|
+
$scriptPath = $MyInvocation.MyCommand.Path
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
Write-Host "Requesting administrator privileges..."
|
|
12
|
+
Start-Process -FilePath "PowerShell.exe" -Verb RunAs -ArgumentList @(
|
|
13
|
+
"-NoProfile",
|
|
14
|
+
"-ExecutionPolicy",
|
|
15
|
+
"Bypass",
|
|
16
|
+
"-File",
|
|
17
|
+
$scriptPath
|
|
18
|
+
)
|
|
19
|
+
exit
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
$IntervalSeconds = 5
|
|
23
|
+
$WatchSeconds = 5
|
|
24
|
+
$KeepWindowOpen = $false
|
|
25
|
+
$ShippingProcessName = "MadGlobal-Win64-Shipping"
|
|
26
|
+
$LauncherProcessName = "MadGlobal.exe"
|
|
27
|
+
|
|
28
|
+
function Write-Log {
|
|
29
|
+
param(
|
|
30
|
+
[string]$Message
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
$timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
|
|
34
|
+
Write-Host "[$timestamp] $Message"
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function Get-ParentProcess {
|
|
38
|
+
param(
|
|
39
|
+
[int]$ChildPid
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
$child = Get-CimInstance Win32_Process -Filter "ProcessId = $ChildPid" -ErrorAction Stop
|
|
44
|
+
if (-not $child) {
|
|
45
|
+
return $null
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return Get-CimInstance Win32_Process -Filter "ProcessId = $($child.ParentProcessId)" -ErrorAction SilentlyContinue
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return $null
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function Stop-ProcessTree {
|
|
56
|
+
param(
|
|
57
|
+
[int]$RootPid,
|
|
58
|
+
[string]$ExpectedProcessName
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
if ($RootPid -le 0) {
|
|
62
|
+
Write-Log "Invalid root PID: $RootPid"
|
|
63
|
+
return $false
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if ($RootPid -eq $PID) {
|
|
67
|
+
Write-Log "Refusing to kill current PowerShell process PID $RootPid"
|
|
68
|
+
return $false
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
$root = Get-Process -Id $RootPid -ErrorAction SilentlyContinue
|
|
72
|
+
if (-not $root) {
|
|
73
|
+
Write-Log "Root process PID $RootPid no longer exists."
|
|
74
|
+
return $false
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if ($ExpectedProcessName) {
|
|
78
|
+
$actualName = "$($root.ProcessName).exe"
|
|
79
|
+
if ($actualName -ine $ExpectedProcessName) {
|
|
80
|
+
Write-Log "Refusing to kill PID $RootPid because process is $actualName (expected $ExpectedProcessName)."
|
|
81
|
+
return $false
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
$taskkillOutput = & taskkill /F /T /PID $RootPid 2>&1
|
|
86
|
+
$taskkillExitCode = $LASTEXITCODE
|
|
87
|
+
|
|
88
|
+
if ($taskkillExitCode -ne 0) {
|
|
89
|
+
Write-Log "taskkill failed for PID $RootPid with exit code $taskkillExitCode"
|
|
90
|
+
foreach ($line in $taskkillOutput) {
|
|
91
|
+
Write-Log "taskkill: $line"
|
|
92
|
+
}
|
|
93
|
+
return $false
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
Write-Log "Killed process tree for PID $RootPid"
|
|
97
|
+
return $true
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
$startedAt = Get-Date
|
|
101
|
+
if ($WatchSeconds -gt 0) {
|
|
102
|
+
Write-Log "Watching $ShippingProcessName.exe every $IntervalSeconds second(s) for up to $WatchSeconds second(s)."
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
Write-Log "Watching $ShippingProcessName.exe every $IntervalSeconds second(s) until stopped."
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
while ($true) {
|
|
109
|
+
if ($WatchSeconds -gt 0) {
|
|
110
|
+
$elapsed = (Get-Date) - $startedAt
|
|
111
|
+
if ($elapsed.TotalSeconds -ge $WatchSeconds) {
|
|
112
|
+
Write-Log "Watch limit reached ($WatchSeconds second(s)). Exiting."
|
|
113
|
+
break
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
$shippingProcesses = Get-Process -Name $ShippingProcessName -ErrorAction SilentlyContinue
|
|
118
|
+
|
|
119
|
+
foreach ($shipping in $shippingProcesses) {
|
|
120
|
+
$responding = $true
|
|
121
|
+
try {
|
|
122
|
+
$responding = [bool]$shipping.Responding
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
# If we cannot read Responding, skip this process safely.
|
|
126
|
+
continue
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if ($responding) {
|
|
130
|
+
continue
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
Write-Log "$($ShippingProcessName).exe PID $($shipping.Id) is not responding."
|
|
134
|
+
|
|
135
|
+
$parent = Get-ParentProcess -ChildPid $shipping.Id
|
|
136
|
+
if (-not $parent) {
|
|
137
|
+
Write-Log "Could not resolve parent process for PID $($shipping.Id)."
|
|
138
|
+
continue
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if ($parent.Name -ieq $LauncherProcessName) {
|
|
142
|
+
Write-Log "Killing launcher tree: $($parent.Name) PID $($parent.ProcessId)"
|
|
143
|
+
$result = Stop-ProcessTree -RootPid ([int]$parent.ProcessId) -ExpectedProcessName $LauncherProcessName
|
|
144
|
+
if (-not $result) {
|
|
145
|
+
Write-Log "Launcher tree kill found no running processes."
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
Write-Log "Parent process is $($parent.Name) PID $($parent.ProcessId); expected $LauncherProcessName. No action taken."
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if ($WatchSeconds -gt 0) {
|
|
154
|
+
$remaining = $WatchSeconds - [int]((Get-Date) - $startedAt).TotalSeconds
|
|
155
|
+
if ($remaining -le 0) {
|
|
156
|
+
Write-Log "Watch limit reached ($WatchSeconds second(s)). Exiting."
|
|
157
|
+
break
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if ($remaining -lt $IntervalSeconds) {
|
|
161
|
+
Start-Sleep -Seconds $remaining
|
|
162
|
+
continue
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
Start-Sleep -Seconds $IntervalSeconds
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if ($KeepWindowOpen) {
|
|
170
|
+
Write-Host ""
|
|
171
|
+
Read-Host "Debug mode: press Enter to close"
|
|
172
|
+
}
|
|
File without changes
|
|
@@ -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,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);
|
|
File without changes
|
package/{bin → binaries}/prod
RENAMED
|
File without changes
|
|
@@ -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);
|