From 55e7e2dc10375b6ed143ee873ba84823320f77fe Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Sat, 20 Nov 2021 07:16:47 +0100 Subject: [PATCH] feat(commonjs): auto-detect conditional requires (#1038) --- packages/commonjs/src/generate-imports.js | 10 +- packages/commonjs/src/index.js | 7 +- .../commonjs/src/resolve-require-sources.js | 44 +++- packages/commonjs/src/transform-commonjs.js | 61 ++++- packages/commonjs/src/utils.js | 8 +- .../conditional-require-chain/_config.js | 3 + .../function/conditional-require-chain/dep.js | 1 + .../conditional-require-chain/main.js | 6 + .../conditional-require-chain/throws.js | 1 + .../function/skips-dead-branches/main.js | 7 +- .../_config.js | 3 + .../hoisted.js | 1 + .../main.js | 44 ++++ .../throws.js | 1 + .../main.js | 4 +- packages/commonjs/test/form.js | 17 +- .../commonjs/test/snapshots/function.js.md | 211 +++++++++++++++--- .../commonjs/test/snapshots/function.js.snap | Bin 20032 -> 20622 bytes 18 files changed, 364 insertions(+), 65 deletions(-) create mode 100644 packages/commonjs/test/fixtures/function/conditional-require-chain/_config.js create mode 100644 packages/commonjs/test/fixtures/function/conditional-require-chain/dep.js create mode 100644 packages/commonjs/test/fixtures/function/conditional-require-chain/main.js create mode 100644 packages/commonjs/test/fixtures/function/conditional-require-chain/throws.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/hoisted.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/throws.js diff --git a/packages/commonjs/src/generate-imports.js b/packages/commonjs/src/generate-imports.js index 7aa0c33a7..d624ab25c 100644 --- a/packages/commonjs/src/generate-imports.js +++ b/packages/commonjs/src/generate-imports.js @@ -104,6 +104,7 @@ export function getRequireHandlers() { scope, usesReturnValue, isInsideTryBlock, + isInsideConditional, toBeRemoved ) { requireExpressions.push({ @@ -112,6 +113,7 @@ export function getRequireHandlers() { scope, usesReturnValue, isInsideTryBlock, + isInsideConditional, toBeRemoved }); } @@ -135,7 +137,6 @@ export function getRequireHandlers() { const imports = []; imports.push(`import * as ${helpersName} from "${HELPERS_ID}";`); if (usesRequire) { - // TODO Lukas check where to import it from or change to usesDynamicRequire imports.push( `import { commonjsRequire as ${dynamicRequireName} } from "${DYNAMIC_MODULES_ID}";` ); @@ -155,7 +156,12 @@ export function getRequireHandlers() { const { requireTargets, usesRequireWrapper } = await resolveRequireSourcesAndGetMeta( id, needsRequireWrapper ? IS_WRAPPED_COMMONJS : !isEsModule, - Object.keys(requiresBySource) + Object.keys(requiresBySource).map((source) => { + return { + source, + isConditional: requiresBySource[source].every((require) => require.isInsideConditional) + }; + }) ); processRequireExpressions( imports, diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index 45eb23c98..88c362987 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -38,7 +38,7 @@ export default function commonjs(options = {}) { } = options; const extensions = options.extensions || ['.js']; const filter = createFilter(options.include, options.exclude); - const { strictRequiresFilter, detectCycles } = getStrictRequiresFilter(options); + const { strictRequiresFilter, detectCyclesAndConditional } = getStrictRequiresFilter(options); const getRequireReturnsDefault = typeof requireReturnsDefaultOption === 'function' @@ -63,10 +63,11 @@ export default function commonjs(options = {}) { resolveRequireSourcesAndGetMeta, getWrappedIds, isRequiredId - } = getResolveRequireSourcesAndGetMeta(extensions, detectCycles); + } = getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndConditional); const dynamicRequireModules = getDynamicRequireModules(options.dynamicRequireTargets); const isDynamicRequireModulesEnabled = dynamicRequireModules.size > 0; - // TODO Lukas do we need the CWD? + // TODO Lukas replace with new dynamicRequireRoot to replace CWD + // TODO Lukas throw if require from outside commondir const commonDir = isDynamicRequireModulesEnabled ? getCommonDir(null, Array.from(dynamicRequireModules.keys()).concat(process.cwd())) : null; diff --git a/packages/commonjs/src/resolve-require-sources.js b/packages/commonjs/src/resolve-require-sources.js index 78f0af4d0..9483d2cd1 100644 --- a/packages/commonjs/src/resolve-require-sources.js +++ b/packages/commonjs/src/resolve-require-sources.js @@ -7,9 +7,10 @@ import { } from './helpers'; import { resolveExtensions } from './resolve-id'; -export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { +export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndConditional) { 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)); @@ -20,20 +21,31 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { (id) => knownCjsModuleTypes[id] === IS_WRAPPED_COMMONJS ), isRequiredId: (id) => requiredIds[id], - resolveRequireSourcesAndGetMeta: (rollupContext) => async (id, isParentCommonJS, sources) => { - knownCjsModuleTypes[id] = isParentCommonJS; + resolveRequireSourcesAndGetMeta: (rollupContext) => async ( + parentId, + isParentCommonJS, + sources + ) => { + knownCjsModuleTypes[parentId] = knownCjsModuleTypes[parentId] || isParentCommonJS; + if ( + knownCjsModuleTypes[parentId] && + requiredIds[parentId] && + !unconditionallyRequiredIds[parentId] + ) { + knownCjsModuleTypes[parentId] = IS_WRAPPED_COMMONJS; + } const requireTargets = await Promise.all( - sources.map(async (source) => { + sources.map(async ({ source, isConditional }) => { // Never analyze or proxy internal modules if (source.startsWith('\0')) { return { id: source, allowProxy: false }; } const resolved = - (await rollupContext.resolve(source, id, { + (await rollupContext.resolve(source, parentId, { custom: { 'node-resolve': { isRequire: true } } - })) || resolveExtensions(source, id, extensions); + })) || resolveExtensions(source, parentId, extensions); if (!resolved) { return { id: wrapId(source, EXTERNAL_SUFFIX), allowProxy: false }; } @@ -42,17 +54,25 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { return { id: wrapId(childId, EXTERNAL_SUFFIX), allowProxy: false }; } requiredIds[childId] = true; - const parentDependentModules = getDependentModules(id); + if ( + !( + detectCyclesAndConditional && + (isConditional || knownCjsModuleTypes[parentId] === IS_WRAPPED_COMMONJS) + ) + ) { + unconditionallyRequiredIds[childId] = true; + } + const parentDependentModules = getDependentModules(parentId); const childDependentModules = getDependentModules(childId); - childDependentModules[id] = true; + 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 (detectCycles && isParentCommonJS) { - knownCjsModuleTypes[id] = IS_WRAPPED_COMMONJS; + if (detectCyclesAndConditional && isParentCommonJS) { + knownCjsModuleTypes[parentId] = IS_WRAPPED_COMMONJS; knownCjsModuleTypes[childId] = IS_WRAPPED_COMMONJS; for (const dependentId of Object.keys(parentDependentModules)) { if (getDependentModules(dependentId)[childId]) { @@ -73,7 +93,7 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { requireTargets: requireTargets.map(({ id: dependencyId, allowProxy }, index) => { const isCommonJS = knownCjsModuleTypes[dependencyId]; return { - source: sources[index], + source: sources[index].source, id: allowProxy ? isCommonJS === IS_WRAPPED_COMMONJS ? wrapId(dependencyId, WRAPPED_SUFFIX) @@ -82,7 +102,7 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { isCommonJS }; }), - usesRequireWrapper: knownCjsModuleTypes[id] === IS_WRAPPED_COMMONJS + usesRequireWrapper: knownCjsModuleTypes[parentId] === IS_WRAPPED_COMMONJS }; } }; diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index 7b53b5ab8..5468878ec 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -71,7 +71,13 @@ export default async function transformCommonjs( let shouldWrap = false; const globals = new Set(); + // A conditionalNode is a node for which execution is not guaranteed. If such a node is a require + // or contains nested requires, those should be handled as function calls unless there is an + // unconditional require elsewhere. + let currentConditionalNodeEnd = null; + const conditionalNodes = new Set(); + // TODO Lukas fix this at last, we are close // TODO technically wrong since globals isn't populated yet, but ¯\_(ツ)_/¯ const helpersName = deconflict([scope], globals, 'commonjsHelpers'); const dynamicRequireName = deconflict([scope], globals, 'commonjsRequire'); @@ -102,6 +108,12 @@ export default async function transformCommonjs( if (currentTryBlockEnd !== null && node.start > currentTryBlockEnd) { currentTryBlockEnd = null; } + if (currentConditionalNodeEnd !== null && node.start > currentConditionalNodeEnd) { + currentConditionalNodeEnd = null; + } + if (currentConditionalNodeEnd === null && conditionalNodes.has(node)) { + currentConditionalNodeEnd = node.end; + } programDepth += 1; if (node.scope) ({ scope } = node); @@ -113,11 +125,6 @@ export default async function transformCommonjs( // eslint-disable-next-line default-case switch (node.type) { - case 'TryStatement': - if (currentTryBlockEnd === null) { - currentTryBlockEnd = node.block.end; - } - return; case 'AssignmentExpression': if (node.left.type === 'MemberExpression') { const flattened = getKeypath(node.left); @@ -227,6 +234,7 @@ export default async function transformCommonjs( scope, usesReturnValue, currentTryBlockEnd !== null, + currentConditionalNodeEnd !== null, parent.type === 'ExpressionStatement' ? parent : node ); } @@ -237,8 +245,26 @@ export default async function transformCommonjs( // skip dead branches if (isFalsy(node.test)) { skippedNodes.add(node.consequent); - } else if (node.alternate && isTruthy(node.test)) { - skippedNodes.add(node.alternate); + } else if (isTruthy(node.test)) { + if (node.alternate) { + skippedNodes.add(node.alternate); + } + } else { + conditionalNodes.add(node.consequent); + if (node.alternate) { + conditionalNodes.add(node.alternate); + } + } + return; + case 'ArrowFunctionExpression': + case 'FunctionDeclaration': + case 'FunctionExpression': + // requires in functions should be conditional unless it is an IIFE + if ( + currentConditionalNodeEnd === null && + !(parent.type === 'CallExpression' && parent.callee === node) + ) { + currentConditionalNodeEnd = node.end; } return; case 'Identifier': { @@ -301,6 +327,22 @@ export default async function transformCommonjs( return; } } + case 'LogicalExpression': + // skip dead branches + if (node.operator === '&&') { + if (isFalsy(node.left)) { + skippedNodes.add(node.right); + } else if (!isTruthy(node.left)) { + conditionalNodes.add(node.right); + } + } else if (node.operator === '||') { + if (isTruthy(node.left)) { + skippedNodes.add(node.right); + } else if (!isFalsy(node.left)) { + conditionalNodes.add(node.right); + } + } + return; case 'MemberExpression': if (!isDynamicRequireModulesEnabled && isModuleRequire(node, scope)) { uses.require = true; @@ -328,6 +370,11 @@ export default async function transformCommonjs( } } return; + case 'TryStatement': + if (currentTryBlockEnd === null) { + currentTryBlockEnd = node.block.end; + } + return; case 'UnaryExpression': // rewrite `typeof module`, `typeof module.exports` and `typeof exports` (https://github.com/rollup/rollup-plugin-commonjs/issues/151) if (node.operator === 'typeof') { diff --git a/packages/commonjs/src/utils.js b/packages/commonjs/src/utils.js index baee15948..35c727a97 100644 --- a/packages/commonjs/src/utils.js +++ b/packages/commonjs/src/utils.js @@ -44,20 +44,20 @@ export function capitalize(name) { export function getStrictRequiresFilter({ strictRequires }) { switch (strictRequires) { case true: - return { strictRequiresFilter: () => true, detectCycles: false }; + return { strictRequiresFilter: () => true, detectCyclesAndConditional: false }; // eslint-disable-next-line no-undefined case undefined: case 'auto': case 'debug': case null: - return { strictRequiresFilter: () => false, detectCycles: true }; + return { strictRequiresFilter: () => false, detectCyclesAndConditional: true }; case false: - return { strictRequiresFilter: () => false, detectCycles: false }; + return { strictRequiresFilter: () => false, detectCyclesAndConditional: false }; default: if (typeof strictRequires === 'string' || Array.isArray(strictRequires)) { return { strictRequiresFilter: createFilter(strictRequires), - detectCycles: false + detectCyclesAndConditional: false }; } throw new Error('Unexpected value for "strictRequires" option.'); diff --git a/packages/commonjs/test/fixtures/function/conditional-require-chain/_config.js b/packages/commonjs/test/fixtures/function/conditional-require-chain/_config.js new file mode 100644 index 000000000..e0666eccc --- /dev/null +++ b/packages/commonjs/test/fixtures/function/conditional-require-chain/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'makes requires in conditionally required modules conditional as well' +}; diff --git a/packages/commonjs/test/fixtures/function/conditional-require-chain/dep.js b/packages/commonjs/test/fixtures/function/conditional-require-chain/dep.js new file mode 100644 index 000000000..3b1998d8e --- /dev/null +++ b/packages/commonjs/test/fixtures/function/conditional-require-chain/dep.js @@ -0,0 +1 @@ +require('./throws.js'); diff --git a/packages/commonjs/test/fixtures/function/conditional-require-chain/main.js b/packages/commonjs/test/fixtures/function/conditional-require-chain/main.js new file mode 100644 index 000000000..1aa85f1c1 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/conditional-require-chain/main.js @@ -0,0 +1,6 @@ +global.false = false; + +if (global.false) { + // eslint-disable-next-line global-require + require('./dep.js'); +} diff --git a/packages/commonjs/test/fixtures/function/conditional-require-chain/throws.js b/packages/commonjs/test/fixtures/function/conditional-require-chain/throws.js new file mode 100644 index 000000000..eb8668af4 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/conditional-require-chain/throws.js @@ -0,0 +1 @@ +throw new Error('This should not be executed'); diff --git a/packages/commonjs/test/fixtures/function/skips-dead-branches/main.js b/packages/commonjs/test/fixtures/function/skips-dead-branches/main.js index 0066d0550..03d934380 100644 --- a/packages/commonjs/test/fixtures/function/skips-dead-branches/main.js +++ b/packages/commonjs/test/fixtures/function/skips-dead-branches/main.js @@ -3,4 +3,9 @@ if ('development' === 'production') { require('./a.js'); } -module.exports = true ? require('./b.js') : require('./c.js'); +exports.conditionalTrue = true ? require('./b.js') : require('./c.js'); +exports.conditionalFalse = false ? require('./c.js') : require('./b.js'); +exports.logicalAnd1 = true && require('./b.js'); +exports.logicalAnd2 = false && require('./c.js'); +exports.logicalOr1 = true || require('./c.js'); +exports.logicalOr2 = false || require('./b.js'); diff --git a/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/_config.js new file mode 100644 index 000000000..d926d0b82 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'automatically detects requires nested in conditionals' +}; diff --git a/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/hoisted.js b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/hoisted.js new file mode 100644 index 000000000..705851f9f --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/hoisted.js @@ -0,0 +1 @@ +module.exports = 'this should be top-level'; diff --git a/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/main.js b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/main.js new file mode 100644 index 000000000..b7fc6ea58 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/main.js @@ -0,0 +1,44 @@ +/* eslint-disable global-require */ +global.false = false; +global.true = true; + +if (global.false) { + require('./throws.js'); +} + +if (global.true) { + /* do nothing */ +} else { + require('./throws.js'); +} + +const conditionalFalse = global.false ? require('./throws.js') : null; +const conditionalTrue = global.true ? null : require('./throws.js'); + +const logicalAnd = global.false && require('./throws.js'); +const logicalOr = global.true || require('./throws.js'); + +function requireFunctionDeclaration() { + require('./throws.js'); +} + +const requireFunctionExpression = function () { + require('./throws.js'); +}; + +const requireArrowFunction = () => require('./throws.js'); + +if (global.false) { + requireFunctionDeclaration(); + requireFunctionExpression(); + requireArrowFunction(); +} + +// These should not cause wrapping +t.is( + (function () { + return require('./hoisted.js'); + })(), + 'this should be top-level' +); +t.is((() => require('./hoisted.js'))(), 'this should be top-level'); diff --git a/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/throws.js b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/throws.js new file mode 100644 index 000000000..d11e026e6 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/throws.js @@ -0,0 +1 @@ +throw new Error('This should never be executed or imported'); diff --git a/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/main.js b/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/main.js index c10a2ca10..8e5f0208b 100644 --- a/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/main.js +++ b/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/main.js @@ -1,2 +1,4 @@ +global.null = 0; + // eslint-disable-next-line global-require -t.is(0 && require('./error.js'), 0); +t.is(global.null && require('./error.js'), 0); diff --git a/packages/commonjs/test/form.js b/packages/commonjs/test/form.js index 3dcc25740..270d27ccf 100644 --- a/packages/commonjs/test/form.js +++ b/packages/commonjs/test/form.js @@ -11,6 +11,13 @@ import { commonjs } from './helpers/util'; process.chdir(__dirname); const 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; + }, + load: ({ id }) => Promise.resolve({ id, meta: {} }), parse: (input, options) => acorn.parse(input, { ecmaVersion: 9, @@ -20,8 +27,7 @@ const transformContext = { resolve: (source, importer) => Promise.resolve({ id: `${path.resolve(path.dirname(importer), source)}${path.extname(source) ? '' : '.js'}` - }), - load: ({ id }) => Promise.resolve({ id, meta: {} }) + }) }; // Do not run on Windows as we have full path names in the output @@ -59,13 +65,6 @@ if (path.sep === '/') { : [] }; }; - 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 = fs.readFileSync(id, 'utf-8'); let outputFile = `fixtures/form/${dir}/${outputName}`; diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index 68e51acb0..42d68b8eb 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -4484,16 +4484,32 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ - var multiply = function (a, b) {␊ - return a * b;␊ - };␊ + var multiply;␊ + var hasRequiredMultiply;␊ + ␊ + function requireMultiply () {␊ + if (hasRequiredMultiply) return multiply;␊ + hasRequiredMultiply = 1;␊ + multiply = function (a, b) {␊ + return a * b;␊ + };␊ + return multiply;␊ + }␊ + ␊ + var foo;␊ + var hasRequiredFoo;␊ ␊ - var foo = 1;␊ + function requireFoo () {␊ + if (hasRequiredFoo) return foo;␊ + hasRequiredFoo = 1;␊ + foo = 1;␊ + return foo;␊ + }␊ ␊ /* eslint-disable global-require */␊ ␊ var main = function () {␊ - return multiply(2, foo);␊ + return requireMultiply()(2, requireFoo());␊ };␊ ␊ module.exports = main;␊ @@ -5598,16 +5614,31 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ + Object.defineProperty(exports, '__esModule', { value: true });␊ + ␊ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ ␊ + var main = {};␊ + ␊ commonjsGlobal.b = 2;␊ var b = 'b';␊ ␊ /* eslint-disable */␊ ␊ - var main = b ;␊ + var conditionalTrue = main.conditionalTrue = b ;␊ + var conditionalFalse = main.conditionalFalse = b;␊ + var logicalAnd1 = main.logicalAnd1 = b;␊ + var logicalAnd2 = main.logicalAnd2 = false ;␊ + var logicalOr1 = main.logicalOr1 = true ;␊ + var logicalOr2 = main.logicalOr2 = b;␊ ␊ - module.exports = main;␊ + exports.conditionalFalse = conditionalFalse;␊ + exports.conditionalTrue = conditionalTrue;␊ + exports["default"] = main;␊ + exports.logicalAnd1 = logicalAnd1;␊ + exports.logicalAnd2 = logicalAnd2;␊ + exports.logicalOr1 = logicalOr1;␊ + exports.logicalOr2 = logicalOr2;␊ `, } @@ -5807,6 +5838,77 @@ Generated by [AVA](https://avajs.dev). `, } +## strict-requires-detect-conditionals + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ + ␊ + var main = {};␊ + ␊ + var throws = {};␊ + ␊ + var hasRequiredThrows;␊ + ␊ + function requireThrows () {␊ + if (hasRequiredThrows) return throws;␊ + hasRequiredThrows = 1;␊ + throw new Error('This should never be executed or imported');␊ + }␊ + ␊ + var hoisted = 'this should be top-level';␊ + ␊ + /* eslint-disable global-require */␊ + ␊ + commonjsGlobal.false = false;␊ + commonjsGlobal.true = true;␊ + ␊ + if (commonjsGlobal.false) {␊ + requireThrows();␊ + }␊ + ␊ + if (commonjsGlobal.true) ; else {␊ + requireThrows();␊ + }␊ + ␊ + commonjsGlobal.false ? requireThrows() : null;␊ + commonjsGlobal.true ? null : requireThrows();␊ + ␊ + commonjsGlobal.false && requireThrows();␊ + commonjsGlobal.true || requireThrows();␊ + ␊ + function requireFunctionDeclaration() {␊ + requireThrows();␊ + }␊ + ␊ + const requireFunctionExpression = function () {␊ + requireThrows();␊ + };␊ + ␊ + const requireArrowFunction = () => requireThrows();␊ + ␊ + if (commonjsGlobal.false) {␊ + requireFunctionDeclaration();␊ + requireFunctionExpression();␊ + requireArrowFunction();␊ + }␊ + ␊ + // These should not cause wrapping␊ + t.is(␊ + (function () {␊ + return hoisted;␊ + })(),␊ + 'this should be top-level'␊ + );␊ + t.is((() => hoisted)(), 'this should be top-level');␊ + ␊ + module.exports = main;␊ + `, + } + ## strict-requires-entry-node-resolve > Snapshot 1 @@ -6052,15 +6154,29 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ + ␊ var main = {};␊ ␊ + var error = {};␊ + ␊ + var hasRequiredError;␊ + ␊ + function requireError () {␊ + if (hasRequiredError) return error;␊ + hasRequiredError = 1;␊ + throw new Error('FAIL');␊ + }␊ + ␊ var hasRequiredMain;␊ ␊ function requireMain () {␊ if (hasRequiredMain) return main;␊ hasRequiredMain = 1;␊ + commonjsGlobal.null = 0;␊ + ␊ // eslint-disable-next-line global-require␊ - t.is(0 , 0);␊ + t.is(commonjsGlobal.null && requireError(), 0);␊ return main;␊ }␊ ␊ @@ -6962,6 +7078,44 @@ Generated by [AVA](https://avajs.dev). `, } +## try-catch-internal + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var dep = {};␊ + ␊ + dep.foo = 'foo';␊ + ␊ + /* eslint-disable global-require */␊ + ␊ + try {␊ + t.is(dep.foo, 'foo');␊ + } catch (err) {␊ + throw new Error(`Could not require: ${err}`);␊ + }␊ + ␊ + module.exports = main;␊ + `, + } + +## try-catch-remove + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + module.exports = main;␊ + `, + } + ## typeof-module-require > Snapshot 1 @@ -7031,39 +7185,44 @@ Generated by [AVA](https://avajs.dev). `, } -## try-catch-internal +## conditional-require-chain > Snapshot 1 { 'main.js': `'use strict';␊ ␊ + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ + ␊ var main = {};␊ ␊ var dep = {};␊ ␊ - dep.foo = 'foo';␊ + var throws = {};␊ ␊ - /* eslint-disable global-require */␊ + var hasRequiredThrows;␊ ␊ - try {␊ - t.is(dep.foo, 'foo');␊ - } catch (err) {␊ - throw new Error(`Could not require: ${err}`);␊ + function requireThrows () {␊ + if (hasRequiredThrows) return throws;␊ + hasRequiredThrows = 1;␊ + throw new Error('This should not be executed');␊ }␊ ␊ - module.exports = main;␊ - `, - } - -## try-catch-remove - -> Snapshot 1 - - { - 'main.js': `'use strict';␊ + var hasRequiredDep;␊ ␊ - var main = {};␊ + function requireDep () {␊ + if (hasRequiredDep) return dep;␊ + hasRequiredDep = 1;␊ + requireThrows();␊ + return dep;␊ + }␊ + ␊ + commonjsGlobal.false = false;␊ + ␊ + if (commonjsGlobal.false) {␊ + // eslint-disable-next-line global-require␊ + requireDep();␊ + }␊ ␊ module.exports = main;␊ `, diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index 568120c83d385a08c1d41b26413a707caa8646e4..f09c75457080c1951f53bd791fedb6baa72e3c78 100644 GIT binary patch literal 20622 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 literal 20032 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

^ZK?ze7n@Ip_2}w9TFBAqV+3Nrf!PrmBQ_{C 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 Tg>jnlbl?92W=xLJh;;%05~rm+