From df01795fb014115e13d667a7a0504ddc6eb0243e Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Thu, 2 Dec 2021 09:25:44 +0100 Subject: [PATCH] fix(commonjs): do not transform "typeof exports" for mixed modules (#1038) resolves #1014 --- packages/commonjs/src/index.js | 21 +++-- packages/commonjs/src/resolve-id.js | 10 ++- .../commonjs/src/resolve-require-sources.js | 78 ++++++++++-------- packages/commonjs/src/transform-commonjs.js | 12 +-- .../function/load-cycle-parallel/_config.js | 3 + .../function/load-cycle-parallel/a.js | 1 + .../function/load-cycle-parallel/b.js | 1 + .../function/load-cycle-parallel/c.js | 1 + .../function/load-cycle-parallel/main.js | 3 + .../mixed-module-typeof-exports/_config.js | 4 + .../mixed-module-typeof-exports/foo.js | 1 + .../mixed-module-typeof-exports/main.js | 7 ++ .../commonjs/test/snapshots/function.js.md | 17 +++- .../commonjs/test/snapshots/function.js.snap | Bin 20650 -> 20734 bytes packages/commonjs/test/snapshots/test.js.md | 15 ++++ packages/commonjs/test/snapshots/test.js.snap | Bin 813 -> 938 bytes packages/commonjs/test/test.js | 18 +++- 17 files changed, 139 insertions(+), 53 deletions(-) create mode 100644 packages/commonjs/test/fixtures/function/load-cycle-parallel/_config.js create mode 100644 packages/commonjs/test/fixtures/function/load-cycle-parallel/a.js create mode 100644 packages/commonjs/test/fixtures/function/load-cycle-parallel/b.js create mode 100644 packages/commonjs/test/fixtures/function/load-cycle-parallel/c.js create mode 100644 packages/commonjs/test/fixtures/function/load-cycle-parallel/main.js create mode 100644 packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/_config.js create mode 100644 packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/foo.js create mode 100644 packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/main.js diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index 1d0fdcc59..627f98eb6 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -128,16 +128,19 @@ export default function commonjs(options = {}) { !isEsModule && (dynamicRequireModules.has(normalizePathSlashes(id)) || strictRequiresFilter(id)); - const checkDynamicRequire = () => { + const checkDynamicRequire = (position) => { if (id.indexOf(dynamicRequireRoot) !== 0) { - this.error({ - code: 'DYNAMIC_REQUIRE_OUTSIDE_ROOT', - id, - dynamicRequireRoot, - message: `"${id}" contains dynamic require statements but it is not within the current dynamicRequireRoot "${dynamicRequireRoot}". You should set dynamicRequireRoot to "${dirname( - id - )}" or one of its parent directories.` - }); + this.error( + { + code: 'DYNAMIC_REQUIRE_OUTSIDE_ROOT', + id, + dynamicRequireRoot, + message: `"${id}" contains dynamic require statements but it is not within the current dynamicRequireRoot "${dynamicRequireRoot}". You should set dynamicRequireRoot to "${dirname( + id + )}" or one of its parent directories.` + }, + position + ); } }; diff --git a/packages/commonjs/src/resolve-id.js b/packages/commonjs/src/resolve-id.js index c7d3844a9..74d209e5b 100644 --- a/packages/commonjs/src/resolve-id.js +++ b/packages/commonjs/src/resolve-id.js @@ -50,6 +50,14 @@ export function resolveExtensions(importee, importer, extensions) { export default function getResolveId(extensions) { return async function resolveId(importee, importer, resolveOptions) { + // We assume that all requires are pre-resolved + if ( + resolveOptions.custom && + resolveOptions.custom['node-resolve'] && + resolveOptions.custom['node-resolve'].isRequire + ) { + return null; + } if (isWrappedId(importee, WRAPPED_SUFFIX)) { return unwrapId(importee, WRAPPED_SUFFIX); } @@ -69,7 +77,7 @@ export default function getResolveId(extensions) { if (importer) { if ( importer === DYNAMIC_MODULES_ID || - // Except for exports, proxies are only importing resolved ids, no need to resolve again + // Proxies are only importing resolved ids, no need to resolve again isWrappedId(importer, PROXY_SUFFIX) || isWrappedId(importer, ES_IMPORT_SUFFIX) ) { diff --git a/packages/commonjs/src/resolve-require-sources.js b/packages/commonjs/src/resolve-require-sources.js index 9483d2cd1..76fae132e 100644 --- a/packages/commonjs/src/resolve-require-sources.js +++ b/packages/commonjs/src/resolve-require-sources.js @@ -11,9 +11,39 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndCo const knownCjsModuleTypes = Object.create(null); const requiredIds = Object.create(null); const unconditionallyRequiredIds = Object.create(null); - const dependentModules = Object.create(null); - const getDependentModules = (id) => - dependentModules[id] || (dependentModules[id] = Object.create(null)); + const dependencies = Object.create(null); + const getDependencies = (id) => dependencies[id] || (dependencies[id] = new Set()); + + const isCyclic = (id) => { + const dependenciesToCheck = new Set(getDependencies(id)); + for (const dependency of dependenciesToCheck) { + if (dependency === id) { + return true; + } + for (const childDependency of getDependencies(dependency)) { + dependenciesToCheck.add(childDependency); + } + } + return false; + }; + + const fullyAnalyzedModules = Object.create(null); + + const getTypeForFullyAnalyzedModule = (id) => { + const knownType = knownCjsModuleTypes[id]; + if ( + knownType === IS_WRAPPED_COMMONJS || + !detectCyclesAndConditional || + fullyAnalyzedModules[id] + ) { + return knownType; + } + fullyAnalyzedModules[id] = true; + if (isCyclic(id)) { + return (knownCjsModuleTypes[id] = IS_WRAPPED_COMMONJS); + } + return knownType; + }; return { getWrappedIds: () => @@ -26,8 +56,9 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndCo isParentCommonJS, sources ) => { - knownCjsModuleTypes[parentId] = knownCjsModuleTypes[parentId] || isParentCommonJS; + knownCjsModuleTypes[parentId] = isParentCommonJS; if ( + detectCyclesAndConditional && knownCjsModuleTypes[parentId] && requiredIds[parentId] && !unconditionallyRequiredIds[parentId] @@ -42,9 +73,7 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndCo } const resolved = (await rollupContext.resolve(source, parentId, { - custom: { - 'node-resolve': { isRequire: true } - } + custom: { 'node-resolve': { isRequire: true } } })) || resolveExtensions(source, parentId, extensions); if (!resolved) { return { id: wrapId(source, EXTERNAL_SUFFIX), allowProxy: false }; @@ -54,44 +83,25 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndCo return { id: wrapId(childId, EXTERNAL_SUFFIX), allowProxy: false }; } requiredIds[childId] = true; - if ( - !( - detectCyclesAndConditional && - (isConditional || knownCjsModuleTypes[parentId] === IS_WRAPPED_COMMONJS) - ) - ) { + if (!(isConditional || knownCjsModuleTypes[parentId] === IS_WRAPPED_COMMONJS)) { unconditionallyRequiredIds[childId] = true; } - const parentDependentModules = getDependentModules(parentId); - const childDependentModules = getDependentModules(childId); - childDependentModules[parentId] = true; - for (const dependentId of Object.keys(parentDependentModules)) { - childDependentModules[dependentId] = true; - } - if (parentDependentModules[childId]) { - // If we depend on one of our dependencies, we have a cycle. Then all modules that - // we depend on that also depend on the same module are part of a cycle as well. - if (detectCyclesAndConditional && isParentCommonJS) { - knownCjsModuleTypes[parentId] = IS_WRAPPED_COMMONJS; - knownCjsModuleTypes[childId] = IS_WRAPPED_COMMONJS; - for (const dependentId of Object.keys(parentDependentModules)) { - if (getDependentModules(dependentId)[childId]) { - knownCjsModuleTypes[dependentId] = IS_WRAPPED_COMMONJS; - } - } - } - } else { + + getDependencies(parentId).add(childId); + if (!isCyclic(childId)) { // This makes sure the current transform handler waits for all direct dependencies to be // loaded and transformed and therefore for all transitive CommonJS dependencies to be // loaded as well so that all cycles have been found and knownCjsModuleTypes is reliable. await rollupContext.load(resolved); + } else if (detectCyclesAndConditional && knownCjsModuleTypes[parentId]) { + knownCjsModuleTypes[parentId] = IS_WRAPPED_COMMONJS; } return { id: childId, allowProxy: true }; }) ); return { requireTargets: requireTargets.map(({ id: dependencyId, allowProxy }, index) => { - const isCommonJS = knownCjsModuleTypes[dependencyId]; + const isCommonJS = getTypeForFullyAnalyzedModule(dependencyId); return { source: sources[index].source, id: allowProxy @@ -102,7 +112,7 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndCo isCommonJS }; }), - usesRequireWrapper: knownCjsModuleTypes[parentId] === IS_WRAPPED_COMMONJS + usesRequireWrapper: getTypeForFullyAnalyzedModule(parentId) === IS_WRAPPED_COMMONJS }; } }; diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index e4147d4cd..3fb8602cd 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -198,7 +198,7 @@ export default async function transformCommonjs( isRequire(node.callee.object, scope) && node.callee.property.name === 'resolve' ) { - checkDynamicRequire(); + checkDynamicRequire(node.start); uses.require = true; const requireNode = node.callee.object; magicString.appendLeft( @@ -220,6 +220,7 @@ export default async function transformCommonjs( if (hasDynamicArguments(node)) { if (isDynamicRequireModulesEnabled) { + checkDynamicRequire(node.start); magicString.appendLeft( node.end - 1, `, ${JSON.stringify( @@ -228,7 +229,6 @@ export default async function transformCommonjs( ); } if (!ignoreDynamicRequires) { - checkDynamicRequire(); replacedDynamicRequires.push(node.callee); } return; @@ -286,7 +286,6 @@ export default async function transformCommonjs( return; } if (!ignoreDynamicRequires) { - checkDynamicRequire(); if (isShorthandProperty(parent)) { magicString.prependRight(node.start, 'require: '); } @@ -370,9 +369,10 @@ export default async function transformCommonjs( if (scope.contains(flattened.name)) return; if ( - flattened.keypath === 'module.exports' || - flattened.keypath === 'module' || - flattened.keypath === 'exports' + !isEsModule && + (flattened.keypath === 'module.exports' || + flattened.keypath === 'module' || + flattened.keypath === 'exports') ) { magicString.overwrite(node.start, node.end, `'object'`, { storeName: false diff --git a/packages/commonjs/test/fixtures/function/load-cycle-parallel/_config.js b/packages/commonjs/test/fixtures/function/load-cycle-parallel/_config.js new file mode 100644 index 000000000..73cd1001e --- /dev/null +++ b/packages/commonjs/test/fixtures/function/load-cycle-parallel/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'handles loading all modules of a cycle in parallel' +}; diff --git a/packages/commonjs/test/fixtures/function/load-cycle-parallel/a.js b/packages/commonjs/test/fixtures/function/load-cycle-parallel/a.js new file mode 100644 index 000000000..ed897bbc6 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/load-cycle-parallel/a.js @@ -0,0 +1 @@ +require('./b.js'); diff --git a/packages/commonjs/test/fixtures/function/load-cycle-parallel/b.js b/packages/commonjs/test/fixtures/function/load-cycle-parallel/b.js new file mode 100644 index 000000000..60204ed1e --- /dev/null +++ b/packages/commonjs/test/fixtures/function/load-cycle-parallel/b.js @@ -0,0 +1 @@ +require('./c.js'); diff --git a/packages/commonjs/test/fixtures/function/load-cycle-parallel/c.js b/packages/commonjs/test/fixtures/function/load-cycle-parallel/c.js new file mode 100644 index 000000000..d87ec6cce --- /dev/null +++ b/packages/commonjs/test/fixtures/function/load-cycle-parallel/c.js @@ -0,0 +1 @@ +require('./a.js'); diff --git a/packages/commonjs/test/fixtures/function/load-cycle-parallel/main.js b/packages/commonjs/test/fixtures/function/load-cycle-parallel/main.js new file mode 100644 index 000000000..c6d056017 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/load-cycle-parallel/main.js @@ -0,0 +1,3 @@ +require('./a.js'); +require('./b.js'); +require('./c.js'); diff --git a/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/_config.js b/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/_config.js new file mode 100644 index 000000000..3d25d8d4d --- /dev/null +++ b/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/_config.js @@ -0,0 +1,4 @@ +module.exports = { + description: 'replaces "typeof exports" with "undefined" in mixed modules', + pluginOptions: { transformMixedEsModules: true } +}; diff --git a/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/foo.js b/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/foo.js new file mode 100644 index 000000000..ce0fffb75 --- /dev/null +++ b/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/foo.js @@ -0,0 +1 @@ +module.exports = 21; diff --git a/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/main.js b/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/main.js new file mode 100644 index 000000000..b1f34e2a2 --- /dev/null +++ b/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/main.js @@ -0,0 +1,7 @@ +const foo = require('./foo'); + +if (typeof exports !== 'undefined') { + throw new Error('There should be no global exports in an ES module'); +} + +export { foo as default }; diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index b30e1811d..70584b812 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -3050,8 +3050,10 @@ Generated by [AVA](https://avajs.dev). root = window;␊ } else if (typeof global !== 'undefined') {␊ root = global;␊ - } else {␊ + } else if (typeof module !== 'undefined') {␊ root = module;␊ + } else {␊ + root = Function('return this')(); // eslint-disable-line no-new-func␊ }␊ ␊ root.pollution = 'foo';␊ @@ -4725,6 +4727,19 @@ Generated by [AVA](https://avajs.dev). `, } +## load-cycle-parallel + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + module.exports = main;␊ + `, + } + ## module-meta-properties > Snapshot 1 diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index a4ae4968c02399853df76dce48e40539a0845d94..9a637b0f78efbc20252f51b2fa9f6550e0ac45c6 100644 GIT binary patch delta 20574 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 I5p#(G0B+9TCIA2c delta 20555 zcmZ6xV{o9q7Y16JTib58#+F;#wr#s_ZFAeLZQHiHwQbw?_rLefT;xOY%$X!J2brAY zJYRXB<$0ihpqe1DvYnxWvxU72u^S5<7zh^wDGI&oG@4s}Puuqo?s1|h7?A(7fnV~$ zdZ;WeUPFpd{%kE+IutBm4Pr$z`(YsqVj9-tPaO_F%QV(WE=!$f7tE$JIccA0B``wI;6~f1_DBb<4?Krz5$NRrQ zM?h%d=kh}mC%rDOv7GVD&~eLUtEW*+v)HtdUH22(e6C)@uG~ELzxFaB3;U86pS`zYw|xm8 zS}m#BIyXNr7Vw6ez-*K_8MC|cY)wTF4kG`Rx)3>qU(=& zuF}8HBJ#^6JMrCTw+$1>;Bs|Rr3n#wn>pU0wslHfGE2%9A zV077q7u?GDffvT7$>#5`F}`J9ccV`w0>PG?Dobyq_3JF;n(w(8>+j9?>B3(#`v0k6 zDQ>l1nj*lg5xybc0s8?SHM;BQ6TfmdA$ z3s2s=**HW~uZQ!<`kn7nyW-D11!N~#BUWo)4el#9n#VU-+x!Pm_XYc6-T!ShHxiJn zytHI`RP(y?iU+XszAvEFETTSi{bxg!g*^F-+vN^{?4DDqG*2~sUmzwn*PCIEZTpL} ztK;Ytz8a>-?{-|3@#~hIK#)-bPN_ai{@S${O+Cx+Jh^@0I`a{pK=9Z{eF5opB43n8 zf7AV(Q=jXuHN(8ST~T~?m@@wE8oaATfbC(;J+|jyFY365Lq&YnT$_#ICFz;vT+X&e zzRSV$;Zi-PTS0s_7T}PD51BsUeu_QTUmfut4zjoLfxUssGhP!Me zDmb@@I{pjU7Q=DhnV-7OXL#?IU6QQV9gaiQ+=0{j)s{{08L{U1qO1<~{FwsJX|)E~;V+{UtgNz(pD0XSe)JsMCHv6~=oT z5}VtgW~p^B`P}2Ia1mhtQG672AU?zQoEn?ky=Z{s`!*HE$Y;smrLuq< zTFrkyR=42hW0P9q_L>n$Fk#_D``Bn71X_434Sy_arq0dpt)6W9N~z&3R(v;Mfk;h2n2p4dT!KXn||K ztHtKD>GpkC0>S52*@bRar>D*leL_~_e%WJ)FW05#J}&>+r|rN5R|StRw#_v=^zy4^6LJ6A@9QosHG?~J3;ZkVEh=^SdE@;C96V>6YwG27 z>c7M7nNvKq&goUyd@_Ii^q)-@o%OdQmr)-Ms07C&)NMUJ)AzNBbn2e@2J|{1{)?t# z0dS?SJ&;MALK z6m|c2|Chtpd^ME=-Ti$>v}VR}2J?0rmEkriZQtoRT2VH8sUF+v^HQ~JKacuQ)nl<% zhfF1h{npd`1@Jq(dY+>Jx_M+Lj9ncf1PWDcT7Q>r-^&Z}Dg8R|_3SV-OA zXWittmo>W8BieA7DNZ+t7P8m|*e*MwaIgMwd%x{3)O`84p6iK=x`}w z3;b#=AJ=kxg7e5m{FBXxKi^)gt3S?#ArZP?<74yRR546?mP+3E8Xw$}iJuC|}%jm5V>-1{qlN<{Fkuqn9B z2QJJ*d8Tzd*EJEBb@S|O#@l7IJtOD+;f{R<>TPn@xft+N9!BQ=)Z;u<*6j)v%8xK? zWpxq>Tr`}IdMY#W8SY{9DL?nk5;Ey4bACU4ki~JgJ{Rt;l5|vREyd<-^Q$elTjA;B zH2GcT$k%Y+M6R^iGxP$pjIrP}_TLtp{i)B<-|T!3i`UOJZHU4P1}Ud+HP0cQ;@#g@ z6xP7QG3)ljXV&k(E|0xm2%jVxSo8W{mzjT&y?=R`7uqgv zARZG%<>?pqwmTf!%XJ?VR)4F+^jvNJeb)X!M(8?$(4BZY0(^kk0%5bS(=A=MtlG2U zG3>Ru66?(pJw6(zy9z8_FERb3>y!KLxICVmQtK}9IK7t#MdR*_Up^xXvG1=Rh}d3? zFU!x4>v4VprdQGSGrm4|_F)kAg9^4O)m53VXLQ#aA6=@?ytfB@R7GDNprL*+UN_0x zHk~ErPxr?$x~zcbN+dGobxW`T7{^*Mgs(My&dpW|=}mR|Q=u{4v*SsU@;AyG}o z+m5h6=LFUzpUd0zk?{%W@#)%G=ykU5b8MQv-*g6E_NvEfi@D)R#qs$X&i(b)=bbob zWtaWO;+M1Dn*n0z7Sfrk+Gn46W<$R7%roXj{pnNz-WL#(CmyJJl-Z5tb>#Ol)_~md zQ=^6EX$J}0Yi#EC_?q{!uG7x?2q7y~d*|zDguU^}h(TKSPK;=Wu4>a;|GPl@@$++0 zDp6csNkDV!&5%20y8Cq7&%2%%!mefDNB?Zi(&^gJx6W&SnLEFyxI^;w&1Q|j2`a+p z0cX40Dl5Q=e|wWPlIgqkCc7=A`u*aEp!=n*+wt+u!S?gTV_vjn%loWGZVN>tH18Rd z=8Ou<_Zd3LzQbUDp=I-XWS9VXB{&axtIS%U>TT>VpZ>+e({UO__4`ZQ^;URZLto{` zY3tU4Kt*-izn15K-G)>oZ!lq?3$;>{j&S9f=M*r;>baYpB#O2JD8uuduNIrEzYKi1 zJr8^ZY;y2tk)^-$iG?>woEy$n@jz`L-pQ4UffMy5CAG zZ>ltGON$pXJq$zlZF35IzU-`-hY|6bN-eKqRej@x^4~z~c3e#Yae#A42~o_I(}lOV z4Y1;jjG+5iTm9*jgSXtne$@|8Imvw&ii*7b1R0wBSX%u#?&JET-lB7v^ETbiUO@IP zGcbGk4N;o?ah2vv^x>*kc(#DI{P~*1j{Wwr-`;HZg@u*%zOqsh>eu+qjJM76%!IJH zFB$K29H89I)$O{+?tby{rM~dgO(?t!0<2yy0pE@*h1)rgi$vA!_iI~C>bm}Uc-xT1 zC$U68o7tP8^)_%cEY0|4GscCm`NgN(v420jvYGzvliJp5xz-l}F3>+KdVRk37E{48 zHnUZ}b-UJr{CQRm-aR;b{#|bUEa2dJ+<$f(N1)Pl+ShY+JFkJD3rQXxR^4#`9HYs< zj(J1tJlLc>x546uWT~T+@^gu{y0;5>58aYWHc~oumK)?;oCT53ly! zkFU}#MDMH!n;_&%BmG#{Ovg{%L@nlom!3NjBRwH`?tYL;xLCf{W9jLV@)StCR>SPb zHeq>=RZ`v;duSaUpXTy^UTUs^PBh+=;a%)E9GTafhugXm0dBshX&mVvIgLR}0kgBS zw3qTdzJ{CcyUN#I=abf{_=NhYOQ;V-9sbF((pFR=(|#v^?Yq1x8QG7R2?T*w^^~W{ z>Yff-$6aN1&MQ6df#7F*@Cue-Kel=)@2enGMn>+3{+%;pe%!BP{Uv|k7B)|QNyU=! ztK~FYTklm@b#XuLg@Yci;!QGKh2oB3e#G0gp^-e$eoONqgQ&9{M~Bd z3>8A#UXE(Xrte|tY`(k;#AjNMl(+5iN)WWKr_?hi&^p3Cl9dLPNE`fh6Hj~j=xe`z zxI+Wa_%hW7{Wk3TfNlZE!uWD26n(zNau#&s*l#gEuOPN~`gp6K!>j=oDNj%T^mUtr zuLHkS)i<3d!ib2R!eVpNeYGKWx%o?$^1tyeo~k$G$$2 ztfD4BtV|I<)*Vm=^R=t5yF{>f-HJrgT0!w;8n_g_2V zJp_%5rN=yM2sHj6Sx*3zFBz*Z!|idEzc=mVYTX_%B)?kG;g6FWg^c?Y|)| z)KT6(O;VmtJF}|&KG!=wE~+AI(XuamkCwRuzfOW_FMELXqV3kFyS$n!*7K$$yS2+i zqH`E8(RQhKrw(JeEz>KqZ+?noKaT}z;a;Dh*$!6X!&LqBbph7S;&$7;H~WuILE;hN z69F|9OMS@L({q6*Ow)APe5nv&(%)eGm7Bu&MHX7tRkyoYapgl(%}3oA88TXUjB(R#xVI7? zIn>l^!iy2Zjb+%>o`SB|m_ySg2a{F}=(8g@sALKl60Bk=11;}^uRPY+hX1Lln=kkd zk6R58Gv&1K;K-ZR&x!O$Lr!f~rppE5XO(HV_X7`acopw4sTR#en>R!2iDivA_XQid z)E|hJPwMK%AMvZ}DN^RF{v@O7#;!P8yOp{aRR)xTO;)5aCk1>Nzu?q=a%A;aXm=zr zta{K&p35pB5LL!eZCSlstbTy}TF;WxI^c67S6F6}U|LP%M7v}YL@pF8Qaa`D%@?O! zm;sy#+;+GxMqRnEmJK7$Ya`EVdtI>|H#cpJ+3D-c&HhD9;mbtQ(_$a222D1(nAexd zann+8;3U;`n>4a+v0xdRdUUT%Ua*m%-iwunzeXp?vH1M3ART;)uC|SN4#YPrPF1R= z2zQBu?8s*znB#DE31XWC8#=5JWd|SdYXD#a{8B7~rE_;j73KyL%l@ned$TChxm1dH z?ZEIb>tCKe7t9SnNlBMCu%_t9i5Jw+W!NHPm$`H@Af<}(;ujAsSUmKSKx0c&sQsyX z1woGfLB|6&b9Eubm1r^OES$?^wI@Qhnk7N}=HfvMb#27ItVC3}sDC-uT%yb;HV<4d z7ndxQHO}y`FJ^_~jH#p|Io6Ip&tWo&dB+GNj1s);6A-W*QB6{7Xlg5sEqUNsIFYT} z%|{pVVTvvI|3xU3wPnL0)9z&hg(P>&E0$@(4J%QO5OG(xRnNy$;g`@J33qcXQr127 zV6z7E(^9rnP~jcG4zj^rO`c1VatDGtWBG!$dPi49bAP7Wh;m1a^mg_AP$&|D08I(5 zAdg{>G(4`IYkP}--H-(lw=5<=3Jy8#_B4ppu-4*b6-XHy49M;6GlZm0%Ko`wl$*v= z5b+Wb?alIpR@ht{VKBZ|Cmj=!>)P3*x534cx?^-TbQx5LH5_FWpJb%9HU*?2)iQ$2 zk*9;og4AJocYzMTQ?k7#NqMD#J!C&|p?LYMy0k=0ghj_FEfP|BOJD@ku6go9sD)2r zjHZ-qGocw2qe}{Dl#Uo<4s>~lc1f3m*>E$x=20+F$h(ZDUkA6oZ5Y`=B*urB!2aFyH==?R2QN%)U+1 zssEZGXKBSV>gXcn`CtHsg_Lk}UmYt-)TzdxHg44YI@KRPgKdn46DHxmWO_Ah#)nSn z2P){vQS`^PP*l`{6H=CgB7W6cE%6Nnn(aVmcvLqY0vn1mz2)t2ai?kCZFKCJ! zXn@q|I~^9aiqUeY3?bT!#pTilNJ_3esCXfR9{H&w%0U+cG7)=h8iSH@&`p5l2ekGA zSfX4sCbfG0)HWE2PdZfAo!3&3!|B=Eook32`$rU6YrG8gF;)?!yNgI9i$2HQn-

-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 Snapshot 1 + + `var foo$1 = 21;␊ + ␊ + const foo = foo$1;␊ + ␊ + if (typeof exports !== 'undefined') {␊ + throw new Error('There should be no global exports in an ES module');␊ + }␊ + ␊ + export { foo as default };␊ + ` diff --git a/packages/commonjs/test/snapshots/test.js.snap b/packages/commonjs/test/snapshots/test.js.snap index d685942af1e2eeb399872b59de8d160b69b56c71..68529726427894ada7fa0377b4fea98960699f33 100644 GIT binary patch literal 938 zcmV;b16BM%RzVogn_g;Hsk_CV>XTMj5h)+ByTym4mI@p!jkK%X)DCgWJEH`{>cb z_dk6xc=X+cia{T1%b$;bj&}Pm{n)uNdHFN(cg3Iwo0j$K?tveD(R}CIOWpXDZ=%mD z20j10Wo=q#P0q?0>xGSb6(>y)5+$RdayqtseQ=0F)rhKR( z!66x^VHo3ODcRg*`dxz)8z2-C+!z%^6v*ISjC`cVumi0Qp>M)P`t0oF#{q_dCkhVf z^fji&UKk4@U9*&o2V&~hpbl;XuS2UwJhe;D#O+1>MxLQ}*zc2nuiTVy)bDGD%+B)i zRyq4E^3e5qt0-ZsTauv=u(w6RvNTp({lc$Pn*J?--|E<_ZL8o~*YfJcK-aJJU~O;) zPJ>nhS`8gLTWbwjJkKKsW0{(UdIggOvs07uz|#Jq5Zk)sH(HCV1QB2ighe5^YCb~| zLK*JWZWo-C=OYz3dB@aPieun-40}>itDKu-lvL7Kq;UWP1TJ6{ivf!lafmtNuy+7C zU5DD3mCDj6Y91_sLSV?&BZ(pPe7Ogog)$+`L6zZpqwM>g)AECOO zj;6>J2Jf;dCNnlfm*;{QbtxkE3LYK1x*{f-h+-LPOZ!x-+J|ZJ%M5OgS0$=catJ*( zo5gcijiW?Q^C;EH6B4dk&Gd_TGbxnNIdqui&I~+YOog!GR|a_c-N2r>6;>_L(#{{*IFJw#?vju0kO!kYEh ze1HGF8+*QAZx)n8iTEM9l+E{z=)T_up2jh;DÍvU3rn$>3gt!2okj}_&v{r^e+ M2hUKdAEgEW03LwJqyPW_ literal 813 zcmV+|1Je9KRzV%HI00000000A( zR6B1IK@dLYA>`|*d1w?O`E2ZS(%K3kQbH&Qi2_vC>9n@z?2XTRW^XTGB3DSM=pv{< zqM%5JfC2;^KL82-01^#|U%~9%`4I;YSn@t*_nU9#+nE!FVayq~A6{E|Tc)!QSc)ZTaW1f zY5kVVpOkOBUS07ozTl5DvDKM3j9KGM>^U=UoSiw&x+>Lss_@3T4yuBGFJh5D>N_&+~CjO4hfS9`kTu0(gN0%SQ#A9L09qN6}JkD8X`- ztXE)(rcx=n4$ufhs9=w7Z!y)jJwFJf6)zk=Om@w4# z9Eb3=;bv&&j-vqsbC9Gr8MC`g2%WDzX(ij_mSji;tSykREb`TYlj5qwqrW+Dm#gOF zvt@AV)spOky3Swg!77le=Zdtd)2fj(2UAZ&C$?=9AU^5F4{E28j3PThS(~EN-Xz|Q zxWvW9CBlqSJ4rRZ^KV2mA7-YQM#a)XwHCFyC=@ntvMz=_)<8=nC7>xi@+j;yj;fjE z9$2d1!@$!=6yng;g2rUC8p8-PVz3f>R-%fe0MBNdrWwCb6aW zNv`dCV#u?OVMFqsqP7r4=)^hvF`!Nnni>zQL+R) zNAqL{S};u+59ukZ>W)fEH%?g>QM?$I5Qbf{l?#_#cjwOThU*r}X~>>Le1I0Qxo#}F r>sCNSzE4r5^2L)m`Y4^K)pFtL*yZobin#OtU&+4!O?VhP%LM=c%=(JY diff --git a/packages/commonjs/test/test.js b/packages/commonjs/test/test.js index ea0afb695..097f1a6df 100644 --- a/packages/commonjs/test/test.js +++ b/packages/commonjs/test/test.js @@ -331,8 +331,8 @@ test('typeof transforms: sinon', async (t) => { } = await bundle.generate({ format: 'es' }); t.is(code.indexOf('typeof require'), -1, code); - // t.not( code.indexOf( 'typeof module' ), -1, code ); // #151 breaks this test - // t.not( code.indexOf( 'typeof define' ), -1, code ); // #144 breaks this test + t.is(code.indexOf('typeof module'), -1, code); + t.is(code.indexOf('typeof define'), -1, code); }); test('deconflicts helper name', async (t) => { @@ -717,3 +717,17 @@ test('throws when there is a dynamic require from outside dynamicRequireRoot', a dynamicRequireRoot }); }); + +test('does not transform typeof exports for mixed modules', async (t) => { + const bundle = await rollup({ + input: 'fixtures/samples/mixed-module-typeof-exports/main.js', + plugins: [commonjs({ transformMixedEsModules: true })] + }); + + const { + output: [{ code }] + } = await bundle.generate({ format: 'es' }); + + t.is(code.includes('typeof exports'), true, '"typeof exports" not found in the code'); + t.snapshot(code); +});