Skip to content

Commit

Permalink
fix(node): setting process.exitCode should change exit code of process (
Browse files Browse the repository at this point in the history
  • Loading branch information
dsherret authored Dec 2, 2023
1 parent 61a4e88 commit f29075a
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 5 deletions.
53 changes: 51 additions & 2 deletions cli/tests/unit_node/process_test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -681,9 +681,58 @@ Deno.test("process.memoryUsage.rss()", () => {
});

Deno.test("process.exitCode", () => {
assert(process.exitCode === undefined);
assertEquals(process.exitCode, undefined);
process.exitCode = 127;
assert(process.exitCode === 127);
assertEquals(process.exitCode, 127);
// deno-lint-ignore no-explicit-any
(process.exitCode as any) = "asdf";
// deno-lint-ignore no-explicit-any
assertEquals(process.exitCode as any, "asdf");
// deno-lint-ignore no-explicit-any
(process.exitCode as any) = "10";
process.exitCode = undefined; // reset
});

async function exitCodeTest(codeText: string, expectedExitCode: number) {
const command = new Deno.Command(Deno.execPath(), {
args: [
"eval",
codeText,
],
cwd: testDir,
});
const { code } = await command.output();
assertEquals(code, expectedExitCode);
}

Deno.test("process.exitCode in should change exit code", async () => {
await exitCodeTest(
"import process from 'node:process'; process.exitCode = 127;",
127,
);
await exitCodeTest(
"import process from 'node:process'; process.exitCode = 2.5;",
2,
);
await exitCodeTest(
"import process from 'node:process'; process.exitCode = '10';",
10,
);
await exitCodeTest(
"import process from 'node:process'; process.exitCode = '0x10';",
16,
);
await exitCodeTest(
"import process from 'node:process'; process.exitCode = NaN;",
0,
);
});

Deno.test("Deno.exit should override process exit", async () => {
await exitCodeTest(
"import process from 'node:process'; process.exitCode = 10; Deno.exit(12);",
12,
);
});

Deno.test("process.config", () => {
Expand Down
17 changes: 14 additions & 3 deletions ext/node/polyfills/process.ts
Original file line number Diff line number Diff line change
Expand Up @@ -76,15 +76,16 @@ const notImplementedEvents = [
];

export const argv: string[] = [];
let globalProcessExitCode: number | undefined = undefined;

/** https://nodejs.org/api/process.html#process_process_exit_code */
export const exit = (code?: number | string) => {
if (code || code === 0) {
if (typeof code === "string") {
const parsedCode = parseInt(code);
process.exitCode = isNaN(parsedCode) ? undefined : parsedCode;
globalProcessExitCode = isNaN(parsedCode) ? undefined : parsedCode;
} else {
process.exitCode = code;
globalProcessExitCode = code;
}
}

Expand Down Expand Up @@ -426,7 +427,17 @@ class Process extends EventEmitter {
_exiting = _exiting;

/** https://nodejs.org/api/process.html#processexitcode_1 */
exitCode: undefined | number = undefined;
get exitCode() {
return globalProcessExitCode;
}

set exitCode(code: number | undefined) {
globalProcessExitCode = code;
code = parseInt(code) || 0;
if (!isNaN(code)) {
ops.op_set_exit_code(code);
}
}

// Typed as any to avoid importing "module" module for types
// deno-lint-ignore no-explicit-any
Expand Down

0 comments on commit f29075a

Please sign in to comment.