From 0b1ca1ae29722101676d98c01d757ed6947f4201 Mon Sep 17 00:00:00 2001 From: Joe Clark Date: Tue, 16 Dec 2025 11:01:45 +0000 Subject: [PATCH] experiment with custom promise --- packages/runtime/src/execute/context.ts | 19 +++++++++++++++++++ packages/runtime/test/errors.test.ts | 22 ++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/packages/runtime/src/execute/context.ts b/packages/runtime/src/execute/context.ts index 5a644ed34..8e80d65de 100644 --- a/packages/runtime/src/execute/context.ts +++ b/packages/runtime/src/execute/context.ts @@ -34,6 +34,24 @@ export default ( } } + // TODO naming + class FancyPromise extends Promise { + constructor(resolve, reject) { + super(resolve, reject); + } + reject(e: any) { + console.log(' >>> custom reject!!'); + if (!e || !(e instanceof Error)) { + // Force all promise objects to be errors + // This allows us to track positions + const error = new Error(); + Object.assign(error, e); + return super.reject(error); + } + return super.reject(e); + } + } + const context = vm.createContext( freezeAll( { @@ -48,6 +66,7 @@ export default ( setTimeout, state, // TODO will be dropped as a global one day, see https://github.com/OpenFn/kit/issues/17 Buffer: SafeBuffer, + Promise: FancyPromise, }, { state: true } ), diff --git a/packages/runtime/test/errors.test.ts b/packages/runtime/test/errors.test.ts index 2153e2607..21b01b8e9 100644 --- a/packages/runtime/test/errors.test.ts +++ b/packages/runtime/test/errors.test.ts @@ -313,6 +313,28 @@ test('fail on runtime TypeError', async (t) => { }); }); +test.only('fail with position on rejected promise', async (t) => { + const expression = `export default [(s) => { + return Promise.reject({}); +}]`; + + const result: any = await run(expression); + const error = result.errors['job-1']; + t.log(error); + + // t.deepEqual(error, { + // message: "TypeError: Cannot read properties of undefined (reading 'y')", + // name: 'RuntimeError', + // subtype: 'TypeError', + // severity: 'fail', + // source: 'runtime', + // pos: { + // column: 28, + // line: 1, + // }, + // }); +}); + test('fail on runtime error with RangeError', async (t) => { const expression = 'export default [(s) => Number.parseFloat("1").toFixed(-1)]';