Skip to content

Commit 0b9a0e8

Browse files
committed
fix(commonjs): inject module name into dynamic require function (#1038)
1 parent df01795 commit 0b9a0e8

File tree

21 files changed

+499
-351
lines changed

21 files changed

+499
-351
lines changed

packages/commonjs/src/dynamic-modules.js

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,17 @@ export function getDynamicRequireModules(patterns, dynamicRequireRoot) {
6363

6464
const FAILED_REQUIRE_ERROR = `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.');`;
6565

66+
export const COMMONJS_REQUIRE_EXPORT = 'commonjsRequire';
67+
export const CREATE_COMMONJS_REQUIRE_EXPORT = 'createCommonjsRequire';
68+
6669
export function getDynamicModuleRegistry(
6770
isDynamicRequireModulesEnabled,
6871
dynamicRequireModules,
6972
commonDir,
7073
ignoreDynamicRequires
7174
) {
7275
if (!isDynamicRequireModulesEnabled) {
73-
return `export function commonjsRequire(path) {
76+
return `export function ${COMMONJS_REQUIRE_EXPORT}(path) {
7477
${FAILED_REQUIRE_ERROR}
7578
}`;
7679
}
@@ -100,25 +103,25 @@ ${dynamicModuleProps}
100103
});
101104
}
102105
103-
export function commonjsRequire(path, originalModuleDir) {
104-
var resolvedPath = commonjsResolveImpl(path, originalModuleDir);
105-
if (resolvedPath !== null) {
106-
return getDynamicModules()[resolvedPath]();
106+
export function ${CREATE_COMMONJS_REQUIRE_EXPORT}(originalModuleDir) {
107+
function handleRequire(path) {
108+
var resolvedPath = commonjsResolve(path, originalModuleDir);
109+
if (resolvedPath !== null) {
110+
return getDynamicModules()[resolvedPath]();
111+
}
112+
${ignoreDynamicRequires ? 'return require(path);' : FAILED_REQUIRE_ERROR}
107113
}
108-
${ignoreDynamicRequires ? 'return require(path);' : FAILED_REQUIRE_ERROR}
109-
}
110-
111-
function commonjsResolve (path, originalModuleDir) {
112-
const resolvedPath = commonjsResolveImpl(path, originalModuleDir);
113-
if (resolvedPath !== null) {
114-
return resolvedPath;
114+
handleRequire.resolve = function (path) {
115+
var resolvedPath = commonjsResolve(path, originalModuleDir);
116+
if (resolvedPath !== null) {
117+
return resolvedPath;
118+
}
119+
return require.resolve(path);
115120
}
116-
return require.resolve(path);
121+
return handleRequire;
117122
}
118123
119-
commonjsRequire.resolve = commonjsResolve;
120-
121-
function commonjsResolveImpl (path, originalModuleDir) {
124+
function commonjsResolve (path, originalModuleDir) {
122125
var shouldTryNodeModules = isPossibleNodeModulesPath(path);
123126
path = normalize(path);
124127
var relPath;

packages/commonjs/src/generate-imports.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { COMMONJS_REQUIRE_EXPORT, CREATE_COMMONJS_REQUIRE_EXPORT } from './dynamic-modules';
12
import {
23
DYNAMIC_MODULES_ID,
34
EXPORTS_SUFFIX,
@@ -92,14 +93,16 @@ export function getRequireHandlers() {
9293
resolveRequireSourcesAndGetMeta,
9394
needsRequireWrapper,
9495
isEsModule,
95-
usesRequire,
96+
isDynamicRequireModulesEnabled,
9697
getIgnoreTryCatchRequireStatementMode
9798
) {
9899
const imports = [];
99100
imports.push(`import * as ${helpersName} from "${HELPERS_ID}";`);
100-
if (usesRequire) {
101+
if (dynamicRequireName) {
101102
imports.push(
102-
`import { commonjsRequire as ${dynamicRequireName} } from "${DYNAMIC_MODULES_ID}";`
103+
`import { ${
104+
isDynamicRequireModulesEnabled ? CREATE_COMMONJS_REQUIRE_EXPORT : COMMONJS_REQUIRE_EXPORT
105+
} as ${dynamicRequireName} } from "${DYNAMIC_MODULES_ID}";`
103106
);
104107
}
105108
if (exportMode === 'module') {

packages/commonjs/src/transform-commonjs.js

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import {
1616
isTruthy,
1717
KEY_COMPILED_ESM
1818
} from './ast-utils';
19+
import { COMMONJS_REQUIRE_EXPORT, CREATE_COMMONJS_REQUIRE_EXPORT } from './dynamic-modules';
1920
import { rewriteExportsAndGetExportsBlock, wrapCode } from './generate-exports';
2021
import {
2122
getRequireHandlers,
@@ -201,12 +202,6 @@ export default async function transformCommonjs(
201202
checkDynamicRequire(node.start);
202203
uses.require = true;
203204
const requireNode = node.callee.object;
204-
magicString.appendLeft(
205-
node.end - 1,
206-
`,${JSON.stringify(
207-
dirname(id) === '.' ? null /* default behavior */ : virtualDynamicRequirePath
208-
)}`
209-
);
210205
replacedDynamicRequires.push(requireNode);
211206
return;
212207
}
@@ -221,12 +216,6 @@ export default async function transformCommonjs(
221216
if (hasDynamicArguments(node)) {
222217
if (isDynamicRequireModulesEnabled) {
223218
checkDynamicRequire(node.start);
224-
magicString.appendLeft(
225-
node.end - 1,
226-
`, ${JSON.stringify(
227-
dirname(id) === '.' ? null /* default behavior */ : virtualDynamicRequirePath
228-
)}`
229-
);
230219
}
231220
if (!ignoreDynamicRequires) {
232221
replacedDynamicRequires.push(node.callee);
@@ -400,7 +389,13 @@ export default async function transformCommonjs(
400389
const requireName = deconflict([scope], globals, `require${capitalize(nameBase)}`);
401390
const isRequiredName = deconflict([scope], globals, `hasRequired${capitalize(nameBase)}`);
402391
const helpersName = deconflict([scope], globals, 'commonjsHelpers');
403-
const dynamicRequireName = deconflict([scope], globals, 'commonjsRequire');
392+
const dynamicRequireName =
393+
replacedDynamicRequires.length > 0 &&
394+
deconflict(
395+
[scope],
396+
globals,
397+
isDynamicRequireModulesEnabled ? CREATE_COMMONJS_REQUIRE_EXPORT : COMMONJS_REQUIRE_EXPORT
398+
);
404399
const deconflictedExportNames = Object.create(null);
405400
for (const [exportName, { scopes }] of exportsAssignmentsByName) {
406401
deconflictedExportNames[exportName] = deconflict([...scopes], globals, exportName);
@@ -412,10 +407,17 @@ export default async function transformCommonjs(
412407
});
413408
}
414409
for (const node of replacedDynamicRequires) {
415-
magicString.overwrite(node.start, node.end, dynamicRequireName, {
416-
contentOnly: true,
417-
storeName: true
418-
});
410+
magicString.overwrite(
411+
node.start,
412+
node.end,
413+
isDynamicRequireModulesEnabled
414+
? `${dynamicRequireName}(${JSON.stringify(virtualDynamicRequirePath)})`
415+
: dynamicRequireName,
416+
{
417+
contentOnly: true,
418+
storeName: true
419+
}
420+
);
419421
}
420422

421423
// We cannot wrap ES/mixed modules
@@ -470,7 +472,7 @@ export default async function transformCommonjs(
470472
resolveRequireSourcesAndGetMeta,
471473
needsRequireWrapper,
472474
isEsModule,
473-
uses.require,
475+
isDynamicRequireModulesEnabled,
474476
getIgnoreTryCatchRequireStatementMode
475477
);
476478
const exportBlock = isEsModule

packages/commonjs/test/fixtures/form/constant-template-literal/output.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as commonjsHelpers from "_commonjsHelpers.js";
2-
import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules";
32
import { __exports as input } from "\u0000fixtures/form/constant-template-literal/input.js?commonjs-exports"
43
import require$$0 from "\u0000CWD/fixtures/form/constant-template-literal/tape.js?commonjs-proxy";
54

packages/commonjs/test/fixtures/form/ignore-ids-function/output.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as commonjsHelpers from "_commonjsHelpers.js";
2-
import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules";
32
import { __exports as input } from "\u0000fixtures/form/ignore-ids-function/input.js?commonjs-exports"
43
import require$$0 from "\u0000CWD/fixtures/form/ignore-ids-function/bar.js?commonjs-proxy";
54

packages/commonjs/test/fixtures/form/ignore-ids/output.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as commonjsHelpers from "_commonjsHelpers.js";
2-
import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules";
32
import { __exports as input } from "\u0000fixtures/form/ignore-ids/input.js?commonjs-exports"
43
import require$$0 from "\u0000CWD/fixtures/form/ignore-ids/bar.js?commonjs-proxy";
54

packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as commonjsHelpers from "_commonjsHelpers.js";
2-
import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules";
32
import require$$0 from "\u0000CWD/fixtures/form/multi-entry-module-exports/input2.js?commonjs-proxy";
43

54
const t2 = require$$0;

packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as commonjsHelpers from "_commonjsHelpers.js";
2-
import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules";
32
import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations-b/input.js?commonjs-exports"
43
import require$$0 from "\u0000CWD/fixtures/form/multiple-var-declarations-b/a.js?commonjs-proxy";
54

packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as commonjsHelpers from "_commonjsHelpers.js";
2-
import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules";
32
import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations-c/input.js?commonjs-exports"
43
import require$$0 from "\u0000CWD/fixtures/form/multiple-var-declarations-c/b.js?commonjs-proxy";
54

packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
import * as commonjsHelpers from "_commonjsHelpers.js";
2-
import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules";
32
import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations/input.js?commonjs-exports"
43
import require$$0 from "\u0000CWD/fixtures/form/multiple-var-declarations/a.js?commonjs-proxy";
54
import require$$1 from "\u0000CWD/fixtures/form/multiple-var-declarations/b.js?commonjs-proxy";

0 commit comments

Comments
 (0)