diff --git a/packages/compartment-mapper/src/parse-cjs-shared-export-wrapper.js b/packages/compartment-mapper/src/parse-cjs-shared-export-wrapper.js index 2826b6ccd4..4d968485b9 100644 --- a/packages/compartment-mapper/src/parse-cjs-shared-export-wrapper.js +++ b/packages/compartment-mapper/src/parse-cjs-shared-export-wrapper.js @@ -103,6 +103,8 @@ export const wrap = ({ } }; + const redefined = new Set(); + const originalExports = new Proxy(moduleEnvironmentRecord.default, { set(_target, prop, value) { promoteToNamedExport(prop, value); @@ -121,6 +123,9 @@ export const wrap = ({ // descriptor.get in the trap will cause an error. // Object.defineProperty is used instead of Reflect.defineProperty for better error messages. defineProperty(target, prop, descriptor); + // Make a note to propagate the value from the getter to the module + // environment record when the module finishes executing. + redefined.add(prop); return true; }, }); @@ -176,10 +181,14 @@ export const wrap = ({ if (exportsHaveBeenOverwritten) { moduleEnvironmentRecord.default = finalExports; for (const prop of keys(moduleEnvironmentRecord.default || {})) { - if (prop !== 'default') + if (prop !== 'default') { moduleEnvironmentRecord[prop] = moduleEnvironmentRecord.default[prop]; + } } } + for (const prop of redefined) { + moduleEnvironmentRecord[prop] = moduleEnvironmentRecord.default[prop]; + } }; return { diff --git a/packages/compartment-mapper/test/esm-imports-cjs-define.test.js b/packages/compartment-mapper/test/esm-imports-cjs-define.test.js new file mode 100644 index 0000000000..c2ffe15dae --- /dev/null +++ b/packages/compartment-mapper/test/esm-imports-cjs-define.test.js @@ -0,0 +1,23 @@ +/* eslint-disable no-underscore-dangle */ +// import "./ses-lockdown.js"; +import 'ses'; +import test from 'ava'; + +import { scaffold } from './scaffold.js'; + +const fixture = new URL( + 'fixtures-esm-imports-cjs-define/0.mjs', + import.meta.url, +).toString(); + +const assertFixture = t => t.pass(); + +const fixtureAssertionCount = 1; + +scaffold( + 'fixtures-esm-imports-cjs-define', + test, + fixture, + assertFixture, + fixtureAssertionCount, +); diff --git a/packages/compartment-mapper/test/fixtures-esm-imports-cjs-define/0.mjs b/packages/compartment-mapper/test/fixtures-esm-imports-cjs-define/0.mjs new file mode 100644 index 0000000000..682fc4bd44 --- /dev/null +++ b/packages/compartment-mapper/test/fixtures-esm-imports-cjs-define/0.mjs @@ -0,0 +1,4 @@ +import { meaning } from './1.cjs'; +if (meaning !== 42) { + throw new Error('Fail'); +} diff --git a/packages/compartment-mapper/test/fixtures-esm-imports-cjs-define/1.cjs b/packages/compartment-mapper/test/fixtures-esm-imports-cjs-define/1.cjs new file mode 100644 index 0000000000..72964d16be --- /dev/null +++ b/packages/compartment-mapper/test/fixtures-esm-imports-cjs-define/1.cjs @@ -0,0 +1,8 @@ +const universe = require('./2.cjs'); +Object.defineProperty(exports, '__esModule', { value: true }); +Object.defineProperty(exports, 'meaning', { + enumerable: true, + get() { + return universe.meaning; + }, +}); diff --git a/packages/compartment-mapper/test/fixtures-esm-imports-cjs-define/2.cjs b/packages/compartment-mapper/test/fixtures-esm-imports-cjs-define/2.cjs new file mode 100644 index 0000000000..a09d05c8e3 --- /dev/null +++ b/packages/compartment-mapper/test/fixtures-esm-imports-cjs-define/2.cjs @@ -0,0 +1,2 @@ +Object.defineProperty(exports, '__esModule', { value: true }); +exports.meaning = 42; diff --git a/packages/compartment-mapper/test/fixtures-esm-imports-cjs-define/package.json b/packages/compartment-mapper/test/fixtures-esm-imports-cjs-define/package.json new file mode 100644 index 0000000000..bc4f937021 --- /dev/null +++ b/packages/compartment-mapper/test/fixtures-esm-imports-cjs-define/package.json @@ -0,0 +1,9 @@ +{ + "name": "app", + "version": "1.0.0", + "main": "./0.mjs", + "type": "commonjs", + "scripts": { + "preinstall": "echo DO NOT INSTALL TEST FIXTURES; exit -1" + } +}