mirror of
https://github.com/zebrajr/node.git
synced 2025-12-06 12:20:27 +01:00
module: support 'module.exports' interop export in require(esm)
PR-URL: https://github.com/nodejs/node/pull/54563 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Joyee Cheung <joyeec9h3@gmail.com>
This commit is contained in:
parent
2755551c3c
commit
d24c7313f7
|
|
@ -175,6 +175,9 @@ changes:
|
||||||
- version: REPLACEME
|
- version: REPLACEME
|
||||||
pr-url: https://github.com/nodejs/node/pull/55085
|
pr-url: https://github.com/nodejs/node/pull/55085
|
||||||
description: require() now supports loading synchronous ES modules by default.
|
description: require() now supports loading synchronous ES modules by default.
|
||||||
|
- version: REPLACEME
|
||||||
|
pr-url: https://github.com/nodejs/node/pull/54563
|
||||||
|
description: Support `'module.exports'` interop export in `require(esm)`.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
The `.mjs` extension is reserved for [ECMAScript Modules][].
|
The `.mjs` extension is reserved for [ECMAScript Modules][].
|
||||||
|
|
@ -204,10 +207,9 @@ export function distance(a, b) { return (b.x - a.x) ** 2 + (b.y - a.y) ** 2; }
|
||||||
|
|
||||||
```mjs
|
```mjs
|
||||||
// point.mjs
|
// point.mjs
|
||||||
class Point {
|
export default class Point {
|
||||||
constructor(x, y) { this.x = x; this.y = y; }
|
constructor(x, y) { this.x = x; this.y = y; }
|
||||||
}
|
}
|
||||||
export default Point;
|
|
||||||
```
|
```
|
||||||
|
|
||||||
A CommonJS module can load them with `require()`:
|
A CommonJS module can load them with `require()`:
|
||||||
|
|
@ -236,6 +238,66 @@ This property is experimental and can change in the future. It should only be us
|
||||||
by tools converting ES modules into CommonJS modules, following existing ecosystem
|
by tools converting ES modules into CommonJS modules, following existing ecosystem
|
||||||
conventions. Code authored directly in CommonJS should avoid depending on it.
|
conventions. Code authored directly in CommonJS should avoid depending on it.
|
||||||
|
|
||||||
|
When a ES Module contains both named exports and a default export, the result returned by `require()`
|
||||||
|
is the module namespace object, which places the default export in the `.default` property, similar to
|
||||||
|
the results returned by `import()`.
|
||||||
|
To customize what should be returned by `require(esm)` directly, the ES Module can export the
|
||||||
|
desired value using the string name `"module.exports"`.
|
||||||
|
|
||||||
|
<!-- eslint-disable @stylistic/js/semi -->
|
||||||
|
|
||||||
|
```mjs
|
||||||
|
// point.mjs
|
||||||
|
export default class Point {
|
||||||
|
constructor(x, y) { this.x = x; this.y = y; }
|
||||||
|
}
|
||||||
|
|
||||||
|
// `distance` is lost to CommonJS consumers of this module, unless it's
|
||||||
|
// added to `Point` as a static property.
|
||||||
|
export function distance(a, b) { return (b.x - a.x) ** 2 + (b.y - a.y) ** 2; }
|
||||||
|
export { Point as 'module.exports' }
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- eslint-disable node-core/no-duplicate-requires -->
|
||||||
|
|
||||||
|
```cjs
|
||||||
|
const Point = require('./point.mjs');
|
||||||
|
console.log(Point); // [class Point]
|
||||||
|
|
||||||
|
// Named exports are lost when 'module.exports' is used
|
||||||
|
const { distance } = require('./point.mjs');
|
||||||
|
console.log(distance); // undefined
|
||||||
|
```
|
||||||
|
|
||||||
|
Notice in the example above, when the `module.exports` export name is used, named exports
|
||||||
|
will be lost to CommonJS consumers. To allow CommonJS consumers to continue accessing
|
||||||
|
named exports, the module can make sure that the default export is an object with the
|
||||||
|
named exports attached to it as properties. For example with the example above,
|
||||||
|
`distance` can be attached to the default export, the `Point` class, as a static method.
|
||||||
|
|
||||||
|
<!-- eslint-disable @stylistic/js/semi -->
|
||||||
|
|
||||||
|
```mjs
|
||||||
|
export function distance(a, b) { return (b.x - a.x) ** 2 + (b.y - a.y) ** 2; }
|
||||||
|
|
||||||
|
export default class Point {
|
||||||
|
constructor(x, y) { this.x = x; this.y = y; }
|
||||||
|
static distance = distance;
|
||||||
|
}
|
||||||
|
|
||||||
|
export { Point as 'module.exports' }
|
||||||
|
```
|
||||||
|
|
||||||
|
<!-- eslint-disable node-core/no-duplicate-requires -->
|
||||||
|
|
||||||
|
```cjs
|
||||||
|
const Point = require('./point.mjs');
|
||||||
|
console.log(Point); // [class Point]
|
||||||
|
|
||||||
|
const { distance } = require('./point.mjs');
|
||||||
|
console.log(distance); // [Function: distance]
|
||||||
|
```
|
||||||
|
|
||||||
If the module being `require()`'d contains top-level `await`, or the module
|
If the module being `require()`'d contains top-level `await`, or the module
|
||||||
graph it `import`s contains top-level `await`,
|
graph it `import`s contains top-level `await`,
|
||||||
[`ERR_REQUIRE_ASYNC_MODULE`][] will be thrown. In this case, users should
|
[`ERR_REQUIRE_ASYNC_MODULE`][] will be thrown. In this case, users should
|
||||||
|
|
|
||||||
|
|
@ -1427,10 +1427,13 @@ function loadESMFromCJS(mod, filename) {
|
||||||
// createRequiredModuleFacade() to `wrap` which is a ModuleWrap wrapping
|
// createRequiredModuleFacade() to `wrap` which is a ModuleWrap wrapping
|
||||||
// over the original module.
|
// over the original module.
|
||||||
|
|
||||||
// We don't do this to modules that don't have default exports to avoid
|
// We don't do this to modules that are marked as CJS ESM or that
|
||||||
// the unnecessary overhead. If __esModule is already defined, we will
|
// don't have default exports to avoid the unnecessary overhead.
|
||||||
// also skip the extension to allow users to override it.
|
// If __esModule is already defined, we will also skip the extension
|
||||||
if (!ObjectHasOwn(namespace, 'default') || ObjectHasOwn(namespace, '__esModule')) {
|
// to allow users to override it.
|
||||||
|
if (ObjectHasOwn(namespace, 'module.exports')) {
|
||||||
|
mod.exports = namespace['module.exports'];
|
||||||
|
} else if (!ObjectHasOwn(namespace, 'default') || ObjectHasOwn(namespace, '__esModule')) {
|
||||||
mod.exports = namespace;
|
mod.exports = namespace;
|
||||||
} else {
|
} else {
|
||||||
mod.exports = createRequiredModuleFacade(wrap);
|
mod.exports = createRequiredModuleFacade(wrap);
|
||||||
|
|
|
||||||
51
test/es-module/test-require-as-esm-interop.mjs
Normal file
51
test/es-module/test-require-as-esm-interop.mjs
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
// Flags: --experimental-require-module
|
||||||
|
import '../common/index.mjs';
|
||||||
|
import assert from 'assert';
|
||||||
|
import { directRequireFixture, importFixture } from '../fixtures/pkgexports.mjs';
|
||||||
|
|
||||||
|
const tests = {
|
||||||
|
'false': false,
|
||||||
|
'string': 'cjs',
|
||||||
|
'object': { a: 'cjs a', b: 'cjs b' },
|
||||||
|
'fauxesmdefault': { default: 'faux esm default' },
|
||||||
|
'fauxesmmixed': { default: 'faux esm default', a: 'faux esm a', b: 'faux esm b' },
|
||||||
|
'fauxesmnamed': { a: 'faux esm a', b: 'faux esm b' }
|
||||||
|
};
|
||||||
|
|
||||||
|
// This test demonstrates interop between CJS and CJS represented as ESM
|
||||||
|
// under the new `export { ... as 'module.exports'}` pattern, for the above cases.
|
||||||
|
for (const [test, exactShape] of Object.entries(tests)) {
|
||||||
|
// Each case represents a CJS dependency, which has the expected shape in CJS:
|
||||||
|
assert.deepStrictEqual(directRequireFixture(`interop-cjsdep-${test}`), exactShape);
|
||||||
|
|
||||||
|
// Each dependency is reexported through CJS as if it is a library being consumed,
|
||||||
|
// which in CJS is fully shape-preserving:
|
||||||
|
assert.deepStrictEqual(directRequireFixture(`interop-cjs/${test}`), exactShape);
|
||||||
|
|
||||||
|
// Now we have ESM conversions of these dependencies, using `export ... as "module.exports"`
|
||||||
|
// staring with the conversion of those dependencies into ESM under require(esm):
|
||||||
|
assert.deepStrictEqual(directRequireFixture(`interop-cjsdep-${test}-esm`), exactShape);
|
||||||
|
|
||||||
|
// When importing these ESM conversions, from require(esm), we should preserve the shape:
|
||||||
|
assert.deepStrictEqual(directRequireFixture(`interop-cjs/${test}-esm`), exactShape);
|
||||||
|
|
||||||
|
// Now if the importer itself is converted into ESM, it should still be able to load the original
|
||||||
|
// CJS and reexport it, preserving the shape:
|
||||||
|
assert.deepStrictEqual(directRequireFixture(`interop-cjs-esm/${test}`), exactShape);
|
||||||
|
|
||||||
|
// And then if we have the converted CJS to ESM importing from converted CJS to ESM,
|
||||||
|
// that should also work:
|
||||||
|
assert.deepStrictEqual(directRequireFixture(`interop-cjs-esm/${test}-esm`), exactShape);
|
||||||
|
|
||||||
|
// Finally, the CJS ESM representation under `import()` should match all these cases equivalently,
|
||||||
|
// where the CJS module is exported as the default export:
|
||||||
|
const esmCjsImport = await importFixture(`interop-cjsdep-${test}`);
|
||||||
|
assert.deepStrictEqual(esmCjsImport.default, exactShape);
|
||||||
|
|
||||||
|
assert.deepStrictEqual((await importFixture(`interop-cjsdep-${test}`)).default, exactShape);
|
||||||
|
assert.deepStrictEqual((await importFixture(`interop-cjs/${test}`)).default, exactShape);
|
||||||
|
assert.deepStrictEqual((await importFixture(`interop-cjsdep-${test}-esm`)).default, exactShape);
|
||||||
|
assert.deepStrictEqual((await importFixture(`interop-cjs/${test}-esm`)).default, exactShape);
|
||||||
|
assert.deepStrictEqual((await importFixture(`interop-cjs-esm/${test}`)).default, exactShape);
|
||||||
|
assert.deepStrictEqual((await importFixture(`interop-cjs-esm/${test}-esm`)).default, exactShape);
|
||||||
|
}
|
||||||
3
test/fixtures/node_modules/interop-cjs-esm/false-esm.js
generated
vendored
Normal file
3
test/fixtures/node_modules/interop-cjs-esm/false-esm.js
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
import dep from 'interop-cjsdep-false-esm';
|
||||||
|
export default dep;
|
||||||
|
export { dep as 'module.exports' }
|
||||||
3
test/fixtures/node_modules/interop-cjs-esm/false.js
generated
vendored
Normal file
3
test/fixtures/node_modules/interop-cjs-esm/false.js
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
import dep from 'interop-cjsdep-false';
|
||||||
|
export default dep;
|
||||||
|
export { dep as 'module.exports' }
|
||||||
3
test/fixtures/node_modules/interop-cjs-esm/fauxesmdefault-esm.js
generated
vendored
Normal file
3
test/fixtures/node_modules/interop-cjs-esm/fauxesmdefault-esm.js
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
import dep from 'interop-cjsdep-fauxesmdefault-esm';
|
||||||
|
export default dep;
|
||||||
|
export { dep as 'module.exports' }
|
||||||
3
test/fixtures/node_modules/interop-cjs-esm/fauxesmdefault.js
generated
vendored
Normal file
3
test/fixtures/node_modules/interop-cjs-esm/fauxesmdefault.js
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
import dep from 'interop-cjsdep-fauxesmdefault';
|
||||||
|
export default dep;
|
||||||
|
export { dep as 'module.exports' }
|
||||||
4
test/fixtures/node_modules/interop-cjs-esm/fauxesmmixed-esm.js
generated
vendored
Normal file
4
test/fixtures/node_modules/interop-cjs-esm/fauxesmmixed-esm.js
generated
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
import dep from 'interop-cjsdep-fauxesmmixed-esm';
|
||||||
|
export default dep;
|
||||||
|
export { dep as 'module.exports' }
|
||||||
|
|
||||||
3
test/fixtures/node_modules/interop-cjs-esm/fauxesmmixed.js
generated
vendored
Normal file
3
test/fixtures/node_modules/interop-cjs-esm/fauxesmmixed.js
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
import dep from 'interop-cjsdep-fauxesmmixed';
|
||||||
|
export default dep;
|
||||||
|
export { dep as 'module.exports' }
|
||||||
3
test/fixtures/node_modules/interop-cjs-esm/fauxesmnamed-esm.js
generated
vendored
Normal file
3
test/fixtures/node_modules/interop-cjs-esm/fauxesmnamed-esm.js
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
import dep from 'interop-cjsdep-fauxesmnamed-esm';
|
||||||
|
export default dep;
|
||||||
|
export { dep as 'module.exports' }
|
||||||
3
test/fixtures/node_modules/interop-cjs-esm/fauxesmnamed.js
generated
vendored
Normal file
3
test/fixtures/node_modules/interop-cjs-esm/fauxesmnamed.js
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
import dep from 'interop-cjsdep-fauxesmnamed';
|
||||||
|
export default dep;
|
||||||
|
export { dep as 'module.exports' }
|
||||||
3
test/fixtures/node_modules/interop-cjs-esm/object-esm.js
generated
vendored
Normal file
3
test/fixtures/node_modules/interop-cjs-esm/object-esm.js
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
import dep from 'interop-cjsdep-object-esm';
|
||||||
|
export default dep;
|
||||||
|
export { dep as 'module.exports' }
|
||||||
3
test/fixtures/node_modules/interop-cjs-esm/object.js
generated
vendored
Normal file
3
test/fixtures/node_modules/interop-cjs-esm/object.js
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
import dep from 'interop-cjsdep-object';
|
||||||
|
export default dep;
|
||||||
|
export { dep as 'module.exports' }
|
||||||
17
test/fixtures/node_modules/interop-cjs-esm/package.json
generated
vendored
Normal file
17
test/fixtures/node_modules/interop-cjs-esm/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"type": "module",
|
||||||
|
"exports": {
|
||||||
|
"./false-esm": "./false-esm.js",
|
||||||
|
"./false": "./false.js",
|
||||||
|
"./fauxesmdefault-esm": "./fauxesmdefault-esm.js",
|
||||||
|
"./fauxesmdefault": "./fauxesmdefault.js",
|
||||||
|
"./fauxesmmixed-esm": "./fauxesmmixed-esm.js",
|
||||||
|
"./fauxesmmixed": "./fauxesmmixed.js",
|
||||||
|
"./fauxesmnamed-esm": "./fauxesmnamed-esm.js",
|
||||||
|
"./fauxesmnamed": "./fauxesmnamed.js",
|
||||||
|
"./object-esm": "./object-esm.js",
|
||||||
|
"./object": "./object.js",
|
||||||
|
"./string-esm": "./string-esm.js",
|
||||||
|
"./string": "./string.js"
|
||||||
|
}
|
||||||
|
}
|
||||||
3
test/fixtures/node_modules/interop-cjs-esm/string-esm.js
generated
vendored
Normal file
3
test/fixtures/node_modules/interop-cjs-esm/string-esm.js
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
import dep from 'interop-cjsdep-string-esm';
|
||||||
|
export default dep;
|
||||||
|
export { dep as 'module.exports' }
|
||||||
3
test/fixtures/node_modules/interop-cjs-esm/string.js
generated
vendored
Normal file
3
test/fixtures/node_modules/interop-cjs-esm/string.js
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
import dep from 'interop-cjsdep-string';
|
||||||
|
export default dep;
|
||||||
|
export { dep as 'module.exports' }
|
||||||
1
test/fixtures/node_modules/interop-cjs/false-esm.js
generated
vendored
Normal file
1
test/fixtures/node_modules/interop-cjs/false-esm.js
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = require('interop-cjsdep-false-esm');
|
||||||
1
test/fixtures/node_modules/interop-cjs/false.js
generated
vendored
Normal file
1
test/fixtures/node_modules/interop-cjs/false.js
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = require('interop-cjsdep-false');
|
||||||
1
test/fixtures/node_modules/interop-cjs/fauxesmdefault-esm.js
generated
vendored
Normal file
1
test/fixtures/node_modules/interop-cjs/fauxesmdefault-esm.js
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = require('interop-cjsdep-fauxesmdefault-esm');
|
||||||
1
test/fixtures/node_modules/interop-cjs/fauxesmdefault.js
generated
vendored
Normal file
1
test/fixtures/node_modules/interop-cjs/fauxesmdefault.js
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = require('interop-cjsdep-fauxesmdefault');
|
||||||
1
test/fixtures/node_modules/interop-cjs/fauxesmmixed-esm.js
generated
vendored
Normal file
1
test/fixtures/node_modules/interop-cjs/fauxesmmixed-esm.js
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = require('interop-cjsdep-fauxesmmixed-esm');
|
||||||
1
test/fixtures/node_modules/interop-cjs/fauxesmmixed.js
generated
vendored
Normal file
1
test/fixtures/node_modules/interop-cjs/fauxesmmixed.js
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = require('interop-cjsdep-fauxesmmixed');
|
||||||
1
test/fixtures/node_modules/interop-cjs/fauxesmnamed-esm.js
generated
vendored
Normal file
1
test/fixtures/node_modules/interop-cjs/fauxesmnamed-esm.js
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = require('interop-cjsdep-fauxesmnamed-esm');
|
||||||
1
test/fixtures/node_modules/interop-cjs/fauxesmnamed.js
generated
vendored
Normal file
1
test/fixtures/node_modules/interop-cjs/fauxesmnamed.js
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = require('interop-cjsdep-fauxesmnamed');
|
||||||
1
test/fixtures/node_modules/interop-cjs/object-esm.js
generated
vendored
Normal file
1
test/fixtures/node_modules/interop-cjs/object-esm.js
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = require('interop-cjsdep-object-esm');
|
||||||
1
test/fixtures/node_modules/interop-cjs/object.js
generated
vendored
Normal file
1
test/fixtures/node_modules/interop-cjs/object.js
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = require('interop-cjsdep-object');
|
||||||
17
test/fixtures/node_modules/interop-cjs/package.json
generated
vendored
Normal file
17
test/fixtures/node_modules/interop-cjs/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
{
|
||||||
|
"type": "commonjs",
|
||||||
|
"exports": {
|
||||||
|
"./false-esm": "./false-esm.js",
|
||||||
|
"./false": "./false.js",
|
||||||
|
"./fauxesmdefault-esm": "./fauxesmdefault-esm.js",
|
||||||
|
"./fauxesmdefault": "./fauxesmdefault.js",
|
||||||
|
"./fauxesmmixed-esm": "./fauxesmmixed-esm.js",
|
||||||
|
"./fauxesmmixed": "./fauxesmmixed.js",
|
||||||
|
"./fauxesmnamed-esm": "./fauxesmnamed-esm.js",
|
||||||
|
"./fauxesmnamed": "./fauxesmnamed.js",
|
||||||
|
"./object-esm": "./object-esm.js",
|
||||||
|
"./object": "./object.js",
|
||||||
|
"./string-esm": "./string-esm.js",
|
||||||
|
"./string": "./string.js"
|
||||||
|
}
|
||||||
|
}
|
||||||
1
test/fixtures/node_modules/interop-cjs/string-esm.js
generated
vendored
Normal file
1
test/fixtures/node_modules/interop-cjs/string-esm.js
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = require('interop-cjsdep-string-esm');
|
||||||
1
test/fixtures/node_modules/interop-cjs/string.js
generated
vendored
Normal file
1
test/fixtures/node_modules/interop-cjs/string.js
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = require('interop-cjsdep-string');
|
||||||
3
test/fixtures/node_modules/interop-cjsdep-false-esm/dep.js
generated
vendored
Normal file
3
test/fixtures/node_modules/interop-cjsdep-false-esm/dep.js
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
const output = false;
|
||||||
|
export default output;
|
||||||
|
export { output as 'module.exports' }
|
||||||
4
test/fixtures/node_modules/interop-cjsdep-false-esm/package.json
generated
vendored
Normal file
4
test/fixtures/node_modules/interop-cjsdep-false-esm/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"type": "module",
|
||||||
|
"exports": "./dep.js"
|
||||||
|
}
|
||||||
1
test/fixtures/node_modules/interop-cjsdep-false/dep.js
generated
vendored
Normal file
1
test/fixtures/node_modules/interop-cjsdep-false/dep.js
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = false;
|
||||||
4
test/fixtures/node_modules/interop-cjsdep-false/package.json
generated
vendored
Normal file
4
test/fixtures/node_modules/interop-cjsdep-false/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"type": "commonjs",
|
||||||
|
"exports": "./dep.js"
|
||||||
|
}
|
||||||
7
test/fixtures/node_modules/interop-cjsdep-fauxesmdefault-esm/dep.js
generated
vendored
Normal file
7
test/fixtures/node_modules/interop-cjsdep-fauxesmdefault-esm/dep.js
generated
vendored
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
const exports = {};
|
||||||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||||||
|
exports.default = 'faux esm default';
|
||||||
|
|
||||||
|
export default exports;
|
||||||
|
|
||||||
|
export { exports as 'module.exports' }
|
||||||
4
test/fixtures/node_modules/interop-cjsdep-fauxesmdefault-esm/package.json
generated
vendored
Normal file
4
test/fixtures/node_modules/interop-cjsdep-fauxesmdefault-esm/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"type": "module",
|
||||||
|
"exports": "./dep.js"
|
||||||
|
}
|
||||||
2
test/fixtures/node_modules/interop-cjsdep-fauxesmdefault/dep.js
generated
vendored
Normal file
2
test/fixtures/node_modules/interop-cjsdep-fauxesmdefault/dep.js
generated
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||||||
|
exports.default = 'faux esm default';
|
||||||
4
test/fixtures/node_modules/interop-cjsdep-fauxesmdefault/package.json
generated
vendored
Normal file
4
test/fixtures/node_modules/interop-cjsdep-fauxesmdefault/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"type": "commonjs",
|
||||||
|
"exports": "./dep.js"
|
||||||
|
}
|
||||||
9
test/fixtures/node_modules/interop-cjsdep-fauxesmmixed-esm/dep.js
generated
vendored
Normal file
9
test/fixtures/node_modules/interop-cjsdep-fauxesmmixed-esm/dep.js
generated
vendored
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
const exports = {};
|
||||||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||||||
|
exports.default = 'faux esm default';
|
||||||
|
exports.a = 'faux esm a';
|
||||||
|
exports.b = 'faux esm b';
|
||||||
|
|
||||||
|
export default exports;
|
||||||
|
|
||||||
|
export { exports as 'module.exports' }
|
||||||
4
test/fixtures/node_modules/interop-cjsdep-fauxesmmixed-esm/package.json
generated
vendored
Normal file
4
test/fixtures/node_modules/interop-cjsdep-fauxesmmixed-esm/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"type": "module",
|
||||||
|
"exports": "./dep.js"
|
||||||
|
}
|
||||||
4
test/fixtures/node_modules/interop-cjsdep-fauxesmmixed/dep.js
generated
vendored
Normal file
4
test/fixtures/node_modules/interop-cjsdep-fauxesmmixed/dep.js
generated
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||||||
|
exports.default = 'faux esm default';
|
||||||
|
exports.a = 'faux esm a';
|
||||||
|
exports.b = 'faux esm b';
|
||||||
4
test/fixtures/node_modules/interop-cjsdep-fauxesmmixed/package.json
generated
vendored
Normal file
4
test/fixtures/node_modules/interop-cjsdep-fauxesmmixed/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"type": "commonjs",
|
||||||
|
"exports": "./dep.js"
|
||||||
|
}
|
||||||
8
test/fixtures/node_modules/interop-cjsdep-fauxesmnamed-esm/dep.js
generated
vendored
Normal file
8
test/fixtures/node_modules/interop-cjsdep-fauxesmnamed-esm/dep.js
generated
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
const exports = {};
|
||||||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||||||
|
exports.a = 'faux esm a';
|
||||||
|
exports.b = 'faux esm b';
|
||||||
|
|
||||||
|
export default exports;
|
||||||
|
|
||||||
|
export { exports as 'module.exports' }
|
||||||
4
test/fixtures/node_modules/interop-cjsdep-fauxesmnamed-esm/package.json
generated
vendored
Normal file
4
test/fixtures/node_modules/interop-cjsdep-fauxesmnamed-esm/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"type": "module",
|
||||||
|
"exports": "./dep.js"
|
||||||
|
}
|
||||||
3
test/fixtures/node_modules/interop-cjsdep-fauxesmnamed/dep.js
generated
vendored
Normal file
3
test/fixtures/node_modules/interop-cjsdep-fauxesmnamed/dep.js
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||||||
|
exports.a = 'faux esm a';
|
||||||
|
exports.b = 'faux esm b';
|
||||||
4
test/fixtures/node_modules/interop-cjsdep-fauxesmnamed/package.json
generated
vendored
Normal file
4
test/fixtures/node_modules/interop-cjsdep-fauxesmnamed/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"type": "commonjs",
|
||||||
|
"exports": "./dep.js"
|
||||||
|
}
|
||||||
8
test/fixtures/node_modules/interop-cjsdep-object-esm/dep.js
generated
vendored
Normal file
8
test/fixtures/node_modules/interop-cjsdep-object-esm/dep.js
generated
vendored
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
const output = {
|
||||||
|
a: 'cjs a',
|
||||||
|
b: 'cjs b'
|
||||||
|
};
|
||||||
|
|
||||||
|
export default output;
|
||||||
|
|
||||||
|
export { output as 'module.exports' }
|
||||||
4
test/fixtures/node_modules/interop-cjsdep-object-esm/package.json
generated
vendored
Normal file
4
test/fixtures/node_modules/interop-cjsdep-object-esm/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"type": "module",
|
||||||
|
"exports": "./dep.js"
|
||||||
|
}
|
||||||
2
test/fixtures/node_modules/interop-cjsdep-object/dep.js
generated
vendored
Normal file
2
test/fixtures/node_modules/interop-cjsdep-object/dep.js
generated
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
exports.a = 'cjs a';
|
||||||
|
exports.b = 'cjs b';
|
||||||
4
test/fixtures/node_modules/interop-cjsdep-object/package.json
generated
vendored
Normal file
4
test/fixtures/node_modules/interop-cjsdep-object/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"type": "commonjs",
|
||||||
|
"exports": "./dep.js"
|
||||||
|
}
|
||||||
3
test/fixtures/node_modules/interop-cjsdep-string-esm/dep.js
generated
vendored
Normal file
3
test/fixtures/node_modules/interop-cjsdep-string-esm/dep.js
generated
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
const output = 'cjs';
|
||||||
|
export default output;
|
||||||
|
export { output as 'module.exports' }
|
||||||
4
test/fixtures/node_modules/interop-cjsdep-string-esm/package.json
generated
vendored
Normal file
4
test/fixtures/node_modules/interop-cjsdep-string-esm/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"type": "module",
|
||||||
|
"exports": "./dep.js"
|
||||||
|
}
|
||||||
1
test/fixtures/node_modules/interop-cjsdep-string/dep.js
generated
vendored
Normal file
1
test/fixtures/node_modules/interop-cjsdep-string/dep.js
generated
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
module.exports = 'cjs';
|
||||||
4
test/fixtures/node_modules/interop-cjsdep-string/package.json
generated
vendored
Normal file
4
test/fixtures/node_modules/interop-cjsdep-string/package.json
generated
vendored
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
{
|
||||||
|
"type": "commonjs",
|
||||||
|
"exports": "./dep.js"
|
||||||
|
}
|
||||||
4
test/fixtures/pkgexports.mjs
vendored
4
test/fixtures/pkgexports.mjs
vendored
|
|
@ -3,6 +3,10 @@ import { createRequire } from 'module';
|
||||||
|
|
||||||
const rawRequire = createRequire(fileURLToPath(import.meta.url));
|
const rawRequire = createRequire(fileURLToPath(import.meta.url));
|
||||||
|
|
||||||
|
export function directRequireFixture(specifier) {
|
||||||
|
return rawRequire(specifier);
|
||||||
|
}
|
||||||
|
|
||||||
export async function requireFixture(specifier) {
|
export async function requireFixture(specifier) {
|
||||||
return { default: rawRequire(specifier ) };
|
return { default: rawRequire(specifier ) };
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user