@@ -107,6 +107,10 @@ func resolvePackageInContext(mgr string, cwd string, packageName string, global
107
107
}
108
108
}
109
109
110
+ if mgr == "bun" {
111
+ return nil , fmt .Errorf ("bun does not support package resolution" )
112
+ }
113
+
110
114
stdout := bytes .NewBuffer (nil )
111
115
var cmd * exec.Cmd
112
116
if global {
@@ -241,6 +245,17 @@ func (p *Package) ResolveImport(mgr string, imp string) (path string, err error)
241
245
func (pkg * Package ) TryEscapeScript (mgr string , scriptName string ) (executable string , arguments []string ) {
242
246
script := pkg .Scripts [scriptName ]
243
247
248
+ // Apply fallbacks
249
+ engine := "node"
250
+ if mgr == "bun" {
251
+ engine = "bun"
252
+ executable = "bun"
253
+ arguments = []string {"run" , scriptName }
254
+ } else {
255
+ executable = mgr
256
+ arguments = []string {"run" , "-s" , scriptName }
257
+ }
258
+
244
259
// If known script with no shell-like characters:
245
260
if script != "" && ! strings .Contains (script , "&" ) && ! strings .Contains (script , "|" ) && ! strings .Contains (script , ">" ) {
246
261
// If we successfully split the script:
@@ -249,39 +264,56 @@ func (pkg *Package) TryEscapeScript(mgr string, scriptName string) (executable s
249
264
cmd := parts [0 ]
250
265
var importedScript string
251
266
var executedScript string
267
+
252
268
switch cmd {
269
+ case "node" , "nodejs" , "deno" , "bun" :
270
+ // enforce engine
271
+ return engine , parts [1 :]
253
272
case "tsx" :
254
273
importedScript = "tsx"
274
+ if mgr == "bun" {
275
+ return // Not necessary as bun can run TypeScript directly
276
+ }
255
277
case "tsc" :
256
- importedScript = "typescript"
278
+ executedScript = "typescript"
257
279
case "ts-node" :
258
280
importedScript = "ts-node"
281
+ if mgr == "bun" {
282
+ return // Not necessary as bun can run TypeScript directly
283
+ }
259
284
case "ts-node-esm" :
260
285
importedScript = "ts-node/esm"
286
+ if mgr == "bun" {
287
+ return // Not necessary as bun can run TypeScript directly
288
+ }
261
289
case "vite" :
262
290
executedScript = "vite/$bin/vite"
263
291
}
292
+
264
293
// If we have a known script, try to run it with node
265
294
if importedScript != "" || executedScript != "" {
266
- _ , err := exec .LookPath ("node" )
295
+ // Bun does not support --import
296
+ if importedScript != "" {
297
+ return
298
+ }
299
+ _ , err := exec .LookPath (engine )
267
300
if err != nil {
268
- return mgr , [] string { "run" , "-s" , scriptName }
301
+ return
269
302
}
270
303
271
- scriptName = cmp .Or (executedScript , importedScript )
272
- if p , err := pkg .ResolveImport (mgr , scriptName ); err == nil {
304
+ resolvedScriptName : = cmp .Or (executedScript , importedScript )
305
+ if p , err := pkg .ResolveImport (mgr , resolvedScriptName ); err == nil {
273
306
var args []string
274
307
if importedScript != "" {
275
- args = []string {
276
- "--experimental-specifier-resolution=node" ,
277
- "--import" ,
278
- "file://" + p ,
308
+ if engine == "node" {
309
+ args = []string {"--experimental-specifier-resolution=node" }
279
310
}
311
+ args = append (args , "--import" , "file://" + p )
280
312
} else {
281
313
args = []string {p }
282
314
}
283
315
args = append (args , parts [1 :]... )
284
- return "node" , args
316
+ return engine , args
285
317
}
286
318
}
287
319
@@ -293,7 +325,7 @@ func (pkg *Package) TryEscapeScript(mgr string, scriptName string) (executable s
293
325
}
294
326
295
327
// Fallback to running the script with the package manager
296
- return mgr , [] string { "run" , "-s" , scriptName }
328
+ return
297
329
}
298
330
299
331
func ResolveGlobalPackage (mgr string , pkg string ) (p * Package , err error ) {
0 commit comments