mirror of https://github.com/nodejs/corepack.git
fix: don't override `process.exitCode` (#268)
* fix: don't override exit codes * chore: update nock files
This commit is contained in:
parent
321180492d
commit
17d1f3dd41
|
|
@ -88,7 +88,7 @@ async function executePackageManagerRequest({packageManager, binaryName, binaryV
|
||||||
return await corepackUtils.runVersion(installSpec, binaryName, args);
|
return await corepackUtils.runVersion(installSpec, binaryName, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
async function main(argv: Array<string>) {
|
export async function runMain(argv: Array<string>) {
|
||||||
// Because we load the binaries in the same process, we don't support custom contexts.
|
// Because we load the binaries in the same process, we don't support custom contexts.
|
||||||
const context = {
|
const context = {
|
||||||
...Cli.defaultContext,
|
...Cli.defaultContext,
|
||||||
|
|
@ -99,10 +99,9 @@ async function main(argv: Array<string>) {
|
||||||
const [firstArg, ...restArgs] = argv;
|
const [firstArg, ...restArgs] = argv;
|
||||||
const request = getPackageManagerRequestFromCli(firstArg, context);
|
const request = getPackageManagerRequestFromCli(firstArg, context);
|
||||||
|
|
||||||
let cli: Cli<Context>;
|
|
||||||
if (!request) {
|
if (!request) {
|
||||||
// If the first argument doesn't match any supported package manager, we fallback to the standard Corepack CLI
|
// If the first argument doesn't match any supported package manager, we fallback to the standard Corepack CLI
|
||||||
cli = new Cli({
|
const cli = new Cli({
|
||||||
binaryLabel: `Corepack`,
|
binaryLabel: `Corepack`,
|
||||||
binaryName: `corepack`,
|
binaryName: `corepack`,
|
||||||
binaryVersion: corepackVersion,
|
binaryVersion: corepackVersion,
|
||||||
|
|
@ -116,7 +115,7 @@ async function main(argv: Array<string>) {
|
||||||
cli.register(HydrateCommand);
|
cli.register(HydrateCommand);
|
||||||
cli.register(PrepareCommand);
|
cli.register(PrepareCommand);
|
||||||
|
|
||||||
return await cli.run(argv, context);
|
await cli.runExit(argv, context);
|
||||||
} else {
|
} else {
|
||||||
// Otherwise, we create a single-command CLI to run the specified package manager (we still use Clipanion in order to pretty-print usage errors).
|
// Otherwise, we create a single-command CLI to run the specified package manager (we still use Clipanion in order to pretty-print usage errors).
|
||||||
const cli = new Cli({
|
const cli = new Cli({
|
||||||
|
|
@ -132,16 +131,9 @@ async function main(argv: Array<string>) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return await cli.run(restArgs, context);
|
const code = await cli.run(restArgs, context);
|
||||||
|
if (code !== 0) {
|
||||||
|
process.exitCode ??= code;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Important: this is the only function that the corepack binary exports.
|
|
||||||
export function runMain(argv: Array<string>) {
|
|
||||||
main(argv).then(exitCode => {
|
|
||||||
process.exitCode = exitCode;
|
|
||||||
}, err => {
|
|
||||||
console.error(err.stack);
|
|
||||||
process.exitCode = 1;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -538,3 +538,71 @@ it(`should handle parallel installs`, async () => {
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it(`should not override the package manager exit code`, async () => {
|
||||||
|
await xfs.mktempPromise(async cwd => {
|
||||||
|
await xfs.writeJsonPromise(ppath.join(cwd, `package.json` as Filename), {
|
||||||
|
packageManager: `yarn@2.2.2`,
|
||||||
|
});
|
||||||
|
|
||||||
|
const yarnPath = ppath.join(npath.toPortablePath(process.env.COREPACK_HOME!), `yarn/2.2.2/yarn.js` as PortablePath);
|
||||||
|
|
||||||
|
await xfs.mkdirPromise(ppath.dirname(yarnPath), {recursive: true});
|
||||||
|
await xfs.writeFilePromise(yarnPath, `
|
||||||
|
process.exitCode = 42;
|
||||||
|
`);
|
||||||
|
|
||||||
|
await expect(runCli(cwd, [`yarn`, `--version`])).resolves.toMatchObject({
|
||||||
|
exitCode: 42,
|
||||||
|
stdout: ``,
|
||||||
|
stderr: ``,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`should not override the package manager exit code when it throws`, async () => {
|
||||||
|
await xfs.mktempPromise(async cwd => {
|
||||||
|
await xfs.writeJsonPromise(ppath.join(cwd, `package.json` as Filename), {
|
||||||
|
packageManager: `yarn@2.2.2`,
|
||||||
|
});
|
||||||
|
|
||||||
|
const yarnPath = ppath.join(npath.toPortablePath(process.env.COREPACK_HOME!), `yarn/2.2.2/yarn.js` as PortablePath);
|
||||||
|
|
||||||
|
await xfs.mkdirPromise(ppath.dirname(yarnPath), {recursive: true});
|
||||||
|
await xfs.writeFilePromise(yarnPath, `
|
||||||
|
process.exitCode = 42;
|
||||||
|
throw new Error('foo');
|
||||||
|
`);
|
||||||
|
|
||||||
|
await expect(runCli(cwd, [`yarn`, `--version`])).resolves.toMatchObject({
|
||||||
|
exitCode: 42,
|
||||||
|
stdout: expect.stringContaining(`foo`),
|
||||||
|
stderr: ``,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it(`should not set the exit code after successfully launching the package manager`, async () => {
|
||||||
|
await xfs.mktempPromise(async cwd => {
|
||||||
|
await xfs.writeJsonPromise(ppath.join(cwd, `package.json` as Filename), {
|
||||||
|
packageManager: `yarn@2.2.2`,
|
||||||
|
});
|
||||||
|
|
||||||
|
const yarnPath = ppath.join(npath.toPortablePath(process.env.COREPACK_HOME!), `yarn/2.2.2/yarn.js` as PortablePath);
|
||||||
|
|
||||||
|
await xfs.mkdirPromise(ppath.dirname(yarnPath), {recursive: true});
|
||||||
|
await xfs.writeFilePromise(yarnPath, `
|
||||||
|
process.once('beforeExit', () => {
|
||||||
|
if (process.exitCode === undefined) {
|
||||||
|
process.exitCode = 42;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
`);
|
||||||
|
|
||||||
|
await expect(runCli(cwd, [`yarn`, `--version`])).resolves.toMatchObject({
|
||||||
|
exitCode: 42,
|
||||||
|
stdout: ``,
|
||||||
|
stderr: ``,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue