@@ -63,7 +63,7 @@ export function printUsage() {
63
63
--shell=<path> custom shell binary
64
64
--prefix=<command> prefix all commands
65
65
--postfix=<command> postfix all commands
66
- --prefer-local, -l prefer locally installed packages bins
66
+ --prefer-local, -l prefer locally installed packages and binaries
67
67
--cwd=<path> set current directory
68
68
--eval=<js>, -e evaluate script
69
69
--ext=<.mjs> script extension
@@ -81,8 +81,10 @@ export function printUsage() {
81
81
82
82
// prettier-ignore
83
83
export const argv : minimist . ParsedArgs = parseArgv ( process . argv . slice ( 2 ) , {
84
+ default : { [ 'prefer-local' ] : false } ,
85
+ // exclude 'prefer-local' to let minimist infer the type
84
86
string : [ 'shell' , 'prefix' , 'postfix' , 'eval' , 'cwd' , 'ext' , 'registry' , 'env' ] ,
85
- boolean : [ 'version' , 'help' , 'quiet' , 'verbose' , 'install' , 'repl' , 'experimental' , 'prefer-local' ] ,
87
+ boolean : [ 'version' , 'help' , 'quiet' , 'verbose' , 'install' , 'repl' , 'experimental' ] ,
86
88
alias : { e : 'eval' , i : 'install' , v : 'version' , h : 'help' , l : 'prefer-local' , 'env-file' : 'env' } ,
87
89
stopEarly : true ,
88
90
parseBoolean : true ,
@@ -126,19 +128,22 @@ async function runScript(
126
128
scriptPath : string ,
127
129
tempPath : string
128
130
) : Promise < void > {
129
- const rmTemp = ( ) => fs . rmSync ( tempPath , { force : true } )
131
+ let nm = ''
132
+ const rmTemp = ( ) => {
133
+ fs . rmSync ( tempPath , { force : true , recursive : true } )
134
+ nm && fs . rmSync ( nm , { force : true , recursive : true } )
135
+ }
130
136
try {
131
137
if ( tempPath ) {
132
138
scriptPath = tempPath
133
139
await fs . writeFile ( tempPath , script )
134
140
}
135
-
141
+ const cwd = path . dirname ( scriptPath )
142
+ if ( typeof argv . preferLocal === 'string' ) {
143
+ nm = linkNodeModules ( cwd , argv . preferLocal )
144
+ }
136
145
if ( argv . install ) {
137
- await installDeps (
138
- parseDeps ( script ) ,
139
- path . dirname ( scriptPath ) ,
140
- argv . registry
141
- )
146
+ await installDeps ( parseDeps ( script ) , cwd , argv . registry )
142
147
}
143
148
144
149
injectGlobalRequire ( scriptPath )
@@ -151,6 +156,20 @@ async function runScript(
151
156
}
152
157
}
153
158
159
+ function linkNodeModules ( cwd : string , external : string ) : string {
160
+ const nm = 'node_modules'
161
+ const alias = path . resolve ( cwd , nm )
162
+ const target =
163
+ path . basename ( external ) === nm
164
+ ? path . resolve ( external )
165
+ : path . resolve ( external , nm )
166
+
167
+ if ( fs . existsSync ( alias ) || ! fs . existsSync ( target ) ) return ''
168
+
169
+ fs . symlinkSync ( target , alias , 'junction' )
170
+ return target
171
+ }
172
+
154
173
async function readScript ( ) {
155
174
const [ firstArg ] = argv . _
156
175
let script = ''
0 commit comments