Skip to content

Commit ae5b97f

Browse files
authored
Merge branch 'nodejs:main' into fix-test-runner-when-source-maps-is-enabled
2 parents 3d5df7f + d24c731 commit ae5b97f

File tree

58 files changed

+411
-6
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+411
-6
lines changed

doc/api/cli.md

Lines changed: 2 additions & 0 deletions

doc/api/modules.md

Lines changed: 64 additions & 2 deletions

lib/internal/modules/cjs/loader.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1427,10 +1427,13 @@ function loadESMFromCJS(mod, filename) {
14271427
// createRequiredModuleFacade() to `wrap` which is a ModuleWrap wrapping
14281428
// over the original module.
14291429

1430-
// We don't do this to modules that don't have default exports to avoid
1431-
// the unnecessary overhead. If __esModule is already defined, we will
1432-
// also skip the extension to allow users to override it.
1433-
if (!ObjectHasOwn(namespace, 'default') || ObjectHasOwn(namespace, '__esModule')) {
1430+
// We don't do this to modules that are marked as CJS ESM or that
1431+
// don't have default exports to avoid the unnecessary overhead.
1432+
// If __esModule is already defined, we will also skip the extension
1433+
// to allow users to override it.
1434+
if (ObjectHasOwn(namespace, 'module.exports')) {
1435+
mod.exports = namespace['module.exports'];
1436+
} else if (!ObjectHasOwn(namespace, 'default') || ObjectHasOwn(namespace, '__esModule')) {
14341437
mod.exports = namespace;
14351438
} else {
14361439
mod.exports = createRequiredModuleFacade(wrap);
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
// Flags: --experimental-require-module
2+
import '../common/index.mjs';
3+
import assert from 'assert';
4+
import { directRequireFixture, importFixture } from '../fixtures/pkgexports.mjs';
5+
6+
const tests = {
7+
'false': false,
8+
'string': 'cjs',
9+
'object': { a: 'cjs a', b: 'cjs b' },
10+
'fauxesmdefault': { default: 'faux esm default' },
11+
'fauxesmmixed': { default: 'faux esm default', a: 'faux esm a', b: 'faux esm b' },
12+
'fauxesmnamed': { a: 'faux esm a', b: 'faux esm b' }
13+
};
14+
15+
// This test demonstrates interop between CJS and CJS represented as ESM
16+
// under the new `export { ... as 'module.exports'}` pattern, for the above cases.
17+
for (const [test, exactShape] of Object.entries(tests)) {
18+
// Each case represents a CJS dependency, which has the expected shape in CJS:
19+
assert.deepStrictEqual(directRequireFixture(`interop-cjsdep-${test}`), exactShape);
20+
21+
// Each dependency is reexported through CJS as if it is a library being consumed,
22+
// which in CJS is fully shape-preserving:
23+
assert.deepStrictEqual(directRequireFixture(`interop-cjs/${test}`), exactShape);
24+
25+
// Now we have ESM conversions of these dependencies, using `export ... as "module.exports"`
26+
// staring with the conversion of those dependencies into ESM under require(esm):
27+
assert.deepStrictEqual(directRequireFixture(`interop-cjsdep-${test}-esm`), exactShape);
28+
29+
// When importing these ESM conversions, from require(esm), we should preserve the shape:
30+
assert.deepStrictEqual(directRequireFixture(`interop-cjs/${test}-esm`), exactShape);
31+
32+
// Now if the importer itself is converted into ESM, it should still be able to load the original
33+
// CJS and reexport it, preserving the shape:
34+
assert.deepStrictEqual(directRequireFixture(`interop-cjs-esm/${test}`), exactShape);
35+
36+
// And then if we have the converted CJS to ESM importing from converted CJS to ESM,
37+
// that should also work:
38+
assert.deepStrictEqual(directRequireFixture(`interop-cjs-esm/${test}-esm`), exactShape);
39+
40+
// Finally, the CJS ESM representation under `import()` should match all these cases equivalently,
41+
// where the CJS module is exported as the default export:
42+
const esmCjsImport = await importFixture(`interop-cjsdep-${test}`);
43+
assert.deepStrictEqual(esmCjsImport.default, exactShape);
44+
45+
assert.deepStrictEqual((await importFixture(`interop-cjsdep-${test}`)).default, exactShape);
46+
assert.deepStrictEqual((await importFixture(`interop-cjs/${test}`)).default, exactShape);
47+
assert.deepStrictEqual((await importFixture(`interop-cjsdep-${test}-esm`)).default, exactShape);
48+
assert.deepStrictEqual((await importFixture(`interop-cjs/${test}-esm`)).default, exactShape);
49+
assert.deepStrictEqual((await importFixture(`interop-cjs-esm/${test}`)).default, exactShape);
50+
assert.deepStrictEqual((await importFixture(`interop-cjs-esm/${test}-esm`)).default, exactShape);
51+
}

test/es-module/test-typescript.mjs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,3 +352,36 @@ test('execute a TypeScript test mocking module', { skip: isWindows && process.ar
352352
match(result.stdout, /Hello, TypeScript-CommonJS!/);
353353
strictEqual(result.code, 0);
354354
});
355+
356+
test('execute a TypeScript file with union types', async () => {
357+
const result = await spawnPromisified(process.execPath, [
358+
'--experimental-strip-types',
359+
'--no-warnings',
360+
fixtures.path('typescript/ts/test-union-types.ts'),
361+
]);
362+
363+
strictEqual(result.stderr, '');
364+
strictEqual(result.stdout,
365+
'{' +
366+
" name: 'Hello, TypeScript!' }\n" +
367+
'{ role: \'admin\', permission: \'all\' }\n' +
368+
'{\n foo: \'Testing Partial Type\',\n bar: 42,\n' +
369+
' zoo: true,\n metadata: undefined\n' +
370+
'}\n');
371+
strictEqual(result.code, 0);
372+
});
373+
374+
test('expect error when executing a TypeScript file with generics', async () => {
375+
const result = await spawnPromisified(process.execPath, [
376+
'--experimental-strip-types',
377+
fixtures.path('typescript/ts/test-parameter-properties.ts'),
378+
]);
379+
380+
// This error should be thrown during transformation
381+
match(
382+
result.stderr,
383+
/TypeScript parameter property is not supported in strip-only mode/
384+
);
385+
strictEqual(result.stdout, '');
386+
strictEqual(result.code, 1);
387+
});

test/fixtures/node_modules/interop-cjs-esm/false-esm.js

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fixtures/node_modules/interop-cjs-esm/false.js

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fixtures/node_modules/interop-cjs-esm/fauxesmdefault-esm.js

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fixtures/node_modules/interop-cjs-esm/fauxesmdefault.js

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/fixtures/node_modules/interop-cjs-esm/fauxesmmixed-esm.js

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)