From b07edae2547a8d267785d8d7c3d2b9e278cd4046 Mon Sep 17 00:00:00 2001 From: Daniel Cohen Gindi Date: Mon, 1 Jun 2020 17:13:13 +0300 Subject: [PATCH] fix(commonjs): __moduleExports in multi entry + inter dependencies (#415) * fix(commonjs): __moduleExports in multi entry + inter dependencies * Added form tests outputs to .prettierignore --- packages/commonjs/.prettierignore | 1 + 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 | 6 ++ packages/commonjs/test/form.js | 65 +++++++++++------- .../commonjs/test/snapshots/function.js.md | 2 +- .../commonjs/test/snapshots/function.js.snap | Bin 7778 -> 7782 bytes 11 files changed, 81 insertions(+), 30 deletions(-) create mode 100644 packages/commonjs/.prettierignore 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/.prettierignore b/packages/commonjs/.prettierignore new file mode 100644 index 000000000..b797e4c31 --- /dev/null +++ b/packages/commonjs/.prettierignore @@ -0,0 +1 @@ +test/fixtures/form/output*.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..b02231f2c --- /dev/null +++ b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output2.js @@ -0,0 +1,6 @@ +var input2 = { + a: 2 +}; + +export default input2; +export { input2 as __moduleExports }; 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..3ebf253e9a3b95c26d47a576a678bcda51850399 100644 GIT binary patch literal 7782 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 W3=Q0O+TMb{520j6e$9x4hx;GQo*xYW literal 7778 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