|
3 | 3 | /** @fileoverview pnpm CLI wrapper entry point. */ |
4 | 4 |
|
5 | 5 | void (async () => { |
6 | | - process.exitCode = 1 |
| 6 | + try { |
| 7 | + // Use require to load from built dist path to avoid creating shadow-pnpm-bin files. |
| 8 | + const shadowPnpmBin = require('../dist/shadow-pnpm-bin.js') |
7 | 9 |
|
8 | | - // Use require to load from built dist path to avoid creating shadow-pnpm-bin files. |
9 | | - const shadowPnpmBin = require('../dist/shadow-pnpm-bin.js') |
| 10 | + // Safely get current working directory, fall back if deleted |
| 11 | + let cwd |
| 12 | + try { |
| 13 | + cwd = process.cwd() |
| 14 | + } catch { |
| 15 | + // If cwd is deleted, use home or temp directory |
| 16 | + const os = require('node:os') |
| 17 | + cwd = process.env['HOME'] || process.env['USERPROFILE'] || os.tmpdir() |
| 18 | + } |
10 | 19 |
|
11 | | - const { spawnPromise } = await shadowPnpmBin(process.argv.slice(2), { |
12 | | - stdio: 'inherit', |
13 | | - cwd: process.cwd(), |
14 | | - env: { ...process.env }, |
15 | | - }) |
| 20 | + const { spawnPromise } = await shadowPnpmBin(process.argv.slice(2), { |
| 21 | + stdio: 'inherit', |
| 22 | + cwd, |
| 23 | + env: { ...process.env }, |
| 24 | + }) |
16 | 25 |
|
17 | | - // See https://nodejs.org/api/child_process.html#event-exit. |
18 | | - spawnPromise.process.on( |
19 | | - 'exit', |
20 | | - (code: number | null, signalName: NodeJS.Signals | null) => { |
21 | | - if (signalName) { |
22 | | - process.kill(process.pid, signalName) |
23 | | - } else if (typeof code === 'number') { |
24 | | - // eslint-disable-next-line n/no-process-exit |
25 | | - process.exit(code) |
26 | | - } |
27 | | - }, |
28 | | - ) |
| 26 | + // See https://nodejs.org/api/child_process.html#event-exit. |
| 27 | + spawnPromise.process.on( |
| 28 | + 'exit', |
| 29 | + (code: number | null, signalName: NodeJS.Signals | null) => { |
| 30 | + if (signalName) { |
| 31 | + // On Windows, only certain signals are supported |
| 32 | + // Fallback to exit code 128 + signal number for unsupported signals |
| 33 | + if (process.platform === 'win32') { |
| 34 | + // Windows supports SIGTERM and SIGINT but not others like SIGHUP |
| 35 | + if (signalName === 'SIGTERM' || signalName === 'SIGINT') { |
| 36 | + process.kill(process.pid, signalName) |
| 37 | + } else { |
| 38 | + // Use conventional exit code for signal termination |
| 39 | + // Default to SIGTERM-like exit code |
| 40 | + // eslint-disable-next-line n/no-process-exit |
| 41 | + process.exit(128 + 15) |
| 42 | + } |
| 43 | + } else { |
| 44 | + process.kill(process.pid, signalName) |
| 45 | + } |
| 46 | + } else if (typeof code === 'number') { |
| 47 | + // eslint-disable-next-line n/no-process-exit |
| 48 | + process.exit(code) |
| 49 | + } |
| 50 | + }, |
| 51 | + ) |
29 | 52 |
|
30 | | - await spawnPromise |
| 53 | + await spawnPromise |
| 54 | + } catch (error) { |
| 55 | + // Only set exit code on actual failure |
| 56 | + process.exitCode = 1 |
| 57 | + throw error |
| 58 | + } |
31 | 59 | })() |
0 commit comments