From cc4e34586e93a5e1ef6ab0b475240b8e2c3af97d Mon Sep 17 00:00:00 2001 From: Pelle Johnsen Date: Mon, 28 Nov 2022 16:29:44 +0000 Subject: [PATCH] fix: emit closure requires in global scope --- sdk/nodejs/runtime/closure/serializeClosure.ts | 11 +++++++++++ sdk/nodejs/tests/runtime/tsClosureCases.ts | 12 ++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/sdk/nodejs/runtime/closure/serializeClosure.ts b/sdk/nodejs/runtime/closure/serializeClosure.ts index c4ae3f925115..0e8a80ef8699 100644 --- a/sdk/nodejs/runtime/closure/serializeClosure.ts +++ b/sdk/nodejs/runtime/closure/serializeClosure.ts @@ -151,6 +151,7 @@ function serializeJavaScriptText( let environmentText = ""; let functionText = ""; + const emittedRequires = new Set(); const outerFunctionName = emitFunctionAndGetName(outerClosure.func); @@ -202,6 +203,16 @@ function serializeJavaScriptText( const parameters = [...Array(functionInfo.paramCount)].map((_, index) => `__${index}`).join(", "); + for (const [keyEntry, { entry: valEntry }] of functionInfo.capturedValues) { + if (valEntry.module !== undefined) { + if(!emittedRequires.has(keyEntry.json)) { + emittedRequires.add(keyEntry.json); + functionText += `const ${keyEntry.json} = require("${valEntry.module}");\n`; + } + delete capturedValues[keyEntry.json]; + } + } + functionText += "\n" + "function " + varName + "(" + parameters + ") {\n" + " return (function() {\n" + diff --git a/sdk/nodejs/tests/runtime/tsClosureCases.ts b/sdk/nodejs/tests/runtime/tsClosureCases.ts index eed6ef740047..19b90290e5f2 100644 --- a/sdk/nodejs/tests/runtime/tsClosureCases.ts +++ b/sdk/nodejs/tests/runtime/tsClosureCases.ts @@ -859,10 +859,11 @@ return () => { let x = eval("undefined + null + NaN + Infinity + __filename"); r title: "Capture built in module by ref", func: () => os, expectText: `exports.handler = __f0; +const os = require("os"); function __f0() { return (function() { - with({ os: require("os") }) { + with({ }) { return () => os; @@ -886,10 +887,11 @@ return () => os; return { v }; }, expectText: `exports.handler = __f0; +const os = require("os"); function __f0(__0, __1, __2) { return (function() { - with({ os: require("os") }) { + with({ }) { return (a, b, c) => { const v = os; @@ -915,10 +917,11 @@ return (a, b, c) => { title: "Capture module through indirect function references", func: func, expectText: `exports.handler = __f0; +const os = require("os"); function __f1() { return (function() { - with({ os: require("os") }) { + with({ }) { return () => os; @@ -6645,10 +6648,11 @@ return function (thisArg, _arguments, P, generator) { } }).apply(undefined, undefined).apply(this, arguments); } +const mockpackage_1 = require("mockpackage"); function __f1() { return (function() { - with({ mockpackage_1: require("mockpackage") }) { + with({ }) { return () => mockpackage_1.z.object({ message: mockpackage_1.z.string(),