From b2a483f149c5fa0779ab2c0c85df774e3eadfc2a Mon Sep 17 00:00:00 2001 From: Kinland <16787581+kinland@users.noreply.github.com> Date: Thu, 28 Sep 2023 22:56:59 -0700 Subject: [PATCH] Add tests for pnpm and yarn (#117) --- .github/workflows/test.yml | 19 ++++- .npmrc | 1 + package.json | 12 +-- test/aggregate-output.js | 5 +- test/argument-placeholders.js | 7 +- test/common.js | 11 +-- test/config.js | 9 +-- test/fail.js | 7 +- test/lib/util.js | 33 ++++++++ test/mixed.js | 5 +- test/package-config.js | 142 ++++++++++++++++------------------ test/parallel.js | 7 +- test/pattern.js | 7 +- test/print-label.js | 5 +- test/print-name.js | 5 +- test/sequential.js | 7 +- test/yarn.js | 4 +- 17 files changed, 140 insertions(+), 146 deletions(-) create mode 100644 .npmrc diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4bb5600..d0d6d4d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,6 +14,7 @@ jobs: matrix: os: [ubuntu-latest, windows-latest, macos-latest] node: ['lts/*', 18] + package-manager: ['npm', 'pnpm', 'yarn'] steps: - uses: actions/checkout@v4 @@ -21,8 +22,22 @@ jobs: uses: actions/setup-node@v3 with: node-version: ${{ matrix.node }} - - run: npm i - - run: npm test + - name: Install pnpm + if: ${{ matrix.package-manager == 'pnpm' }} + uses: pnpm/action-setup@v2 + with: + version: 8 + - name: Install dependencies via yarn + if: ${{ matrix.package-manager == 'yarn' }} + uses: bahmutov/npm-install@v1 + with: + useLockFile: false + useYarn: true + install-command: yarn install + - name: Install dependencies + if: ${{ matrix.package-manager != 'yarn' }} + run: ${{ matrix.package-manager }} install + - run: ${{ matrix.package-manager }} run test - uses: codecov/codecov-action@v3 if: ${{ github.event_name == 'pull_request' }} with: diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..6c59086 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +enable-pre-post-scripts=true diff --git a/package.json b/package.json index 404562d..d99d9b2 100644 --- a/package.json +++ b/package.json @@ -22,11 +22,11 @@ "clean": "rm -rf coverage jsdoc \"test-workspace/{build,test.txt}\"", "docs": "jsdoc -c jsdoc.json", "lint": "standard", - "pretest": "node scripts/make-slink.js && npm run lint", - "test": "c8 npm run _mocha", - "watch": "npm run _mocha -- --watch --growl", + "pretest": "node scripts/make-slink.js && yarpm run lint", + "test": "c8 yarpm run _mocha", + "watch": "yarpm run _mocha -- --watch --growl", "version": "auto-changelog -p --template keepachangelog auto-changelog --breaking-pattern 'BREAKING CHANGE:' && git add CHANGELOG.md", - "preversion": "npm test", + "preversion": "yarpm test", "postversion": "git push --follow-tags && gh-release -y" }, "dependencies": { @@ -46,8 +46,10 @@ "jsdoc": "^4.0.0", "mocha": "^10.0.0", "p-queue": "^7.3.4", + "rimraf": "^3.0.2", + "standard": "^17.1.0", "yarn": "^1.12.3", - "standard": "^17.1.0" + "yarpm": "^1.2.0" }, "repository": { "type": "git", diff --git a/test/aggregate-output.js b/test/aggregate-output.js index 0c6f1dd..f216e52 100644 --- a/test/aggregate-output.js +++ b/test/aggregate-output.js @@ -13,10 +13,7 @@ const assert = require('assert').strict const nodeApi = require('../lib') const BufferStream = require('./lib/buffer-stream') -const util = require('./lib/util') -const runAll = util.runAll -const runPar = util.runPar -const runSeq = util.runSeq +const { runAll, runPar, runSeq } = require('./lib/util') // ------------------------------------------------------------------------------ // Test diff --git a/test/argument-placeholders.js b/test/argument-placeholders.js index a193fe3..5fa7788 100644 --- a/test/argument-placeholders.js +++ b/test/argument-placeholders.js @@ -12,12 +12,7 @@ const assert = require('assert').strict const nodeApi = require('../lib') -const util = require('./lib/util') -const result = util.result -const removeResult = util.removeResult -const runAll = util.runAll -const runPar = util.runPar -const runSeq = util.runSeq +const { it, result, removeResult, runAll, runPar, runSeq } = require('./lib/util') // ------------------------------------------------------------------------------ // Test diff --git a/test/common.js b/test/common.js index 781e2bf..467ca19 100644 --- a/test/common.js +++ b/test/common.js @@ -13,12 +13,7 @@ const assert = require('assert').strict const nodeApi = require('../lib') const BufferStream = require('./lib/buffer-stream') -const util = require('./lib/util') -const result = util.result -const removeResult = util.removeResult -const runAll = util.runAll -const runPar = util.runPar -const runSeq = util.runSeq +const { describe, isPnpm, result, removeResult, runAll, runPar, runSeq } = require('./lib/util') // ------------------------------------------------------------------------------ // Test @@ -221,14 +216,14 @@ describe('[common]', () => { }) }) - describe('should be able to use `restart` built-in task:', () => { + describe.npmOnly('should be able to use `restart` built-in task:', () => { it('Node API', () => nodeApi('restart')) it('npm-run-all command', () => runAll(['restart'])) it('run-s command', () => runSeq(['restart'])) it('run-p command', () => runPar(['restart'])) }) - describe('should be able to use `env` built-in task:', () => { + describe.skip.if(isPnpm())('should be able to use `env` built-in task:', () => { it('Node API', () => nodeApi('env')) it('npm-run-all command', () => runAll(['env'])) it('run-s command', () => runSeq(['env'])) diff --git a/test/config.js b/test/config.js index 66fafa9..7284f5c 100644 --- a/test/config.js +++ b/test/config.js @@ -12,18 +12,13 @@ const assert = require('assert').strict const nodeApi = require('../lib') -const util = require('./lib/util') -const result = util.result -const removeResult = util.removeResult -const runAll = util.runAll -const runPar = util.runPar -const runSeq = util.runSeq +const { describe, isPnpm, result, removeResult, runAll, runPar, runSeq } = require('./lib/util') // ------------------------------------------------------------------------------ // Test // ------------------------------------------------------------------------------ -describe('[config] it should have an ability to set config variables:', () => { +describe.skip.if(isPnpm())('[config] it should have an ability to set config variables:', () => { before(() => process.chdir('test-workspace')) after(() => process.chdir('..')) diff --git a/test/fail.js b/test/fail.js index 9d33be9..d86aec9 100644 --- a/test/fail.js +++ b/test/fail.js @@ -12,12 +12,7 @@ const assert = require('assert').strict const nodeApi = require('../lib') -const util = require('./lib/util') -const delay = util.delay -const removeResult = util.removeResult -const runAll = util.runAll -const runPar = util.runPar -const runSeq = util.runSeq +const { delay, removeResult, runAll, runPar, runSeq } = require('./lib/util') // ------------------------------------------------------------------------------ // Helpers diff --git a/test/lib/util.js b/test/lib/util.js index be115bb..004b3b0 100644 --- a/test/lib/util.js +++ b/test/lib/util.js @@ -1,3 +1,4 @@ +/* eslint-env mocha */ /** * @author Toru Nagashima * @copyright 2016 Toru Nagashima. All rights reserved. @@ -9,6 +10,7 @@ // Requirements // ------------------------------------------------------------------------------ +const { describe, it } = require('mocha') const cp = require('child_process') const fs = require('fs') const path = require('path') @@ -23,6 +25,37 @@ const NPM_RUN_ALL = path.resolve(__dirname, '../../bin/npm-run-all/index.js') const RUN_P = path.resolve(__dirname, '../../bin/run-p/index.js') const RUN_S = path.resolve(__dirname, '../../bin/run-s/index.js') +/** + * Determines whether we are running in npm, pnpm, or yarn + */ +function getPackageManagerName () { + const npmPath = process.env.npm_execpath + if (npmPath) { + const basename = path.basename(npmPath) + if (['npm', 'npx'].some(cmd => basename.startsWith(cmd))) { + return 'npm' + } else if (['pnpm', 'pnpx'].some(cmd => basename.startsWith(cmd))) { + return 'pnpm' + } else if (basename.startsWith('yarn')) { + return 'yarn' + } + } + throw new Error('Unable to determine what package manager is in use') +} + +// Augment mocha's describe and it with 'skip' and 'npmOnly' +const isNpm = () => getPackageManagerName() === 'npm' +describe.npmOnly = isNpm() ? it : it.skip +describe.skip.if = (condition) => condition ? describe.skip : describe +it.npmOnly = isNpm() ? describe : describe.skip +it.skip.if = (condition) => condition ? it.skip : it +module.exports.getPackageManagerName = getPackageManagerName +module.exports.isNpm = isNpm +module.exports.isPnpm = () => getPackageManagerName() === 'pnpm' +module.exports.isYarn = () => getPackageManagerName() === 'yarn' +module.exports.describe = describe +module.exports.it = it + /** * Spawns the given script with the given arguments. * diff --git a/test/mixed.js b/test/mixed.js index 402d60d..8be346f 100644 --- a/test/mixed.js +++ b/test/mixed.js @@ -11,10 +11,7 @@ // ------------------------------------------------------------------------------ const assert = require('assert').strict -const util = require('./lib/util') -const result = util.result -const removeResult = util.removeResult -const runAll = util.runAll +const { result, removeResult, runAll } = require('./lib/util') // ------------------------------------------------------------------------------ // Test diff --git a/test/package-config.js b/test/package-config.js index 15c0a25..0b95417 100644 --- a/test/package-config.js +++ b/test/package-config.js @@ -13,104 +13,96 @@ const { execSync } = require('child_process') const assert = require('assert').strict const nodeApi = require('../lib') -const util = require('./lib/util') -const result = util.result -const removeResult = util.removeResult -const runAll = util.runAll -const runPar = util.runPar -const runSeq = util.runSeq +const { isNpm, it, result, removeResult, runAll, runPar, runSeq } = require('./lib/util') // ------------------------------------------------------------------------------ // Test // ------------------------------------------------------------------------------ -describe("[package-config] it should have an ability to overwrite package's config:", () => { +const [major] = execSync('yarpm --version', { encoding: 'utf8' }).trim().split('.') +const supportsOverrides = major <= 6 && !isNpm() + +it.skip.if(!supportsOverrides)("[package-config] it should have an ability to overwrite package's config:", () => { before(() => process.chdir('test-workspace')) after(() => process.chdir('..')) beforeEach(removeResult) - const [major] = execSync('npm --version', { encoding: 'utf8' }).trim().split('.') + it('Node API should address "packageConfig" option', async () => { + await nodeApi('test-task:package-config', { packageConfig: { 'npm-run-all-test': { test: 'OVERWRITTEN' } } }) + assert.equal(result(), 'OVERWRITTEN') + }) + + it('Node API should address "packageConfig" option for multiple variables', async () => { + await nodeApi('test-task:package-config2', { packageConfig: { 'npm-run-all-test': { test: '1', test2: '2', test3: '3' } } }) + assert.equal(result(), '1\n2\n3') + }) + + describe('CLI commands should address "--a:b=c" style options', () => { + it('npm-run-all command', async () => { + await runAll(['test-task:package-config', '--npm-run-all-test:test=OVERWRITTEN']) + assert.equal(result(), 'OVERWRITTEN') + }) - const supportsOverrides = major <= 6 + it('run-s command', async () => { + await runSeq(['test-task:package-config', '--npm-run-all-test:test=OVERWRITTEN']) + assert.equal(result(), 'OVERWRITTEN') + }) - if (supportsOverrides) { - it('Node API should address "packageConfig" option', async () => { - await nodeApi('test-task:package-config', { packageConfig: { 'npm-run-all-test': { test: 'OVERWRITTEN' } } }) + it('run-p command', async () => { + await runPar(['test-task:package-config', '--npm-run-all-test:test=OVERWRITTEN']) assert.equal(result(), 'OVERWRITTEN') }) + }) - it('Node API should address "packageConfig" option for multiple variables', async () => { - await nodeApi('test-task:package-config2', { packageConfig: { 'npm-run-all-test': { test: '1', test2: '2', test3: '3' } } }) + describe('CLI commands should address "--a:b=c" style options for multiple variables', () => { + it('npm-run-all command', async () => { + await runAll(['test-task:package-config2', '--npm-run-all-test:test=1', '--npm-run-all-test:test2=2', '--npm-run-all-test:test3=3']) assert.equal(result(), '1\n2\n3') }) - describe('CLI commands should address "--a:b=c" style options', () => { - it('npm-run-all command', async () => { - await runAll(['test-task:package-config', '--npm-run-all-test:test=OVERWRITTEN']) - assert.equal(result(), 'OVERWRITTEN') - }) - - it('run-s command', async () => { - await runSeq(['test-task:package-config', '--npm-run-all-test:test=OVERWRITTEN']) - assert.equal(result(), 'OVERWRITTEN') - }) - - it('run-p command', async () => { - await runPar(['test-task:package-config', '--npm-run-all-test:test=OVERWRITTEN']) - assert.equal(result(), 'OVERWRITTEN') - }) + it('run-s command', async () => { + await runSeq(['test-task:package-config2', '--npm-run-all-test:test=1', '--npm-run-all-test:test2=2', '--npm-run-all-test:test3=3']) + assert.equal(result(), '1\n2\n3') }) - describe('CLI commands should address "--a:b=c" style options for multiple variables', () => { - it('npm-run-all command', async () => { - await runAll(['test-task:package-config2', '--npm-run-all-test:test=1', '--npm-run-all-test:test2=2', '--npm-run-all-test:test3=3']) - assert.equal(result(), '1\n2\n3') - }) - - it('run-s command', async () => { - await runSeq(['test-task:package-config2', '--npm-run-all-test:test=1', '--npm-run-all-test:test2=2', '--npm-run-all-test:test3=3']) - assert.equal(result(), '1\n2\n3') - }) - - it('run-p command', async () => { - await runPar(['test-task:package-config2', '--npm-run-all-test:test=1', '--npm-run-all-test:test2=2', '--npm-run-all-test:test3=3']) - assert.equal(result(), '1\n2\n3') - }) + it('run-p command', async () => { + await runPar(['test-task:package-config2', '--npm-run-all-test:test=1', '--npm-run-all-test:test2=2', '--npm-run-all-test:test3=3']) + assert.equal(result(), '1\n2\n3') }) + }) - describe('CLI commands should address "--a:b c" style options', () => { - it('npm-run-all command', async () => { - await runAll(['test-task:package-config', '--npm-run-all-test:test', 'OVERWRITTEN']) - assert.equal(result(), 'OVERWRITTEN') - }) - - it('run-s command', async () => { - await runSeq(['test-task:package-config', '--npm-run-all-test:test', 'OVERWRITTEN']) - assert.equal(result(), 'OVERWRITTEN') - }) - - it('run-p command', async () => { - await runPar(['test-task:package-config', '--npm-run-all-test:test', 'OVERWRITTEN']) - assert.equal(result(), 'OVERWRITTEN') - }) + describe('CLI commands should address "--a:b c" style options', () => { + it('npm-run-all command', async () => { + await runAll(['test-task:package-config', '--npm-run-all-test:test', 'OVERWRITTEN']) + assert.equal(result(), 'OVERWRITTEN') }) - describe('CLI commands should transfar overriting nested commands.', () => { - it('npm-run-all command', async () => { - await runAll(['test-task:nested-package-config', '--npm-run-all-test:test', 'OVERWRITTEN']) - assert.equal(result(), 'OVERWRITTEN') - }) - - it('run-s command', async () => { - await runSeq(['test-task:nested-package-config', '--npm-run-all-test:test', 'OVERWRITTEN']) - assert.equal(result(), 'OVERWRITTEN') - }) - - it('run-p command', async () => { - await runPar(['test-task:nested-package-config', '--npm-run-all-test:test', 'OVERWRITTEN']) - assert.equal(result(), 'OVERWRITTEN') - }) + it('run-s command', async () => { + await runSeq(['test-task:package-config', '--npm-run-all-test:test', 'OVERWRITTEN']) + assert.equal(result(), 'OVERWRITTEN') + }) + + it('run-p command', async () => { + await runPar(['test-task:package-config', '--npm-run-all-test:test', 'OVERWRITTEN']) + assert.equal(result(), 'OVERWRITTEN') + }) + }) + + describe('CLI commands should transfar overriting nested commands.', () => { + it('npm-run-all command', async () => { + await runAll(['test-task:nested-package-config', '--npm-run-all-test:test', 'OVERWRITTEN']) + assert.equal(result(), 'OVERWRITTEN') + }) + + it('run-s command', async () => { + await runSeq(['test-task:nested-package-config', '--npm-run-all-test:test', 'OVERWRITTEN']) + assert.equal(result(), 'OVERWRITTEN') + }) + + it('run-p command', async () => { + await runPar(['test-task:nested-package-config', '--npm-run-all-test:test', 'OVERWRITTEN']) + assert.equal(result(), 'OVERWRITTEN') }) - } + }) }) diff --git a/test/parallel.js b/test/parallel.js index ec226be..d86222c 100644 --- a/test/parallel.js +++ b/test/parallel.js @@ -13,12 +13,7 @@ const assert = require('assert').strict const nodeApi = require('../lib') const spawnWithKill = require('./lib/spawn-with-kill') -const util = require('./lib/util') -const delay = util.delay -const result = util.result -const removeResult = util.removeResult -const runAll = util.runAll -const runPar = util.runPar +const { delay, result, removeResult, runAll, runPar } = require('./lib/util') // ------------------------------------------------------------------------------ // Test diff --git a/test/pattern.js b/test/pattern.js index 7409fa0..cddd1bf 100644 --- a/test/pattern.js +++ b/test/pattern.js @@ -13,12 +13,7 @@ const assert = require('assert').strict const nodeApi = require('../lib') const BufferStream = require('./lib/buffer-stream') -const util = require('./lib/util') -const result = util.result -const removeResult = util.removeResult -const runAll = util.runAll -const runPar = util.runPar -const runSeq = util.runSeq +const { result, removeResult, runAll, runPar, runSeq } = require('./lib/util') // ------------------------------------------------------------------------------ // Test diff --git a/test/print-label.js b/test/print-label.js index 9fb5b9f..996e0b1 100644 --- a/test/print-label.js +++ b/test/print-label.js @@ -13,10 +13,7 @@ const assert = require('assert').strict const nodeApi = require('../lib') const BufferStream = require('./lib/buffer-stream') -const util = require('./lib/util') -const runAll = util.runAll -const runPar = util.runPar -const runSeq = util.runSeq +const { runAll, runPar, runSeq } = require('./lib/util') // ------------------------------------------------------------------------------ // Test diff --git a/test/print-name.js b/test/print-name.js index 19a869c..53e1edd 100644 --- a/test/print-name.js +++ b/test/print-name.js @@ -15,11 +15,8 @@ const nodeApi = require('../lib') const createHeader = require('../lib/create-header') const readPackageJson = require('../lib/read-package-json') const BufferStream = require('./lib/buffer-stream') -const util = require('./lib/util') +const { runAll, runPar, runSeq } = require('./lib/util') const ansiStylesPromise = import('ansi-styles') -const runAll = util.runAll -const runPar = util.runPar -const runSeq = util.runSeq // ------------------------------------------------------------------------------ // Test diff --git a/test/sequential.js b/test/sequential.js index a184692..eabe886 100644 --- a/test/sequential.js +++ b/test/sequential.js @@ -13,12 +13,7 @@ const assert = require('assert').strict const nodeApi = require('../lib') const spawnWithKill = require('./lib/spawn-with-kill') -const util = require('./lib/util') -const delay = util.delay -const result = util.result -const removeResult = util.removeResult -const runAll = util.runAll -const runSeq = util.runSeq +const { delay, result, removeResult, runAll, runSeq } = require('./lib/util') // ------------------------------------------------------------------------------ // Test diff --git a/test/yarn.js b/test/yarn.js index 177b3bb..8663d28 100644 --- a/test/yarn.js +++ b/test/yarn.js @@ -13,9 +13,7 @@ const assert = require('assert').strict const spawn = require('cross-spawn') const BufferStream = require('./lib/buffer-stream') -const util = require('./lib/util') -const result = util.result -const removeResult = util.removeResult +const { result, removeResult } = require('./lib/util') // ------------------------------------------------------------------------------ // Helpers