Skip to content

Commit 2079a7a

Browse files
authored
module: do not set CJS variables for Worker eval
PR-URL: #53050 Reviewed-By: Geoffrey Booth <webadmin@geoffreybooth.com> Reviewed-By: James M Snell <jasnell@gmail.com>
1 parent ccceae0 commit 2079a7a

File tree

3 files changed

+42
-6
lines changed

3 files changed

+42
-6
lines changed

lib/internal/process/execution.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ function evalScript(name, body, breakFirstLine, print, shouldLoadESM = false) {
8383

8484
if (getOptionValue('--experimental-detect-module') &&
8585
getOptionValue('--input-type') === '' && getOptionValue('--experimental-default-type') === '' &&
86-
containsModuleSyntax(body, name)) {
86+
containsModuleSyntax(body, name, null, 'no CJS variables')) {
8787
return evalModuleEntryPoint(body, print);
8888
}
8989

src/node_contextify.cc

+13-5
Original file line numberDiff line numberDiff line change
@@ -1442,7 +1442,8 @@ static MaybeLocal<Function> CompileFunctionForCJSLoader(Environment* env,
14421442
Local<Context> context,
14431443
Local<String> code,
14441444
Local<String> filename,
1445-
bool* cache_rejected) {
1445+
bool* cache_rejected,
1446+
bool is_cjs_scope) {
14461447
Isolate* isolate = context->GetIsolate();
14471448
EscapableHandleScope scope(isolate);
14481449

@@ -1494,7 +1495,10 @@ static MaybeLocal<Function> CompileFunctionForCJSLoader(Environment* env,
14941495
options = ScriptCompiler::kConsumeCodeCache;
14951496
}
14961497

1497-
std::vector<Local<String>> params = GetCJSParameters(env->isolate_data());
1498+
std::vector<Local<String>> params;
1499+
if (is_cjs_scope) {
1500+
params = GetCJSParameters(env->isolate_data());
1501+
}
14981502
MaybeLocal<Function> maybe_fn = ScriptCompiler::CompileFunction(
14991503
context,
15001504
&source,
@@ -1556,7 +1560,7 @@ static void CompileFunctionForCJSLoader(
15561560
ShouldNotAbortOnUncaughtScope no_abort_scope(realm->env());
15571561
TryCatchScope try_catch(env);
15581562
if (!CompileFunctionForCJSLoader(
1559-
env, context, code, filename, &cache_rejected)
1563+
env, context, code, filename, &cache_rejected, true)
15601564
.ToLocal(&fn)) {
15611565
CHECK(try_catch.HasCaught());
15621566
CHECK(!try_catch.HasTerminated());
@@ -1694,11 +1698,15 @@ static void ContainsModuleSyntax(const FunctionCallbackInfo<Value>& args) {
16941698
CHECK(args[1]->IsString());
16951699
Local<String> filename = args[1].As<String>();
16961700

1697-
// Argument 2: resource name (URL for ES module).
1701+
// Argument 3: resource name (URL for ES module).
16981702
Local<String> resource_name = filename;
16991703
if (args[2]->IsString()) {
17001704
resource_name = args[2].As<String>();
17011705
}
1706+
// Argument 4: flag to indicate if CJS variables should not be in scope
1707+
// (they should be for normal CommonJS modules, but not for the
1708+
// CommonJS eval scope).
1709+
bool cjs_var = !args[3]->IsString();
17021710

17031711
bool cache_rejected = false;
17041712
Local<String> message;
@@ -1707,7 +1715,7 @@ static void ContainsModuleSyntax(const FunctionCallbackInfo<Value>& args) {
17071715
TryCatchScope try_catch(env);
17081716
ShouldNotAbortOnUncaughtScope no_abort_scope(env);
17091717
if (CompileFunctionForCJSLoader(
1710-
env, context, code, filename, &cache_rejected)
1718+
env, context, code, filename, &cache_rejected, cjs_var)
17111719
.ToLocal(&fn)) {
17121720
args.GetReturnValue().Set(false);
17131721
return;

test/es-module/test-esm-detect-ambiguous.mjs

+28
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,19 @@ describe('--experimental-detect-module', { concurrency: !process.env.TEST_PARALL
4444
strictEqual(signal, null);
4545
});
4646

47+
it('should not switch to module if code is parsable as script', async () => {
48+
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [
49+
'--experimental-detect-module',
50+
'--eval',
51+
'let __filename,__dirname,require,module,exports;this.a',
52+
]);
53+
54+
strictEqual(stderr, '');
55+
strictEqual(stdout, '');
56+
strictEqual(code, 0);
57+
strictEqual(signal, null);
58+
});
59+
4760
it('should be overridden by --experimental-default-type', async () => {
4861
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [
4962
'--experimental-detect-module',
@@ -393,3 +406,18 @@ describe('Wrapping a `require` of an ES module while using `--abort-on-uncaught-
393406
strictEqual(signal, null);
394407
});
395408
});
409+
410+
describe('when working with Worker threads', () => {
411+
it('should support sloppy scripts that declare CJS "global-like" variables', async () => {
412+
const { code, signal, stdout, stderr } = await spawnPromisified(process.execPath, [
413+
'--experimental-detect-module',
414+
'--eval',
415+
'new worker_threads.Worker("let __filename,__dirname,require,module,exports;this.a",{eval:true})',
416+
]);
417+
418+
strictEqual(stderr, '');
419+
strictEqual(stdout, '');
420+
strictEqual(code, 0);
421+
strictEqual(signal, null);
422+
});
423+
});

0 commit comments

Comments
 (0)