Skip to content

Commit

Permalink
worker: add eval ts input
Browse files Browse the repository at this point in the history
PR-URL: nodejs#56394
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: Paolo Insogna <[email protected]>
Reviewed-By: Pietro Marchini <[email protected]>
  • Loading branch information
marco-ippolito authored Jan 3, 2025
1 parent 639db21 commit 76b80b1
Show file tree
Hide file tree
Showing 2 changed files with 93 additions and 1 deletion.
27 changes: 26 additions & 1 deletion lib/internal/main/worker_thread.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,10 @@ const { setupMainThreadPort } = require('internal/worker/messaging');
const {
onGlobalUncaughtException,
evalScript,
evalTypeScript,
evalModuleEntryPoint,
parseAndEvalCommonjsTypeScript,
parseAndEvalModuleTypeScript,
} = require('internal/process/execution');

let debug = require('internal/util/debuglog').debuglog('worker', (fn) => {
Expand Down Expand Up @@ -166,7 +169,29 @@ port.on('message', (message) => {
value: filename,
});
ArrayPrototypeSplice(process.argv, 1, 0, name);
evalScript(name, filename);
const tsEnabled = getOptionValue('--experimental-strip-types');
const inputType = getOptionValue('--input-type');

if (inputType === 'module-typescript' && tsEnabled) {
// This is a special case where we want to parse and eval the
// TypeScript code as a module
parseAndEvalModuleTypeScript(filename, false);
break;
}

let evalFunction;
if (inputType === 'commonjs') {
evalFunction = evalScript;
} else if (inputType === 'commonjs-typescript' && tsEnabled) {
evalFunction = parseAndEvalCommonjsTypeScript;
} else if (tsEnabled) {
evalFunction = evalTypeScript;
} else {
// Default to commonjs.
evalFunction = evalScript;
}

evalFunction(name, filename);
break;
}

Expand Down
67 changes: 67 additions & 0 deletions test/parallel/test-worker-eval-typescript.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
'use strict';
require('../common');
const assert = require('assert');
const { Worker } = require('worker_threads');
const { test } = require('node:test');
const { once } = require('events');

const esmHelloWorld = `
import worker from 'worker_threads';
const foo: string = 'Hello, World!';
worker.parentPort.postMessage(foo);
`;

const cjsHelloWorld = `
const { parentPort } = require('worker_threads');
const foo: string = 'Hello, World!';
parentPort.postMessage(foo);
`;

const disableTypeScriptWarningFlag = '--disable-warning=ExperimentalWarning';

test('Worker eval module typescript without input-type', async () => {
const w = new Worker(esmHelloWorld, { eval: true, execArgv: [disableTypeScriptWarningFlag] });
assert.deepStrictEqual(await once(w, 'message'), ['Hello, World!']);
});

test('Worker eval module typescript with --input-type=module-typescript', async () => {
const w = new Worker(esmHelloWorld, { eval: true, execArgv: ['--input-type=module-typescript',
disableTypeScriptWarningFlag] });
assert.deepStrictEqual(await once(w, 'message'), ['Hello, World!']);
});

test('Worker eval module typescript with --input-type=commonjs-typescript', async () => {
const w = new Worker(esmHelloWorld, { eval: true, execArgv: ['--input-type=commonjs-typescript',
disableTypeScriptWarningFlag] });

const [err] = await once(w, 'error');
assert.strictEqual(err.name, 'SyntaxError');
assert.match(err.message, /Cannot use import statement outside a module/);
});

test('Worker eval module typescript with --input-type=module', async () => {
const w = new Worker(esmHelloWorld, { eval: true, execArgv: ['--input-type=module',
disableTypeScriptWarningFlag] });
const [err] = await once(w, 'error');
assert.strictEqual(err.name, 'SyntaxError');
assert.match(err.message, /Missing initializer in const declaration/);
});

test('Worker eval commonjs typescript without input-type', async () => {
const w = new Worker(cjsHelloWorld, { eval: true, execArgv: [disableTypeScriptWarningFlag] });
assert.deepStrictEqual(await once(w, 'message'), ['Hello, World!']);
});

test('Worker eval commonjs typescript with --input-type=commonjs-typescript', async () => {
const w = new Worker(cjsHelloWorld, { eval: true, execArgv: ['--input-type=commonjs-typescript',
disableTypeScriptWarningFlag] });
assert.deepStrictEqual(await once(w, 'message'), ['Hello, World!']);
});

test('Worker eval commonjs typescript with --input-type=module-typescript', async () => {
const w = new Worker(cjsHelloWorld, { eval: true, execArgv: ['--input-type=module-typescript',
disableTypeScriptWarningFlag] });
const [err] = await once(w, 'error');
assert.strictEqual(err.name, 'ReferenceError');
assert.match(err.message, /require is not defined in ES module scope, you can use import instead/);
});

0 comments on commit 76b80b1

Please sign in to comment.