8000 feat(commonjs): throw for dynamic requires from outside the configure… · rollup/plugins@c198d9d · GitHub
[go: up one dir, main page]

Skip to content

Commit c198d9d

Browse files
committed
feat(commonjs): throw for dynamic requires from outside the configured root (#1038)
1 parent 08ab82c commit c198d9d

File tree

7 files changed

+54
-15
lines changed

7 files changed

+54
-15
lines changed

packages/commonjs/src/index.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { extname, relative, resolve } from 'path';
1+
import { extname, relative, resolve, dirname } from 'path';
22

33
import { createFilter } from '@rollup/pluginutils';
44

@@ -129,6 +129,19 @@ export default function commonjs(options = {}) {
129129
!isEsModule &&
130130
(dynamicRequireModules.has(normalizePathSlashes(id)) || strictRequiresFilter(id));
131131

132+
const checkDynamicRequire = () => {
133+
if (id.indexOf(dynamicRequireRoot) !== 0) {
134+
this.error({
135+
code: 'DYNAMIC_REQUIRE_OUTSIDE_ROOT',
136+
id,
137+
dynamicRequireRoot,
138+
message: `"${id}" contains dynamic require statements but it is not within the current dynamicRequireRoot "${dynamicRequireRoot}". You should set dynamicRequireRoot to "${dirname(
139+
id
140+
)}" or one of its parent directories.`
141+
});
142+
}
143+
};
144+
132145
return transformCommonjs(
133146
this.parse,
134147
code,
@@ -146,7 +159,8 @@ export default function commonjs(options = {}) {
146159
getDefaultIsModuleExports(id),
147160
needsRequireWrapper,
148161
resolveRequireSourcesAndGetMeta(this),
149-
isRequiredId(id)
162+
isRequiredId(id),
163+
checkDynamicRequire
150164
);
151165
}
152166

packages/commonjs/src/transform-commonjs.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ export default async function transformCommonjs(
5252
defaultIsModuleExports,
5353
needsRequireWrapper,
5454
resolveRequireSourcesAndGetMeta,
55-
isRequired
55+
isRequired,
56+
checkDynamicRequire
5657
) {
5758
const ast = astCache || tryParse(parse, code, id);
5859
const magicString = new MagicString(code);
@@ -295,6 +296,7 @@ export default async function transformCommonjs(
295296
);
296297
}
297298
if (!ignoreDynamicRequires) {
299+
checkDynamicRequire();
298300
if (isShorthandProperty(parent)) {
299301
magicString.appendRight(node.end, `: ${dynamicRequireName}`);
300302
} else {

packages/commonjs/test/fixtures/form/dynamic-template-literal/input.js

Lines changed: 0 additions & 3 deletions
This file was deleted.

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

Lines changed: 0 additions & 9 deletions
This file was deleted.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
function takeModule(path) {
2+
// eslint-disable-next-line global-require,import/no-dynamic-require
3+
return require(path);
4+
}
5+
6+
takeModule('./nested/target.js');
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = 'target';

packages/commonjs/test/test.js

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -684,3 +684,31 @@ if (os.platform() === 'win32') {
684684
t.regex(code, /var foo(\$\d+)? = {}/);
685685
});
686686
}
687+
688+
test('throws when there is a dynamic require from outside dynamicRequireRoot', async (t) => {
689+
let error = null;
690+
try {
691+
await rollup({
692+
input: 'fixtures/samples/dynamic-require-outside-root/main.js',
693+
plugins: [
694+
commonjs({
695+
dynamicRequireRoot: 'fixtures/samples/dynamic-require-outside-root/nested',
696+
dynamicRequireTargets: ['fixtures/samples/dynamic-require-outside-root/nested/target.js']
697+
})
698+
]
699+
});
700+
} catch (err) {
701+
error = err;
702+
}
703+
704+
const cwd = process.cwd();
705+
const id = path.join(cwd, 'fixtures/samples/dynamic-require-outside-root/main.js');
706+
const dynamicRequireRoot = path.join(cwd, 'fixtures/samples/dynamic-require-outside-root/nested');
707+
const minimalDynamicRequireRoot = path.join(cwd, 'fixtures/samples/dynamic-require-outside-root');
708+
t.like(error, {
709+
message: `"${id}" contains dynamic require statements but it is not within the current dynamicRequireRoot "${dynamicRequireRoot}". You should set dynamicRequireRoot to "${minimalDynamicRequireRoot}" or one of its parent directories.`,
710+
pluginCode: 'DYNAMIC_REQUIRE_OUTSIDE_ROOT',
711+
id,
712+
dynamicRequireRoot
713+
});
714+
});

0 commit comments

Comments
 (0)
0