From 4ca901903a0a908858889cce7a09b5fd876982b9 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 | 5 +- 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 | 65 +++++++++++------- .../commonjs/test/snapshots/function.js.md | 2 +- .../commonjs/test/snapshots/function.js.snap | Bin 7778 -> 7780 bytes 10 files changed, 82 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..9108add70 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, diff --git a/packages/commonjs/src/transform.js b/packages/commonjs/src/transform.js index d371b707f..8b882767c 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, @@ -564,7 +565,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' @@ -634,7 +635,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};`; @@ -660,7 +661,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..e84cacf66 100644 --- a/packages/commonjs/test/form.js +++ b/packages/commonjs/test/form.js @@ -27,35 +27,50 @@ readdirSync('./fixtures/form').forEach((dir) => { config = {}; } + 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.md b/packages/commonjs/test/snapshots/function.js.md index fa724cc97..369671717 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -4,7 +4,7 @@ The actual snapshot is saved in `function.js.snap`. Generated by [AVA](https://ava.li). -## \_\_esModule +## __esModule > Snapshot 1 diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index 578c30a547bb032d24ccb456e2fac2c712c591fc..52bdb218757ebb0a0fead249d1803e164b84e623 100644 GIT binary patch delta 7407 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 Z-~k2UVS912>)rVqK%bH!ISdiuzX1FEmrMWv delta 7462 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 gSUvh8#