Skip to content

Commit c4aae01

Browse files
committed
feat(endo-exec): new package
1 parent 4da7742 commit c4aae01

File tree

8 files changed

+110
-0
lines changed

8 files changed

+110
-0
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
"packages/cli",
1212
"packages/compartment-mapper",
1313
"packages/daemon",
14+
"packages/endo-exec",
1415
"packages/eslint-config",
1516
"packages/eslint-plugin",
1617
"packages/eventual-send",

packages/endo-exec/README.md

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Endo Exec
2+
3+
The Endo executor is a helper for creating scripts that are executed in a Hardened JS start compartment. It opts for compatibility with legacy code when possible.
4+
5+
NOTE: if you want control over how Endo is initialized, especially if you are
6+
writing an application that needs to use mixed Compartments (both trusted
7+
libraries and untrusted code), you should NOT use this package.
8+
9+
Use it like:
10+
11+
```js
12+
#! /usr/bin/env endo-exec
13+
console.log('Hello, Endo world!');
14+
```
15+
16+
Or if you want to have your script be importable without side-effects (ocap
17+
discipline), then avoid top-level module state and export a `main` entrypoint
18+
that can be executed on demand.
19+
20+
```js
21+
#! /usr/bin/env endo-exec
22+
import { promises as fs } from 'fs';
23+
24+
/** @type {import('endo-exec').Main} */
25+
export const main = async ([script, file]) => {
26+
console.log('Hello from', script);
27+
await fs.readFile(file);
28+
console.log(`Here's the file`, file);
29+
};
30+
```

packages/endo-exec/bin/endo-exec

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#! /usr/bin/env bash
2+
real0=$(readlink -f "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")
3+
thisdir=$(cd "$(dirname -- "$real0")/.." >/dev/null && pwd -P)
4+
exec node "$thisdir/endo-exec.cjs" ${1+"$@"}

packages/endo-exec/bin/endo-exec.cmd

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
@node %~dp0\..\endo-exec.cjs %*

packages/endo-exec/endo-exec.cjs

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#!/usr/bin/env node
2+
(async () => {
3+
// We use the legacy mode for maximum compatibility.
4+
await import('@endo/init/legacy.js');
5+
6+
// Trim off the Node.js interpreter name.
7+
const [_nodeJS, endoExec, script, ...args] = process.argv;
8+
assert(script, `Usage: ${endoExec} SCRIPT [ARGS...]`);
9+
10+
const url = await import('url');
11+
const mod = new URL(script, url.pathToFileURL('./')).href;
12+
13+
// Execute the `main` import if there is one.
14+
const { main } = await import(mod);
15+
let resultP;
16+
if (typeof main === 'function') {
17+
resultP = main(harden([script, ...args]));
18+
}
19+
20+
const result = await resultP;
21+
if (Number.isSafeInteger(result)) {
22+
// Specify an exit code.
23+
process.exitCode = result;
24+
}
25+
})().catch(error => {
26+
console.error(error);
27+
if (process.exitCode === 0) {
28+
process.exitCode = 1;
29+
}
30+
});

packages/endo-exec/package.json

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{
2+
"name": "endo-exec",
3+
"version": "0.1.0",
4+
"description": "Endo script executor",
5+
"keywords": [],
6+
"author": "Endo contributors",
7+
"license": "Apache-2.0",
8+
"homepage": "https://github.com/endojs/endo/tree/master/packages/cli#readme",
9+
"repository": {
10+
"type": "git",
11+
"url": "git+https://github.com/endojs/endo.git"
12+
},
13+
"bugs": {
14+
"url": "https://github.com/endojs/endo/issues"
15+
},
16+
"type": "module",
17+
"exports": {
18+
"./endo-exec.cjs": "./endo-exec.cjs"
19+
},
20+
"bin": "./bin/endo-exec",
21+
"scripts": {
22+
"build": "exit 0",
23+
"lint": "exit 0",
24+
"lint-fix": "exit 0",
25+
"test": "exit 0"
26+
},
27+
"dependencies": {
28+
"@endo/init": "^0.5.42",
29+
"global": "^4.4.0"
30+
},
31+
"devDependencies": {},
32+
"publishConfig": {
33+
"access": "public"
34+
}
35+
}

packages/endo-exec/scripts/hello.js

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#! /usr/bin/env endo-exec
2+
console.log('Hello, Endo world!');

packages/endo-exec/scripts/zx-head.js

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#! /usr/bin/env endo-exec
2+
import 'zx/globals';
3+
4+
export const main = async ([script, file]) => {
5+
echo`Hello, world (from ${script})!`;
6+
await $`head -5 ${file}`;
7+
};

0 commit comments

Comments
 (0)