From 7dc41c0c43b58e078b48b991da6fdd0ee2455365 Mon Sep 17 00:00:00 2001 From: dandelany Date: Thu, 23 Jul 2026 18:16:21 -0700 Subject: [PATCH 01/17] add isolation unit tests --- test/isolation.spec.ts | 130 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 test/isolation.spec.ts diff --git a/test/isolation.spec.ts b/test/isolation.spec.ts new file mode 100644 index 0000000..78144e1 --- /dev/null +++ b/test/isolation.spec.ts @@ -0,0 +1,130 @@ +import vm from 'node:vm'; +import { describe, it } from 'node:test'; +import { expect } from 'expect'; + +import { UserCodeRunner } from '../src/UserCodeRunner'; + +const PROCESS_UNAVAILABLE = 'process unavailable'; + +/** + * security regression tests for the user-code boundary. + * + * access to the host `process` object enables arbitrary code execution through + * node capabilities such as environment variables, filesystem access, networking, + * native bindings, and child processes. + * + * a clean guest realm cannot access `process`, but host objects passed into it + * may expose the host `Function` constructor through their constructor chain. + * these tests ensure runner- and caller-provided values do not create that bridge. + */ + +interface ExecuteOptions { + args?: unknown[]; + argsTypes?: string[]; + context?: vm.Context; +} + +async function execute(source: string, options: ExecuteOptions = {}): Promise { + const args = options.args ?? []; + const argsTypes = options.argsTypes ?? args.map(() => 'any'); + + const result = await new UserCodeRunner().executeUserCode(source, args, 'any', argsTypes, 1000, [], options.context); + + return result.unwrap(); +} + +describe('UserCodeRunner isolation', () => { + it('does not expose process through guest-realm intrinsics', async () => { + const value = await execute(` + export default function(): string { + try { + return Function('return process.version')(); + } catch { + return '${PROCESS_UNAVAILABLE}'; + } + } + `); + + expect(value).toBe(PROCESS_UNAVAILABLE); + }); + + it('does not expose process through the internal argument array', async () => { + const value = await execute(` + export default function(): string { + try { + const args = (globalThis as any).__args; + return args.constructor.constructor( + 'return process.version', + )(); + } catch { + return '${PROCESS_UNAVAILABLE}'; + } + } + `); + + expect(value).toBe(PROCESS_UNAVAILABLE); + }); + + it('does not expose process through a user-code argument', async () => { + const value = await execute( + ` + export default function(props: any): string { + try { + return props.constructor.constructor( + 'return process.version', + )(); + } catch { + return '${PROCESS_UNAVAILABLE}'; + } + } + `, + { args: [{}] }, + ); + + expect(value).toBe(PROCESS_UNAVAILABLE); + }); + + it('does not expose process through a nested user-code argument', async () => { + const value = await execute( + ` + export default function(props: any): string { + try { + return props.nested.constructor.constructor( + 'return process.version', + )(); + } catch { + return '${PROCESS_UNAVAILABLE}'; + } + } + `, + {args: [{ nested: {} }]}, + ); + + expect(value).toBe(PROCESS_UNAVAILABLE); + }); + + it('does not expose process through an explicitly provided context value', async () => { + const context = vm.createContext({ + hostValue: {}, + }); + + const value = await execute( + ` + declare const hostValue: any; + + export default function(): string { + try { + return hostValue.constructor.constructor( + 'return process.version', + )(); + } catch { + return '${PROCESS_UNAVAILABLE}'; + } + } + `, + { args: [], context }, + ); + + expect(value).toBe(PROCESS_UNAVAILABLE); + }); +}); From 59b51ed7e8705eea4fa3cb77de7e0f4b840cf110 Mon Sep 17 00:00:00 2001 From: dandelany Date: Thu, 23 Jul 2026 18:16:53 -0700 Subject: [PATCH 02/17] use node 24, install isolated-vm@6.0.2 --- .nvmrc | 1 + package-lock.json | 437 ++++++++++++++++++++++++++++++++++++++++++++++ package.json | 5 + 3 files changed, 443 insertions(+) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..5bcf9c6 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +v24.18.0 diff --git a/package-lock.json b/package-lock.json index c250f05..1c59e4f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,6 +9,7 @@ "version": "0.7.0", "license": "MIT", "dependencies": { + "isolated-vm": "6.0.2", "source-map": "^0.7.4", "stack-trace": "^1.0.0-pre1" }, @@ -744,6 +745,37 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/braces": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", @@ -756,6 +788,30 @@ "node": ">=8" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -778,6 +834,12 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, "node_modules/ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", @@ -825,6 +887,39 @@ "node": ">= 8" } }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, "node_modules/diff-sequences": { "version": "29.4.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", @@ -846,6 +941,15 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/esbuild": { "version": "0.18.20", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", @@ -892,6 +996,15 @@ "node": ">=8" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, "node_modules/expect": { "version": "29.5.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", @@ -948,6 +1061,12 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -974,6 +1093,12 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, "node_modules/glob": { "version": "10.3.9", "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.9.tgz", @@ -1035,6 +1160,38 @@ "node": ">=8" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -1059,6 +1216,19 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/isolated-vm": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/isolated-vm/-/isolated-vm-6.0.2.tgz", + "integrity": "sha512-Qw6AJuagG/VJuh2AIcSWmQPsAArti/L+lKhjXU+lyhYkbt3J57XZr+ZjgfTnOr4NJcY1r3f8f0eePS7MRGp+pg==", + "hasInstallScript": true, + "license": "ISC", + "dependencies": { + "prebuild-install": "^7.1.3" + }, + "engines": { + "node": ">=22.0.0" + } + }, "node_modules/jackspeak": { "version": "2.3.5", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.5.tgz", @@ -1202,6 +1372,27 @@ "node": ">=8.6" } }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", @@ -1211,6 +1402,39 @@ "node": ">=16 || 14 >=14.17" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/node-abi": { + "version": "3.94.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.94.0.tgz", + "integrity": "sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -1257,6 +1481,33 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "deprecated": "No longer maintained. Please contact the author of the relevant native addon; alternatives are available.", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prettier": { "version": "2.8.7", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", @@ -1298,12 +1549,51 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pump": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, "node_modules/react-is": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", "dev": true }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", @@ -1313,6 +1603,38 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -1346,6 +1668,51 @@ "vscode-textmate": "^8.0.0" } }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -1383,6 +1750,15 @@ "node": ">=10" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", @@ -1437,6 +1813,15 @@ "node": ">=8" } }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1449,6 +1834,34 @@ "node": ">=8" } }, + "node_modules/tar-fs": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.5.tgz", + "integrity": "sha512-OboTd8mmMhZDNPV+UjQcK9yKAatXu2aJ+r1w4im1Otd4M4fl2hwvdoXUxIYHFTHWK/3y3FarBP70v3vwmGlOxw==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1503,6 +1916,18 @@ "source-map": "^0.6.0" } }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/typedoc": { "version": "0.23.28", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.23.28.tgz", @@ -1561,6 +1986,12 @@ "node": ">=12.20" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, "node_modules/vscode-oniguruma": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", @@ -1605,6 +2036,12 @@ "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" } } } diff --git a/package.json b/package.json index a4472aa..e2f4ce9 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "watch": "tsc -p tsconfig.json --watch" }, "dependencies": { + "isolated-vm": "6.0.2", "source-map": "^0.7.4", "stack-trace": "^1.0.0-pre1" }, @@ -30,5 +31,9 @@ "tsx": "^3", "typedoc": "^0.23.17", "typescript": "^5" + }, + "allowScripts": { + "esbuild@0.18.20": true, + "fsevents@2.3.3": true } } From 6591ad70589d20f372bfaebaf91efb91ab6371e8 Mon Sep 17 00:00:00 2001 From: dandelany Date: Mon, 27 Jul 2026 12:06:44 -0700 Subject: [PATCH 03/17] replace node vm execution with isolated v8 contexts --- src/UserCodeRunner.ts | 104 ++++++++++++++++++++++++++--------------- test/isolation.spec.ts | 18 ++++--- 2 files changed, 75 insertions(+), 47 deletions(-) diff --git a/src/UserCodeRunner.ts b/src/UserCodeRunner.ts index 084b59a..56cfe1f 100644 --- a/src/UserCodeRunner.ts +++ b/src/UserCodeRunner.ts @@ -1,4 +1,4 @@ -import vm from 'vm'; +import ivm from 'isolated-vm'; import path from 'path'; import { defaultErrorCodeMessageMappers } from './defaultErrorCodeMessageMappers.js'; import { createMapDiagnosticMessage } from './utils/errorMessageMapping.js'; @@ -15,6 +15,8 @@ export { defaultErrorCodeMessageMappers } from './defaultErrorCodeMessageMappers const EXECUTION_HARNESS_FILENAME = '__execution_harness'; const USER_CODE_FILENAME = '__user_file'; +export type UserCodeGlobals = Record; + export interface CacheItem { jsFileMap: { [key: string]: string }; userCodeSourceMap: string; @@ -191,7 +193,7 @@ export class UserCodeRunner { argsTypes: string[] = ['any'], timeout: number = 5000, additionalSourceFiles: ts.SourceFile[] = [], - context: vm.Context = vm.createContext(), + globals: UserCodeGlobals = {} ): Promise> { const result = await this.preProcess(userCode, outputType, argsTypes, additionalSourceFiles); @@ -201,54 +203,82 @@ export class UserCodeRunner { const { jsFileMap, userCodeSourceMap } = result.unwrap(); - return this.executeUserCodeFromArtifacts(jsFileMap, userCodeSourceMap, args, timeout, context); + return this.executeUserCodeFromArtifacts(jsFileMap, userCodeSourceMap, args, timeout, globals); } - public async executeUserCodeFromArtifacts( - jsFileMap: { [key: string]: string }, + public async executeUserCodeFromArtifacts( + jsFileMap: Record, sourceMap: string, args: ArgsType, - timeout: number = 5000, - context: vm.Context = vm.createContext(), - ): Promise> { - // Put args and result into context - context.__args = args; - context.__result = undefined; - - // Create modules for VM - const moduleCache = new Map(); - for (const [fileName, content] of Object.entries(jsFileMap)) { - moduleCache.set( - fileName, - new vm.SourceTextModule(content, { - identifier: fileName, - context, - }), - ); - } - const harnessModule = moduleCache.get(EXECUTION_HARNESS_FILENAME)!; - await harnessModule.link(specifier => { - const filenameSansExt = removeExt(specifier); - if (moduleCache.has(filenameSansExt)) { - return moduleCache.get(filenameSansExt)!; - } - throw new Error(`Unable to resolve dependency: ${specifier}`); + timeout = 5000, + globals: UserCodeGlobals = {}, + ): Promise> { + // create an isolated VM + context + const isolate = new ivm.Isolate({ + memoryLimit: 128, }); try { - await harnessModule.evaluate({ - timeout, + const context = isolate.createContextSync(); + const global = context.global; + + // put args and result into context + // any objects from host must be set with {copy: true}, this creates guest-owned deep clones of originals, + // not live host objects whose prototypes or constructors could expose host capabilities. + global.setSync('__args', args, { copy: true }); + global.setSync('__result', undefined); + + // put user-provided globals into context + for (const [name, value] of Object.entries(globals)) { + if (name === '__args' || name === '__result') { + throw new Error(`Reserved global name: ${name}`); + } + global.setSync(name, value, { copy: true }); + } + + // Create modules for VM + const moduleCache = new Map(); + for (const [fileName, content] of Object.entries(jsFileMap)) { + moduleCache.set( + fileName, + isolate.compileModuleSync(content, { + filename: fileName, + }), + ); + } + + // the harness module imports and invokes the user module, + // keeping execution and result capture inside the isolated context. + const harnessModule = moduleCache.get(EXECUTION_HARNESS_FILENAME); + if (harnessModule === undefined) { + throw new Error('Execution harness module is missing'); + } + // recursively resolve & link the harness module’s imports + harnessModule.instantiateSync(context, specifier => { + // module names currently use a flat namespace; directory paths and extensions are discarded. + const filenameSansExt = removeExt(specifier); + const module = moduleCache.get(filenameSansExt); + if (module === undefined) { + throw new Error(`Unable to resolve dependency: ${specifier}`); + } + return module; }); - const result = context.__result; - delete context.__args; - delete context.__result; - return Result.Ok(result); - } catch (error: any) { + + // evaluate the resolved module + await harnessModule.evaluate({ timeout }); + // copy guest results out as host-owned data; don't expose live guest reference. + const value = await global.get('__result', { copy: true }); + + return Result.Ok(value as OutputType); + } catch (error) { return Result.Err([UserCodeRuntimeError.new(error as Error, await new SourceMapConsumer(sourceMap))]); + } finally { + isolate.dispose(); } } } + // Base error type for the User Code Runner export abstract class UserCodeError { // Simple Error Message diff --git a/test/isolation.spec.ts b/test/isolation.spec.ts index 78144e1..28e9cf8 100644 --- a/test/isolation.spec.ts +++ b/test/isolation.spec.ts @@ -1,8 +1,7 @@ -import vm from 'node:vm'; import { describe, it } from 'node:test'; import { expect } from 'expect'; -import { UserCodeRunner } from '../src/UserCodeRunner'; +import { UserCodeRunner, UserCodeGlobals } from '../src/UserCodeRunner'; const PROCESS_UNAVAILABLE = 'process unavailable'; @@ -21,14 +20,14 @@ const PROCESS_UNAVAILABLE = 'process unavailable'; interface ExecuteOptions { args?: unknown[]; argsTypes?: string[]; - context?: vm.Context; + globals?: UserCodeGlobals; } async function execute(source: string, options: ExecuteOptions = {}): Promise { const args = options.args ?? []; const argsTypes = options.argsTypes ?? args.map(() => 'any'); - const result = await new UserCodeRunner().executeUserCode(source, args, 'any', argsTypes, 1000, [], options.context); + const result = await new UserCodeRunner().executeUserCode(source, args, 'any', argsTypes, 1000, [], options.globals); return result.unwrap(); } @@ -103,11 +102,7 @@ describe('UserCodeRunner isolation', () => { expect(value).toBe(PROCESS_UNAVAILABLE); }); - it('does not expose process through an explicitly provided context value', async () => { - const context = vm.createContext({ - hostValue: {}, - }); - + it('does not expose process through an explicitly provided globals value', async () => { const value = await execute( ` declare const hostValue: any; @@ -122,7 +117,10 @@ describe('UserCodeRunner isolation', () => { } } `, - { args: [], context }, + { + args: [], + globals: { hostValue: {} }, + }, ); expect(value).toBe(PROCESS_UNAVAILABLE); From 62d156c51e82305b3ef554a619ab810862451c7e Mon Sep 17 00:00:00 2001 From: dandelany Date: Tue, 28 Jul 2026 15:37:43 -0700 Subject: [PATCH 04/17] update to Node 24, update readme re: required node flag --- README.md | 8 +++++--- package-lock.json | 24 +++++++++++++++++++----- package.json | 8 ++++++-- 3 files changed, 30 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 09d7436..2a23c7c 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,12 @@ A simple way to safely run user code written in Typescript. ## Requirements -NodeJS >= 13.0.0 +NodeJS >= 24.0.0 -Because we are transpiling and running the typescript code as modules in a vm, we need to flag on the vm modules flag at runtime with -```node --experimental-vm-modules``` +Because this library uses `isolated-vm`, node.js must be started with the `--no-node-snapshot` flag when this module is used: +``` +node --no-node-snapshot +``` ## Example diff --git a/package-lock.json b/package-lock.json index 1c59e4f..40cad2d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,7 +15,7 @@ }, "devDependencies": { "@js-temporal/polyfill": "^0.4.3", - "@types/node": "^18.11.2", + "@types/node": "24.13.3", "@types/stack-trace": "^0.0.30", "expect": "^29", "glob": "^10", @@ -24,6 +24,9 @@ "typedoc": "^0.23.17", "typescript": "^5" }, + "engines": { + "node": "24.x" + }, "peerDependencies": { "typescript": "4.x || 5.x" } @@ -677,10 +680,14 @@ } }, "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", - "dev": true + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.18.0" + } }, "node_modules/@types/stack-trace": { "version": "0.0.30", @@ -1986,6 +1993,13 @@ "node": ">=12.20" } }, + "node_modules/undici-types": { + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "dev": true, + "license": "MIT" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index e2f4ce9..ba79c6c 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,9 @@ "test": "node --experimental-vm-modules --test --loader tsx `glob 'test/**/*.spec.ts'`", "watch": "tsc -p tsconfig.json --watch" }, + "engines": { + "node": "24.x" + }, "dependencies": { "isolated-vm": "6.0.2", "source-map": "^0.7.4", @@ -23,7 +26,7 @@ }, "devDependencies": { "@js-temporal/polyfill": "^0.4.3", - "@types/node": "^18.11.2", + "@types/node": "24.13.3", "@types/stack-trace": "^0.0.30", "expect": "^29", "glob": "^10", @@ -34,6 +37,7 @@ }, "allowScripts": { "esbuild@0.18.20": true, - "fsevents@2.3.3": true + "fsevents@2.3.3": true, + "isolated-vm@6.0.2": true } } From 4143aa7c72432bb63fbb5d10dcba75a3554ec19b Mon Sep 17 00:00:00 2001 From: dandelany Date: Wed, 29 Jul 2026 11:42:08 -0700 Subject: [PATCH 05/17] add optional result serializer option and update preProcess to use it --- src/UserCodeRunner.ts | 105 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 86 insertions(+), 19 deletions(-) diff --git a/src/UserCodeRunner.ts b/src/UserCodeRunner.ts index 56cfe1f..3ca7dda 100644 --- a/src/UserCodeRunner.ts +++ b/src/UserCodeRunner.ts @@ -22,10 +22,46 @@ export interface CacheItem { userCodeSourceMap: string; } +// instance options provided by the user when constructing the UserCodeRunner export interface UserCodeRunnerOptions { typeErrorCodeMessageMappers?: { [errorCode: number]: (message: string) => string | undefined }; // The error code to message mappers } +// optional execution-specific options that can be provided when code is executed +export interface ResultSerializerOptions { + /** + * Name of an additional source module whose default export converts the + * user's raw result into transferable data that can safely leave the isolate. + */ + moduleName: string; + + /** + * TypeScript type returned by the serializer. + */ + outputType?: string; +} +export interface UserCodeExecutionOptions { + /** + * Plain data copied into the guest isolate. + */ + globals?: UserCodeGlobals; + + /** + * Maximum guest-isolate heap size in MB. + */ + memoryLimitMb?: number; + + /** + * Trusted guest-side serializer included in additionalSourceFiles. + */ + resultSerializer?: ResultSerializerOptions; +} + +export interface ArtifactExecutionOptions { + globals?: UserCodeGlobals; + memoryLimitMb?: number; +} + export class UserCodeRunner { private readonly mapDiagnosticMessage: ReturnType; @@ -35,13 +71,27 @@ export class UserCodeRunner { ); } + /** + * Pre-process user code into executable Javascript artifacts by: + * - generating a top level Typescript harness which imports the main user code and additional source files + * - type-checking and transpiling the module graph + * - producing source files and source maps for runtime error mapping + * The harness invokes the user module and optionally serializes its result inside the guest environment. + * + * @param userCode TypeScript source containing the user module's default export. + * @param outputType Expected TypeScript return type of the user function. + * @param argsTypes TypeScript types corresponding to the user function arguments. + * @param additionalSourceFiles Additional virtual TypeScript modules available to the harness and user code. + * @param options Optional preprocessing behavior, including guest-side result serialization. + * @returns The transpiled module map and user-code source map, or preprocessing errors. + */ public async preProcess( userCode: string, outputType: string = 'any', argsTypes: string[] = ['any'], additionalSourceFiles: ts.SourceFile[] = [], + options: Pick = {}, ): Promise> { - // TypeCheck and transpile code const userSourceFile = ts.createSourceFile( USER_CODE_FILENAME, userCode, @@ -50,26 +100,43 @@ export class UserCodeRunner { ts.ScriptKind.TS, ); + const serializer = options.resultSerializer; + const serializerModuleName = serializer === undefined ? undefined : removeExt(serializer.moduleName); + + const serializerImport = + serializerModuleName === undefined + ? '' + : `import __serializeResult from ${JSON.stringify(serializerModuleName)};`; + + const finalOutputType = serializer?.outputType ?? outputType; + const executionCode = ` ${additionalSourceFiles .map(file => { if (file.fileName.endsWith('.d.ts')) return ''; - const filenameSansExt = removeExt(file.fileName); - return `import '${filenameSansExt}';`; + return `import ${JSON.stringify(removeExt(file.fileName))};`; }) - .join('\n ')} - import defaultExport from '${USER_CODE_FILENAME}'; - - declare global { - const __args: [${argsTypes.join(', ')}]; - let __result: ${outputType} | Promise<${outputType}>; - } - __result = defaultExport(...__args); - - if ((__result as any) instanceof Promise) { - __result = await __result; - } - `; + .join('\n')} + + ${serializerImport} + + import defaultExport from ${JSON.stringify(USER_CODE_FILENAME)}; + + declare global { + const __args: [${argsTypes.join(', ')}]; + let __result: ${outputType} | Promise<${outputType}>; + } + let __finalResult: ${finalOutputType}; + + __result = defaultExport(...__args); + if ((__result as any) instanceof Promise) { + __result = await __result; + } + const __resolvedResult: ${outputType} = await __result; + + __finalResult = ${serializer === undefined ? '__resolvedResult' : 'await __serializeResult(__resolvedResult)'}; + (globalThis as any).__finalResult = __finalResult; + `; const executionSourceFile = ts.createSourceFile( EXECUTION_HARNESS_FILENAME, @@ -193,7 +260,7 @@ export class UserCodeRunner { argsTypes: string[] = ['any'], timeout: number = 5000, additionalSourceFiles: ts.SourceFile[] = [], - globals: UserCodeGlobals = {} + globals: UserCodeGlobals = {}, ): Promise> { const result = await this.preProcess(userCode, outputType, argsTypes, additionalSourceFiles); @@ -222,7 +289,7 @@ export class UserCodeRunner { const context = isolate.createContextSync(); const global = context.global; - // put args and result into context + // put args & result into context // any objects from host must be set with {copy: true}, this creates guest-owned deep clones of originals, // not live host objects whose prototypes or constructors could expose host capabilities. global.setSync('__args', args, { copy: true }); @@ -267,7 +334,7 @@ export class UserCodeRunner { // evaluate the resolved module await harnessModule.evaluate({ timeout }); // copy guest results out as host-owned data; don't expose live guest reference. - const value = await global.get('__result', { copy: true }); + const value = await global.get('__finalResult', { copy: true }); return Result.Ok(value as OutputType); } catch (error) { From 4a00759c5db4bfe4b50699f892484425e120c5d5 Mon Sep 17 00:00:00 2001 From: dandelany Date: Wed, 29 Jul 2026 12:12:45 -0700 Subject: [PATCH 06/17] update API to accept options instead of context, pass result serializer, update tests --- src/UserCodeRunner.ts | 105 +++++++++++++++++++++++++++- test/UserCodeRunner.spec.ts | 134 ++++++++++++++---------------------- 2 files changed, 157 insertions(+), 82 deletions(-) diff --git a/src/UserCodeRunner.ts b/src/UserCodeRunner.ts index 3ca7dda..829b936 100644 --- a/src/UserCodeRunner.ts +++ b/src/UserCodeRunner.ts @@ -100,8 +100,16 @@ export class UserCodeRunner { ts.ScriptKind.TS, ); + // optional result serializer passed by the user + // if passed, will be run on all results of user code before returning to transform them to safe values const serializer = options.resultSerializer; const serializerModuleName = serializer === undefined ? undefined : removeExt(serializer.moduleName); + if ( + serializerModuleName !== undefined && + !additionalSourceFiles.some(file => removeExt(file.fileName) === serializerModuleName) + ) { + throw new Error(`Result serializer module not found: ${serializerModuleName}`); + } const serializerImport = serializerModuleName === undefined @@ -253,7 +261,32 @@ export class UserCodeRunner { }); } - public async executeUserCode( + public async executeUserCode( + userCode: string, + args: ArgsType, + outputType = 'any', + argsTypes: string[] = ['any'], + timeout = 5000, + additionalSourceFiles: ts.SourceFile[] = [], + options: UserCodeExecutionOptions = {}, + ): Promise> { + const result = await this.preProcess(userCode, outputType, argsTypes, additionalSourceFiles, { + resultSerializer: options.resultSerializer, + }); + + if (result.isErr()) { + return result; + } + + const { jsFileMap, userCodeSourceMap } = result.unwrap(); + + return this.executeUserCodeFromArtifacts(jsFileMap, userCodeSourceMap, args, timeout, { + globals: options.globals, + memoryLimitMb: options.memoryLimitMb, + }); + } + + public async executeUserCodeOld( userCode: string, args: ArgsType, outputType: string = 'any', @@ -274,6 +307,76 @@ export class UserCodeRunner { } public async executeUserCodeFromArtifacts( + jsFileMap: Record, + sourceMap: string, + args: ArgsType, + timeout = 5000, + options: ArtifactExecutionOptions = {}, + ): Promise> { + const isolate = new ivm.Isolate({ + memoryLimit: options.memoryLimitMb ?? 1024, + }); + + try { + const context = isolate.createContextSync(); + const global = context.global; + + // copy host values into the guest isolate so objects are guest-owned clones, + // not live host objects whose prototypes or constructors could expose host capabilities. + global.setSync('__args', args, { copy: true }); + global.setSync('__result', undefined); + // global.setSync('__finalResult', undefined); + + for (const [name, value] of Object.entries(options.globals ?? {})) { + if (name === '__args' || name === '__result' || name === '__finalResult') { + throw new Error(`Reserved global name: ${name}`); + } + + global.setSync(name, value, { copy: true }); + } + + // Create modules for VM + const moduleCache = new Map(); + for (const [fileName, content] of Object.entries(jsFileMap)) { + moduleCache.set( + fileName, + isolate.compileModuleSync(content, { + filename: fileName, + }), + ); + } + + // the harness module imports and invokes the user module, + // keeping execution and result capture inside the isolated context. + const harnessModule = moduleCache.get(EXECUTION_HARNESS_FILENAME); + if (harnessModule === undefined) { + throw new Error('Execution harness module is missing'); + } + + // recursively resolve & link the harness module’s imports + harnessModule.instantiateSync(context, specifier => { + // module names currently use a flat namespace; directory paths and extensions are discarded. + const module = moduleCache.get(removeExt(specifier)); + if (module === undefined) { + throw new Error(`Unable to resolve dependency: ${specifier}`); + } + return module; + }); + + // evaluate the resolved module + await harnessModule.evaluate({ timeout }); + // copy guest results out as host-owned data; don't expose live guest reference. + const value = await global.get('__finalResult', { copy: true }); + + return Result.Ok(value as OutputType); + } catch (error) { + return Result.Err([UserCodeRuntimeError.new(error as Error, await new SourceMapConsumer(sourceMap))]); + } finally { + isolate.dispose(); + } + } + + public async executeUserCodeFromArtifactsOld( jsFileMap: Record, sourceMap: string, args: ArgsType, diff --git a/test/UserCodeRunner.spec.ts b/test/UserCodeRunner.spec.ts index 63fb331..5a6b8d1 100644 --- a/test/UserCodeRunner.spec.ts +++ b/test/UserCodeRunner.spec.ts @@ -473,9 +473,11 @@ describe('behavior', () => { } `.trimTemplate(), ts.ScriptTarget.ESNext, true) ], - vm.createContext({ - someGlobalFunction: (thing: string) => 'hello ' + thing, // Implementation injected to global namespace here - }), + { + globals: { + someGlobalFunction: (thing: string) => 'hello ' + thing, // Implementation injected to global namespace here + } + } ); // expect(result.isOk()).toBeTruthy(); @@ -503,9 +505,6 @@ describe('behavior', () => { fs.promises.readFile(new URL('./inputs/TemporalPolyfillTypes.ts', import.meta.url).pathname, 'utf8'), ]); - const context = vm.createContext({ - Temporal, - }); const result = await runner.executeUserCode( userCode, [{ activity: null}], @@ -517,7 +516,7 @@ describe('behavior', () => { ts.createSourceFile('activity-types.ts', activityTypes, ts.ScriptTarget.ESNext, true), ts.createSourceFile('TemporalPolyfillTypes.ts', temporalPolyfill, ts.ScriptTarget.ESNext, true), ], - context, + { globals: { Temporal } }, ); expect(result.isErr()).toBeTruthy(); @@ -556,9 +555,6 @@ describe('behavior', () => { fs.promises.readFile(new URL('./inputs/TemporalPolyfillTypes.ts', import.meta.url).pathname, 'utf8'), ]); - const context = vm.createContext({ - Temporal, - }); const result = await runner.executeUserCode( userCode, [{ activity: null}], @@ -570,7 +566,7 @@ describe('behavior', () => { ts.createSourceFile('activity-types.ts', activityTypes, ts.ScriptTarget.ESNext, true), ts.createSourceFile('TemporalPolyfillTypes.ts', temporalPolyfill, ts.ScriptTarget.ESNext, true), ], - context, + { globals: { Temporal } }, ); expect(result.isErr()).toBeTruthy(); @@ -609,22 +605,19 @@ describe('behavior', () => { fs.promises.readFile(new URL('./inputs/TemporalPolyfillTypes.ts', import.meta.url).pathname, 'utf8'), ]); - const context = vm.createContext({ - Temporal, - }); const result = await runner.executeUserCode( - userCode, - [{ activity: null}], - 'Command[] | Command | null', - ['{ activity: ActivityType }'], - 1000, - [ - ts.createSourceFile('command-types.ts', commandTypes, ts.ScriptTarget.ESNext, true), - ts.createSourceFile('activity-types.ts', activityTypes, ts.ScriptTarget.ESNext, true), - ts.createSourceFile('TemporalPolyfillTypes.ts', temporalPolyfill, ts.ScriptTarget.ESNext, true), - ], - context, - ); + userCode, + [{ activity: null }], + 'Command[] | Command | null', + ['{ activity: ActivityType }'], + 1000, + [ + ts.createSourceFile('command-types.ts', commandTypes, ts.ScriptTarget.ESNext, true), + ts.createSourceFile('activity-types.ts', activityTypes, ts.ScriptTarget.ESNext, true), + ts.createSourceFile('TemporalPolyfillTypes.ts', temporalPolyfill, ts.ScriptTarget.ESNext, true), + ], + { globals: { Temporal } }, + ); expect(result.isErr()).toBeTruthy(); expect(result.unwrapErr().length).toBe(3); @@ -666,9 +659,6 @@ describe('behavior', () => { fs.promises.readFile(new URL('./inputs/TemporalPolyfillTypes.ts', import.meta.url).pathname, 'utf8'), ]); - const context = vm.createContext({ - Temporal, - }); const result = await runner.executeUserCode( userCode, [{ activity: { attributes: { arguments: { primitiveLong: 1 } } } }], @@ -680,7 +670,7 @@ describe('behavior', () => { ts.createSourceFile('activity-types.ts', activityTypes, ts.ScriptTarget.ESNext, true), ts.createSourceFile('TemporalPolyfillTypes.ts', temporalPolyfill, ts.ScriptTarget.ESNext, true), ], - context, + { globals: { Temporal } }, ); expect(result.isOk()).toBeTruthy(); @@ -1076,22 +1066,19 @@ describe('regression tests', () => { fs.promises.readFile(new URL('./inputs/TemporalPolyfillTypes.ts', import.meta.url).pathname, 'utf8'), ]); - const context = vm.createContext({ - Temporal, - }); const result = await runner.executeUserCode( - userCode, - [{ activity: null }], - 'Command[] | Command | null', - ['{ activity: ActivityType }'], - 1000, - [ - ts.createSourceFile('command-types.ts', commandTypes, ts.ScriptTarget.ESNext, true), - ts.createSourceFile('activity-types.ts', activityTypes, ts.ScriptTarget.ESNext, true), - ts.createSourceFile('TemporalPolyfillTypes.ts', temporalPolyfill, ts.ScriptTarget.ESNext, true), - ], - context, - ); + userCode, + [{ activity: null }], + 'Command[] | Command | null', + ['{ activity: ActivityType }'], + 1000, + [ + ts.createSourceFile('command-types.ts', commandTypes, ts.ScriptTarget.ESNext, true), + ts.createSourceFile('activity-types.ts', activityTypes, ts.ScriptTarget.ESNext, true), + ts.createSourceFile('TemporalPolyfillTypes.ts', temporalPolyfill, ts.ScriptTarget.ESNext, true), + ], + { globals: { Temporal } }, + ); expect(result.unwrap()).toMatchObject({ stem: 'BAKE_BREAD', @@ -1122,9 +1109,6 @@ describe('regression tests', () => { fs.promises.readFile(new URL('./inputs/TemporalPolyfillTypes.ts', import.meta.url).pathname, 'utf8'), ]); - const context = vm.createContext({ - Temporal, - }); const result = await runner.executeUserCode( userCode, [{ activityInstance: null }, {}], @@ -1136,7 +1120,7 @@ describe('regression tests', () => { ts.createSourceFile('activity-types.ts', activityTypes, ts.ScriptTarget.ESNext, true), ts.createSourceFile('TemporalPolyfillTypes.ts', temporalPolyfill, ts.ScriptTarget.ESNext, true), ], - context, + {} ); expect(result.isErr()).toBeTruthy(); @@ -1207,7 +1191,6 @@ describe('regression tests', () => { fs.promises.readFile(new URL('./inputs/mission-model-generated-code.ts', import.meta.url).pathname, 'utf8'), ]); - const context = vm.createContext({}); const result = await runner.executeUserCode( userCode, [], @@ -1219,7 +1202,7 @@ describe('regression tests', () => { ts.createSourceFile('scheduler-edsl-fluent-api.ts', schedulerEdsl, ts.ScriptTarget.ESNext), ts.createSourceFile('mission-model-generated-code.ts', modelSpecific, ts.ScriptTarget.ESNext), ], - context, + {}, ); expect(result.unwrap()).toMatchObject({ @@ -1263,7 +1246,6 @@ describe('regression tests', () => { fs.promises.readFile(new URL('./inputs/dsl-model-specific--2345.ts', import.meta.url).pathname, 'utf8'), ]); - const context = vm.createContext({}); const result = await runner.executeUserCode( userCode, [], @@ -1275,7 +1257,7 @@ describe('regression tests', () => { ts.createSourceFile('scheduler-edsl-fluent-api.ts', schedulerEdsl, ts.ScriptTarget.ESNext), ts.createSourceFile('mission-model-generated-code.ts', modelSpecific, ts.ScriptTarget.ESNext), ], - context, + {}, ); expect(result.isErr()).toBeTruthy(); @@ -1307,20 +1289,19 @@ describe('regression tests', () => { fs.promises.readFile(new URL('./inputs/mission-model-generated-code.ts', import.meta.url).pathname, 'utf8'), ]); - const context = vm.createContext({}); const result = await runner.executeUserCode( - userCode, - [], - 'Goal', - [], - undefined, - [ - ts.createSourceFile('scheduler-ast.ts', schedulerAst, ts.ScriptTarget.ESNext), - ts.createSourceFile('scheduler-edsl-fluent-api.ts', schedulerEdsl, ts.ScriptTarget.ESNext), - ts.createSourceFile('mission-model-generated-code.ts', modelSpecific, ts.ScriptTarget.ESNext), - ], - context, - ); + userCode, + [], + 'Goal', + [], + undefined, + [ + ts.createSourceFile('scheduler-ast.ts', schedulerAst, ts.ScriptTarget.ESNext), + ts.createSourceFile('scheduler-edsl-fluent-api.ts', schedulerEdsl, ts.ScriptTarget.ESNext), + ts.createSourceFile('mission-model-generated-code.ts', modelSpecific, ts.ScriptTarget.ESNext), + ], + {}, + ); expect(result.isErr()).toBeTruthy(); expect(result.unwrapErr().length).toBe(1); @@ -1350,7 +1331,6 @@ describe('regression tests', () => { fs.promises.readFile(new URL('./inputs/mission-model-generated-code.ts', import.meta.url).pathname, 'utf8'), ]); - const context = vm.createContext({}); const result = await runner.executeUserCode( userCode, [], @@ -1362,7 +1342,7 @@ describe('regression tests', () => { ts.createSourceFile('scheduler-edsl-fluent-api.ts', schedulerEdsl, ts.ScriptTarget.ESNext), ts.createSourceFile('mission-model-generated-code.ts', modelSpecific, ts.ScriptTarget.ESNext), ], - context, + {} ); expect(result.isOk()).toBeTruthy(); @@ -1385,7 +1365,6 @@ describe('regression tests', () => { fs.promises.readFile(new URL('./inputs/mission-model-generated-code.ts', import.meta.url).pathname, 'utf8'), ]); - const context = vm.createContext({}); const result = await runner.executeUserCode( userCode, [], @@ -1397,7 +1376,7 @@ describe('regression tests', () => { ts.createSourceFile('scheduler-edsl-fluent-api.ts', schedulerEdsl, ts.ScriptTarget.ESNext), ts.createSourceFile('mission-model-generated-code.ts', modelSpecific, ts.ScriptTarget.ESNext), ], - context, + {}, ); expect(result.isErr()).toBeTruthy(); @@ -1428,7 +1407,6 @@ describe('regression tests', () => { fs.promises.readFile(new URL('./inputs/mission-model-generated-code.ts', import.meta.url).pathname, 'utf8'), ]); - const context = vm.createContext({}); const result = await runner.executeUserCode( userCode, [], @@ -1440,7 +1418,7 @@ describe('regression tests', () => { ts.createSourceFile('scheduler-edsl-fluent-api.ts', schedulerEdsl, ts.ScriptTarget.ESNext), ts.createSourceFile('mission-model-generated-code.ts', modelSpecific, ts.ScriptTarget.ESNext), ], - context, + {} ); expect(result.isErr()).toBeTruthy(); @@ -1471,9 +1449,6 @@ describe('regression tests', () => { fs.promises.readFile(new URL('./inputs/TemporalPolyfillTypes.ts', import.meta.url).pathname, 'utf8'), ]); - const context = vm.createContext({ - Temporal, - }); const result = await runner.executeUserCode( userCode, [{ activity: null }], @@ -1485,7 +1460,7 @@ describe('regression tests', () => { ts.createSourceFile('activity-types.ts', activityTypes, ts.ScriptTarget.ESNext, true), ts.createSourceFile('TemporalPolyfillTypes.ts', temporalPolyfill, ts.ScriptTarget.ESNext, true), ], - context, + {}, ); expect(result.isErr()).toBeTruthy(); @@ -1548,7 +1523,6 @@ describe('regression tests', () => { fs.promises.readFile(new URL('./inputs/mission-model-generated-code.ts', import.meta.url).pathname, 'utf8'), ]); - const context = vm.createContext({}); const result = await runner.executeUserCode( userCode, [], @@ -1560,7 +1534,7 @@ describe('regression tests', () => { ts.createSourceFile('scheduler-edsl-fluent-api.ts', schedulerEdsl, ts.ScriptTarget.ESNext), ts.createSourceFile('mission-model-generated-code.ts', modelSpecific, ts.ScriptTarget.ESNext), ], - context, + {}, ); expect(result.isErr()).toBeTruthy(); @@ -1641,9 +1615,7 @@ describe('regression tests', () => { ts.createSourceFile('command-types.ts', commandTypes, ts.ScriptTarget.ESNext), ts.createSourceFile('TemporalPolyfillTypes.ts', temporalPolyfill, ts.ScriptTarget.ESNext), ], - vm.createContext({ - Temporal, - }), + { globals: { Temporal } }, ); expect(result.isErr()).toBeTruthy(); From 3b0eed6ca050b989dba9ccc135709324597e6c52 Mon Sep 17 00:00:00 2001 From: dandelany Date: Fri, 31 Jul 2026 14:59:31 -0700 Subject: [PATCH 07/17] cleanup old code, add result serializer --- src/UserCodeRunner.ts | 144 +++++++++--------------------------- test/UserCodeRunner.spec.ts | 42 ++++++++++- 2 files changed, 78 insertions(+), 108 deletions(-) diff --git a/src/UserCodeRunner.ts b/src/UserCodeRunner.ts index 829b936..fb2aa7b 100644 --- a/src/UserCodeRunner.ts +++ b/src/UserCodeRunner.ts @@ -154,16 +154,32 @@ export class UserCodeRunner { ts.ScriptKind.TS, ); - const tsFileMap = new Map(); - - tsFileMap.set(USER_CODE_FILENAME, userSourceFile); - tsFileMap.set(EXECUTION_HARNESS_FILENAME, executionSourceFile); + // Precompiled JavaScript bundles are runtime-only guest modules. + // They must bypass TypeScript compilation to avoid re-emission conflicts. + const runtimeJavascriptFiles = additionalSourceFiles.filter(file => /\.(?:c|m)?js$/.test(file.fileName)); + + // TypeScript and declaration files remain in the virtual compiler program for + // type checking, transpilation, diagnostics, and source-map generation. + const typescriptSourceFiles = additionalSourceFiles.filter(file => !/\.(?:c|m)?js$/.test(file.fileName)); + + const tsFileMap = new Map([ + [USER_CODE_FILENAME, userSourceFile], + [EXECUTION_HARNESS_FILENAME, executionSourceFile], + ]); + for (const typescriptSourceFile of typescriptSourceFiles) { + tsFileMap.set(removeExt(typescriptSourceFile.fileName), typescriptSourceFile); + } - for (const additionalSourceFile of additionalSourceFiles) { - tsFileMap.set(removeExt(additionalSourceFile.fileName), additionalSourceFile); + // Seed the runtime module map with precompiled JS guest bundles unchanged. + const jsFileMap: Record = {}; + for (const file of runtimeJavascriptFiles) { + const moduleName = removeExt(file.fileName); + if (jsFileMap[moduleName] !== undefined) { + throw new Error(`Duplicate runtime module: ${moduleName}`); + } + jsFileMap[moduleName] = file.text; } - const jsFileMap = {} as { [key: string]: string }; let userCodeSourceMap: string; const defaultCompilerHost = ts.createCompilerHost({}); @@ -187,15 +203,14 @@ export class UserCodeRunner { if (removeExt(filenameSansExt) === USER_CODE_FILENAME) { userCodeSourceMap = ts.createSourceFile(removeExt(filenameSansExt), data, ts.ScriptTarget.ESNext).text; } - } else { - jsFileMap[filenameSansExt] = ts.createSourceFile( - filenameSansExt, - data, - ts.ScriptTarget.ESNext, - undefined, - ts.ScriptKind.JS, - ).text; + return; + } + // Prevent emitted TypeScript from silently replacing a supplied runtime bundle. + if (jsFileMap[filenameSansExt] !== undefined) { + throw new Error(`Duplicate emitted module: ${filenameSansExt}`); } + // Add transpiled (now JS) modules to the same map as the untouched precompiled JS bundles. + jsFileMap[filenameSansExt] = data; }, readFile(fileName: string): string | undefined { const filenameSansExt = removeExt(fileName); @@ -211,12 +226,18 @@ export class UserCodeRunner { }; const program = ts.createProgram( - [...additionalSourceFiles.map(f => f.fileName), EXECUTION_HARNESS_FILENAME], + [...typescriptSourceFiles.map(f => f.fileName), EXECUTION_HARNESS_FILENAME], { target: ts.ScriptTarget.ESNext, module: ts.ModuleKind.ES2022, lib: ['lib.esnext.d.ts'], sourceMap: true, + // allow TS files OR pre-bundled JS files + allowJs: true, + checkJs: true, + // prevent pre-bundled JavaScript inputs from overwriting themselves + // The custom compiler host captures these virtual output paths in memory. + outDir: '__generated__', }, customCompilerHost, ); @@ -286,26 +307,6 @@ export class UserCodeRunner { }); } - public async executeUserCodeOld( - userCode: string, - args: ArgsType, - outputType: string = 'any', - argsTypes: string[] = ['any'], - timeout: number = 5000, - additionalSourceFiles: ts.SourceFile[] = [], - globals: UserCodeGlobals = {}, - ): Promise> { - const result = await this.preProcess(userCode, outputType, argsTypes, additionalSourceFiles); - - if (result.isErr()) { - return result; - } - - const { jsFileMap, userCodeSourceMap } = result.unwrap(); - - return this.executeUserCodeFromArtifacts(jsFileMap, userCodeSourceMap, args, timeout, globals); - } - public async executeUserCodeFromArtifacts( jsFileMap: Record, sourceMap: string, @@ -375,77 +376,6 @@ export class UserCodeRunner { isolate.dispose(); } } - - public async executeUserCodeFromArtifactsOld( - jsFileMap: Record, - sourceMap: string, - args: ArgsType, - timeout = 5000, - globals: UserCodeGlobals = {}, - ): Promise> { - // create an isolated VM + context - const isolate = new ivm.Isolate({ - memoryLimit: 128, - }); - - try { - const context = isolate.createContextSync(); - const global = context.global; - - // put args & result into context - // any objects from host must be set with {copy: true}, this creates guest-owned deep clones of originals, - // not live host objects whose prototypes or constructors could expose host capabilities. - global.setSync('__args', args, { copy: true }); - global.setSync('__result', undefined); - - // put user-provided globals into context - for (const [name, value] of Object.entries(globals)) { - if (name === '__args' || name === '__result') { - throw new Error(`Reserved global name: ${name}`); - } - global.setSync(name, value, { copy: true }); - } - - // Create modules for VM - const moduleCache = new Map(); - for (const [fileName, content] of Object.entries(jsFileMap)) { - moduleCache.set( - fileName, - isolate.compileModuleSync(content, { - filename: fileName, - }), - ); - } - - // the harness module imports and invokes the user module, - // keeping execution and result capture inside the isolated context. - const harnessModule = moduleCache.get(EXECUTION_HARNESS_FILENAME); - if (harnessModule === undefined) { - throw new Error('Execution harness module is missing'); - } - // recursively resolve & link the harness module’s imports - harnessModule.instantiateSync(context, specifier => { - // module names currently use a flat namespace; directory paths and extensions are discarded. - const filenameSansExt = removeExt(specifier); - const module = moduleCache.get(filenameSansExt); - if (module === undefined) { - throw new Error(`Unable to resolve dependency: ${specifier}`); - } - return module; - }); - - // evaluate the resolved module - await harnessModule.evaluate({ timeout }); - // copy guest results out as host-owned data; don't expose live guest reference. - const value = await global.get('__finalResult', { copy: true }); - - return Result.Ok(value as OutputType); - } catch (error) { - return Result.Err([UserCodeRuntimeError.new(error as Error, await new SourceMapConsumer(sourceMap))]); - } finally { - isolate.dispose(); - } - } } diff --git a/test/UserCodeRunner.spec.ts b/test/UserCodeRunner.spec.ts index 5a6b8d1..c3bc825 100644 --- a/test/UserCodeRunner.spec.ts +++ b/test/UserCodeRunner.spec.ts @@ -480,10 +480,50 @@ describe('behavior', () => { } ); - // expect(result.isOk()).toBeTruthy(); expect(result.unwrap()).toBe('hello hello world other'); }); + it('should serialize the result before copying it out, if serializer is provided', async () => { + const serializer = ts.createSourceFile( + 'result-serializer.ts', + ` + export default function serializeResult( + result: { greet(name: string): string }, + ): string { + return result.greet('world'); + } + `, + ts.ScriptTarget.ESNext, + undefined, + ts.ScriptKind.TS, + ); + + const result = await new UserCodeRunner().executeUserCode<[], string>( + ` + export default function() { + return { + greet(name: string): string { + return 'hello ' + name; + }, + }; + } + `, + [], + '{ greet(name: string): string }', + [], + 1000, + [serializer], + { + resultSerializer: { + moduleName: 'result-serializer', + outputType: 'string', + }, + }, + ); + + expect(result.unwrap()).toBe('hello world'); + }); + it('should handle unnamed arrow function default exports', async () => { const userCode = ` type ExpansionProps = { activity: ActivityType }; From 869a71fb3e196a3a00ac62e34197f4e6961f5a17 Mon Sep 17 00:00:00 2001 From: dandelany Date: Mon, 3 Aug 2026 13:25:57 -0700 Subject: [PATCH 08/17] fix issues with error messages --- src/UserCodeRunner.ts | 32 ++++++++----- test/UserCodeRunner.spec.ts | 93 ++++++++++++++++++++++++------------- 2 files changed, 82 insertions(+), 43 deletions(-) diff --git a/src/UserCodeRunner.ts b/src/UserCodeRunner.ts index fb2aa7b..b5bca48 100644 --- a/src/UserCodeRunner.ts +++ b/src/UserCodeRunner.ts @@ -371,7 +371,10 @@ export class UserCodeRunner { return Result.Ok(value as OutputType); } catch (error) { - return Result.Err([UserCodeRuntimeError.new(error as Error, await new SourceMapConsumer(sourceMap))]); + // errors from outside user code are "fatal" and will be re-thrown by new() to bubble up + const runtimeErr = UserCodeRuntimeError.new(error as Error, await new SourceMapConsumer(sourceMap)); + // errors originating in user code are returned to the caller in a Result.Err + return Result.Err([runtimeErr]); } finally { isolate.dispose(); } @@ -493,18 +496,11 @@ export class UserCodeRuntimeError extends UserCodeError { private readonly sourceMap: SourceMapConsumer; private readonly stackFrames: StackFrame[]; - protected constructor(error: Error, sourceMap: SourceMapConsumer) { + protected constructor(error: Error, sourceMap: SourceMapConsumer, stackFrames: StackFrame[]) { super(); this.error = error; this.sourceMap = sourceMap; - this.stackFrames = parse(this.error); - const userCodeFrame = this.stackFrames.find(frame => frame.getFileName() === USER_CODE_FILENAME); - if (userCodeFrame === undefined) { - this.error.message = - 'Error: Runtime error detected outside of user code execution path. This is most likely a bug in the additional library source.\nInherited from:\n' + - this.error.message; - throw this.error; - } + this.stackFrames = stackFrames; } public get message(): string { @@ -552,7 +548,21 @@ export class UserCodeRuntimeError extends UserCodeError { } public static new(error: Error, sourceMap: SourceMapConsumer): UserCodeRuntimeError { - return new UserCodeRuntimeError(error, sourceMap); + const stackFrames = parse(error); + const userCodeFrame = stackFrames.find(frame => frame.getFileName() === USER_CODE_FILENAME); + + if (userCodeFrame === undefined) { + // errors from *outside* user code are thrown instead of wrapped in a Result.Err(UserCodeRuntimeError) + error.message = + 'Runtime error detected outside of user code execution path. ' + + 'This is most likely a bug in the additional library source.\n' + + 'Inherited from:\n' + + error.message; + + throw error; + } + + return new UserCodeRuntimeError(error, sourceMap, stackFrames); } } diff --git a/test/UserCodeRunner.spec.ts b/test/UserCodeRunner.spec.ts index c3bc825..5e9c40c 100644 --- a/test/UserCodeRunner.spec.ts +++ b/test/UserCodeRunner.spec.ts @@ -444,44 +444,71 @@ describe('behavior', () => { expect(result.unwrap()).toBe('hello world'); }); - it('should accept additional source files', async () => { - const userCode = ` - import { importedFunction } from 'other-importable'; + it('should accept additional source files, and allow user code to import and invoke them', async () => { + const userCode = ` + import { importedFunction } from 'other-importable'; + export default function myDSLFunction(thing: string): string { + return importedFunction(thing + ' world'); + } + `.trimTemplate(); + + const runner = new UserCodeRunner(); + + const result = await runner.executeUserCode(userCode, ['hello'], 'string', ['string'], 1000, [ + ts.createSourceFile( + 'other-importable.ts', + ` + export function importedFunction(thing: string): string { + return thing + ' other'; + } + `.trimTemplate(), + ts.ScriptTarget.ESNext, + true, + ), + ]); + + expect(result.unwrap()).toBe('hello world other'); + }); + + it('should reject function globals, since they are non-cloneable and cannot be safely passed in', async () => { + const userCode = ` export default function myDSLFunction(thing: string): string { - return someGlobalFunction(thing) + importedFunction(' world'); + return someGlobalFunction(thing); } - `.trimTemplate(); + `.trimTemplate(); - const runner = new UserCodeRunner(); + const runner = new UserCodeRunner(); - const result = await runner.executeUserCode( - userCode, - ['hello'], - 'string', - ['string'], - 1000, - [ - ts.createSourceFile('globals.d.ts', ` - declare global { - function someGlobalFunction(thing: string): string; - } - export {}; - `.trimTemplate(), ts.ScriptTarget.ESNext, true), - ts.createSourceFile('other-importable.ts', ` - export function importedFunction(thing: string): string { - return thing + ' other'; - } - `.trimTemplate(), ts.ScriptTarget.ESNext, true) - ], + const resultPromise = runner.executeUserCode( + userCode, + ['hello'], + 'string', + ['string'], + 1000, + [ + ts.createSourceFile( + 'globals.d.ts', + ` + declare global { + function someGlobalFunction(thing: string): string; + } + export {}; + `.trimTemplate(), + ts.ScriptTarget.ESNext, + true, + ), + ], { globals: { - someGlobalFunction: (thing: string) => 'hello ' + thing, // Implementation injected to global namespace here - } - } - ); + someGlobalFunction: (thing: string) => `hello ${thing}`, + }, + }, + ); - expect(result.unwrap()).toBe('hello hello world other'); - }); + await expect(resultPromise).rejects.toThrow( + /Runtime error detected outside of user code execution path[\s\S]*could not be cloned/, + ); + }); it('should serialize the result before copying it out, if serializer is provided', async () => { const serializer = ts.createSourceFile( @@ -556,7 +583,9 @@ describe('behavior', () => { ts.createSourceFile('activity-types.ts', activityTypes, ts.ScriptTarget.ESNext, true), ts.createSourceFile('TemporalPolyfillTypes.ts', temporalPolyfill, ts.ScriptTarget.ESNext, true), ], - { globals: { Temporal } }, + { + // globals: { Temporal } + }, ); expect(result.isErr()).toBeTruthy(); From 40fede5e88a6864e0fb90bdcd69e110c452b0b3e Mon Sep 17 00:00:00 2001 From: dandelany Date: Mon, 3 Aug 2026 14:12:00 -0700 Subject: [PATCH 09/17] fix remaining tests --- test/UserCodeRunner.spec.ts | 202 ++++++++++++++---------------------- 1 file changed, 76 insertions(+), 126 deletions(-) diff --git a/test/UserCodeRunner.spec.ts b/test/UserCodeRunner.spec.ts index 5e9c40c..3b1c84f 100644 --- a/test/UserCodeRunner.spec.ts +++ b/test/UserCodeRunner.spec.ts @@ -551,56 +551,35 @@ describe('behavior', () => { expect(result.unwrap()).toBe('hello world'); }); - it('should handle unnamed arrow function default exports', async () => { - const userCode = ` - type ExpansionProps = { activity: ActivityType }; + it('should handle unnamed arrow function default exports', async () => { + const runner = new UserCodeRunner(); - export default (props: ExpansionProps): ExpansionReturn => { - const { activity } = props; - const { biteSize } = activity.attributes.arguments; - - return [ - AVS_DMP_ADC_SNAPSHOT(biteSize) - ]; - } - `.trimTemplate() + const result = await runner.executeUserCode( + `export default (thing: string): string => thing + ' world';`, + ['hello'], + 'string', + ['string'], + 1000, + ); - const runner = new UserCodeRunner(); - const [commandTypes, activityTypes, temporalPolyfill] = await Promise.all([ - fs.promises.readFile(new URL('./inputs/command-types.ts', import.meta.url).pathname, 'utf8'), - fs.promises.readFile(new URL('./inputs/activity-types.ts', import.meta.url).pathname, 'utf8'), - fs.promises.readFile(new URL('./inputs/TemporalPolyfillTypes.ts', import.meta.url).pathname, 'utf8'), - ]); + expect(result.unwrap()).toBe('hello world'); + }); - const result = await runner.executeUserCode( - userCode, - [{ activity: null}], - 'Command[] | Command | null', - ['{ activity: ActivityType }'], - 1000, - [ - ts.createSourceFile('command-types.ts', commandTypes, ts.ScriptTarget.ESNext, true), - ts.createSourceFile('activity-types.ts', activityTypes, ts.ScriptTarget.ESNext, true), - ts.createSourceFile('TemporalPolyfillTypes.ts', temporalPolyfill, ts.ScriptTarget.ESNext, true), - ], - { - // globals: { Temporal } - }, - ); + it('should handle unnamed arrow function default exports assignment', async () => { + const runner = new UserCodeRunner(); - expect(result.isErr()).toBeTruthy(); - expect(result.unwrapErr().length).toBe(3); - expect(result.unwrapErr()[0].message).toBe(` - TypeError: TS2322 Incorrect return type. Expected: 'Command[] | Command | null | Promise', Actual: 'ExpansionReturn'. - `.trimTemplate()); - expect(result.unwrapErr()[0].stack).toBe(` - at (3:1) - `.trimTemplate()) - expect(result.unwrapErr()[0].location).toMatchObject({ - line: 3, - column: 1, - }); - }); + const result = await runner.executeUserCode(` + const myDSLFunction = (thing: string): string => thing + ' world'; + export default myDSLFunction; + `.trimTemplate(), + ['hello'], + 'string', + ['string'], + 1000, + ); + + expect(result.unwrap()).toBe('hello world'); + }); it('should handle exported variable that references an arrow function', async () => { const userCode = ` @@ -702,49 +681,6 @@ describe('behavior', () => { }); }); - it('should handle unnamed arrow function default exports assignment', async () => { - const userCode = ` - type ExpansionProps = { activity: ActivityType }; - - const myExpansion = (props: ExpansionProps) => { - const { activity } = props; - const { primitiveLong } = activity.attributes.arguments; - - if (true) { - return undefined; - } - - return [ - PREHEAT_OVEN(primitiveLong) - ]; - }; - export default myExpansion; - `.trimTemplate() - - const runner = new UserCodeRunner(); - const [commandTypes, activityTypes, temporalPolyfill] = await Promise.all([ - fs.promises.readFile(new URL('./inputs/command-types.ts', import.meta.url).pathname, 'utf8'), - fs.promises.readFile(new URL('./inputs/activity-types.ts', import.meta.url).pathname, 'utf8'), - fs.promises.readFile(new URL('./inputs/TemporalPolyfillTypes.ts', import.meta.url).pathname, 'utf8'), - ]); - - const result = await runner.executeUserCode( - userCode, - [{ activity: { attributes: { arguments: { primitiveLong: 1 } } } }], - 'Command[] | Command | null', - ['{ activity: ActivityType }'], - 1000, - [ - ts.createSourceFile('command-types.ts', commandTypes, ts.ScriptTarget.ESNext, true), - ts.createSourceFile('activity-types.ts', activityTypes, ts.ScriptTarget.ESNext, true), - ts.createSourceFile('TemporalPolyfillTypes.ts', temporalPolyfill, ts.ScriptTarget.ESNext, true), - ], - { globals: { Temporal } }, - ); - - expect(result.isOk()).toBeTruthy(); - }); - it('should handle throws in user code but outside default function execution path', async () => { const userCode = ` export default function MyDSLFunction(thing: string): string { @@ -777,43 +713,40 @@ describe('behavior', () => { }); }); - it('should handle throws in library code outside default function execution path with an explicit error', async () => { - const userCode = ` - export default function MyDSLFunction(thing: string): string { - return thing + ' world'; - } - `.trimTemplate(); + it('should handle throws in library code outside default function execution path with an explicit error', async () => { + const userCode = ` + export default function MyDSLFunction(thing: string): string { + return thing + ' world'; + } + `.trimTemplate(); - const runner = new UserCodeRunner(); + const runner = new UserCodeRunner(); - try { - await runner.executeUserCode( - userCode, - ['hello'], - 'string', - ['string'], - 1000, - [ - ts.createSourceFile('additionalFile.ts', ` - export {} - throw new Error('This is a test error'); - `.trimTemplate(), ts.ScriptTarget.ESNext, true), - ], - ); - } catch (err: any) { - expect(err.message).toBe(` - Error: Runtime error detected outside of user code execution path. This is most likely a bug in the additional library source. - Inherited from: - This is a test error - `.trimTemplate()); - expect(err.stack).toContain(` - Error: This is a test error - at additionalFile:1:7 - `.trimTemplate()); - expect(err.stack).toMatch(/at SourceTextModule.evaluate \(node:internal\/vm\/module:\d+:\d+\)/); - expect(err.stack).toMatch(/at UserCodeRunner\.executeUserCodeFromArtifacts \(\S+src\/UserCodeRunner\.ts:\d+:\d+/); - } - }); + const resultPromise = runner.executeUserCode(userCode, ['hello'], 'string', ['string'], 1000, [ + ts.createSourceFile( + 'additionalFile.ts', + ` + export {}; + throw new Error('This is a test error'); + `.trimTemplate(), + ts.ScriptTarget.ESNext, + true, + ), + ]); + + const expectedMessage = ` +Runtime error detected outside of user code execution path. This is most likely a bug in the additional library source. +Inherited from: +This is a test error + `.trimTemplate(); + await expect(resultPromise).rejects.toThrow(expectedMessage); + await expect(resultPromise).rejects.toHaveProperty( + 'stack', + expect.stringMatching( + /Error: Runtime error detected[\s\S]*This is a test error[\s\S]*at additionalFile:\d+:\d+/, + ), + ); + }); it('should allow preprocessing of user code and subsequent execution', async () => { const userCode = ` @@ -1145,8 +1078,25 @@ describe('regression tests', () => { ts.createSourceFile('command-types.ts', commandTypes, ts.ScriptTarget.ESNext, true), ts.createSourceFile('activity-types.ts', activityTypes, ts.ScriptTarget.ESNext, true), ts.createSourceFile('TemporalPolyfillTypes.ts', temporalPolyfill, ts.ScriptTarget.ESNext, true), - ], - { globals: { Temporal } }, + // dependencies like Temporal *must* be passed as sourceFiles, not in context/globals + ts.createSourceFile( + 'temporal-bundle-stub.ts', ` + class Duration { + static from(value: string) { + return new Duration(); + } + } + + Object.defineProperty(globalThis, 'Temporal', { + value: { Duration }, + writable: false, + configurable: false, + }); + `.trimTemplate(), + ts.ScriptTarget.ESNext, + true, + ), + ] ); expect(result.unwrap()).toMatchObject({ From de8b9f2c407f66a545635acc8bc7e5468ca897ca Mon Sep 17 00:00:00 2001 From: dandelany Date: Mon, 3 Aug 2026 14:19:28 -0700 Subject: [PATCH 10/17] update test action workflow --- .github/workflows/test.yml | 28 ++++++++++++++----- nasa-jpl-aerie-ts-user-code-runner-0.7.0.tgz | Bin 0 -> 132581 bytes 2 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 nasa-jpl-aerie-ts-user-code-runner-0.7.0.tgz diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f13bb03..fe62c80 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,25 +8,39 @@ on: branches: - develop tags: - - v* + - 'v*' workflow_dispatch: +permissions: + contents: read + jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - name: Check out repository + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Setup Node.js + uses: actions/setup-node@v6 with: - node-version: 'lts/*' + node-version-file: .nvmrc cache: npm + cache-dependency-path: package-lock.json + - name: Install Dependencies run: npm ci + - name: Test run: npm test + - name: Upload Test Results if: always() - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v7 with: - name: Test Results - path: ${{ github.workspace }}/test-report + name: test-results-${{ github.run_id }} + path: test-report + if-no-files-found: warn + retention-days: 14 diff --git a/nasa-jpl-aerie-ts-user-code-runner-0.7.0.tgz b/nasa-jpl-aerie-ts-user-code-runner-0.7.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..7a3f2a0ccd002d5cd6af20bcfacc043d34a5e82b GIT binary patch literal 132581 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 z�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

