From 335a013b4d7f4b6a13caed8dcc6d5d953f9fc5a0 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Mon, 22 Nov 2021 07:08:01 +0100 Subject: [PATCH] refactor(commonjs): deconflict helpers only once globals are known (#1038) --- packages/commonjs/src/generate-imports.js | 45 +---- packages/commonjs/src/index.js | 1 - packages/commonjs/src/transform-commonjs.js | 106 +++++----- .../dynamic-module-require/_config.js | 2 - .../_config.js | 15 -- .../dynamic-require-cache-reference/main.js | 5 - .../node_modules/custom-module/index.js | 3 - .../node_modules/custom-module2/index.js | 7 - .../node_modules/stealthy/index.js | 25 --- .../dynamic-require-resolve-reference/main.js | 4 + .../node_modules/custom-module/index.js | 4 +- .../node_modules/custom-module2/index.js | 4 +- .../function/try-catch-internal/main.js | 6 + .../function/try-catch-internal/throws.js | 1 + .../commonjs/test/snapshots/function.js.md | 182 ++++++++++++++++-- .../commonjs/test/snapshots/function.js.snap | Bin 20550 -> 20650 bytes 16 files changed, 239 insertions(+), 171 deletions(-) delete mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/_config.js delete mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/main.js delete mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module/index.js delete mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module2/index.js delete mode 100644 packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/node_modules/stealthy/index.js create mode 100644 packages/commonjs/test/fixtures/function/try-catch-internal/throws.js diff --git a/packages/commonjs/src/generate-imports.js b/packages/commonjs/src/generate-imports.js index d624ab25c..7fb85393d 100644 --- a/packages/commonjs/src/generate-imports.js +++ b/packages/commonjs/src/generate-imports.js @@ -1,7 +1,3 @@ -import { dirname, resolve } from 'path'; - -import { sync as nodeResolveSync } from 'resolve'; - import { DYNAMIC_MODULES_ID, EXPORTS_SUFFIX, @@ -12,9 +8,8 @@ import { MODULE_SUFFIX, wrapId } from './helpers'; -import { normalizePathSlashes } from './utils'; -export function isRequireStatement(node, scope) { +export function isRequireExpression(node, scope) { if (!node) return false; if (node.type !== 'CallExpression') return false; @@ -24,7 +19,7 @@ export function isRequireStatement(node, scope) { return isRequire(node.callee, scope); } -function isRequire(node, scope) { +export function isRequire(node, scope) { return ( (node.type === 'Identifier' && node.name === 'require' && !scope.contains('require')) || (node.type === 'MemberExpression' && isModuleRequire(node, scope)) @@ -41,12 +36,7 @@ export function isModuleRequire({ object, property }, scope) { ); } -export function isStaticRequireStatement(node, scope) { - if (!isRequireStatement(node, scope)) return false; - return !hasDynamicArguments(node); -} - -function hasDynamicArguments(node) { +export function hasDynamicArguments(node) { return ( node.arguments.length > 1 || (node.arguments[0].type !== 'Literal' && @@ -60,41 +50,12 @@ export function isNodeRequirePropertyAccess(parent) { return parent && parent.property && reservedMethod[parent.property.name]; } -export function isIgnoredRequireStatement(requiredNode, ignoreRequire) { - return ignoreRequire(requiredNode.arguments[0].value); -} - export function getRequireStringArg(node) { return node.arguments[0].type === 'Literal' ? node.arguments[0].value : node.arguments[0].quasis[0].value.cooked; } -export function hasDynamicModuleForPath(source, id, dynamicRequireModules) { - if (!/^(?:\.{0,2}[/\\]|[A-Za-z]:[/\\])/.test(source)) { - try { - const resolvedPath = normalizePathSlashes(nodeResolveSync(source, { basedir: dirname(id) })); - if (dynamicRequireModules.has(resolvedPath)) { - return true; - } - } catch (ex) { - // Probably a node.js internal module - return false; - } - - return false; - } - - for (const attemptExt of ['', '.js', '.json']) { - const resolvedPath = normalizePathSlashes(resolve(dirname(id), source + attemptExt)); - if (dynamicRequireModules.has(resolvedPath)) { - return true; - } - } - - return false; -} - export function getRequireHandlers() { const requireExpressions = []; diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index cf68d552b..337f41830 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -67,7 +67,6 @@ export default function commonjs(options = {}) { typeof options.dynamicRequireRoot === 'string' ? resolve(options.dynamicRequireRoot) : process.cwd(); - // TODO Lukas throw if require from outside commondir const { commonDir, dynamicRequireModules } = getDynamicRequireModules( options.dynamicRequireTargets, dynamicRequireRoot diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index 509685256..e4147d4cd 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -20,12 +20,11 @@ import { rewriteExportsAndGetExportsBlock, wrapCode } from './generate-exports'; import { getRequireHandlers, getRequireStringArg, - hasDynamicModuleForPath, - isIgnoredRequireStatement, + hasDynamicArguments, isModuleRequire, isNodeRequirePropertyAccess, - isRequireStatement, - isStaticRequireStatement + isRequire, + isRequireExpression } from './generate-imports'; import { IS_WRAPPED_COMMONJS } from './helpers'; import { tryParse } from './parse'; @@ -77,12 +76,6 @@ export default async function transformCommonjs( // 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'); - const { addRequireStatement, rewriteRequireExpressionsAndGetImportBlock } = getRequireHandlers(); // See which names are assigned to. This is necessary to prevent @@ -98,6 +91,8 @@ export default async function transformCommonjs( const exportsAssignmentsByName = new Map(); const topLevelAssignments = new Set(); const topLevelDefineCompiledEsmExpressions = []; + const replacedGlobal = []; + const replacedDynamicRequires = []; walk(ast, { enter(node, parent) { @@ -198,12 +193,12 @@ export default async function transformCommonjs( // Transform require.resolve if ( + isDynamicRequireModulesEnabled && node.callee.object && - node.callee.object.name === 'require' && - node.callee.property.name === 'resolve' && - hasDynamicModuleForPath(id, '/', dynamicRequireModules) + isRequire(node.callee.object, scope) && + node.callee.property.name === 'resolve' ) { - // TODO Lukas reimplement? + checkDynamicRequire(); uses.require = true; const requireNode = node.callee.object; magicString.appendLeft( @@ -212,25 +207,38 @@ export default async function transformCommonjs( dirname(id) === '.' ? null /* default behavior */ : virtualDynamicRequirePath )}` ); - magicString.overwrite(requireNode.start, requireNode.end, dynamicRequireName, { - storeName: true - }); + replacedDynamicRequires.push(requireNode); return; } - // Ignore call expressions of dynamic requires, the callee will be transformed within Identifier - if (!isStaticRequireStatement(node, scope)) { + if (!isRequireExpression(node, scope)) { return; } - // Otherwise we do not want to replace "require" with the internal helper skippedNodes.add(node.callee); uses.require = true; - if (!isIgnoredRequireStatement(node, ignoreRequire)) { + if (hasDynamicArguments(node)) { + if (isDynamicRequireModulesEnabled) { + magicString.appendLeft( + node.end - 1, + `, ${JSON.stringify( + dirname(id) === '.' ? null /* default behavior */ : virtualDynamicRequirePath + )}` + ); + } + if (!ignoreDynamicRequires) { + checkDynamicRequire(); + replacedDynamicRequires.push(node.callee); + } + return; + } + + const requireStringArg = getRequireStringArg(node); + if (!ignoreRequire(requireStringArg)) { const usesReturnValue = parent.type !== 'ExpressionStatement'; addRequireStatement( - getRequireStringArg(node), + requireStringArg, node, scope, usesReturnValue, @@ -275,35 +283,14 @@ export default async function transformCommonjs( case 'require': uses.require = true; if (isNodeRequirePropertyAccess(parent)) { - // TODO Lukas reimplement? - if (hasDynamicModuleForPath(id, '/', dynamicRequireModules)) { - if (parent.property.name === 'cache') { - magicString.overwrite(node.start, node.end, dynamicRequireName, { - storeName: true - }); - } - } - return; } - - if (isDynamicRequireModulesEnabled && isRequireStatement(parent, scope)) { - magicString.appendLeft( - parent.end - 1, - `, ${JSON.stringify( - dirname(id) === '.' ? null /* default behavior */ : virtualDynamicRequirePath - )}` - ); - } if (!ignoreDynamicRequires) { checkDynamicRequire(); if (isShorthandProperty(parent)) { - magicString.appendRight(node.end, `: ${dynamicRequireName}`); - } else { - magicString.overwrite(node.start, node.end, dynamicRequireName, { - storeName: true - }); + magicString.prependRight(node.start, 'require: '); } + replacedDynamicRequires.push(node); } return; case 'module': @@ -314,9 +301,7 @@ export default async function transformCommonjs( case 'global': uses.global = true; if (!ignoreGlobal) { - magicString.overwrite(node.start, node.end, `${helpersName}.commonjsGlobal`, { - storeName: true - }); + replacedGlobal.push(node); } return; case 'define': @@ -348,9 +333,7 @@ export default async function transformCommonjs( case 'MemberExpression': if (!isDynamicRequireModulesEnabled && isModuleRequire(node, scope)) { uses.require = true; - magicString.overwrite(node.start, node.end, dynamicRequireName, { - storeName: true - }); + replacedDynamicRequires.push(node); skippedNodes.add(node.object); skippedNodes.add(node.property); } @@ -366,9 +349,7 @@ export default async function transformCommonjs( if (lexicalDepth === 0) { uses.global = true; if (!ignoreGlobal) { - magicString.overwrite(node.start, node.end, `${helpersName}.commonjsGlobal`, { - storeName: true - }); + replacedGlobal.push(node); } } return; @@ -376,6 +357,9 @@ export default async function transformCommonjs( if (currentTryBlockEnd === null) { currentTryBlockEnd = node.block.end; } + if (currentConditionalNodeEnd === null) { + currentConditionalNodeEnd = node.end; + } return; case 'UnaryExpression': // rewrite `typeof module`, `typeof module.exports` and `typeof exports` (https://github.com/rollup/rollup-plugin-commonjs/issues/151) @@ -415,11 +399,25 @@ export default async function transformCommonjs( const moduleName = deconflict([...moduleAccessScopes], globals, `${nameBase}Module`); const requireName = deconflict([scope], globals, `require${capitalize(nameBase)}`); const isRequiredName = deconflict([scope], globals, `hasRequired${capitalize(nameBase)}`); + const helpersName = deconflict([scope], globals, 'commonjsHelpers'); + const dynamicRequireName = deconflict([scope], globals, 'commonjsRequire'); const deconflictedExportNames = Object.create(null); for (const [exportName, { scopes }] of exportsAssignmentsByName) { deconflictedExportNames[exportName] = deconflict([...scopes], globals, exportName); } + for (const node of replacedGlobal) { + magicString.overwrite(node.start, node.end, `${helpersName}.commonjsGlobal`, { + storeName: true + }); + } + for (const node of replacedDynamicRequires) { + magicString.overwrite(node.start, node.end, dynamicRequireName, { + contentOnly: true, + storeName: true + }); + } + // We cannot wrap ES/mixed modules shouldWrap = !isEsModule && (shouldWrap || (uses.exports && moduleExportsAssignments.length > 0)); const detectWrappedDefault = diff --git a/packages/commonjs/test/fixtures/function/dynamic-module-require/_config.js b/packages/commonjs/test/fixtures/function/dynamic-module-require/_config.js index be6712858..0693ea19d 100755 --- a/packages/commonjs/test/fixtures/function/dynamic-module-require/_config.js +++ b/packages/commonjs/test/fixtures/function/dynamic-module-require/_config.js @@ -1,6 +1,4 @@ module.exports = { - // TODO Lukas think about a way to re-implement - skip: true, description: 'supports dynamic require', pluginOptions: { dynamicRequireTargets: ['fixtures/function/dynamic-module-require/submodule.js'] diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/_config.js b/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/_config.js deleted file mode 100755 index c72a299c4..000000000 --- a/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/_config.js +++ /dev/null @@ -1,15 +0,0 @@ -const { nodeResolve } = require('@rollup/plugin-node-resolve'); - -module.exports = { - // TODO Lukas re-enable cache-handling in some way - skip: true, - description: 'accesses commonjsRequire.cache', - options: { - plugins: [nodeResolve()] - }, - pluginOptions: { - dynamicRequireTargets: [ - 'fixtures/function/dynamic-require-cache-reference/node_modules/{custom-module,custom-module2}{,/*.js}' - ] - } -}; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/main.js b/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/main.js deleted file mode 100755 index b60c0f9dd..000000000 --- a/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/main.js +++ /dev/null @@ -1,5 +0,0 @@ -const a = require('custom-module2'); -const b = require('custom-module'); - -t.is(a.foo, 'baz'); -t.is(b.foo, 'bar'); diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module/index.js b/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module/index.js deleted file mode 100755 index 5b4c8fd7a..000000000 --- a/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module/index.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - foo: 'bar', -}; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module2/index.js b/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module2/index.js deleted file mode 100755 index 1e06b7638..000000000 --- a/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module2/index.js +++ /dev/null @@ -1,7 +0,0 @@ -const stealthRequire = require('stealthy'); - -module.exports = stealthRequire(require.cache, () => { - let m = require('custom-module'); - m.foo = 'baz'; - return m; -}); diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/node_modules/stealthy/index.js b/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/node_modules/stealthy/index.js deleted file mode 100644 index 20b1da1c0..000000000 --- a/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/node_modules/stealthy/index.js +++ /dev/null @@ -1,25 +0,0 @@ -function mv(from, to) { - for (let [key, value] of Object.entries(from)) { - to[key] = value; - } -} - -function clear(obj) { - for (let key of Array.from(Object.keys(obj))) { - delete obj[key]; - } -} - -module.exports = function stealth(cacheObject, cb) { - let orig = Object.create(null); - - mv(cacheObject, orig) - clear(cacheObject) - - let res = cb(); - - clear(cacheObject) - mv(orig, cacheObject) - - return res; -}; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-resolve-reference/main.js b/packages/commonjs/test/fixtures/function/dynamic-require-resolve-reference/main.js index a30e03d98..90dd10156 100755 --- a/packages/commonjs/test/fixtures/function/dynamic-require-resolve-reference/main.js +++ b/packages/commonjs/test/fixtures/function/dynamic-require-resolve-reference/main.js @@ -1,3 +1,7 @@ +t.is( + require('custom-module')(), + '/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2' +); t.is( require('custom-module2')(), '/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module' diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module/index.js b/packages/commonjs/test/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module/index.js index 5b4c8fd7a..7eabc0d90 100755 --- a/packages/commonjs/test/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module/index.js +++ b/packages/commonjs/test/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module/index.js @@ -1,3 +1 @@ -module.exports = { - foo: 'bar', -}; +module.exports = () => module.require.resolve('custom-module2'); diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2/index.js b/packages/commonjs/test/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2/index.js index 4ffedfe58..f7ec4a019 100755 --- a/packages/commonjs/test/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2/index.js +++ b/packages/commonjs/test/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2/index.js @@ -1,3 +1 @@ -module.exports = () => { - return require.resolve('custom-module'); -}; +module.exports = () => require.resolve('custom-module'); diff --git a/packages/commonjs/test/fixtures/function/try-catch-internal/main.js b/packages/commonjs/test/fixtures/function/try-catch-internal/main.js index df773bb29..5d3875d55 100644 --- a/packages/commonjs/test/fixtures/function/try-catch-internal/main.js +++ b/packages/commonjs/test/fixtures/function/try-catch-internal/main.js @@ -5,3 +5,9 @@ try { } catch (err) { throw new Error(`Could not require: ${err}`); } + +try { + require('./throws.js'); +} catch (err) { + t.is(err.message, 'Expected error'); +} diff --git a/packages/commonjs/test/fixtures/function/try-catch-internal/throws.js b/packages/commonjs/test/fixtures/function/try-catch-internal/throws.js new file mode 100644 index 000000000..dcf80a10e --- /dev/null +++ b/packages/commonjs/test/fixtures/function/try-catch-internal/throws.js @@ -0,0 +1 @@ +throw new Error('Expected error'); diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index 574c79cc3..b30e1811d 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -390,6 +390,140 @@ Generated by [AVA](https://avajs.dev). `, } +## dynamic-module-require + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var submodule;␊ + var hasRequiredSubmodule;␊ + ␊ + function requireSubmodule () {␊ + if (hasRequiredSubmodule) return submodule;␊ + hasRequiredSubmodule = 1;␊ + submodule = function () {␊ + return 'Hello there';␊ + };␊ + return submodule;␊ + }␊ + ␊ + var dynamicModules;␊ + ␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/fixtures/function/dynamic-module-require/submodule.js": requireSubmodule␊ + });␊ + }␊ + ␊ + function commonjsRequire(path, originalModuleDir) {␊ + var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return getDynamicModules()[resolvedPath]();␊ + }␊ + throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');␊ + }␊ + ␊ + function commonjsResolve (path, originalModuleDir) {␊ + const resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + }␊ + ␊ + commonjsRequire.resolve = commonjsResolve;␊ + ␊ + function commonjsResolveImpl (path, originalModuleDir) {␊ + var shouldTryNodeModules = isPossibleNodeModulesPath(path);␊ + path = normalize(path);␊ + var relPath;␊ + if (path[0] === '/') {␊ + originalModuleDir = '';␊ + }␊ + var modules = getDynamicModules();␊ + var checkedExtensions = ['', '.js', '.json'];␊ + while (true) {␊ + if (!shouldTryNodeModules) {␊ + relPath = normalize(originalModuleDir + '/' + path);␊ + } else {␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + }␊ + ␊ + if (relPath.endsWith('/..')) {␊ + break; // Travelled too far up, avoid infinite loop␊ + }␊ + ␊ + for (var extensionIndex = 0; extensionIndex < checkedExtensions.length; extensionIndex++) {␊ + var resolvedPath = relPath + checkedExtensions[extensionIndex];␊ + if (modules[resolvedPath]) {␊ + return resolvedPath;␊ + }␊ + }␊ + if (!shouldTryNodeModules) break;␊ + var nextDir = normalize(originalModuleDir + '/..');␊ + if (nextDir === originalModuleDir) break;␊ + originalModuleDir = nextDir;␊ + }␊ + return null;␊ + }␊ + ␊ + function isPossibleNodeModulesPath (modulePath) {␊ + var c0 = modulePath[0];␊ + if (c0 === '/' || c0 === '\\\\') return false;␊ + var c1 = modulePath[1], c2 = modulePath[2];␊ + if ((c0 === '.' && (!c1 || c1 === '/' || c1 === '\\\\')) ||␊ + (c0 === '.' && c1 === '.' && (!c2 || c2 === '/' || c2 === '\\\\'))) return false;␊ + if (c1 === ':' && (c2 === '/' || c2 === '\\\\')) return false;␊ + return true;␊ + }␊ + ␊ + function normalize (path) {␊ + path = path.replace(/\\\\/g, '/');␊ + var parts = path.split('/');␊ + var slashed = parts[0] === '';␊ + for (var i = 1; i < parts.length; i++) {␊ + if (parts[i] === '.' || parts[i] === '') {␊ + parts.splice(i--, 1);␊ + }␊ + }␊ + for (var i = 1; i < parts.length; i++) {␊ + if (parts[i] !== '..') continue;␊ + if (i > 0 && parts[i - 1] !== '..' && parts[i - 1] !== '.') {␊ + parts.splice(--i, 2);␊ + i--;␊ + }␊ + }␊ + path = parts.join('/');␊ + if (slashed && path[0] !== '/') path = '/' + path;␊ + else if (path.length === 0) path = '.';␊ + return path;␊ + }␊ + ␊ + var main = {};␊ + ␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ + ␊ + let message;␊ + ␊ + function takeModule(withName) {␊ + return commonjsRequire(`./${withName}`, "/fixtures/function/dynamic-module-require");␊ + }␊ + ␊ + try {␊ + const submodule = takeModule('submodule');␊ + message = submodule();␊ + } catch (err) {␊ + ({ message } = err);␊ + }␊ + ␊ + t.is(message, 'Hello there');␊ + ␊ + module.exports = main;␊ + `, + } + ## dynamic-require > Snapshot 1 @@ -2139,16 +2273,17 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ - var customModule;␊ + var customModule = {exports: {}};␊ + ␊ var hasRequiredCustomModule;␊ ␊ function requireCustomModule () {␊ - if (hasRequiredCustomModule) return customModule;␊ + if (hasRequiredCustomModule) return customModule.exports;␊ hasRequiredCustomModule = 1;␊ - customModule = {␊ - foo: 'bar',␊ - };␊ - return customModule;␊ + (function (module) {␊ + module.exports = () => commonjsRequire.resolve('custom-module2',"/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module");␊ + } (customModule));␊ + return customModule.exports;␊ }␊ ␊ var customModule2;␊ @@ -2157,9 +2292,7 @@ Generated by [AVA](https://avajs.dev). function requireCustomModule2 () {␊ if (hasRequiredCustomModule2) return customModule2;␊ hasRequiredCustomModule2 = 1;␊ - customModule2 = () => {␊ - return commonjsRequire.resolve('custom-module',"/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2");␊ - };␊ + customModule2 = () => commonjsRequire.resolve('custom-module',"/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2");␊ return customModule2;␊ }␊ ␊ @@ -2260,6 +2393,10 @@ Generated by [AVA](https://avajs.dev). ␊ var main = {};␊ ␊ + t.is(␊ + requireCustomModule()(),␊ + '/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2'␊ + );␊ t.is(␊ requireCustomModule2()(),␊ '/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module'␊ @@ -6996,16 +7133,39 @@ Generated by [AVA](https://avajs.dev). ␊ var dep = {};␊ ␊ - dep.foo = 'foo';␊ + var hasRequiredDep;␊ + ␊ + function requireDep () {␊ + if (hasRequiredDep) return dep;␊ + hasRequiredDep = 1;␊ + dep.foo = 'foo';␊ + return dep;␊ + }␊ + ␊ + var throws = {};␊ + ␊ + var hasRequiredThrows;␊ + ␊ + function requireThrows () {␊ + if (hasRequiredThrows) return throws;␊ + hasRequiredThrows = 1;␊ + throw new Error('Expected error');␊ + }␊ ␊ /* eslint-disable global-require */␊ ␊ try {␊ - t.is(dep.foo, 'foo');␊ + t.is(requireDep().foo, 'foo');␊ } catch (err) {␊ throw new Error(`Could not require: ${err}`);␊ }␊ ␊ + try {␊ + requireThrows();␊ + } catch (err) {␊ + t.is(err.message, 'Expected error');␊ + }␊ + ␊ module.exports = main;␊ `, } diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index ac9d53cf63e771a1e25d1da373dbfcde4db7d37f..a4ae4968c02399853df76dce48e40539a0845d94 100644 GIT binary patch literal 20650 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 ba{GADXUL9-y(R;Y8@ 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