From 419c3797486b4e4c8d7ecfa9bf8d550b8e8077bd Mon Sep 17 00:00:00 2001 From: Daniel Cohen Gindi Date: Mon, 25 May 2020 20:58:49 +0300 Subject: [PATCH] fix(commonjs): __moduleExports in multi entry + inter dependencies --- packages/commonjs/src/index.js | 11 ++- packages/commonjs/src/transform.js | 8 ++- .../multi-entry-module-exports/_config.js | 9 +++ .../form/multi-entry-module-exports/input1.js | 4 ++ .../form/multi-entry-module-exports/input2.js | 3 + .../multi-entry-module-exports/output1.js | 8 +++ .../multi-entry-module-exports/output2.js | 8 +++ packages/commonjs/test/form.js | 67 +++++++++++------- .../commonjs/test/snapshots/function.js.snap | Bin 7834 -> 7815 bytes 9 files changed, 88 insertions(+), 30 deletions(-) create mode 100644 packages/commonjs/test/fixtures/form/multi-entry-module-exports/_config.js create mode 100644 packages/commonjs/test/fixtures/form/multi-entry-module-exports/input1.js create mode 100644 packages/commonjs/test/fixtures/form/multi-entry-module-exports/input2.js create mode 100644 packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js create mode 100644 packages/commonjs/test/fixtures/form/multi-entry-module-exports/output2.js diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index 19d2b203b..2e2c8a3ff 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -80,11 +80,14 @@ export default function commonjs(options = {}) { return null; } + const moduleInfo = this.getModuleInfo(id); + const transformed = transformCommonjs( this.parse, code, id, - this.getModuleInfo(id).isEntry, + moduleInfo.isEntry, + moduleInfo.importers && moduleInfo.importers.length > 0, isEsModule, ignoreGlobal || isEsModule, ignoreRequire, @@ -218,7 +221,11 @@ export default function commonjs(options = {}) { return `import { __moduleExports } from ${JSON.stringify( actualId )}; export default __moduleExports;`; - else if (esModulesWithoutDefaultExport.has(actualId)) + /* return `export { default } from ${JSON.stringify( + actualId + )};`;*/ else if ( + esModulesWithoutDefaultExport.has(actualId) + ) return `import * as ${name} from ${JSON.stringify(actualId)}; export default ${name};`; else if (esModulesWithDefaultExport.has(actualId)) { return `export {default} from ${JSON.stringify(actualId)};`; diff --git a/packages/commonjs/src/transform.js b/packages/commonjs/src/transform.js index 9118f7964..043359cdc 100644 --- a/packages/commonjs/src/transform.js +++ b/packages/commonjs/src/transform.js @@ -106,6 +106,7 @@ export function transformCommonjs( code, id, isEntry, + hasImporters, isEsModule, ignoreGlobal, ignoreRequire, @@ -569,7 +570,7 @@ export function transformCommonjs( let wrapperEnd = ''; const moduleName = deconflict(scope, globals, getName(id)); - if (!isEntry && !isEsModule) { + if ((!isEntry || hasImporters) && !isEsModule) { const exportModuleExports = { str: `export { ${moduleName} as __moduleExports };`, name: '__moduleExports' @@ -656,7 +657,7 @@ export function transformCommonjs( } } - if (!hasDefaultExport && (names.length || (!isEntry && !isEsModule))) { + if (!hasDefaultExport && (names.length || ((!isEntry || hasImporters) && !isEsModule))) { wrapperEnd = `\n\nvar ${moduleName} = {\n${names .map(({ name, deconflicted }) => `\t${name}: ${deconflicted}`) .join(',\n')}\n};`; @@ -686,7 +687,8 @@ export function transformCommonjs( .trim() .append(wrapperEnd); - const injectExportBlock = hasDefaultExport || named.length > 0 || shouldWrap || !isEntry; + const injectExportBlock = + hasDefaultExport || named.length > 0 || shouldWrap || !isEntry || hasImporters; if (injectExportBlock) { magicString.append(exportBlock); } diff --git a/packages/commonjs/test/fixtures/form/multi-entry-module-exports/_config.js b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/_config.js new file mode 100644 index 000000000..54e5ab230 --- /dev/null +++ b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/_config.js @@ -0,0 +1,9 @@ +module.exports = { + multi: { + output1: 'input1.js', + output2: 'input2.js' + }, + importers: { + output2: ['input1.js'] + } +}; diff --git a/packages/commonjs/test/fixtures/form/multi-entry-module-exports/input1.js b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/input1.js new file mode 100644 index 000000000..7aff633ef --- /dev/null +++ b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/input1.js @@ -0,0 +1,4 @@ +const t2 = require('./input2.js'); + +console.log(t2); +module.exports = 1; diff --git a/packages/commonjs/test/fixtures/form/multi-entry-module-exports/input2.js b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/input2.js new file mode 100644 index 000000000..39d4e85af --- /dev/null +++ b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/input2.js @@ -0,0 +1,3 @@ +module.exports = { + a: 2 +}; diff --git a/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js new file mode 100644 index 000000000..fd1e0719e --- /dev/null +++ b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js @@ -0,0 +1,8 @@ +import './input2.js'; +import t2 from '_./input2.js?commonjs-proxy'; + +console.log(t2); +var input1 = 1; + +export default input1; +export { input1 as __moduleExports }; diff --git a/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output2.js b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output2.js new file mode 100644 index 000000000..7813ceb5f --- /dev/null +++ b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output2.js @@ -0,0 +1,8 @@ +var input2 = { + a: 2 +}; + +export default input2; +export { input2 as __moduleExports }; +var input2_1 = input2.a; +export { input2_1 as a }; diff --git a/packages/commonjs/test/form.js b/packages/commonjs/test/form.js index 0ecf6e33d..c0cba3061 100644 --- a/packages/commonjs/test/form.js +++ b/packages/commonjs/test/form.js @@ -27,35 +27,52 @@ readdirSync('./fixtures/form').forEach((dir) => { config = {}; } + const { transform } = commonjs(config.options); + + const inputEntries = []; + + if (typeof config.multi === 'object') { + for (const [key, entry] of Object.entries(config.multi)) { + inputEntries.push([key, `fixtures/form/${dir}/${entry}`]); + } + } else { + inputEntries.push(['output', `fixtures/form/${dir}/input.js`]); + } + (config.solo ? test.only : test)(dir, async (t) => { - const { transform } = commonjs(config.options); - const id = `./fixtures/form/${dir}/input.js`; + for (const [outputName, id] of inputEntries) { + const { transform } = commonjs(config.options); - transformContext.getModuleInfo = (moduleId) => { - return { - isEntry: config.entry && moduleId === id + transformContext.getModuleInfo = (moduleId) => { + return { + isEntry: config.entry && moduleId === id, + importers: + config.importers && config.importers[outputName] + ? config.importers[outputName].map((x) => `fixtures/form/${dir}/${x}`) + : [] + }; }; - }; - transformContext.error = (base, props) => { - let error = base; - if (!(base instanceof Error)) error = Object.assign(new Error(base.message), base); - if (props) Object.assign(error, props); - throw error; - }; - - const input = readFileSync(id, 'utf-8'); - - let outputFile = `fixtures/form/${dir}/output`; - if (existsSync(`${outputFile}.${process.platform}.js`)) { - outputFile += `.${process.platform}.js`; - } else { - outputFile += '.js'; - } + transformContext.error = (base, props) => { + let error = base; + if (!(base instanceof Error)) error = Object.assign(new Error(base.message), base); + if (props) Object.assign(error, props); + throw error; + }; + + const input = readFileSync(id, 'utf-8'); - const expected = readFileSync(outputFile, 'utf-8').trim(); - const transformed = transform.call(transformContext, input, id); - const actual = (transformed ? transformed.code : input).trim().replace(/\0/g, '_'); + let outputFile = `fixtures/form/${dir}/${outputName}`; + if (existsSync(`${outputFile}.${process.platform}.js`)) { + outputFile += `.${process.platform}.js`; + } else { + outputFile += '.js'; + } - t.is(actual, expected); + const expected = readFileSync(outputFile, 'utf-8').trim(); + const transformed = transform.call(transformContext, input, id); + const actual = (transformed ? transformed.code : input).trim().replace(/\0/g, '_'); + + t.is(actual, expected); + } }); }); diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index c1fd38deebebcfab5695cdb1fc92438ef13e6c25..b7607343db9b117a888518ab5245f29cb5467e66 100644 GIT binary patch literal 7815 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 U9xFZFNPk^(l?JEiBM=e(2hn{q)c^nh