11import  fs  from  "node:fs" ; 
2- import  {  $  }  from  "execa" ; 
2+ import  {  $ ,   execa  }  from  "execa" ; 
33import  {  assert  }  from  "@std/assert" ; 
4+ import  {  additionalFiles  }  from  "@trigger.dev/build/extensions/core" ; 
45import  {  BuildManifest  }  from  "@trigger.dev/core/v3" ; 
56import  {  BuildContext ,  BuildExtension  }  from  "@trigger.dev/core/v3/build" ; 
67import  {  logger  }  from  "@trigger.dev/sdk/v3" ; 
@@ -18,6 +19,13 @@ export type PythonOptions = {
1819   * Example: `/usr/bin/python3` or `C:\\Python39\\python.exe` 
1920   */ 
2021  pythonBinaryPath ?: string ; 
22+   /** 
23+    * An array of glob patterns that specify which Python scripts are allowed to be executed. 
24+    * 
25+    * @remarks  
26+    * These scripts will be copied to the container during the build process. 
27+    */ 
28+   scripts ?: string [ ] ; 
2129} ; 
2230
2331const  splitAndCleanComments  =  ( str : string )  => 
@@ -47,6 +55,10 @@ class PythonExtension implements BuildExtension {
4755  } 
4856
4957  async  onBuildComplete ( context : BuildContext ,  manifest : BuildManifest )  { 
58+     await  additionalFiles ( { 
59+       files : this . options . scripts  ??  [ ] , 
60+     } ) . onBuildComplete ! ( context ,  manifest ) ; 
61+ 
5062    if  ( context . target  ===  "dev" )  { 
5163      if  ( this . options . pythonBinaryPath )  { 
5264        process . env . PYTHON_BIN_PATH  =  this . options . pythonBinaryPath ; 
@@ -110,10 +122,11 @@ export const run = async (scriptArgs: string[] = [], options: Parameters<typeof
110122    options 
111123  ) ; 
112124
113-   const  result  =  await  $ ( { 
125+   const  result  =  await  execa ( { 
114126    shell : true , 
127+     verbose : ( verboseLine ,  verboseObject )  =>  logger . debug ( verboseLine ,  verboseObject ) , 
115128    ...options , 
116-   } ) ( pythonBin ,  ... scriptArgs ) ; 
129+   } ) ( pythonBin ,  scriptArgs ) ; 
117130
118131  try  { 
119132    assert ( ! result . failed ,  `Command failed: ${ result . stderr }  ` ) ; 
@@ -126,9 +139,21 @@ export const run = async (scriptArgs: string[] = [], options: Parameters<typeof
126139  return  result ; 
127140} ; 
128141
142+ export  const  runScript  =  ( 
143+   scriptPath : string , 
144+   scriptArgs : string [ ]  =  [ ] , 
145+   options : Parameters < typeof  $ > [ 1 ]  =  { } 
146+ )  =>  { 
147+   assert ( scriptPath ,  "Script path is required" ) ; 
148+   assert ( fs . existsSync ( scriptPath ) ,  `Script does not exist: ${ scriptPath }  ` ) ; 
149+ 
150+   return  run ( [ scriptPath ,  ...scriptArgs ] ,  options ) ; 
151+ } ; 
152+ 
129153export  const  runInline  =  ( scriptContent : string ,  options : Parameters < typeof  $ > [ 1 ]  =  { } )  =>  { 
130154  assert ( scriptContent ,  "Script content is required" ) ; 
155+ 
131156  return  run ( [ "" ] ,  {  input : scriptContent ,  ...options  } ) ; 
132157} ; 
133158
134- export  default  {  run,  runInline } ; 
159+ export  default  {  run,  runScript ,   runInline } ; 
0 commit comments