From 86bc7752a75f657656b5eda70180322441aca105 Mon Sep 17 00:00:00 2001 From: Antoine du Hamel Date: Wed, 24 Aug 2022 10:35:02 +0200 Subject: [PATCH] feat: add `COREPACK_ENABLE_STRICT` env variable --- README.md | 10 ++++++++-- sources/specUtils.ts | 2 ++ tests/main.test.ts | 28 ++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 36e5d1028..8ba03a760 100644 --- a/README.md +++ b/README.md @@ -111,12 +111,18 @@ This command will retrieve the given package manager from the specified archive ## Environment Variables -- `COREPACK_ENABLE_NETWORK` can be set to `0` to prevent Corepack from accessing the network (in which case you'll be responsible for hydrating the package manager versions that will be required for the projects you'll run, using `corepack hydrate`). - - `COREPACK_DEFAULT_TO_LATEST` can be set to `0` in order to instruct Corepack not to lookup on the remote registry for the latest version of the selected package manager. +- `COREPACK_ENABLE_NETWORK` can be set to `0` to prevent Corepack from accessing + the network (in which case you'll be responsible for hydrating the package + manager versions that will be required for the projects you'll run, using + `corepack hydrate`). + +- `COREPACK_ENABLE_STRICT` can be set to `0` to prevent Corepack from checking + if the package manager corresponds to the one defined for the current project. + - `COREPACK_HOME` can be set in order to define where Corepack should install the package managers. By default it is set to `%LOCALAPPDATA%\node\corepack` on Windows, and to `$HOME/.cache/node/corepack` everywhere else. diff --git a/sources/specUtils.ts b/sources/specUtils.ts index e69bc8fe3..f587d3276 100644 --- a/sources/specUtils.ts +++ b/sources/specUtils.ts @@ -44,6 +44,8 @@ export async function findProjectSpec(initialCwd: string, locator: Locator, {tra // A locator is a valid descriptor (but not the other way around) const fallbackLocator = {name: locator.name, range: locator.reference}; + if (process.env.COREPACK_ENABLE_STRICT === `0`) return fallbackLocator; + while (true) { const result = await loadSpec(initialCwd); diff --git a/tests/main.test.ts b/tests/main.test.ts index 2d93a013b..05d414ce7 100644 --- a/tests/main.test.ts +++ b/tests/main.test.ts @@ -219,6 +219,34 @@ it(`should allow to call "prepare" without arguments within a configured project }); }); +it(`should refuse to run a different package manager within a configured project`, async () => { + await xfs.mktempPromise(async cwd => { + await xfs.writeJsonPromise(ppath.join(cwd, `package.json` as Filename), { + packageManager: `yarn@1.0.0`, + }); + + process.env.FORCE_COLOR = `0`; + + await expect(runCli(cwd, [`pnpm`, `--version`])).resolves.toMatchObject({ + stdout: `Usage Error: This project is configured to use yarn\n\n$ pnpm ...\n`, + exitCode: 1, + }); + + // Disable strict checking to workaround the UsageError. + process.env.COREPACK_ENABLE_STRICT = `0`; + + try { + await expect(runCli(cwd, [`pnpm`, `--version`])).resolves.toMatchObject({ + stdout: `${config.definitions.pnpm.default.split(`+`, 1)[0]}\n`, + exitCode: 0, + }); + } finally { + delete process.env.COREPACK_ENABLE_STRICT; + delete process.env.FORCE_COLOR; + } + }); +}); + it(`should allow to call "prepare" with --all to prepare all package managers`, async () => { await xfs.mktempPromise(async cwd => { await xfs.writeJsonPromise(ppath.join(cwd, `package.json` as Filename), {