Skip to content

module: fix typescript import.meta.main #58661

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions lib/internal/modules/esm/translators.js
Original file line number Diff line number Diff line change
Expand Up @@ -593,17 +593,17 @@ translators.set('addon', function translateAddon(url, source, isMain) {
});

// Strategy for loading a commonjs TypeScript module
translators.set('commonjs-typescript', function(url, source) {
translators.set('commonjs-typescript', function(url, source, isMain) {
assertBufferSource(source, true, 'load');
const code = stripTypeScriptModuleTypes(stringify(source), url);
debug(`Translating TypeScript ${url}`);
return FunctionPrototypeCall(translators.get('commonjs'), this, url, code, false);
return FunctionPrototypeCall(translators.get('commonjs'), this, url, code, isMain);
});

// Strategy for loading an esm TypeScript module
translators.set('module-typescript', function(url, source) {
translators.set('module-typescript', function(url, source, isMain) {
assertBufferSource(source, true, 'load');
const code = stripTypeScriptModuleTypes(stringify(source), url);
debug(`Translating TypeScript ${url}`);
return FunctionPrototypeCall(translators.get('module'), this, url, code, false);
return FunctionPrototypeCall(translators.get('module'), this, url, code, isMain);
});
80 changes: 69 additions & 11 deletions test/es-module/test-esm-import-meta-main-eval.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,6 @@ import * as fixtures from '../common/fixtures.js';
import assert from 'node:assert/strict';
import { describe, it } from 'node:test';

const importMetaMainScript = `
import assert from 'node:assert/strict';

assert.strictEqual(import.meta.main, true, 'import.meta.main should evaluate true in main module');

const { isMain: importedModuleIsMain } = await import(
${JSON.stringify(fixtures.fileURL('es-modules/import-meta-main.mjs'))}
);
assert.strictEqual(importedModuleIsMain, false, 'import.meta.main should evaluate false in imported module');
`;

function wrapScriptInEvalWorker(script) {
return `
import { Worker } from 'node:worker_threads';
Expand All @@ -33,6 +22,17 @@ function wrapScriptInUrlWorker(script) {
}

describe('import.meta.main in evaluated scripts', () => {
const importMetaMainScript = `
import assert from 'node:assert/strict';

assert.strictEqual(import.meta.main, true, 'import.meta.main should evaluate true in main module');

const { isMain: importedModuleIsMain } = await import(
${JSON.stringify(fixtures.fileURL('es-modules/import-meta-main.mjs'))}
);
assert.strictEqual(importedModuleIsMain, false, 'import.meta.main should evaluate false in imported module');
`;

it('should evaluate true in evaluated script', async () => {
const result = await spawnPromisified(
process.execPath,
Expand Down Expand Up @@ -72,3 +72,61 @@ describe('import.meta.main in evaluated scripts', () => {
});
});
});

describe('import.meta.main in typescript scripts', () => {
const importMetaMainTSScript = `
import assert from 'node:assert/strict';

assert.strictEqual(import.meta.main, true, 'import.meta.main should evaluate true in main module');

const { isMain: importedModuleIsMain } = await import(
${JSON.stringify(fixtures.fileURL('es-modules/import-meta-main.ts'))}
);
assert.strictEqual(importedModuleIsMain, false, 'import.meta.main should evaluate false in imported module');
`;

it('should evaluate true in evaluated script', async () => {
const result = await spawnPromisified(
process.execPath,
['--input-type=module-typescript', '--disable-warning=ExperimentalWarning', '--eval', importMetaMainTSScript],
);
assert.deepStrictEqual(result, {
stderr: '',
stdout: '',
code: 0,
signal: null,
});
});

it('should evaluate true in worker instantiated with module source by evaluated script', async () => {
const result = await spawnPromisified(
process.execPath,
['--input-type=module-typescript',
'--disable-warning=ExperimentalWarning',
'--eval',
wrapScriptInEvalWorker(importMetaMainTSScript)],
);
assert.deepStrictEqual(result, {
stderr: '',
stdout: '',
code: 0,
signal: null,
});
});

it('should evaluate true in worker instantiated with `data:` URL by evaluated script', async () => {
const result = await spawnPromisified(
process.execPath,
['--input-type=module',
'--input-type=module-typescript',
'--disable-warning=ExperimentalWarning',
'--eval', wrapScriptInUrlWorker(importMetaMainTSScript)],
);
assert.deepStrictEqual(result, {
stderr: '',
stdout: '',
code: 0,
signal: null,
});
});
});
1 change: 1 addition & 0 deletions test/fixtures/es-modules/import-meta-main.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const isMain = import.meta.main;
Loading