diff --git a/packages/commonjs/src/transform.js b/packages/commonjs/src/transform.js index 1bd6e8fcf..792cf6c1b 100644 --- a/packages/commonjs/src/transform.js +++ b/packages/commonjs/src/transform.js @@ -67,6 +67,25 @@ export function checkEsModule(parse, code, id) { return { isEsModule, hasDefaultExport: false, ast }; } +function getDefinePropertyCallName(node, targetName) { + if (node.type !== 'CallExpression') return; + + const { + callee: { object, property } + } = node; + + if (!object || object.type !== 'Identifier' || object.name !== 'Object') return; + + if (!property || property.type !== 'Identifier' || property.name !== 'defineProperty') return; + + if (node.arguments.length !== 3) return; + + const [target, val] = node.arguments; + if (target.type !== 'Identifier' || target.name !== targetName) return; + // eslint-disable-next-line consistent-return + return val.value; +} + export function transformCommonjs( parse, code, @@ -299,6 +318,9 @@ export function transformCommonjs( return; } + const name = getDefinePropertyCallName(node, 'exports'); + if (name && name === makeLegalIdentifier(name)) namedExports[name] = true; + // if this is `var x = require('x')`, we can do `import x from 'x'` if ( node.type === 'VariableDeclarator' && diff --git a/packages/commonjs/test/fixtures/samples/define-property/foo.js b/packages/commonjs/test/fixtures/samples/define-property/foo.js new file mode 100644 index 000000000..39ae035df --- /dev/null +++ b/packages/commonjs/test/fixtures/samples/define-property/foo.js @@ -0,0 +1,6 @@ +Object.defineProperty(exports, "foo", { + enumerable: true, + get: function get() { + return "bar"; + } +}); diff --git a/packages/commonjs/test/fixtures/samples/define-property/main.js b/packages/commonjs/test/fixtures/samples/define-property/main.js new file mode 100644 index 000000000..f5b64e142 --- /dev/null +++ b/packages/commonjs/test/fixtures/samples/define-property/main.js @@ -0,0 +1 @@ +export { foo } from "./foo"; diff --git a/packages/commonjs/test/test.js b/packages/commonjs/test/test.js index 5748c8018..d3e09297b 100644 --- a/packages/commonjs/test/test.js +++ b/packages/commonjs/test/test.js @@ -407,6 +407,15 @@ test('does not reexport named contents', async (t) => { } }); +test(`exports props defined by 'Object.defineProperty'`, async (t) => { + const bundle = await rollup({ + input: 'fixtures/samples/define-property/main.js', + plugins: [commonjs()] + }); + const m = await executeBundle(bundle, t); + t.is(m.exports.foo, 'bar'); +}); + test('respects other plugins', async (t) => { const bundle = await rollup({ input: 'fixtures/samples/other-transforms/main.js',