Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 66 additions & 30 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,14 @@ const writeShim = (from, to) =>

const writeShim_ = (from, to, prog, args, variables) => {
let shTarget = relative(dirname(to), from)
shTarget = shTarget.split('\\').join('/')
let target = shTarget.split('/').join('\\')
let pwshTarget = shTarget
let longProg
let shProg = prog && prog.split('\\').join('/')
let shLongProg
let pwshProg = shProg && `"${shProg}$exe"`
let pwshLongProg
shTarget = shTarget.split('\\').join('/')
args = args || ''
variables = variables || ''
if (!prog) {
Expand All @@ -76,12 +77,14 @@ const writeShim_ = (from, to, prog, args, variables) => {
args = ''
target = ''
shTarget = ''
pwshTarget = ''
} else {
longProg = `"%dp0%\\${prog}.exe"`
shLongProg = `"$basedir/${prog}"`
pwshLongProg = `"$basedir/${prog}$exe"`
target = `"%dp0%\\${target}"`
shTarget = `"$basedir/${shTarget}"`
shTarget = `"$basedir_win/${shTarget}"`
pwshTarget = `"$basedir/${pwshTarget}"`
}

// Subroutine trick to fix https://github.com/npm/cmd-shim/issues/10
Expand All @@ -97,7 +100,6 @@ const writeShim_ = (from, to, prog, args, variables) => {

let cmd
if (longProg) {
shLongProg = shLongProg.trim()
args = args.trim()
const variablesBatch = toBatchSyntax.convertToSetCommands(variables)
cmd = head
Expand All @@ -119,43 +121,77 @@ const writeShim_ = (from, to, prog, args, variables) => {
}

// #!/bin/sh
// basedir=`dirname "$0"`
// basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
// basedir_win="$basedir"
//
// case `uname` in
// *CYGWIN*|*MINGW*|*MSYS*)
// if command -v cygpath > /dev/null 2>&1; then
// basedir=`cygpath -w "$basedir"`
// case `uname -a` in
// *CYGWIN*|*MINGW*|*MSYS*)
// if command -v cygpath > /dev/null 2>&1; then
// basedir_win=`cygpath -w "$basedir"`
// fi
// ;;
// *WSL2*)
// if command -v wslpath > /dev/null 2>&1; then
// basedir_win="$(wslpath -w "$basedir" 2> /dev/null)"
// if [ $? -ne 0 ] || [ -z "$basedir_win" ]; then
// echo "Error: wslpath failed to convert path. WSL environment may be misconfigured." >&2
// exit 1
// fi
// ;;
// fi
// ;;
// esac
//
// if [ -x "$basedir/node.exe" ]; then
// exec "$basedir/node.exe" "$basedir/node_modules/npm/bin/npm-cli.js" "$@"
// else
// exec node "$basedir/node_modules/npm/bin/npm-cli.js" "$@"
// PROG_EXE="$basedir/node.exe"
// if ! [ -x "$PROG_EXE" ]; then
// PROG_EXE="$basedir/node"
// if ! [ -x "$PROG_EXE" ]; then
// PROG_EXE=node
// if ! [ -x "$PROG_EXE" ]; then
// PROG_EXE=node.exe
// fi
// fi
// fi
//
// exec "$PROG_EXE" "$basedir_win/node_modules/npm/bin/npm-cli.js" "$@"

let sh = '#!/bin/sh\n'

sh = sh
+ `basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')")\n`
+ 'basedir_win="$basedir"\n'
+ '\n'
+ 'case `uname` in\n'
+ ' *CYGWIN*|*MINGW*|*MSYS*)\n'
+ ' if command -v cygpath > /dev/null 2>&1; then\n'
+ ' basedir=`cygpath -w "$basedir"`\n'
+ ' fi\n'
+ ' ;;\n'
+ 'case `uname -a` in\n'
+ ' *CYGWIN*|*MINGW*|*MSYS*)\n'
+ ' if command -v cygpath > /dev/null 2>&1; then\n'
+ ' basedir_win=`cygpath -w "$basedir"`\n'
+ ' fi\n'
+ ' ;;\n'
+ ' *WSL2*)\n'
+ ' if command -v wslpath > /dev/null 2>&1; then\n'
+ ' basedir_win="$(wslpath -w "$basedir" 2> /dev/null)"\n'
+ ' if [ $? -ne 0 ] || [ -z "$basedir_win" ]; then\n'
+ ' echo "Error: wslpath failed to convert path. WSL environment may be misconfigured." >&2\n'
+ ' exit 1\n'
+ ' fi\n'
+ ' fi\n'
+ ' ;;\n'
+ 'esac\n'
+ '\n'

if (shLongProg) {
sh = sh
+ `if [ -x ${shLongProg} ]; then\n`
+ ` exec ${variables}${shLongProg} ${args} ${shTarget} "$@"\n`
+ 'else \n'
+ ` exec ${variables}${shProg} ${args} ${shTarget} "$@"\n`
+ `PROG_EXE=${shLongProg.replace(/"$/, '.exe"')}\n`
+ 'if ! [ -x "$PROG_EXE" ]; then\n'
+ ` PROG_EXE=${shLongProg}\n`
+ ' if ! [ -x "$PROG_EXE" ]; then\n'
+ ` PROG_EXE=${shProg}\n`
+ ' if ! [ -x "$PROG_EXE" ]; then\n'
+ ` PROG_EXE=${shProg}.exe\n`
+ ' fi\n'
+ ' fi\n'
+ 'fi\n'
+ '\n'
+ `exec ${variables}"$PROG_EXE" ${args} ${shTarget} "$@"\n`
} else {
sh = sh
+ `exec ${shProg} ${args} ${shTarget} "$@"\n`
Expand Down Expand Up @@ -198,23 +234,23 @@ const writeShim_ = (from, to, prog, args, variables) => {
+ ' # are installed in the same directory\n'
+ ' $exe=".exe"\n'
+ '}\n'
if (shLongProg) {
if (pwshLongProg) {
pwsh = pwsh
+ '$ret=0\n'
+ `if (Test-Path ${pwshLongProg}) {\n`
+ ' # Support pipeline input\n'
+ ' if ($MyInvocation.ExpectingInput) {\n'
+ ` $input | & ${pwshLongProg} ${args} ${shTarget} $args\n`
+ ` $input | & ${pwshLongProg} ${args} ${pwshTarget} $args\n`
+ ' } else {\n'
+ ` & ${pwshLongProg} ${args} ${shTarget} $args\n`
+ ` & ${pwshLongProg} ${args} ${pwshTarget} $args\n`
+ ' }\n'
+ ' $ret=$LASTEXITCODE\n'
+ '} else {\n'
+ ' # Support pipeline input\n'
+ ' if ($MyInvocation.ExpectingInput) {\n'
+ ` $input | & ${pwshProg} ${args} ${shTarget} $args\n`
+ ` $input | & ${pwshProg} ${args} ${pwshTarget} $args\n`
+ ' } else {\n'
+ ` & ${pwshProg} ${args} ${shTarget} $args\n`
+ ` & ${pwshProg} ${args} ${pwshTarget} $args\n`
+ ' }\n'
+ ' $ret=$LASTEXITCODE\n'
+ '}\n'
Expand All @@ -223,9 +259,9 @@ const writeShim_ = (from, to, prog, args, variables) => {
pwsh = pwsh
+ '# Support pipeline input\n'
+ 'if ($MyInvocation.ExpectingInput) {\n'
+ ` $input | & ${pwshProg} ${args} ${shTarget} $args\n`
+ ` $input | & ${pwshProg} ${args} ${pwshTarget} $args\n`
+ '} else {\n'
+ ` & ${pwshProg} ${args} ${shTarget} $args\n`
+ ` & ${pwshProg} ${args} ${pwshTarget} $args\n`
+ '}\n'
+ 'exit $LASTEXITCODE\n'
}
Expand Down
Loading
Loading