just-bash 2.15.0-executor.0 → 2.15.1-executor.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,97 +0,0 @@
1
- #!/usr/bin/env node
2
- import{a as F,b as P}from"./chunk-MNMRGJJM.js";import"./chunk-4OALHZXB.js";import"./chunk-MY5PY2PL.js";import"./chunk-LIYVQA3X.js";import{a as v,b as T}from"./chunk-OOJCYVYF.js";import{a as M}from"./chunk-4PRVMER6.js";import{b as B}from"./chunk-YU6OGPZR.js";import{a as O,b as S}from"./chunk-RLNOQILG.js";import{a as E}from"./chunk-4VDEBYW7.js";import{b as L}from"./chunk-GTNBSMZR.js";import"./chunk-KGOUQS5A.js";import{AsyncLocalStorage as N}from"node:async_hooks";import{randomBytes as q}from"node:crypto";import{fileURLToPath as D}from"node:url";import{Worker as z}from"node:worker_threads";var _=1e4,I=6e4,W=new N,J=`js-exec - Sandboxed JavaScript/TypeScript runtime with Node.js-compatible APIs
3
-
4
- Usage: js-exec [OPTIONS] [-c CODE | FILE] [ARGS...]
5
-
6
- Options:
7
- -c CODE Execute inline code
8
- -m, --module Enable ES module mode (import/export)
9
- --strip-types Strip TypeScript type annotations
10
- --version, -V Show version
11
- --help Show this help
12
-
13
- Examples:
14
- js-exec -c "console.log(1 + 2)"
15
- js-exec script.js
16
- js-exec app.ts
17
- echo 'console.log("hello")' | js-exec
18
-
19
- File Extension Auto-Detection:
20
- .js script mode (module mode if top-level await detected)
21
- .mjs ES module mode
22
- .ts, .mts ES module mode + TypeScript stripping
23
-
24
- Node.js Compatibility:
25
- Code written for Node.js largely works here. Both require and import
26
- are supported, the node: prefix works, and standard globals like process,
27
- console, and fetch are available. All I/O is synchronous.
28
-
29
- Available modules:
30
- fs, path, child_process, process, console,
31
- os, url, assert, util, events, buffer, stream,
32
- string_decoder, querystring
33
-
34
- fs (global, require('fs'), or import from 'node:fs'):
35
- readFileSync, writeFileSync, appendFileSync, copyFileSync, renameSync
36
- readdirSync, mkdirSync, rmSync, unlinkSync, rmdirSync
37
- statSync, lstatSync, existsSync, realpathSync, chmodSync
38
- symlinkSync, readlinkSync, readFileBuffer
39
- fs.promises.readFile, fs.promises.writeFile, fs.promises.access, ...
40
-
41
- path: join, resolve, dirname, basename, extname, normalize,
42
- relative, isAbsolute, parse, format, sep, delimiter
43
-
44
- child_process:
45
- execSync(cmd) throws on non-zero exit, returns stdout
46
- spawnSync(cmd, args) returns { stdout, stderr, status }
47
-
48
- process (also global): argv, cwd(), exit(), env, platform, arch,
49
- version, versions
50
-
51
- os: platform(), arch(), homedir(), tmpdir(), type(), hostname(),
52
- EOL, cpus(), endianness()
53
-
54
- url: URL, URLSearchParams, parse(), format()
55
-
56
- assert: ok(), equal(), strictEqual(), deepEqual(), throws(),
57
- doesNotThrow(), fail()
58
-
59
- util: format(), inspect(), promisify(), types, inherits()
60
-
61
- events: EventEmitter (on, once, emit, off, removeListener, ...)
62
-
63
- buffer: Buffer.from(), Buffer.alloc(), Buffer.concat(),
64
- Buffer.isBuffer(), toString(), slice(), equals()
65
-
66
- stream: Readable, Writable, Duplex, Transform, PassThrough, pipeline
67
-
68
- string_decoder: StringDecoder (write, end)
69
-
70
- querystring: parse(), stringify(), escape(), unescape()
71
-
72
- Other Globals:
73
- console log (stdout), error/warn (stderr)
74
- fetch(url, opts) HTTP; returns Promise<Response> (Web Fetch API)
75
- URL, URLSearchParams, Headers, Request, Response
76
- Buffer Buffer.from(), Buffer.alloc(), etc.
77
-
78
- Not Available:
79
- http, https, net, tls, crypto, zlib, dns, cluster, worker_threads,
80
- vm, v8, readline, and other Node.js built-in modules that require
81
- native bindings. Use fetch() for HTTP requests.
82
-
83
- Limits:
84
- Memory: 64 MB per execution
85
- Timeout: 10 s (60 s with network; configurable via maxJsTimeoutMs)
86
- Engine: QuickJS (compiled to WebAssembly)
87
- `;function $(t){let e={code:null,scriptFile:null,showVersion:!1,scriptArgs:[],isModule:!1,stripTypes:!1};if(t.length===0)return e;for(let r=0;r<t.length;r++){let s=t[r];if(s==="-m"||s==="--module"){e.isModule=!0;continue}if(s==="--strip-types"){e.stripTypes=!0;continue}if(s==="-c")return r+1>=t.length?{stdout:"",stderr:`js-exec: option requires an argument -- 'c'
88
- `,exitCode:2}:(e.code=t[r+1],e.scriptArgs=t.slice(r+2),e);if(s==="--version"||s==="-V")return e.showVersion=!0,e;if(s.startsWith("-")&&s!=="-"&&s!=="--")return{stdout:"",stderr:`js-exec: unrecognized option '${s}'
89
- `,exitCode:2};if(s==="--")return r+1<t.length&&(e.scriptFile=t[r+1],e.scriptArgs=t.slice(r+2)),e;if(!s.startsWith("-"))return e.scriptFile=s,e.scriptArgs=t.slice(r+1),e}return e}var i=null,j=null,l=[],o=null,V=D(new URL("./worker.js",import.meta.url));function h(){for(;l.length>0&&l[0].canceled;)l.shift();if(o||l.length===0)return;let t=l.shift();if(!t)return;o=t,G().postMessage(o.input)}function Q(t,e){if(!t||typeof t!="object")return{success:!1,error:"Malformed worker response"};let r=t;return typeof r.protocolToken!="string"||r.protocolToken!==e?{success:!1,error:"Malformed worker response: invalid protocol token"}:typeof r.success!="boolean"?{success:!1,error:"Malformed worker response: missing success flag"}:r.success?{success:!0}:{success:!1,error:typeof r.error=="string"&&r.error.length>0?r.error:"Worker execution failed"}}function G(){if(j&&(T(j),j=null),i)return i;let t=B.runTrusted(()=>new z(V));return i=t,t.on("message",e=>{if(i===t){if(o){let r=Q(e,o.input.protocolToken);o.resolve(r),o=null}l.length>0?h():K()}}),t.on("error",e=>{if(i===t){if(o){let r=S(E(e));o.resolve({success:!1,error:r}),o=null}for(let r of l)r.resolve({success:!1,error:"Worker crashed"});l.length=0,i=null}}),t.on("exit",()=>{i===t&&(i=null,o&&(o.resolve({success:!1,error:"Worker exited unexpectedly"}),o=null),l.length>0&&h())}),t}function K(){j=v(()=>{i&&!o&&l.length===0&&(i.terminate(),i=null)},5e3)}async function X(t,e,r,s=[],n,u,a){return W.getStore()?{stdout:"",stderr:`js-exec: recursive invocation is not supported
90
- `,exitCode:1}:Y(t,e,r,s,n,u,a)}async function Y(t,e,r,s=[],n,u,a){let y=F(),p=e.exec,x=p?(d,R)=>W.run(!0,()=>p(d,R)):void 0,b=new P(y,e.fs,e.cwd,"js-exec",e.fetch,e.limits?.maxOutputSize??0,x,e.executorInvokeTool),m=e.limits?.maxJsTimeoutMs??_,w=e.fetch?Math.max(m,I):m,c={protocolToken:q(16).toString("hex"),sharedBuffer:y,jsCode:t,cwd:e.cwd,env:M(e.env),args:s,scriptPath:r,bootstrapCode:n,isModule:u,stripTypes:a,timeoutMs:w,hasExecutorTools:e.executorInvokeTool!==void 0},A,U=new Promise(d=>{A=d}),g={input:c,resolve:()=>{}},H=v(()=>{if(o===g){let d=i;d&&(i=null,d.terminate()),o=null,h()}else g.canceled=!0,o||h();g.resolve({success:!1,error:`Execution timeout: exceeded ${w}ms limit`})},w);g.resolve=d=>{T(H),A(d)},l.push(g),h();let[k,C]=await Promise.all([b.run(w),U.catch(d=>({success:!1,error:S(E(d))}))]);return!C.success&&C.error?{stdout:k.stdout,stderr:`${k.stderr}js-exec: ${S(C.error)}
91
- `,exitCode:k.exitCode||1}:k}async function de(t,e,r){if(W.getStore())return{result:null,error:"js-exec: recursive invocation is not supported"};let s=F(),n=new P(s,e.fs,e.cwd,"js-exec",e.fetch,e.limits?.maxOutputSize??0,void 0,r),u=e.limits?.maxJsTimeoutMs??_,a=e.fetch?Math.max(u,I):u,p={protocolToken:q(16).toString("hex"),sharedBuffer:s,jsCode:t,cwd:e.cwd,env:M(e.env),args:[],executorMode:!0,timeoutMs:a},x,b=new Promise(c=>{x=c}),m={input:p,resolve:()=>{}},w=v(()=>{if(o===m){let c=i;c&&(i=null,c.terminate()),o=null,h()}else m.canceled=!0,o||h();m.resolve({success:!1,error:`Execution timeout: exceeded ${a}ms limit`})},a);m.resolve=c=>{T(w),x(c)},l.push(m),h();let[,f]=await Promise.all([n.run(a),b.catch(c=>({success:!1,error:S(E(c))}))]);if("executorResult"in f&&f.executorResult!==void 0){let c;try{c=JSON.parse(f.executorResult)}catch{c=f.executorResult}return{result:c,logs:f.executorLogs}}return{result:null,error:f.error||"Unknown execution error",logs:"executorLogs"in f?f.executorLogs:void 0}}var fe={name:"js-exec",async execute(t,e){if(L(t))return{stdout:J,stderr:"",exitCode:0};let r=$(t);if("exitCode"in r)return r;if(r.showVersion)return{stdout:`QuickJS (quickjs-emscripten)
92
- `,stderr:"",exitCode:0};let s,n;if(r.code!==null)s=r.code,n="-c";else if(r.scriptFile!==null){let p=e.fs.resolvePath(e.cwd,r.scriptFile);if(!await e.fs.exists(p))return{stdout:"",stderr:`js-exec: can't open file '${r.scriptFile}': No such file or directory
93
- `,exitCode:2};try{s=await e.fs.readFile(p),n=p}catch(x){return{stdout:"",stderr:`js-exec: can't open file '${r.scriptFile}': ${O(x.message)}
94
- `,exitCode:2}}}else if(e.stdin.trim())s=e.stdin,n="<stdin>";else return{stdout:"",stderr:`js-exec: no input provided (use -c CODE or provide a script file)
95
- `,exitCode:2};let u=r.isModule,a=r.stripTypes;n&&n!=="-c"&&n!=="<stdin>"&&((n.endsWith(".mjs")||n.endsWith(".mts")||n.endsWith(".ts"))&&(u=!0),(n.endsWith(".ts")||n.endsWith(".mts"))&&(a=!0)),!u&&/\bawait\s+[\w([`]/.test(s)&&(u=!0);let y=e.jsBootstrapCode;return X(s,e,n,r.scriptArgs,y,u,a)}},pe={name:"node",async execute(){return{stdout:"",stderr:`node: this sandbox uses js-exec instead of node
96
-
97
- ${J}`,exitCode:1}}};export{de as executeForExecutor,fe as jsExecCommand,pe as nodeStubCommand};
@@ -1,97 +0,0 @@
1
- #!/usr/bin/env node
2
- import{a as F,b as P}from"./chunk-MNMRGJJM.js";import"./chunk-4OALHZXB.js";import"./chunk-D64U2VGQ.js";import"./chunk-LIYVQA3X.js";import{a as v,b as T}from"./chunk-OOJCYVYF.js";import{a as M}from"./chunk-4PRVMER6.js";import{b as B}from"./chunk-YU6OGPZR.js";import{a as O,b as S}from"./chunk-RLNOQILG.js";import{a as E}from"./chunk-4VDEBYW7.js";import{b as L}from"./chunk-GTNBSMZR.js";import"./chunk-KGOUQS5A.js";import{AsyncLocalStorage as N}from"node:async_hooks";import{randomBytes as q}from"node:crypto";import{fileURLToPath as D}from"node:url";import{Worker as z}from"node:worker_threads";var _=1e4,I=6e4,W=new N,J=`js-exec - Sandboxed JavaScript/TypeScript runtime with Node.js-compatible APIs
3
-
4
- Usage: js-exec [OPTIONS] [-c CODE | FILE] [ARGS...]
5
-
6
- Options:
7
- -c CODE Execute inline code
8
- -m, --module Enable ES module mode (import/export)
9
- --strip-types Strip TypeScript type annotations
10
- --version, -V Show version
11
- --help Show this help
12
-
13
- Examples:
14
- js-exec -c "console.log(1 + 2)"
15
- js-exec script.js
16
- js-exec app.ts
17
- echo 'console.log("hello")' | js-exec
18
-
19
- File Extension Auto-Detection:
20
- .js script mode (module mode if top-level await detected)
21
- .mjs ES module mode
22
- .ts, .mts ES module mode + TypeScript stripping
23
-
24
- Node.js Compatibility:
25
- Code written for Node.js largely works here. Both require and import
26
- are supported, the node: prefix works, and standard globals like process,
27
- console, and fetch are available. All I/O is synchronous.
28
-
29
- Available modules:
30
- fs, path, child_process, process, console,
31
- os, url, assert, util, events, buffer, stream,
32
- string_decoder, querystring
33
-
34
- fs (global, require('fs'), or import from 'node:fs'):
35
- readFileSync, writeFileSync, appendFileSync, copyFileSync, renameSync
36
- readdirSync, mkdirSync, rmSync, unlinkSync, rmdirSync
37
- statSync, lstatSync, existsSync, realpathSync, chmodSync
38
- symlinkSync, readlinkSync, readFileBuffer
39
- fs.promises.readFile, fs.promises.writeFile, fs.promises.access, ...
40
-
41
- path: join, resolve, dirname, basename, extname, normalize,
42
- relative, isAbsolute, parse, format, sep, delimiter
43
-
44
- child_process:
45
- execSync(cmd) throws on non-zero exit, returns stdout
46
- spawnSync(cmd, args) returns { stdout, stderr, status }
47
-
48
- process (also global): argv, cwd(), exit(), env, platform, arch,
49
- version, versions
50
-
51
- os: platform(), arch(), homedir(), tmpdir(), type(), hostname(),
52
- EOL, cpus(), endianness()
53
-
54
- url: URL, URLSearchParams, parse(), format()
55
-
56
- assert: ok(), equal(), strictEqual(), deepEqual(), throws(),
57
- doesNotThrow(), fail()
58
-
59
- util: format(), inspect(), promisify(), types, inherits()
60
-
61
- events: EventEmitter (on, once, emit, off, removeListener, ...)
62
-
63
- buffer: Buffer.from(), Buffer.alloc(), Buffer.concat(),
64
- Buffer.isBuffer(), toString(), slice(), equals()
65
-
66
- stream: Readable, Writable, Duplex, Transform, PassThrough, pipeline
67
-
68
- string_decoder: StringDecoder (write, end)
69
-
70
- querystring: parse(), stringify(), escape(), unescape()
71
-
72
- Other Globals:
73
- console log (stdout), error/warn (stderr)
74
- fetch(url, opts) HTTP; returns Promise<Response> (Web Fetch API)
75
- URL, URLSearchParams, Headers, Request, Response
76
- Buffer Buffer.from(), Buffer.alloc(), etc.
77
-
78
- Not Available:
79
- http, https, net, tls, crypto, zlib, dns, cluster, worker_threads,
80
- vm, v8, readline, and other Node.js built-in modules that require
81
- native bindings. Use fetch() for HTTP requests.
82
-
83
- Limits:
84
- Memory: 64 MB per execution
85
- Timeout: 10 s (60 s with network; configurable via maxJsTimeoutMs)
86
- Engine: QuickJS (compiled to WebAssembly)
87
- `;function $(t){let e={code:null,scriptFile:null,showVersion:!1,scriptArgs:[],isModule:!1,stripTypes:!1};if(t.length===0)return e;for(let r=0;r<t.length;r++){let s=t[r];if(s==="-m"||s==="--module"){e.isModule=!0;continue}if(s==="--strip-types"){e.stripTypes=!0;continue}if(s==="-c")return r+1>=t.length?{stdout:"",stderr:`js-exec: option requires an argument -- 'c'
88
- `,exitCode:2}:(e.code=t[r+1],e.scriptArgs=t.slice(r+2),e);if(s==="--version"||s==="-V")return e.showVersion=!0,e;if(s.startsWith("-")&&s!=="-"&&s!=="--")return{stdout:"",stderr:`js-exec: unrecognized option '${s}'
89
- `,exitCode:2};if(s==="--")return r+1<t.length&&(e.scriptFile=t[r+1],e.scriptArgs=t.slice(r+2)),e;if(!s.startsWith("-"))return e.scriptFile=s,e.scriptArgs=t.slice(r+1),e}return e}var i=null,j=null,l=[],o=null,V=D(new URL("./worker.js",import.meta.url));function h(){for(;l.length>0&&l[0].canceled;)l.shift();if(o||l.length===0)return;let t=l.shift();if(!t)return;o=t,G().postMessage(o.input)}function Q(t,e){if(!t||typeof t!="object")return{success:!1,error:"Malformed worker response"};let r=t;return typeof r.protocolToken!="string"||r.protocolToken!==e?{success:!1,error:"Malformed worker response: invalid protocol token"}:typeof r.success!="boolean"?{success:!1,error:"Malformed worker response: missing success flag"}:r.success?{success:!0}:{success:!1,error:typeof r.error=="string"&&r.error.length>0?r.error:"Worker execution failed"}}function G(){if(j&&(T(j),j=null),i)return i;let t=B.runTrusted(()=>new z(V));return i=t,t.on("message",e=>{if(i===t){if(o){let r=Q(e,o.input.protocolToken);o.resolve(r),o=null}l.length>0?h():K()}}),t.on("error",e=>{if(i===t){if(o){let r=S(E(e));o.resolve({success:!1,error:r}),o=null}for(let r of l)r.resolve({success:!1,error:"Worker crashed"});l.length=0,i=null}}),t.on("exit",()=>{i===t&&(i=null,o&&(o.resolve({success:!1,error:"Worker exited unexpectedly"}),o=null),l.length>0&&h())}),t}function K(){j=v(()=>{i&&!o&&l.length===0&&(i.terminate(),i=null)},5e3)}async function X(t,e,r,s=[],n,u,a){return W.getStore()?{stdout:"",stderr:`js-exec: recursive invocation is not supported
90
- `,exitCode:1}:Y(t,e,r,s,n,u,a)}async function Y(t,e,r,s=[],n,u,a){let y=F(),p=e.exec,x=p?(d,R)=>W.run(!0,()=>p(d,R)):void 0,b=new P(y,e.fs,e.cwd,"js-exec",e.fetch,e.limits?.maxOutputSize??0,x,e.executorInvokeTool),m=e.limits?.maxJsTimeoutMs??_,w=e.fetch?Math.max(m,I):m,c={protocolToken:q(16).toString("hex"),sharedBuffer:y,jsCode:t,cwd:e.cwd,env:M(e.env),args:s,scriptPath:r,bootstrapCode:n,isModule:u,stripTypes:a,timeoutMs:w,hasExecutorTools:e.executorInvokeTool!==void 0},A,U=new Promise(d=>{A=d}),g={input:c,resolve:()=>{}},H=v(()=>{if(o===g){let d=i;d&&(i=null,d.terminate()),o=null,h()}else g.canceled=!0,o||h();g.resolve({success:!1,error:`Execution timeout: exceeded ${w}ms limit`})},w);g.resolve=d=>{T(H),A(d)},l.push(g),h();let[k,C]=await Promise.all([b.run(w),U.catch(d=>({success:!1,error:S(E(d))}))]);return!C.success&&C.error?{stdout:k.stdout,stderr:`${k.stderr}js-exec: ${S(C.error)}
91
- `,exitCode:k.exitCode||1}:k}async function de(t,e,r){if(W.getStore())return{result:null,error:"js-exec: recursive invocation is not supported"};let s=F(),n=new P(s,e.fs,e.cwd,"js-exec",e.fetch,e.limits?.maxOutputSize??0,void 0,r),u=e.limits?.maxJsTimeoutMs??_,a=e.fetch?Math.max(u,I):u,p={protocolToken:q(16).toString("hex"),sharedBuffer:s,jsCode:t,cwd:e.cwd,env:M(e.env),args:[],executorMode:!0,timeoutMs:a},x,b=new Promise(c=>{x=c}),m={input:p,resolve:()=>{}},w=v(()=>{if(o===m){let c=i;c&&(i=null,c.terminate()),o=null,h()}else m.canceled=!0,o||h();m.resolve({success:!1,error:`Execution timeout: exceeded ${a}ms limit`})},a);m.resolve=c=>{T(w),x(c)},l.push(m),h();let[,f]=await Promise.all([n.run(a),b.catch(c=>({success:!1,error:S(E(c))}))]);if("executorResult"in f&&f.executorResult!==void 0){let c;try{c=JSON.parse(f.executorResult)}catch{c=f.executorResult}return{result:c,logs:f.executorLogs}}return{result:null,error:f.error||"Unknown execution error",logs:"executorLogs"in f?f.executorLogs:void 0}}var fe={name:"js-exec",async execute(t,e){if(L(t))return{stdout:J,stderr:"",exitCode:0};let r=$(t);if("exitCode"in r)return r;if(r.showVersion)return{stdout:`QuickJS (quickjs-emscripten)
92
- `,stderr:"",exitCode:0};let s,n;if(r.code!==null)s=r.code,n="-c";else if(r.scriptFile!==null){let p=e.fs.resolvePath(e.cwd,r.scriptFile);if(!await e.fs.exists(p))return{stdout:"",stderr:`js-exec: can't open file '${r.scriptFile}': No such file or directory
93
- `,exitCode:2};try{s=await e.fs.readFile(p),n=p}catch(x){return{stdout:"",stderr:`js-exec: can't open file '${r.scriptFile}': ${O(x.message)}
94
- `,exitCode:2}}}else if(e.stdin.trim())s=e.stdin,n="<stdin>";else return{stdout:"",stderr:`js-exec: no input provided (use -c CODE or provide a script file)
95
- `,exitCode:2};let u=r.isModule,a=r.stripTypes;n&&n!=="-c"&&n!=="<stdin>"&&((n.endsWith(".mjs")||n.endsWith(".mts")||n.endsWith(".ts"))&&(u=!0),(n.endsWith(".ts")||n.endsWith(".mts"))&&(a=!0)),!u&&/\bawait\s+[\w([`]/.test(s)&&(u=!0);let y=e.jsBootstrapCode;return X(s,e,n,r.scriptArgs,y,u,a)}},pe={name:"node",async execute(){return{stdout:"",stderr:`node: this sandbox uses js-exec instead of node
96
-
97
- ${J}`,exitCode:1}}};export{de as executeForExecutor,fe as jsExecCommand,pe as nodeStubCommand};
@@ -1,96 +0,0 @@
1
- import{a as F,b as P}from"./chunk-B6O2PIY4.js";import"./chunk-XHM67O4N.js";import"./chunk-CWQS3NFK.js";import{a as v,b as T}from"./chunk-A5O5YHGN.js";import"./chunk-IPJHKYVM.js";import{a as M}from"./chunk-OJDRYQWQ.js";import{b as B}from"./chunk-5QMZ5MUS.js";import{a as O,b as S}from"./chunk-3THT3N7L.js";import{a as E}from"./chunk-44UOCSGV.js";import{b as L}from"./chunk-74CEPOFO.js";import"./chunk-DXB73IDG.js";import{AsyncLocalStorage as N}from"node:async_hooks";import{randomBytes as q}from"node:crypto";import{fileURLToPath as D}from"node:url";import{Worker as z}from"node:worker_threads";var _=1e4,I=6e4,W=new N,J=`js-exec - Sandboxed JavaScript/TypeScript runtime with Node.js-compatible APIs
2
-
3
- Usage: js-exec [OPTIONS] [-c CODE | FILE] [ARGS...]
4
-
5
- Options:
6
- -c CODE Execute inline code
7
- -m, --module Enable ES module mode (import/export)
8
- --strip-types Strip TypeScript type annotations
9
- --version, -V Show version
10
- --help Show this help
11
-
12
- Examples:
13
- js-exec -c "console.log(1 + 2)"
14
- js-exec script.js
15
- js-exec app.ts
16
- echo 'console.log("hello")' | js-exec
17
-
18
- File Extension Auto-Detection:
19
- .js script mode (module mode if top-level await detected)
20
- .mjs ES module mode
21
- .ts, .mts ES module mode + TypeScript stripping
22
-
23
- Node.js Compatibility:
24
- Code written for Node.js largely works here. Both require and import
25
- are supported, the node: prefix works, and standard globals like process,
26
- console, and fetch are available. All I/O is synchronous.
27
-
28
- Available modules:
29
- fs, path, child_process, process, console,
30
- os, url, assert, util, events, buffer, stream,
31
- string_decoder, querystring
32
-
33
- fs (global, require('fs'), or import from 'node:fs'):
34
- readFileSync, writeFileSync, appendFileSync, copyFileSync, renameSync
35
- readdirSync, mkdirSync, rmSync, unlinkSync, rmdirSync
36
- statSync, lstatSync, existsSync, realpathSync, chmodSync
37
- symlinkSync, readlinkSync, readFileBuffer
38
- fs.promises.readFile, fs.promises.writeFile, fs.promises.access, ...
39
-
40
- path: join, resolve, dirname, basename, extname, normalize,
41
- relative, isAbsolute, parse, format, sep, delimiter
42
-
43
- child_process:
44
- execSync(cmd) throws on non-zero exit, returns stdout
45
- spawnSync(cmd, args) returns { stdout, stderr, status }
46
-
47
- process (also global): argv, cwd(), exit(), env, platform, arch,
48
- version, versions
49
-
50
- os: platform(), arch(), homedir(), tmpdir(), type(), hostname(),
51
- EOL, cpus(), endianness()
52
-
53
- url: URL, URLSearchParams, parse(), format()
54
-
55
- assert: ok(), equal(), strictEqual(), deepEqual(), throws(),
56
- doesNotThrow(), fail()
57
-
58
- util: format(), inspect(), promisify(), types, inherits()
59
-
60
- events: EventEmitter (on, once, emit, off, removeListener, ...)
61
-
62
- buffer: Buffer.from(), Buffer.alloc(), Buffer.concat(),
63
- Buffer.isBuffer(), toString(), slice(), equals()
64
-
65
- stream: Readable, Writable, Duplex, Transform, PassThrough, pipeline
66
-
67
- string_decoder: StringDecoder (write, end)
68
-
69
- querystring: parse(), stringify(), escape(), unescape()
70
-
71
- Other Globals:
72
- console log (stdout), error/warn (stderr)
73
- fetch(url, opts) HTTP; returns Promise<Response> (Web Fetch API)
74
- URL, URLSearchParams, Headers, Request, Response
75
- Buffer Buffer.from(), Buffer.alloc(), etc.
76
-
77
- Not Available:
78
- http, https, net, tls, crypto, zlib, dns, cluster, worker_threads,
79
- vm, v8, readline, and other Node.js built-in modules that require
80
- native bindings. Use fetch() for HTTP requests.
81
-
82
- Limits:
83
- Memory: 64 MB per execution
84
- Timeout: 10 s (60 s with network; configurable via maxJsTimeoutMs)
85
- Engine: QuickJS (compiled to WebAssembly)
86
- `;function $(t){let e={code:null,scriptFile:null,showVersion:!1,scriptArgs:[],isModule:!1,stripTypes:!1};if(t.length===0)return e;for(let r=0;r<t.length;r++){let s=t[r];if(s==="-m"||s==="--module"){e.isModule=!0;continue}if(s==="--strip-types"){e.stripTypes=!0;continue}if(s==="-c")return r+1>=t.length?{stdout:"",stderr:`js-exec: option requires an argument -- 'c'
87
- `,exitCode:2}:(e.code=t[r+1],e.scriptArgs=t.slice(r+2),e);if(s==="--version"||s==="-V")return e.showVersion=!0,e;if(s.startsWith("-")&&s!=="-"&&s!=="--")return{stdout:"",stderr:`js-exec: unrecognized option '${s}'
88
- `,exitCode:2};if(s==="--")return r+1<t.length&&(e.scriptFile=t[r+1],e.scriptArgs=t.slice(r+2)),e;if(!s.startsWith("-"))return e.scriptFile=s,e.scriptArgs=t.slice(r+1),e}return e}var i=null,j=null,l=[],o=null,V=D(new URL("./worker.js",import.meta.url));function h(){for(;l.length>0&&l[0].canceled;)l.shift();if(o||l.length===0)return;let t=l.shift();if(!t)return;o=t,G().postMessage(o.input)}function Q(t,e){if(!t||typeof t!="object")return{success:!1,error:"Malformed worker response"};let r=t;return typeof r.protocolToken!="string"||r.protocolToken!==e?{success:!1,error:"Malformed worker response: invalid protocol token"}:typeof r.success!="boolean"?{success:!1,error:"Malformed worker response: missing success flag"}:r.success?{success:!0}:{success:!1,error:typeof r.error=="string"&&r.error.length>0?r.error:"Worker execution failed"}}function G(){if(j&&(T(j),j=null),i)return i;let t=B.runTrusted(()=>new z(V));return i=t,t.on("message",e=>{if(i===t){if(o){let r=Q(e,o.input.protocolToken);o.resolve(r),o=null}l.length>0?h():K()}}),t.on("error",e=>{if(i===t){if(o){let r=S(E(e));o.resolve({success:!1,error:r}),o=null}for(let r of l)r.resolve({success:!1,error:"Worker crashed"});l.length=0,i=null}}),t.on("exit",()=>{i===t&&(i=null,o&&(o.resolve({success:!1,error:"Worker exited unexpectedly"}),o=null),l.length>0&&h())}),t}function K(){j=v(()=>{i&&!o&&l.length===0&&(i.terminate(),i=null)},5e3)}async function X(t,e,r,s=[],n,u,a){return W.getStore()?{stdout:"",stderr:`js-exec: recursive invocation is not supported
89
- `,exitCode:1}:Y(t,e,r,s,n,u,a)}async function Y(t,e,r,s=[],n,u,a){let y=F(),p=e.exec,x=p?(d,R)=>W.run(!0,()=>p(d,R)):void 0,b=new P(y,e.fs,e.cwd,"js-exec",e.fetch,e.limits?.maxOutputSize??0,x,e.executorInvokeTool),m=e.limits?.maxJsTimeoutMs??_,w=e.fetch?Math.max(m,I):m,c={protocolToken:q(16).toString("hex"),sharedBuffer:y,jsCode:t,cwd:e.cwd,env:M(e.env),args:s,scriptPath:r,bootstrapCode:n,isModule:u,stripTypes:a,timeoutMs:w,hasExecutorTools:e.executorInvokeTool!==void 0},A,U=new Promise(d=>{A=d}),g={input:c,resolve:()=>{}},H=v(()=>{if(o===g){let d=i;d&&(i=null,d.terminate()),o=null,h()}else g.canceled=!0,o||h();g.resolve({success:!1,error:`Execution timeout: exceeded ${w}ms limit`})},w);g.resolve=d=>{T(H),A(d)},l.push(g),h();let[k,C]=await Promise.all([b.run(w),U.catch(d=>({success:!1,error:S(E(d))}))]);return!C.success&&C.error?{stdout:k.stdout,stderr:`${k.stderr}js-exec: ${S(C.error)}
90
- `,exitCode:k.exitCode||1}:k}async function de(t,e,r){if(W.getStore())return{result:null,error:"js-exec: recursive invocation is not supported"};let s=F(),n=new P(s,e.fs,e.cwd,"js-exec",e.fetch,e.limits?.maxOutputSize??0,void 0,r),u=e.limits?.maxJsTimeoutMs??_,a=e.fetch?Math.max(u,I):u,p={protocolToken:q(16).toString("hex"),sharedBuffer:s,jsCode:t,cwd:e.cwd,env:M(e.env),args:[],executorMode:!0,timeoutMs:a},x,b=new Promise(c=>{x=c}),m={input:p,resolve:()=>{}},w=v(()=>{if(o===m){let c=i;c&&(i=null,c.terminate()),o=null,h()}else m.canceled=!0,o||h();m.resolve({success:!1,error:`Execution timeout: exceeded ${a}ms limit`})},a);m.resolve=c=>{T(w),x(c)},l.push(m),h();let[,f]=await Promise.all([n.run(a),b.catch(c=>({success:!1,error:S(E(c))}))]);if("executorResult"in f&&f.executorResult!==void 0){let c;try{c=JSON.parse(f.executorResult)}catch{c=f.executorResult}return{result:c,logs:f.executorLogs}}return{result:null,error:f.error||"Unknown execution error",logs:"executorLogs"in f?f.executorLogs:void 0}}var fe={name:"js-exec",async execute(t,e){if(L(t))return{stdout:J,stderr:"",exitCode:0};let r=$(t);if("exitCode"in r)return r;if(r.showVersion)return{stdout:`QuickJS (quickjs-emscripten)
91
- `,stderr:"",exitCode:0};let s,n;if(r.code!==null)s=r.code,n="-c";else if(r.scriptFile!==null){let p=e.fs.resolvePath(e.cwd,r.scriptFile);if(!await e.fs.exists(p))return{stdout:"",stderr:`js-exec: can't open file '${r.scriptFile}': No such file or directory
92
- `,exitCode:2};try{s=await e.fs.readFile(p),n=p}catch(x){return{stdout:"",stderr:`js-exec: can't open file '${r.scriptFile}': ${O(x.message)}
93
- `,exitCode:2}}}else if(e.stdin.trim())s=e.stdin,n="<stdin>";else return{stdout:"",stderr:`js-exec: no input provided (use -c CODE or provide a script file)
94
- `,exitCode:2};let u=r.isModule,a=r.stripTypes;n&&n!=="-c"&&n!=="<stdin>"&&((n.endsWith(".mjs")||n.endsWith(".mts")||n.endsWith(".ts"))&&(u=!0),(n.endsWith(".ts")||n.endsWith(".mts"))&&(a=!0)),!u&&/\bawait\s+[\w([`]/.test(s)&&(u=!0);let y=e.jsBootstrapCode;return X(s,e,n,r.scriptArgs,y,u,a)}},pe={name:"node",async execute(){return{stdout:"",stderr:`node: this sandbox uses js-exec instead of node
95
-
96
- ${J}`,exitCode:1}}};export{de as executeForExecutor,fe as jsExecCommand,pe as nodeStubCommand};