From 08ab82ceea04e8cb7cec29f9ccc138e91f11b546 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Sun, 21 Nov 2021 07:46:57 +0100 Subject: [PATCH] feat(commonjs): add dynamicRequireRoot option (#1038) --- packages/commonjs/README.md | 11 +- packages/commonjs/src/dynamic-modules.js | 46 +- packages/commonjs/src/index.js | 18 +- packages/commonjs/src/utils.js | 4 +- .../function/dynamic-require-root/_config.js | 7 + .../function/dynamic-require-root/main.js | 16 + .../dynamic-require-root/submodule.js | 3 + .../commonjs/test/snapshots/function.js.md | 580 +++++++----------- .../commonjs/test/snapshots/function.js.snap | Bin 20622 -> 20550 bytes packages/commonjs/test/types.ts | 1 + packages/commonjs/types/index.d.ts | 7 + 11 files changed, 295 insertions(+), 398 deletions(-) create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-root/_config.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-root/main.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-root/submodule.js diff --git a/packages/commonjs/README.md b/packages/commonjs/README.md index 127b7e688..a835f8e48 100644 --- a/packages/commonjs/README.md +++ b/packages/commonjs/README.md @@ -55,13 +55,13 @@ By default, this plugin will try to hoist `require` statements as imports to the Setting this option to `true` will wrap all CommonJS files in functions which are executed when they are required for the first time, preserving NodeJS semantics. Note that this can have an impact on the size and performance of the generated code. -The default value of `"auto"` will only wrap CommonJS files when they are part of a CommonJS dependency cycle, e.g. an index file that is required by many of its dependencies. All other CommonJS files are hoisted. This is the recommended setting for most code bases. +The default value of `"auto"` will only wrap CommonJS files when they are part of a CommonJS dependency cycle, e.g. an index file that is required by some of its dependencies, or if they are only required in a potentially "conditional" way like from within an if-statement or a function. All other CommonJS files are hoisted. This is the recommended setting for most code bases. Note that the detection of conditional requires can be subject to race conditions if there are both conditional and unconditional requires of the same file, which in edge cases may result in inconsistencies between builds. If you think this is a problem for you, you can avoid this by using any value other than `"auto"` or `"debug"`. `false` will entirely prevent wrapping and hoist all files. This may still work depending on the nature of cyclic dependencies but will often cause problems. You can also provide a [minimatch pattern](https://github.com/isaacs/minimatch), or array of patterns, to only specify a subset of files which should be wrapped in functions for proper `require` semantics. -`"debug"` works like `"auto"` but after bundling, it will display a warning containing a list of ids that have been wrapped which can be used as minimatch pattern for fine-tuning. +`"debug"` works like `"auto"` but after bundling, it will display a warning containing a list of ids that have been wrapped which can be used as minimatch pattern for fine-tuning or to avoid the potential race conditions mentioned for `"auto"`. ### `dynamicRequireTargets` @@ -90,6 +90,13 @@ commonjs({ }); ``` +### `dynamicRequireRoot` + +Type: `string`
+Default: `process.cwd()` + +To avoid long paths when using the `dynamicRequireTargets` option, you can use this option to specify a directory that is a common parent for all files that use dynamic require statements. Using a directory higher up such as `/` may lead to unnecessarily long paths in the generated code and may expose directory names on your machine like your home directory name. By default it uses the current working directory. + ### `exclude` Type: `string | string[]`
diff --git a/packages/commonjs/src/dynamic-modules.js b/packages/commonjs/src/dynamic-modules.js index 272fb1374..82f34c78e 100644 --- a/packages/commonjs/src/dynamic-modules.js +++ b/packages/commonjs/src/dynamic-modules.js @@ -1,5 +1,7 @@ import { existsSync, readFileSync, statSync } from 'fs'; -import { join, resolve } from 'path'; +import { join, resolve, dirname } from 'path'; + +import getCommonDir from 'commondir'; import glob from 'glob'; @@ -30,8 +32,9 @@ function isDirectory(path) { return false; } -export function getDynamicRequireModules(patterns) { +export function getDynamicRequireModules(patterns, dynamicRequireRoot) { const dynamicRequireModules = new Map(); + const dirNames = new Set(); for (const pattern of !patterns || Array.isArray(patterns) ? patterns || [] : [patterns]) { const isNegated = pattern.startsWith('!'); const modifyMap = (targetPath, resolvedPath) => @@ -42,15 +45,20 @@ export function getDynamicRequireModules(patterns) { const resolvedPath = resolve(path); const requirePath = normalizePathSlashes(resolvedPath); if (isDirectory(resolvedPath)) { + dirNames.add(resolvedPath); const modulePath = resolve(join(resolvedPath, getPackageEntryPoint(path))); modifyMap(requirePath, modulePath); modifyMap(normalizePathSlashes(modulePath), modulePath); } else { + dirNames.add(dirname(resolvedPath)); modifyMap(requirePath, resolvedPath); } } } - return dynamicRequireModules; + return { + commonDir: dirNames.size ? getCommonDir([...dirNames, dynamicRequireRoot]) : null, + dynamicRequireModules + }; } 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.');`; @@ -77,9 +85,9 @@ export function getDynamicModuleRegistry( const dynamicModuleProps = [...dynamicRequireModules.keys()] .map( (id, index) => - `\t\t${JSON.stringify( - getVirtualPathForDynamicRequirePath(normalizePathSlashes(id), commonDir) - )}: ${id.endsWith('.json') ? `function () { return json${index}; }` : `require${index}`}` + `\t\t${JSON.stringify(getVirtualPathForDynamicRequirePath(id, commonDir))}: ${ + id.endsWith('.json') ? `function () { return json${index}; }` : `require${index}` + }` ) .join(',\n'); return `${dynamicModuleImports} @@ -93,7 +101,7 @@ ${dynamicModuleProps} } export function commonjsRequire(path, originalModuleDir) { - var resolvedPath = commonjsResolveImpl(path, originalModuleDir, true); + var resolvedPath = commonjsResolveImpl(path, originalModuleDir); if (resolvedPath !== null) { return getDynamicModules()[resolvedPath](); } @@ -115,17 +123,15 @@ function commonjsResolveImpl (path, originalModuleDir) { path = normalize(path); var relPath; if (path[0] === '/') { - originalModuleDir = '/'; + originalModuleDir = ''; } var modules = getDynamicModules(); var checkedExtensions = ['', '.js', '.json']; while (true) { if (!shouldTryNodeModules) { - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path; - } else if (originalModuleDir) { - relPath = normalize(originalModuleDir + '/node_modules/' + path); + relPath = normalize(originalModuleDir + '/' + path); } else { - relPath = normalize(join('node_modules', path)); + relPath = normalize(originalModuleDir + '/node_modules/' + path); } if (relPath.endsWith('/..')) { @@ -176,21 +182,5 @@ function normalize (path) { if (slashed && path[0] !== '/') path = '/' + path; else if (path.length === 0) path = '.'; return path; -} - -function join () { - if (arguments.length === 0) return '.'; - var joined; - for (var i = 0; i < arguments.length; ++i) { - var arg = arguments[i]; - if (arg.length > 0) { - if (joined === undefined) - joined = arg; - else - joined += '/' + arg; - } - } - if (joined === undefined) return '.'; - return joined; }`; } diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index 88c362987..6079ced8b 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -1,7 +1,6 @@ -import { extname, relative } from 'path'; +import { extname, relative, resolve } from 'path'; import { createFilter } from '@rollup/pluginutils'; -import getCommonDir from 'commondir'; import { peerDependencies } from '../package.json'; @@ -64,13 +63,16 @@ export default function commonjs(options = {}) { getWrappedIds, isRequiredId } = getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndConditional); - const dynamicRequireModules = getDynamicRequireModules(options.dynamicRequireTargets); - const isDynamicRequireModulesEnabled = dynamicRequireModules.size > 0; - // TODO Lukas replace with new dynamicRequireRoot to replace CWD + const dynamicRequireRoot = + typeof options.dynamicRequireRoot === 'string' + ? resolve(options.dynamicRequireRoot) + : process.cwd(); // TODO Lukas throw if require from outside commondir - const commonDir = isDynamicRequireModulesEnabled - ? getCommonDir(null, Array.from(dynamicRequireModules.keys()).concat(process.cwd())) - : null; + const { commonDir, dynamicRequireModules } = getDynamicRequireModules( + options.dynamicRequireTargets, + dynamicRequireRoot + ); + const isDynamicRequireModulesEnabled = dynamicRequireModules.size > 0; const esModulesWithDefaultExport = new Set(); const esModulesWithNamedExports = new Set(); diff --git a/packages/commonjs/src/utils.js b/packages/commonjs/src/utils.js index 35c727a97..92866c706 100644 --- a/packages/commonjs/src/utils.js +++ b/packages/commonjs/src/utils.js @@ -1,6 +1,6 @@ /* eslint-disable import/prefer-default-export */ -import { basename, dirname, extname } from 'path'; +import { basename, dirname, extname, relative } from 'path'; import { createFilter, makeLegalIdentifier } from '@rollup/pluginutils'; @@ -35,7 +35,7 @@ export function normalizePathSlashes(path) { } export const getVirtualPathForDynamicRequirePath = (path, commonDir) => - normalizePathSlashes(path).slice(commonDir.length); + `/${normalizePathSlashes(relative(commonDir, path))}`; export function capitalize(name) { return name[0].toUpperCase() + name.slice(1); diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-root/_config.js b/packages/commonjs/test/fixtures/function/dynamic-require-root/_config.js new file mode 100755 index 000000000..04b381c33 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-root/_config.js @@ -0,0 +1,7 @@ +module.exports = { + description: 'supports specifying a dynamic require root', + pluginOptions: { + dynamicRequireTargets: ['fixtures/function/dynamic-require-root/submodule.js'], + dynamicRequireRoot: 'fixtures/function/dynamic-require-root' + } +}; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-root/main.js b/packages/commonjs/test/fixtures/function/dynamic-require-root/main.js new file mode 100755 index 000000000..28c3ae84d --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-root/main.js @@ -0,0 +1,16 @@ +/* eslint-disable import/no-dynamic-require, global-require */ + +let message; + +function takeModule(withName) { + return require(`./${withName}`); +} + +try { + const submodule = takeModule('submodule'); + message = submodule(); +} catch (err) { + ({ message } = err); +} + +t.is(message, 'Hello there'); diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-root/submodule.js b/packages/commonjs/test/fixtures/function/dynamic-require-root/submodule.js new file mode 100755 index 000000000..28a021e39 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-root/submodule.js @@ -0,0 +1,3 @@ +module.exports = function () { + return 'Hello there'; +}; diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index 42d68b8eb..574c79cc3 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -175,6 +175,49 @@ Generated by [AVA](https://avajs.dev). `, } +## 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 = {};␊ + ␊ + var throws = {};␊ + ␊ + var hasRequiredThrows;␊ + ␊ + function requireThrows () {␊ + if (hasRequiredThrows) return throws;␊ + hasRequiredThrows = 1;␊ + throw new Error('This should not be executed');␊ + }␊ + ␊ + var hasRequiredDep;␊ + ␊ + 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;␊ + `, + } + ## custom-options > Snapshot 1 @@ -397,17 +440,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -460,22 +501,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ var main = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ @@ -569,17 +594,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -632,22 +655,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ var main = {};␊ ␊ var submodule = {};␊ @@ -733,17 +740,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -796,22 +801,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ let message;␊ @@ -926,17 +915,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -989,22 +976,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ @@ -1099,17 +1070,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -1162,22 +1131,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ var main = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ @@ -1315,17 +1268,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -1378,22 +1329,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ var main = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ @@ -1475,17 +1410,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -1538,22 +1471,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ var main = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ @@ -1617,17 +1534,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -1680,22 +1595,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ var main = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ @@ -1812,17 +1711,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -1875,22 +1772,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ var main = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ @@ -2007,17 +1888,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -2070,22 +1949,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ var main = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ @@ -2176,17 +2039,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -2239,22 +2100,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ var main = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ @@ -2352,17 +2197,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -2415,22 +2258,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ var main = {};␊ ␊ t.is(␊ @@ -2442,6 +2269,140 @@ Generated by [AVA](https://avajs.dev). `, } +## dynamic-require-root + +> 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 = {␊ + "/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}`, "/");␊ + }␊ + ␊ + try {␊ + const submodule = takeModule('submodule');␊ + message = submodule();␊ + } catch (err) {␊ + ({ message } = err);␊ + }␊ + ␊ + t.is(message, 'Hello there');␊ + ␊ + module.exports = main;␊ + `, + } + ## dynamic-require-root-circular > Snapshot 1 @@ -2589,17 +2550,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -2652,22 +2611,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ var main = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ @@ -2751,17 +2694,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -2814,22 +2755,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ var main = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ @@ -2894,17 +2819,15 @@ Generated by [AVA](https://avajs.dev). path = normalize(path);␊ var relPath;␊ if (path[0] === '/') {␊ - originalModuleDir = '/';␊ + originalModuleDir = '';␊ }␊ var modules = getDynamicModules();␊ var checkedExtensions = ['', '.js', '.json'];␊ while (true) {␊ if (!shouldTryNodeModules) {␊ - relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ - } else if (originalModuleDir) {␊ - relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + relPath = normalize(originalModuleDir + '/' + path);␊ } else {␊ - relPath = normalize(join('node_modules', path));␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ }␊ ␊ if (relPath.endsWith('/..')) {␊ @@ -2957,22 +2880,6 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - function join () {␊ - if (arguments.length === 0) return '.';␊ - var joined;␊ - for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ - if (joined === undefined)␊ - joined = arg;␊ - else␊ - joined += '/' + arg;␊ - }␊ - }␊ - if (joined === undefined) return '.';␊ - return joined;␊ - }␊ - ␊ var main = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ @@ -7184,46 +7091,3 @@ Generated by [AVA](https://avajs.dev). module.exports = main;␊ `, } - -## 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 = {};␊ - ␊ - var throws = {};␊ - ␊ - var hasRequiredThrows;␊ - ␊ - function requireThrows () {␊ - if (hasRequiredThrows) return throws;␊ - hasRequiredThrows = 1;␊ - throw new Error('This should not be executed');␊ - }␊ - ␊ - var hasRequiredDep;␊ - ␊ - 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 f09c75457080c1951f53bd791fedb6baa72e3c78..ac9d53cf63e771a1e25d1da373dbfcde4db7d37f 100644 GIT binary patch literal 20550 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 diff --git a/packages/commonjs/test/types.ts b/packages/commonjs/test/types.ts index d91cebfba..67439d3cf 100644 --- a/packages/commonjs/test/types.ts +++ b/packages/commonjs/test/types.ts @@ -21,6 +21,7 @@ const config: RollupOptions = { transformMixedEsModules: false, ignore: ['conditional-runtime-dependency'], dynamicRequireTargets: ['node_modules/logform/*.js'], + dynamicRequireRoot: 'node_modules', strictRequires: ['node_modules/foo/*.js'] }) ] diff --git a/packages/commonjs/types/index.d.ts b/packages/commonjs/types/index.d.ts index 3337ed6ee..febae890d 100644 --- a/packages/commonjs/types/index.d.ts +++ b/packages/commonjs/types/index.d.ts @@ -218,6 +218,13 @@ interface RollupCommonJSOptions { * replacing strings like `"/Users/John/Desktop/foo-project/"` -> `"/"`. */ dynamicRequireTargets?: string | ReadonlyArray; + /** + * To avoid long paths when using the `dynamicRequireTargets` option, you can use this option to specify a directory + * that is a common parent for all files that use dynamic require statements. Using a directory higher up such as `/` + * may lead to unnecessarily long paths in the generated code and may expose directory names on your machine like your + * home directory name. By default it uses the current working directory. + */ + dynamicRequireRoot?: string; } /**