C(TXEYK58Oc{i)#K#et}mwT{PiyB!P8-6rFh9 zfkjRYDZjMHpKL@2$yOw!oK=hbX`5_rt&|?nRju^HMdFkO@~*O%>30Qfid5fVH2pB5 zg(~yA4Fmh=awxtly6JSxRw_Mmi$j%YrDWTv8ufFQWXU*mRiN-+Sq&OqZ3CS8B`4(bE~75K zjS0Eh=9`%iT0`3*8)w@#F#@KmgXF;of+GPl|{82G)P)fHgee*vQ`_`|5x)X)$ z+U4rxDcLkRwnc>TJ21J6+}Nu<9ESuN4rmG~vyT}`7>DpLnv%^fIi3{c0u%zP=wU`<9l@4m5#&^}J@M`k0AuGM2s==Be zJC)rt8c9xGvqj`4pJcI1i(qZcdgLmK<|bCrY)(?eMpcA5bD3|ROqFwxAyR{5NkU6M z-5o;{hFy7 zg4$&p&oZDwBa?m&SP!unpyOo1#l1#C_9X}@aJ~PM_aCLO$c9*>V>q9@AK~YoAOrkV z#k1y^G#IwJ`au#fZiShYv}}17v`Q&j`qNZlpe(5@9|;Y(UcdurS-2>nLOMKse;AQ~ zFC8%_#zpP>L5k&9casSD?ue!A3%Puz!oCBPcwTc$r;$`T0e&}VP+p76Cx?OX6u++I z>-wF~t2pvSU1d0bdN4R;Bf8T>?5*=9nl1WPw!WtL`}Cb-g0aQl9Vr^W>lnAIr*@?e z?>_F77eiI8Ta5}2iaCX3g?%L~i$85>?d7>Hkj(|?Lc6ZDg-4nIql+$S8p!KVbEU6b zBPmwsqSWsqYs85K+?G>~LT*!bq}l~ok}CR6x$}34n*T74T{aGDzUP>o;VD1kt6=kT z*Al%|QOoz5@(+cve&Q8Qb-)L7sGfVR^5*!k`*8=43C9t_vyHnhTmHFVRR*UB>(4Ex zo-~8wzgCHXn`~EuX?OdvElkMZ=`!z3B|)v^OPGFgEX&T4r3Au=iQ^M%rRC06G-(PWqyKYA{We;?j#gXJUXKu6HtOAZKA#bZd zwFgzzI&N6FkGbck4AXNNA3bCyh!cfQd<-~sk*QEsgB7;{yn{P{!Mqmc2s5eEyzw*~ z#VIW$jRW&D^O_(3^EqBsxL#e;`Kq)yKBM0yoFSLf<`jW~K}HkCk2lWXp)$ebs&~Ib$pt7%kp8Ck3`l@oE>Ka=Xg_(7c0M-Fj2}< zeDqp+RAxi{)$($wA(;k#P>qq0P7UN^|17UX!X#aM_F2kEmXi@YzCP#NXS+_7=e`eg zgBu=?5PP3X__gQH9N3U^(oI89&v26}gDT_YDP|ux$dSNA;s^|mihz>~YT0B8IH6U4>Z>r_*dgE@)Z+-#uo8(<0`>m_=Qvmy!u* zsxusV#ER1_g34y>0GM$>VgaJ=Fo>BdKc_N+(6>a&bC76P%093dY9WrNgt`tgh7z=6 ziIIKb!SyH-hkZ#_yijRP{7&}LsJaVFAago!cT3qxM{pa0 zqbSi*6nW*`27Y6CwssLm#VPT72gL-Lq(Z9@nf53#vCl=$Ml6{UJ~C?pOrfB0%E^#j zu$+wIL7s62tU|hpyy*(0SS6}sH7+17yGZNVa=?M=G`k=pIPq*$6`638DJ?~Cy&L<0 z1*F?duy$l|xYksOROsi?3lC`fK+PeQ(NxJ}xC^ogc;mqG3we#w?hO&T+xJ{#E}AZr%Av>EG%gm)p>P4p_2@h3Fg6!$|0B%6 zFrj@6!c~%SJ|!7GEd#FC4t}Q+p^BD4x0Fo=rzkm0&GO4jNTdfBuO_%0!kKE>Z%gm4 zu(CYA>uB&|HXwC>3+{rNv3aP-PsSvmmwDo>xtWIi4yf zrYW!^dq5#ZDtviJF`iE$NM<--%>f*ZA`KTvyEGN14X2)SMp!^%)ewBM{H_|_OwC0^ zK@xMznKT4zV-OoUM=b|ZP+;LP2YhK6P∾xeoBs4@Qc~*95z{m(kKdUK+~hb_lx8 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 literal 0 HcmV?d00001 From 3e76766e2cda4b5c827e5fbe2775acf6a49b18e7 Mon Sep 17 00:00:00 2001 From: dandelany Date: Mon, 3 Aug 2026 14:34:23 -0700 Subject: [PATCH 11/17] update test workflow --- .github/scripts/write-test-summary.mjs | 22 ++++++++++++++++++++++ .github/workflows/test.yml | 20 +++++++++++++++++--- 2 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 .github/scripts/write-test-summary.mjs diff --git a/.github/scripts/write-test-summary.mjs b/.github/scripts/write-test-summary.mjs new file mode 100644 index 0000000..d9b7d5e --- /dev/null +++ b/.github/scripts/write-test-summary.mjs @@ -0,0 +1,22 @@ +import fs from 'node:fs'; + +const report = fs.existsSync('test-output.txt') + ? fs.readFileSync('test-output.txt', 'utf8').trimEnd() + : 'No test report was generated.'; + +const passed = process.env.TEST_OUTCOME === 'success'; + +const summary = [ + `## ${passed ? '✅ Tests passed' : '❌ Tests failed'}`, + '', + '

', + 'Test results', + '', + '```text', + report, + '```', + '
', + '', +].join('\n'); + +fs.appendFileSync(process.env.GITHUB_STEP_SUMMARY, summary); diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fe62c80..93baeb7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,13 +34,27 @@ jobs: run: npm ci - name: Test - run: npm test + id: test + env: + NO_COLOR: 1 + run: >- + npm test -- + --test-reporter=spec + --test-reporter=spec + --test-reporter-destination=stdout + --test-reporter-destination=test-output.txt + + - name: Add Test Summary + if: always() + env: + TEST_OUTCOME: ${{ steps.test.outcome }} + run: node .github/scripts/write-test-summary.mjs - name: Upload Test Results if: always() uses: actions/upload-artifact@v7 with: name: test-results-${{ github.run_id }} - path: test-report + path: test-output.txt if-no-files-found: warn - retention-days: 14 + retention-days: 14 \ No newline at end of file From ad03b05653d8bfb3b66e0540d88c1b6d3ca2806e Mon Sep 17 00:00:00 2001 From: dandelany Date: Mon, 3 Aug 2026 14:42:56 -0700 Subject: [PATCH 12/17] fix sonarcloud security issues --- .github/workflows/test.yml | 5 ++++- src/UserCodeRunner.ts | 7 ++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 93baeb7..d315c92 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -31,7 +31,10 @@ jobs: cache-dependency-path: package-lock.json - name: Install Dependencies - run: npm ci + run: | + npm ci --ignore-scripts + # isolated-vm requires its lifecycle scripts to build the native addon. + npm rebuild isolated-vm - name: Test id: test diff --git a/src/UserCodeRunner.ts b/src/UserCodeRunner.ts index b5bca48..95160f5 100644 --- a/src/UserCodeRunner.ts +++ b/src/UserCodeRunner.ts @@ -1,5 +1,5 @@ import ivm from 'isolated-vm'; -import path from 'path'; +import path from 'node:path'; import { defaultErrorCodeMessageMappers } from './defaultErrorCodeMessageMappers.js'; import { createMapDiagnosticMessage } from './utils/errorMessageMapping.js'; import ts from 'typescript'; @@ -156,11 +156,12 @@ export class UserCodeRunner { // Precompiled JavaScript bundles are runtime-only guest modules. // They must bypass TypeScript compilation to avoid re-emission conflicts. - const runtimeJavascriptFiles = additionalSourceFiles.filter(file => /\.(?:c|m)?js$/.test(file.fileName)); + const isJavaScriptFile = (fileName: string): boolean => /\.[cm]?js$/.test(fileName); + const runtimeJavascriptFiles = additionalSourceFiles.filter(file => isJavaScriptFile(file.fileName)); // TypeScript and declaration files remain in the virtual compiler program for // type checking, transpilation, diagnostics, and source-map generation. - const typescriptSourceFiles = additionalSourceFiles.filter(file => !/\.(?:c|m)?js$/.test(file.fileName)); + const typescriptSourceFiles = additionalSourceFiles.filter(file => !isJavaScriptFile(file.fileName)); const tsFileMap = new Map([ [USER_CODE_FILENAME, userSourceFile], From d6aefec8ba1acd30013915359a7dba7f4473e881 Mon Sep 17 00:00:00 2001 From: dandelany Date: Mon, 3 Aug 2026 15:05:17 -0700 Subject: [PATCH 13/17] add test:ci script for generating test output file --- .gitignore | 3 ++- package.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index b2ee01f..6ec87bb 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ ts-edsl.iml *.tsbuildinfo .DS_Store build -docs \ No newline at end of file +docs +test-output.txt diff --git a/package.json b/package.json index ba79c6c..b13984d 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "clean": "rm -rf build && rm -rf docs", "doc": "typedoc", "prepare": "npm run build && npm run doc", - "test": "node --experimental-vm-modules --test --loader tsx `glob 'test/**/*.spec.ts'`", + "test": "node --no-node-snapshot --test --loader tsx `glob 'test/**/*.spec.ts'`", + "test:ci": "node --no-node-snapshot --test --loader tsx --test-reporter=spec --test-reporter=spec --test-reporter-destination=stdout --test-reporter-destination=test-output.txt `glob 'test/**/*.spec.ts'`", "watch": "tsc -p tsconfig.json --watch" }, "engines": { From bff3bdc8eeb4dd6595cfcc8458a10ff07da42efb Mon Sep 17 00:00:00 2001 From: dandelany Date: Mon, 3 Aug 2026 15:13:20 -0700 Subject: [PATCH 14/17] fix test workflow --- .github/workflows/test.yml | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d315c92..ebd4113 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,12 +40,7 @@ jobs: id: test env: NO_COLOR: 1 - run: >- - npm test -- - --test-reporter=spec - --test-reporter=spec - --test-reporter-destination=stdout - --test-reporter-destination=test-output.txt + run: npm test:ci - name: Add Test Summary if: always() From b958d5d67983da3f6699b0d40663eaaa2d8c377e Mon Sep 17 00:00:00 2001 From: dandelany Date: Mon, 3 Aug 2026 15:15:23 -0700 Subject: [PATCH 15/17] fix test workflow, remove accidentally added tar bundle --- .github/workflows/test.yml | 2 +- nasa-jpl-aerie-ts-user-code-runner-0.7.0.tgz | Bin 132581 -> 0 bytes 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 nasa-jpl-aerie-ts-user-code-runner-0.7.0.tgz diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index ebd4113..57c5327 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -40,7 +40,7 @@ jobs: id: test env: NO_COLOR: 1 - run: npm test:ci + run: npm run test:ci - name: Add Test Summary if: always() diff --git a/nasa-jpl-aerie-ts-user-code-runner-0.7.0.tgz b/nasa-jpl-aerie-ts-user-code-runner-0.7.0.tgz deleted file mode 100644 index 7a3f2a0ccd002d5cd6af20bcfacc043d34a5e82b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 132581 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 z�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

C(TXEYK58Oc{i)#K#et}mwT{PiyB!P8-6rFh9 zfkjRYDZjMHpKL@2$yOw!oK=hbX`5_rt&|?nRju^HMdFkO@~*O%>30Qfid5fVH2pB5 zg(~yA4Fmh=awxtly6JSxRw_Mmi$j%YrDWTv8ufFQWXU*mRiN-+Sq&OqZ3CS8B`4(bE~75K zjS0Eh=9`%iT0`3*8)w@#F#@KmgXF;of+GPl|{82G)P)fHgee*vQ`_`|5x)X)$ z+U4rxDcLkRwnc>TJ21J6+}Nu<9ESuN4rmG~vyT}`7>DpLnv%^fIi3{c0u%zP=wU`<9l@4m5#&^}J@M`k0AuGM2s==Be zJC)rt8c9xGvqj`4pJcI1i(qZcdgLmK<|bCrY)(?eMpcA5bD3|ROqFwxAyR{5NkU6M z-5o;{hFy7 zg4$&p&oZDwBa?m&SP!unpyOo1#l1#C_9X}@aJ~PM_aCLO$c9*>V>q9@AK~YoAOrkV z#k1y^G#IwJ`au#fZiShYv}}17v`Q&j`qNZlpe(5@9|;Y(UcdurS-2>nLOMKse;AQ~ zFC8%_#zpP>L5k&9casSD?ue!A3%Puz!oCBPcwTc$r;$`T0e&}VP+p76Cx?OX6u++I z>-wF~t2pvSU1d0bdN4R;Bf8T>?5*=9nl1WPw!WtL`}Cb-g0aQl9Vr^W>lnAIr*@?e z?>_F77eiI8Ta5}2iaCX3g?%L~i$85>?d7>Hkj(|?Lc6ZDg-4nIql+$S8p!KVbEU6b zBPmwsqSWsqYs85K+?G>~LT*!bq}l~ok}CR6x$}34n*T74T{aGDzUP>o;VD1kt6=kT z*Al%|QOoz5@(+cve&Q8Qb-)L7sGfVR^5*!k`*8=43C9t_vyHnhTmHFVRR*UB>(4Ex zo-~8wzgCHXn`~EuX?OdvElkMZ=`!z3B|)v^OPGFgEX&T4r3Au=iQ^M%rRC06G-(PWqyKYA{We;?j#gXJUXKu6HtOAZKA#bZd zwFgzzI&N6FkGbck4AXNNA3bCyh!cfQd<-~sk*QEsgB7;{yn{P{!Mqmc2s5eEyzw*~ z#VIW$jRW&D^O_(3^EqBsxL#e;`Kq)yKBM0yoFSLf<`jW~K}HkCk2lWXp)$ebs&~Ib$pt7%kp8Ck3`l@oE>Ka=Xg_(7c0M-Fj2}< zeDqp+RAxi{)$($wA(;k#P>qq0P7UN^|17UX!X#aM_F2kEmXi@YzCP#NXS+_7=e`eg zgBu=?5PP3X__gQH9N3U^(oI89&v26}gDT_YDP|ux$dSNA;s^|mihz>~YT0B8IH6U4>Z>r_*dgE@)Z+-#uo8(<0`>m_=Qvmy!u* zsxusV#ER1_g34y>0GM$>VgaJ=Fo>BdKc_N+(6>a&bC76P%093dY9WrNgt`tgh7z=6 ziIIKb!SyH-hkZ#_yijRP{7&}LsJaVFAago!cT3qxM{pa0 zqbSi*6nW*`27Y6CwssLm#VPT72gL-Lq(Z9@nf53#vCl=$Ml6{UJ~C?pOrfB0%E^#j zu$+wIL7s62tU|hpyy*(0SS6}sH7+17yGZNVa=?M=G`k=pIPq*$6`638DJ?~Cy&L<0 z1*F?duy$l|xYksOROsi?3lC`fK+PeQ(NxJ}xC^ogc;mqG3we#w?hO&T+xJ{#E}AZr%Av>EG%gm)p>P4p_2@h3Fg6!$|0B%6 zFrj@6!c~%SJ|!7GEd#FC4t}Q+p^BD4x0Fo=rzkm0&GO4jNTdfBuO_%0!kKE>Z%gm4 zu(CYA>uB&|HXwC>3+{rNv3aP-PsSvmmwDo>xtWIi4yf zrYW!^dq5#ZDtviJF`iE$NM<--%>f*ZA`KTvyEGN14X2)SMp!^%)ewBM{H_|_OwC0^ zK@xMznKT4zV-OoUM=b|ZP+;LP2YhK6P∾xeoBs4@Qc~*95z{m(kKdUK+~hb_lx8 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 From 78c01b3115492ab6efc66712b622dd8cda3e5193 Mon Sep 17 00:00:00 2001 From: dandelany Date: Mon, 3 Aug 2026 15:42:47 -0700 Subject: [PATCH 16/17] update publish-to-npm script to use NPM trusted publishing instead of deprecated access tokens --- .github/workflows/publish-to-npm.yml | 52 ++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/.github/workflows/publish-to-npm.yml b/.github/workflows/publish-to-npm.yml index 88966d8..2e673c0 100644 --- a/.github/workflows/publish-to-npm.yml +++ b/.github/workflows/publish-to-npm.yml @@ -6,20 +6,52 @@ on: - v* workflow_dispatch: +permissions: + contents: read + # required for GitHub to issue the OIDC identity npm uses for Trusted Publishing + id-token: write + jobs: publish-to-npm: runs-on: ubuntu-latest + environment: publish steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - name: Check out repository + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Setup Node.js + uses: actions/setup-node@v6 with: - cache: npm - node-version: 'lts/*' - registry-url: 'https://registry.npmjs.org' - - name: Install Dependencies - run: npm ci + node-version-file: .nvmrc + registry-url: https://registry.npmjs.org + package-manager-cache: false + + - name: Verify release version + run: >- + node -e " + const { version } = require('./package.json'); + const expectedTag = \`v\${version}\`; + if (process.env.GITHUB_REF_NAME !== expectedTag) { + throw new Error(\`Tag \${process.env.GITHUB_REF_NAME} does not match package version \${expectedTag}\`); + } + " + + - name: Install dependencies + run: | + npm ci --ignore-scripts + # isolated-vm requires its lifecycle scripts to build the native addon. + npm rebuild isolated-vm + + - name: Test + run: npm test + + - name: Build + run: npm run build + + - name: Verify package contents + run: npm pack --dry-run + - name: Publish run: npm publish - continue-on-error: true - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} From 1b01f0cc6d331136caecc7175d2d8aa1ccc0bf2e Mon Sep 17 00:00:00 2001 From: dandelany Date: Mon, 3 Aug 2026 15:53:05 -0700 Subject: [PATCH 17/17] update to release candidate version 1.0.0-rc0, update npm script to publish release candidates with next tag --- .github/workflows/publish-to-npm.yml | 4 ++++ package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/publish-to-npm.yml b/.github/workflows/publish-to-npm.yml index 2e673c0..96d7372 100644 --- a/.github/workflows/publish-to-npm.yml +++ b/.github/workflows/publish-to-npm.yml @@ -54,4 +54,8 @@ jobs: run: npm pack --dry-run - name: Publish + env: + # git tags like `v1.0.0-rc.0` will be tagged as `next` version in NPM instead of `latest` + NPM_DIST_TAG: ${{ contains(github.ref_name, '-') && 'next' || 'latest' }} + run: npm publish --tag "$NPM_DIST_TAG" run: npm publish diff --git a/package-lock.json b/package-lock.json index 40cad2d..f45b1e4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@nasa-jpl/aerie-ts-user-code-runner", - "version": "0.7.0", + "version": "1.0.0-rc0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@nasa-jpl/aerie-ts-user-code-runner", - "version": "0.7.0", + "version": "1.0.0-rc0", "license": "MIT", "dependencies": { "isolated-vm": "6.0.2", diff --git a/package.json b/package.json index b13984d..57a1a71 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@nasa-jpl/aerie-ts-user-code-runner", - "version": "0.7.0", + "version": "1.0.0-rc0", "description": "A simple way to safely run user code written in Typescript.", "main": "build/UserCodeRunner.js", "type": "module",