From 303182cd6aeba27ef70fb3419f4506163649d0cf Mon Sep 17 00:00:00 2001 From: Daniel Cohen Gindi Date: Thu, 30 Apr 2020 08:51:59 +0300 Subject: [PATCH] Improved shouldWrap logic (Closes #304) --- packages/commonjs/src/transform.js | 20 ++++++++---- .../_config.js | 8 +++++ .../es6-export-with-global-sniffing/main.js | 7 +++++ .../submodule.js | 19 ++++++++++++ .../commonjs/test/snapshots/function.js.md | 29 ++++++++++++++++++ .../commonjs/test/snapshots/function.js.snap | Bin 7191 -> 7371 bytes 6 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 packages/commonjs/test/fixtures/function/es6-export-with-global-sniffing/_config.js create mode 100644 packages/commonjs/test/fixtures/function/es6-export-with-global-sniffing/main.js create mode 100644 packages/commonjs/test/fixtures/function/es6-export-with-global-sniffing/submodule.js diff --git a/packages/commonjs/src/transform.js b/packages/commonjs/src/transform.js index 13f2c8f54..8cebd8885 100644 --- a/packages/commonjs/src/transform.js +++ b/packages/commonjs/src/transform.js @@ -141,7 +141,7 @@ export function transformCommonjs( // TODO handle transpiled modules let shouldWrap = /__esModule/.test(code); - let usesDynamicHelpers = false; + let usesCommonjsHelpers = false; function isRequireStatement(node) { if (!node) return false; @@ -316,10 +316,12 @@ export function transformCommonjs( // rewrite `this` as `commonjsHelpers.commonjsGlobal` if (node.type === 'ThisExpression' && lexicalDepth === 0) { uses.global = true; - if (!ignoreGlobal) + if (!ignoreGlobal) { magicString.overwrite(node.start, node.end, `${HELPERS_NAME}.commonjsGlobal`, { storeName: true }); + usesCommonjsHelpers = true; + } return; } @@ -366,7 +368,7 @@ export function transformCommonjs( magicString.overwrite(node.start, node.end, `${HELPERS_NAME}.commonjsRequire`, { storeName: true }); - usesDynamicHelpers = true; + usesCommonjsHelpers = true; } uses[node.name] = true; @@ -374,6 +376,7 @@ export function transformCommonjs( magicString.overwrite(node.start, node.end, `${HELPERS_NAME}.commonjsGlobal`, { storeName: true }); + usesCommonjsHelpers = true; } // if module or exports are used outside the context of an assignment @@ -474,7 +477,7 @@ export function transformCommonjs( : getVirtualPathForDynamicRequirePath(normalizePathSlashes(dirname(id)), commonDir) )})` ); - usesDynamicHelpers = true; + usesCommonjsHelpers = true; } else { magicString.overwrite(node.start, node.end, required.name); } @@ -530,8 +533,13 @@ export function transformCommonjs( return null; } - const includeHelpers = usesDynamicHelpers || shouldWrap || uses.global || uses.require; - const importBlock = `${(includeHelpers + // If `isEsModule` is on, it means it has ES6 import/export statements, + // which just can't be wrapped in a function. + if (isEsModule) shouldWrap = false; + + usesCommonjsHelpers = usesCommonjsHelpers || shouldWrap; + + const importBlock = `${(usesCommonjsHelpers ? [`import * as ${HELPERS_NAME} from '${HELPERS_ID}';`] : [] ) diff --git a/packages/commonjs/test/fixtures/function/es6-export-with-global-sniffing/_config.js b/packages/commonjs/test/fixtures/function/es6-export-with-global-sniffing/_config.js new file mode 100644 index 000000000..2ae8c810d --- /dev/null +++ b/packages/commonjs/test/fixtures/function/es6-export-with-global-sniffing/_config.js @@ -0,0 +1,8 @@ +const nodeResolve = require('@rollup/plugin-node-resolve'); + +module.exports = { + options: { + plugins: [nodeResolve()] + }, + pluginOptions: {} +}; diff --git a/packages/commonjs/test/fixtures/function/es6-export-with-global-sniffing/main.js b/packages/commonjs/test/fixtures/function/es6-export-with-global-sniffing/main.js new file mode 100644 index 000000000..75d7ec51e --- /dev/null +++ b/packages/commonjs/test/fixtures/function/es6-export-with-global-sniffing/main.js @@ -0,0 +1,7 @@ +// this test makes sure that "submodule" is not wrapped in commonjs +// helper due to its use of "typeof module", given that "submodule" has es6 exports. +// any attempt to wrap it in a function will just fail as it's invalid syntax. + +import getGlobalPollution from './submodule.js'; + +t.is(getGlobalPollution(), global.pollution); diff --git a/packages/commonjs/test/fixtures/function/es6-export-with-global-sniffing/submodule.js b/packages/commonjs/test/fixtures/function/es6-export-with-global-sniffing/submodule.js new file mode 100644 index 000000000..49ddf6d49 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/es6-export-with-global-sniffing/submodule.js @@ -0,0 +1,19 @@ +let root; + +if (typeof self !== 'undefined') { + root = self; +} else if (typeof window !== 'undefined') { + root = window; +} else if (typeof global !== 'undefined') { + root = global; +} else if (typeof module !== 'undefined') { + root = module; +} else { + root = Function('return this')(); // eslint-disable-line no-new-func +} + +root.pollution = 'foo'; + +const getGlobalPollution = () => 'foo'; + +export default getGlobalPollution; diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index 34b2cf6c7..0eb07a6c1 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -2500,6 +2500,35 @@ Generated by [AVA](https://ava.li). `, } +## es6-export-with-global-sniffing + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + let root;␊ + ␊ + if (typeof self !== 'undefined') {␊ + root = self;␊ + } else if (typeof window !== 'undefined') {␊ + root = window;␊ + } else if (typeof global !== 'undefined') {␊ + root = global;␊ + } else {␊ + root = module;␊ + }␊ + ␊ + root.pollution = 'foo';␊ + ␊ + const getGlobalPollution = () => 'foo';␊ + ␊ + // this test makes sure that "submodule" is not wrapped in commonjs␊ + ␊ + t.is(getGlobalPollution(), global.pollution);␊ + `, + } + ## export-default-from > Snapshot 1 diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index 621c545da74c3bc2ee92cd82ccc2e4c8664944b3..2d9be79559f083479b482eb21f5e78e0a9d9788c 100644 GIT binary patch literal 7371 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 literal 7191 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 B%EJHv