| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 1ac1dda commit dc66632
54 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1382,10 +1382,13 @@ function loadESMFromCJS(mod, filename) { | |||
| 1382 | 1382 | // createRequiredModuleFacade() to `wrap` which is a ModuleWrap wrapping | |
| 1383 | 1383 | // over the original module. | |
| 1384 | 1384 | ||
| 1385 | - // We don't do this to modules that don't have default exports to avoid | ||
| 1386 | - // the unnecessary overhead. If __esModule is already defined, we will | ||
| 1387 | - // also skip the extension to allow users to override it. | ||
| 1388 | - if (!ObjectHasOwn(namespace, 'default') || ObjectHasOwn(namespace, '__esModule')) { | ||
| 1385 | + // We don't do this to modules that are marked as CJS ESM or that | ||
| 1386 | + // don't have default exports to avoid the unnecessary overhead. | ||
| 1387 | + // If __esModule is already defined, we will also skip the extension | ||
| 1388 | + // to allow users to override it. | ||
| 1389 | + if (ObjectHasOwn(namespace, 'module.exports')) { | ||
| 1390 | + mod.exports = namespace['module.exports']; | ||
| 1391 | + } else if (!ObjectHasOwn(namespace, 'default') || ObjectHasOwn(namespace, '__esModule')) { | ||
| 1389 | 1392 | mod.exports = namespace; | |
| 1390 | 1393 | } else { | |
| 1391 | 1394 | mod.exports = createRequiredModuleFacade(wrap); | |
| Original file line number | Diff line number | Diff 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 | + } | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments