Skip to content

Commit

Permalink
Add support for pnpm (bcomnes#117)
Browse files Browse the repository at this point in the history
  • Loading branch information
kinland committed Sep 29, 2023
1 parent fe72148 commit c177bdc
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 7 deletions.
31 changes: 27 additions & 4 deletions lib/run-task.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
// Requirements
// ------------------------------------------------------------------------------

const fs = require('fs')
const path = require('path')
const parseArgs = require('shell-quote').parse
const createHeader = require('./create-header')
Expand Down Expand Up @@ -128,6 +129,9 @@ function cleanTaskArg (arg) {
* An array of options which are inserted before the task name.
* @param {object} options.labelState - A state object for printing labels.
* @param {boolean} options.printName - The flag to print task names before running each task.
* @param {object} options.packageInfo - A package.json's information.
* @param {object} options.packageInfo.body - A package.json's JSON object.
* @param {string} options.packageInfo.path - A package.json's file path.
* @returns {Promise}
* A promise object which becomes fullfilled when the npm-script is completed.
* This promise object has an extra method: `abort()`.
Expand Down Expand Up @@ -156,12 +160,29 @@ module.exports = function runTask (task, options) {
}

// Execute.
const npmPath = options.npmPath || path.basename(process.env.npm_execpath).startsWith('npx') // eslint-disable-line no-process-env
? path.join(path.dirname(process.env.npm_execpath), path.basename(process.env.npm_execpath).replace('npx', 'npm')) // eslint-disable-line no-process-env
: process.env.npm_execpath // eslint-disable-line no-process-env
let npmPath = options.npmPath
if (!npmPath && process.env.npm_execpath) {
npmPath = path.basename(process.env.npm_execpath).startsWith('npx') // eslint-disable-line no-process-env
? path.join(path.dirname(process.env.npm_execpath), path.basename(process.env.npm_execpath).replace('npx', 'npm')) // eslint-disable-line no-process-env
: process.env.npm_execpath // eslint-disable-line no-process-env
}
const npmPathIsJs = typeof npmPath === 'string' && /\.m?js/.test(path.extname(npmPath))
const execPath = (npmPathIsJs ? process.execPath : npmPath || 'npm')
const npmExecPath = (npmPathIsJs ? process.execPath : npmPath || 'npm')

let isPnpm = false
let pnpmExecPath
if (npmPath === undefined) {
const projectRoot = path.dirname(options.packageInfo.path)
const hasPnpmLockfile = fs.existsSync(path.join(projectRoot, 'pnpm-lock.yaml'))
const { status: pnpmFound, output } = spawn.sync('which', 'pnpm', { silent: true })
isPnpm = hasPnpmLockfile && __dirname.split(path.delimiter).includes('.pnpm') && pnpmFound
if (isPnpm) {
pnpmExecPath = output
}
}

const isYarn = process.env.npm_config_user_agent && process.env.npm_config_user_agent.startsWith('yarn') // eslint-disable-line no-process-env

const spawnArgs = ['run']

if (npmPathIsJs) {
Expand All @@ -174,6 +195,8 @@ module.exports = function runTask (task, options) {
}
Array.prototype.push.apply(spawnArgs, parseArgs(task).map(cleanTaskArg))

const execPath = !isPnpm ? npmExecPath : pnpmExecPath

cp = spawn(execPath, spawnArgs, spawnOptions)

// Piping stdio.
Expand Down
18 changes: 17 additions & 1 deletion lib/spawn-posix.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,25 @@ function kill () {
* @returns {ChildProcess} A ChildProcess instance of new process.
* @private
*/
module.exports = function spawn (command, args, options) {
function spawn (command, args, options) {
const child = crossSpawn(command, args, options)
child.kill = kill

return child
}

/**
* Launches a new process synchronously with the given command.
* This is almost same as `child_process.spawnSync`.
*
* This returns a `SpawnSyncReturns` object.
*
* @param {string} command - The command to run.
* @param {string[]} args - List of string arguments.
* @param {object} options - Options.
* @returns {SpawnSyncReturns} A ChildProcess instance of new process.
* @private
*/
spawn.sync = crossSpawn.sync

module.exports = spawn
18 changes: 17 additions & 1 deletion lib/spawn-win32.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,25 @@ function kill () {
* @returns {ChildProcess} A ChildProcess instance of new process.
* @private
*/
module.exports = function spawn (command, args, options) {
function spawn (command, args, options) {
const child = crossSpawn(command, args, options)
child.kill = kill

return child
}

/**
* Launches a new process synchronously with the given command.
* This is almost same as `child_process.spawnSync`.
*
* This returns a `SpawnSyncReturns` object.
*
* @param {string} command - The command to run.
* @param {string[]} args - List of string arguments.
* @param {object} options - Options.
* @returns {SpawnSyncReturns} A ChildProcess instance of new process.
* @private
*/
spawn.sync = crossSpawn.sync

module.exports = spawn
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "npm-run-all2",
"version": "6.0.6",
"version": "6.0.7",
"description": "A CLI tool to run multiple npm-scripts in parallel or sequential. (Maintainence fork)",
"bin": {
"run-p": "bin/run-p/index.js",
Expand Down

0 comments on commit c177bdc

Please # to comment.