From 2936fe8cda9cf52952329ff4ac173c5d916a0ac1 Mon Sep 17 00:00:00 2001 From: "Jacob Parish (JP250552)" <75643994+JP250552@users.noreply.github.com> Date: Tue, 21 Nov 2023 13:02:28 -0600 Subject: [PATCH 1/7] Added option to enable corepack (#1) Co-authored-by: Steven Co-authored-by: Sayak Mukhopadhyay Co-authored-by: Jacob Parish --- README.md | 23 ++++++++++---------- __tests__/official-installer.test.ts | 32 ++++++++++++++++++++++++++++ action.yml | 5 ++++- dist/cache-save/index.js | 17 ++++++++++++++- dist/setup/index.js | 19 ++++++++++++++++- docs/advanced-usage.md | 29 +++++++++++++++++++++++++ src/main.ts | 9 +++++++- src/util.ts | 13 +++++++++++ 8 files changed, 132 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 20d23405a..613100fe1 100644 --- a/README.md +++ b/README.md @@ -26,22 +26,22 @@ See [action.yml](action.yml) node-version: '' # File containing the version Spec of the version to use. Examples: .nvmrc, .node-version, .tool-versions. - # If node-version and node-version-file are both provided the action will use version from node-version. + # If node-version and node-version-file are both provided the action will use version from node-version. node-version-file: '' - # Set this option if you want the action to check for the latest available version + # Set this option if you want the action to check for the latest available version # that satisfies the version spec. - # It will only get affect for lts Nodejs versions (12.x, >=10.15.0, lts/Hydrogen). + # It will only get affect for lts Nodejs versions (12.x, >=10.15.0, lts/Hydrogen). # Default: false check-latest: false # Target architecture for Node to use. Examples: x86, x64. Will use system architecture by default. - # Default: ''. The action use system architecture by default + # Default: ''. The action use system architecture by default architecture: '' - # Used to pull node distributions from https://github.com/actions/node-versions. - # Since there's a default, this is typically not supplied by the user. - # When running this action on github.com, the default value is sufficient. + # Used to pull node distributions from https://github.com/actions/node-versions. + # Since there's a default, this is typically not supplied by the user. + # When running this action on github.com, the default value is sufficient. # When running on GHES, you can pass a personal access token for github.com if you are experiencing rate limiting. # # We recommend using a service account with the least permissions necessary. Also @@ -57,18 +57,18 @@ See [action.yml](action.yml) # Default: '' cache: '' - # Used to specify the path to a dependency file: package-lock.json, yarn.lock, etc. - # It will generate hash from the target file for primary key. It works only If cache is specified. + # Used to specify the path to a dependency file: package-lock.json, yarn.lock, etc. + # It will generate hash from the target file for primary key. It works only If cache is specified. # Supports wildcards or a list of file names for caching multiple dependencies. # Default: '' cache-dependency-path: '' - # Optional registry to set up for auth. Will set the registry in a project level .npmrc and .yarnrc file, + # Optional registry to set up for auth. Will set the registry in a project level .npmrc and .yarnrc file, # and set up auth to read in from env.NODE_AUTH_TOKEN. # Default: '' registry-url: '' - # Optional scope for authenticating against scoped registries. + # Optional scope for authenticating against scoped registries. # Will fall back to the repository owner when using the GitHub Packages registry (https://npm.pkg.github.com/). # Default: '' scope: '' @@ -203,6 +203,7 @@ If the runner is not able to access github.com, any Nodejs versions requested du - [Publishing to npmjs and GPR with npm](docs/advanced-usage.md#publish-to-npmjs-and-gpr-with-npm) - [Publishing to npmjs and GPR with yarn](docs/advanced-usage.md#publish-to-npmjs-and-gpr-with-yarn) - [Using private packages](docs/advanced-usage.md#use-private-packages) + - [Enabling Corepack](docs/advanced-usage.md#enabling-corepack) ## License diff --git a/__tests__/official-installer.test.ts b/__tests__/official-installer.test.ts index 2d36c19c7..778b5196e 100644 --- a/__tests__/official-installer.test.ts +++ b/__tests__/official-installer.test.ts @@ -825,4 +825,36 @@ describe('setup-node', () => { } ); }); + + describe('corepack flag', () => { + it('use corepack if specified', async () => { + inputs['corepack'] = 'true'; + await main.run(); + expect(getExecOutputSpy).toHaveBeenCalledWith( + 'corepack', + ['enable'], + expect.anything() + ); + }); + + it('use corepack with given package manager', async () => { + inputs['corepack'] = 'npm'; + await main.run(); + expect(getExecOutputSpy).toHaveBeenCalledWith( + 'corepack', + ['enable', 'npm'], + expect.anything() + ); + }); + + it('use corepack with multiple package managers', async () => { + inputs['corepack'] = 'npm yarn'; + await main.run(); + expect(getExecOutputSpy).toHaveBeenCalledWith( + 'corepack', + ['enable', 'npm', 'yarn'], + expect.anything() + ); + }); + }); }); diff --git a/action.yml b/action.yml index 40af88383..689afa35e 100644 --- a/action.yml +++ b/action.yml @@ -25,10 +25,13 @@ inputs: description: 'Used to specify a package manager for caching in the default directory. Supported values: npm, yarn, pnpm.' cache-dependency-path: description: 'Used to specify the path to a dependency file: package-lock.json, yarn.lock, etc. Supports wildcards or a list of file names for caching multiple dependencies.' + corepack: + description: 'Used to specify whether to enable Corepack. Set to true to enable all package managers or set it to one or more package manager names separated by a space. Supported package manager names: npm, yarn, pnpm.' + default: 'false' # TODO: add input to control forcing to pull from cloud or dist. # escape valve for someone having issues or needing the absolute latest which isn't cached yet outputs: - cache-hit: + cache-hit: description: 'A boolean value to indicate if a cache was hit.' node-version: description: 'The installed node version.' diff --git a/dist/cache-save/index.js b/dist/cache-save/index.js index 0b7060e5c..05f3e5821 100644 --- a/dist/cache-save/index.js +++ b/dist/cache-save/index.js @@ -83321,7 +83321,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.unique = exports.printEnvDetailsAndSetOutput = exports.parseNodeVersionFile = void 0; +exports.enableCorepack = exports.unique = exports.printEnvDetailsAndSetOutput = exports.parseNodeVersionFile = void 0; const core = __importStar(__nccwpck_require__(2186)); const exec = __importStar(__nccwpck_require__(1514)); function parseNodeVersionFile(contents) { @@ -83393,6 +83393,21 @@ const unique = () => { }; }; exports.unique = unique; +function enableCorepack(input) { + return __awaiter(this, void 0, void 0, function* () { + const corepackArgs = ['enable']; + if (input.length > 0 && input !== 'false') { + if (input !== 'true') { + const packageManagers = input.split(' '); + corepackArgs.push(...packageManagers); + } + yield exec.getExecOutput('corepack', corepackArgs, { + ignoreReturnCode: true + }); + } + }); +} +exports.enableCorepack = enableCorepack; /***/ }), diff --git a/dist/setup/index.js b/dist/setup/index.js index 0512f3a79..4c58b1d77 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -93698,6 +93698,8 @@ function run() { if (registryUrl) { auth.configAuthentication(registryUrl, alwaysAuth); } + const corepack = core.getInput('corepack') || 'false'; + yield (0, util_1.enableCorepack)(corepack); if (cache && (0, cache_utils_1.isCacheFeatureAvailable)()) { core.saveState(constants_1.State.CachePackageManager, cache); const cacheDependencyPath = core.getInput('cache-dependency-path'); @@ -93775,7 +93777,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.unique = exports.printEnvDetailsAndSetOutput = exports.parseNodeVersionFile = void 0; +exports.enableCorepack = exports.unique = exports.printEnvDetailsAndSetOutput = exports.parseNodeVersionFile = void 0; const core = __importStar(__nccwpck_require__(2186)); const exec = __importStar(__nccwpck_require__(1514)); function parseNodeVersionFile(contents) { @@ -93847,6 +93849,21 @@ const unique = () => { }; }; exports.unique = unique; +function enableCorepack(input) { + return __awaiter(this, void 0, void 0, function* () { + const corepackArgs = ['enable']; + if (input.length > 0 && input !== 'false') { + if (input !== 'true') { + const packageManagers = input.split(' '); + corepackArgs.push(...packageManagers); + } + yield exec.getExecOutput('corepack', corepackArgs, { + ignoreReturnCode: true + }); + } + }); +} +exports.enableCorepack = enableCorepack; /***/ }), diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index 079b8bfac..0d1ddf4e1 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -416,3 +416,32 @@ Please refer to the [Ensuring workflow access to your package - Configuring a pa ### always-auth input The always-auth input sets `always-auth=true` in .npmrc file. With this option set [npm](https://docs.npmjs.com/cli/v6/using-npm/config#always-auth)/yarn sends the authentication credentials when making a request to the registries. + +## Enabling Corepack +You can enable [Corepack](https://github.com/nodejs/corepack) by using the `corepack` input. You can then use `pnpm` and `yarn` commands in your project. + +```yaml +steps: +- uses: actions/checkout@v3 +- uses: actions/setup-node@v3 + with: + node-version: '16.x' + corepack: true +- name: Install dependencies + run: yarn install --immutable +``` + +You can also pass package manager names separated by a space to enable corepack for specific package managers only. + +```yaml +steps: +- uses: actions/checkout@v3 +- uses: actions/setup-node@v3 + with: + node-version: '16.x' + corepack: yarn pnpm +- name: Install dependencies + run: yarn install --immutable +``` + +This option by default is `false` as Corepack is still in experimental phase. diff --git a/src/main.ts b/src/main.ts index ac0517665..082815a7a 100644 --- a/src/main.ts +++ b/src/main.ts @@ -8,7 +8,11 @@ import * as path from 'path'; import {restoreCache} from './cache-restore'; import {isCacheFeatureAvailable} from './cache-utils'; import {getNodejsDistribution} from './distributions/installer-factory'; -import {parseNodeVersionFile, printEnvDetailsAndSetOutput} from './util'; +import { + parseNodeVersionFile, + printEnvDetailsAndSetOutput, + enableCorepack +} from './util'; import {State} from './constants'; export async function run() { @@ -60,6 +64,9 @@ export async function run() { auth.configAuthentication(registryUrl, alwaysAuth); } + const corepack = core.getInput('corepack') || 'false'; + await enableCorepack(corepack); + if (cache && isCacheFeatureAvailable()) { core.saveState(State.CachePackageManager, cache); const cacheDependencyPath = core.getInput('cache-dependency-path'); diff --git a/src/util.ts b/src/util.ts index 3ae94a2dc..d0b417ad7 100644 --- a/src/util.ts +++ b/src/util.ts @@ -70,3 +70,16 @@ export const unique = () => { return true; }; }; + +export async function enableCorepack(input: string): Promise { + const corepackArgs = ['enable']; + if (input.length > 0 && input !== 'false') { + if (input !== 'true') { + const packageManagers = input.split(' '); + corepackArgs.push(...packageManagers); + } + await exec.getExecOutput('corepack', corepackArgs, { + ignoreReturnCode: true + }); + } +} From 7c0fdd03f544655a07e8bf1ab1f0873d1306a784 Mon Sep 17 00:00:00 2001 From: Jacob Parish Date: Tue, 21 Nov 2023 13:31:24 -0600 Subject: [PATCH 2/7] test: updated tests --- __tests__/main.test.ts | 52 ++++++++++++++++++++++++++++ __tests__/official-installer.test.ts | 32 ----------------- 2 files changed, 52 insertions(+), 32 deletions(-) diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts index b57248757..e7d92a51b 100644 --- a/__tests__/main.test.ts +++ b/__tests__/main.test.ts @@ -300,4 +300,56 @@ describe('main tests', () => { ); }); }); + + describe('corepack flag', () => { + it('should not enable corepack when no input', async () => { + inputs['corepack'] = ''; + await main.run(); + expect(getExecOutputSpy).not.toHaveBeenCalledWith( + 'corepack', + expect.anything(), + expect.anything() + ); + }); + + it('should not enable corepack when input is "false"', async () => { + inputs['corepack'] = 'false'; + await main.run(); + expect(getExecOutputSpy).not.toHaveBeenCalledWith( + 'corepack', + expect.anything(), + expect.anything() + ); + }); + + it('should enable corepack when input is "true"', async () => { + inputs['corepack'] = 'true'; + await main.run(); + expect(getExecOutputSpy).toHaveBeenCalledWith( + 'corepack', + ['enable'], + expect.anything() + ); + }); + + it('should enable corepack with a single package manager', async () => { + inputs['corepack'] = 'npm'; + await main.run(); + expect(getExecOutputSpy).toHaveBeenCalledWith( + 'corepack', + ['enable', 'npm'], + expect.anything() + ); + }); + + it('should enable corepack with multiple package managers', async () => { + inputs['corepack'] = 'npm yarn'; + await main.run(); + expect(getExecOutputSpy).toHaveBeenCalledWith( + 'corepack', + ['enable', 'npm', 'yarn'], + expect.anything() + ); + }); + }); }); diff --git a/__tests__/official-installer.test.ts b/__tests__/official-installer.test.ts index 778b5196e..2d36c19c7 100644 --- a/__tests__/official-installer.test.ts +++ b/__tests__/official-installer.test.ts @@ -825,36 +825,4 @@ describe('setup-node', () => { } ); }); - - describe('corepack flag', () => { - it('use corepack if specified', async () => { - inputs['corepack'] = 'true'; - await main.run(); - expect(getExecOutputSpy).toHaveBeenCalledWith( - 'corepack', - ['enable'], - expect.anything() - ); - }); - - it('use corepack with given package manager', async () => { - inputs['corepack'] = 'npm'; - await main.run(); - expect(getExecOutputSpy).toHaveBeenCalledWith( - 'corepack', - ['enable', 'npm'], - expect.anything() - ); - }); - - it('use corepack with multiple package managers', async () => { - inputs['corepack'] = 'npm yarn'; - await main.run(); - expect(getExecOutputSpy).toHaveBeenCalledWith( - 'corepack', - ['enable', 'npm', 'yarn'], - expect.anything() - ); - }); - }); }); From f9532b258e7ddfc36a3f549c77f42ea4ddc4db64 Mon Sep 17 00:00:00 2001 From: Jacob Parish Date: Tue, 21 Nov 2023 13:46:39 -0600 Subject: [PATCH 3/7] docs: node version --- docs/advanced-usage.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index 0d1ddf4e1..057434c73 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -157,7 +157,7 @@ jobs: ## Nightly versions -You can specify a nightly version to download it from https://nodejs.org/download/nightly. +You can specify a nightly version to download it from https://nodejs.org/download/nightly. ### Install the nightly build for a major version @@ -265,7 +265,7 @@ steps: - run: pnpm test ``` -> **Note**: By default `--frozen-lockfile` option is passed starting from pnpm `6.10.x`. It will be automatically added if you run it on [CI](https://pnpm.io/cli/install#--frozen-lockfile). +> **Note**: By default `--frozen-lockfile` option is passed starting from pnpm `6.10.x`. It will be automatically added if you run it on [CI](https://pnpm.io/cli/install#--frozen-lockfile). > If the `pnpm-lock.yaml` file changes then pass `--frozen-lockfile` option. @@ -425,7 +425,7 @@ steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: '16.x' + node-version: '18.x' corepack: true - name: Install dependencies run: yarn install --immutable @@ -438,7 +438,7 @@ steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: '16.x' + node-version: '18.x' corepack: yarn pnpm - name: Install dependencies run: yarn install --immutable From 28c91a3bbc8c3f744ebc5b02f54ca99d68047620 Mon Sep 17 00:00:00 2001 From: Jacob Parish Date: Tue, 21 Nov 2023 13:47:29 -0600 Subject: [PATCH 4/7] docs: actions versions --- docs/advanced-usage.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index 057434c73..0b2e82aec 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -422,8 +422,8 @@ You can enable [Corepack](https://github.com/nodejs/corepack) by using the `core ```yaml steps: -- uses: actions/checkout@v3 -- uses: actions/setup-node@v3 +- uses: actions/checkout@v4 +- uses: actions/setup-node@v4 with: node-version: '18.x' corepack: true @@ -435,8 +435,8 @@ You can also pass package manager names separated by a space to enable corepack ```yaml steps: -- uses: actions/checkout@v3 -- uses: actions/setup-node@v3 +- uses: actions/checkout@v4 +- uses: actions/setup-node@v4 with: node-version: '18.x' corepack: yarn pnpm From d8a8b93089a020a119d54ba91b6fa4553389aba4 Mon Sep 17 00:00:00 2001 From: Jacob Parish Date: Tue, 21 Nov 2023 13:49:41 -0600 Subject: [PATCH 5/7] docs: remove reference to experimental --- docs/advanced-usage.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/advanced-usage.md b/docs/advanced-usage.md index 0b2e82aec..7739c08cc 100644 --- a/docs/advanced-usage.md +++ b/docs/advanced-usage.md @@ -443,5 +443,3 @@ steps: - name: Install dependencies run: yarn install --immutable ``` - -This option by default is `false` as Corepack is still in experimental phase. From c73bf9098a639e60a138e5caf34368347ba22106 Mon Sep 17 00:00:00 2001 From: Jacob Parish Date: Tue, 6 Feb 2024 09:27:54 -0600 Subject: [PATCH 6/7] fix: pr review adjustments --- __tests__/main.test.ts | 33 +++++++++------------------------ dist/cache-save/index.js | 9 ++++----- dist/setup/index.js | 9 ++++----- src/util.ts | 9 ++++----- 4 files changed, 21 insertions(+), 39 deletions(-) diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts index 41310ab09..97883cff4 100644 --- a/__tests__/main.test.ts +++ b/__tests__/main.test.ts @@ -11,6 +11,7 @@ import each from 'jest-each'; import * as main from '../src/main'; import * as util from '../src/util'; +import * as cacheUtil from '../src/cache-utils'; import OfficialBuilds from '../src/distributions/official_builds/official_builds'; describe('main tests', () => { @@ -25,6 +26,7 @@ describe('main tests', () => { let endGroupSpy: jest.SpyInstance; let getExecOutputSpy: jest.SpyInstance; + let getCommandOutputSpy: jest.SpyInstance; let getNodeVersionFromFileSpy: jest.SpyInstance; let cnSpy: jest.SpyInstance; @@ -56,6 +58,7 @@ describe('main tests', () => { inSpy.mockImplementation(name => inputs[name]); getExecOutputSpy = jest.spyOn(exec, 'getExecOutput'); + getCommandOutputSpy = jest.spyOn(cacheUtil, 'getCommandOutput'); findSpy = jest.spyOn(tc, 'find'); @@ -274,50 +277,32 @@ describe('main tests', () => { it('should not enable corepack when no input', async () => { inputs['corepack'] = ''; await main.run(); - expect(getExecOutputSpy).not.toHaveBeenCalledWith( - 'corepack', - expect.anything(), - expect.anything() - ); + expect(getCommandOutputSpy).not.toHaveBeenCalledWith('corepack'); }); it('should not enable corepack when input is "false"', async () => { inputs['corepack'] = 'false'; await main.run(); - expect(getExecOutputSpy).not.toHaveBeenCalledWith( - 'corepack', - expect.anything(), - expect.anything() - ); + expect(getCommandOutputSpy).not.toHaveBeenCalledWith('corepack'); }); it('should enable corepack when input is "true"', async () => { inputs['corepack'] = 'true'; await main.run(); - expect(getExecOutputSpy).toHaveBeenCalledWith( - 'corepack', - ['enable'], - expect.anything() - ); + expect(getCommandOutputSpy).toHaveBeenCalledWith('corepack enable'); }); it('should enable corepack with a single package manager', async () => { inputs['corepack'] = 'npm'; await main.run(); - expect(getExecOutputSpy).toHaveBeenCalledWith( - 'corepack', - ['enable', 'npm'], - expect.anything() - ); + expect(getCommandOutputSpy).toHaveBeenCalledWith('corepack enable npm'); }); it('should enable corepack with multiple package managers', async () => { inputs['corepack'] = 'npm yarn'; await main.run(); - expect(getExecOutputSpy).toHaveBeenCalledWith( - 'corepack', - ['enable', 'npm', 'yarn'], - expect.anything() + expect(getCommandOutputSpy).toHaveBeenCalledWith( + 'corepack enable npm yarn' ); }); }); diff --git a/dist/cache-save/index.js b/dist/cache-save/index.js index dda290fb4..00385962c 100644 --- a/dist/cache-save/index.js +++ b/dist/cache-save/index.js @@ -83338,6 +83338,7 @@ const core = __importStar(__nccwpck_require__(2186)); const exec = __importStar(__nccwpck_require__(1514)); const fs_1 = __importDefault(__nccwpck_require__(7147)); const path_1 = __importDefault(__nccwpck_require__(1017)); +const cache_utils_1 = __nccwpck_require__(1678); function getNodeVersionFromFile(versionFilePath) { var _a, _b, _c, _d, _e; if (!fs_1.default.existsSync(versionFilePath)) { @@ -83431,15 +83432,13 @@ const unique = () => { exports.unique = unique; function enableCorepack(input) { return __awaiter(this, void 0, void 0, function* () { - const corepackArgs = ['enable']; - if (input.length > 0 && input !== 'false') { + if (input.length && input !== 'false') { + const corepackArgs = ['enable']; if (input !== 'true') { const packageManagers = input.split(' '); corepackArgs.push(...packageManagers); } - yield exec.getExecOutput('corepack', corepackArgs, { - ignoreReturnCode: true - }); + yield (0, cache_utils_1.getCommandOutput)(`corepack ${corepackArgs.join(' ')}`); } }); } diff --git a/dist/setup/index.js b/dist/setup/index.js index 31947abaa..ccc9d2aa9 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -93787,6 +93787,7 @@ const core = __importStar(__nccwpck_require__(2186)); const exec = __importStar(__nccwpck_require__(1514)); const fs_1 = __importDefault(__nccwpck_require__(7147)); const path_1 = __importDefault(__nccwpck_require__(1017)); +const cache_utils_1 = __nccwpck_require__(1678); function getNodeVersionFromFile(versionFilePath) { var _a, _b, _c, _d, _e; if (!fs_1.default.existsSync(versionFilePath)) { @@ -93880,15 +93881,13 @@ const unique = () => { exports.unique = unique; function enableCorepack(input) { return __awaiter(this, void 0, void 0, function* () { - const corepackArgs = ['enable']; - if (input.length > 0 && input !== 'false') { + if (input.length && input !== 'false') { + const corepackArgs = ['enable']; if (input !== 'true') { const packageManagers = input.split(' '); corepackArgs.push(...packageManagers); } - yield exec.getExecOutput('corepack', corepackArgs, { - ignoreReturnCode: true - }); + yield (0, cache_utils_1.getCommandOutput)(`corepack ${corepackArgs.join(' ')}`); } }); } diff --git a/src/util.ts b/src/util.ts index acfab3f6c..00872a103 100644 --- a/src/util.ts +++ b/src/util.ts @@ -3,6 +3,7 @@ import * as exec from '@actions/exec'; import fs from 'fs'; import path from 'path'; +import {getCommandOutput} from './cache-utils'; export function getNodeVersionFromFile(versionFilePath: string): string | null { if (!fs.existsSync(versionFilePath)) { @@ -107,14 +108,12 @@ export const unique = () => { }; export async function enableCorepack(input: string): Promise { - const corepackArgs = ['enable']; - if (input.length > 0 && input !== 'false') { + if (input.length && input !== 'false') { + const corepackArgs = ['enable']; if (input !== 'true') { const packageManagers = input.split(' '); corepackArgs.push(...packageManagers); } - await exec.getExecOutput('corepack', corepackArgs, { - ignoreReturnCode: true - }); + await getCommandOutput(`corepack ${corepackArgs.join(' ')}`); } } From 0c618ceb2e48275dc06e86901822fd966ce75ba2 Mon Sep 17 00:00:00 2001 From: Jacob Parish Date: Tue, 6 Feb 2024 09:46:03 -0600 Subject: [PATCH 7/7] test: added e2e test, improved unit test --- .github/workflows/e2e-cache.yml | 38 +++++++++++++++++++++++++++++++++ __tests__/main.test.ts | 4 ++-- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e-cache.yml b/.github/workflows/e2e-cache.yml index a0f206398..424dcaf47 100644 --- a/.github/workflows/e2e-cache.yml +++ b/.github/workflows/e2e-cache.yml @@ -135,6 +135,44 @@ jobs: run: __tests__/verify-node.sh "${{ matrix.node-version }}" shell: bash + node-yarn4-corepack-dependencies-caching: + name: Test yarn 4 (Node ${{ matrix.node-version}}, ${{ matrix.os }}) + runs-on: ${{ matrix.os }} + env: + YARN_ENABLE_IMMUTABLE_INSTALLS: false + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + node-version: [18, 20] + steps: + - uses: actions/checkout@v4 + - name: Update yarn + run: yarn set version 4.1.0 + - name: Yarn version + run: yarn --version + - name: Generate simple .yarnrc.yml + run: | + echo "nodeLinker: node-modules" >> .yarnrc.yml + - name: Generate yarn file + run: yarn install + - name: Remove dependencies + shell: pwsh + run: Remove-Item node_modules -Force -Recurse + - name: Clean global cache + run: yarn cache clean --all + - name: Setup Node + uses: ./ + with: + node-version: ${{ matrix.node-version }} + cache: 'yarn' + corepack: true + - name: Install dependencies + run: yarn install + - name: Verify node and yarn + run: __tests__/verify-node.sh "${{ matrix.node-version }}" + shell: bash + yarn-subprojects: name: Test yarn subprojects strategy: diff --git a/__tests__/main.test.ts b/__tests__/main.test.ts index 97883cff4..da025ce33 100644 --- a/__tests__/main.test.ts +++ b/__tests__/main.test.ts @@ -277,13 +277,13 @@ describe('main tests', () => { it('should not enable corepack when no input', async () => { inputs['corepack'] = ''; await main.run(); - expect(getCommandOutputSpy).not.toHaveBeenCalledWith('corepack'); + expect(getCommandOutputSpy).not.toHaveBeenCalledWith(expect.stringContaining('corepack')); }); it('should not enable corepack when input is "false"', async () => { inputs['corepack'] = 'false'; await main.run(); - expect(getCommandOutputSpy).not.toHaveBeenCalledWith('corepack'); + expect(getCommandOutputSpy).not.toHaveBeenCalledWith(expect.stringContaining('corepack')); }); it('should enable corepack when input is "true"', async () => {