const execFile = require ( "child_process" ) . execFile ; const macosVersion = require ( "macos-version" ) ; export function runJXACode ( jxaCode ) { return executeInOsa ( jxaCode , [ ] ) ; } export function run < R > ( jxaCodeFunction , ... args ) ; export function run < R , A1 > ( jxaCodeFunction , a1 ) ; export function run < R , A1 , A2 > ( jxaCodeFunction , a1 , a2 ) ; export function run < R , A1 , A2 , A3 > ( jxaCodeFunction , a1 , a2 , a3 ) ; export function run < R , A1 , A2 , A3 , A4 > ( jxaCodeFunction , a1 , a2 , a3 , a4 ) ; export function run < R , A1 , A2 , A3 , A4 , A5 > ( jxaCodeFunction , a1 , a2 , a3 , a4 , a5 ) ; export function run < R , A1 , A2 , A3 , A4 , A5 , A6 > ( jxaCodeFunction , a1 , a2 , a3 , a4 , a5 , a6 ) ; export function run < R , A1 , A2 , A3 , A4 , A5 , A6 , A7 > ( jxaCodeFunction , a1 , a2 , a3 , a4 , a5 , a6 , a7 ) ; export function run < R , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 > ( jxaCodeFunction , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 ) ; export function run < R , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9 > ( jxaCodeFunction , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9 ) ; export function run ( jxaCodeFunction , ... args ) { const code = `
ObjC.import('stdlib');
var args = JSON.parse($.getenv('OSA_ARGS'));
var fn   = (${ jxaCodeFunction . toString ( ) });
var out  = fn.apply(null, args);
JSON.stringify({ result: out });
` ; return executeInOsa ( code , args ) ; } const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100 ; /**
 * execute the `code` in `osascript`
 */ function executeInOsa ( code , args ) { return new Promise ( ( resolve , reject ) => { macosVersion . assertGreaterThanOrEqualTo ( "10.10" ) ; const child = execFile ( "/usr/bin/osascript" , [ "-l" , "JavaScript" ] , { env : { OSA_ARGS : JSON . stringify ( args ) } , maxBuffer : DEFAULT_MAX_BUFFER } , ( err , stdout , stderr ) => { if ( err ) { return reject ( err ) ; } if ( stderr ) { console . error ( stderr ) ; } if ( ! stdout ) { resolve ( undefined ) ; } try { const result = JSON . parse ( stdout . toString ( ) . trim ( ) ) . result ; resolve ( result ) ; } catch ( errorOutput ) { resolve ( stdout . toString ( ) . trim ( ) ) ; } } ) ; child . stdin . write ( code ) ; child . stdin . end ( ) ; } ) ; }