From 8937563b758794821e3b55b0e0ca756e095dd374 Mon Sep 17 00:00:00 2001 From: Daniel Cohen Gindi Date: Fri, 9 Oct 2020 00:00:45 +0300 Subject: [PATCH] fix(commonjs): fixed access to node_modules dynamic module with subfolder (i.e 'logform/json') --- packages/commonjs/src/transform.js | 2 +- .../dynamic-require-slash-access/_config.js | 16 ++ .../dynamic-require-slash-access/index.js | 1 + .../dynamic-require-slash-access/main.js | 14 ++ .../node_modules/custom-module/index.js | 1 + .../node_modules/custom-module2/sub.js | 1 + .../dynamic-require-slash-access/sub/index.js | 1 + .../dynamic-require-slash-access/sub/sub.js | 10 + .../commonjs/test/snapshots/function.js.md | 200 ++++++++++++++++++ .../commonjs/test/snapshots/function.js.snap | Bin 12218 -> 12356 bytes 10 files changed, 245 insertions(+), 1 deletion(-) create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-slash-access/_config.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-slash-access/index.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-slash-access/main.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-slash-access/node_modules/custom-module/index.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-slash-access/node_modules/custom-module2/sub.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-slash-access/sub/index.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-slash-access/sub/sub.js diff --git a/packages/commonjs/src/transform.js b/packages/commonjs/src/transform.js index 93e727481..db8cc18f4 100644 --- a/packages/commonjs/src/transform.js +++ b/packages/commonjs/src/transform.js @@ -254,7 +254,7 @@ export function transformCommonjs( } function hasDynamicModuleForPath(source) { - if (!/[/\\]/.test(source)) { + if (!/^(?:\.{0,2}[/\\]|[A-Za-z]:[/\\])/.test(source)) { try { const resolvedPath = normalizePathSlashes( nodeResolveSync(source, { basedir: dirname(id) }) diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/_config.js b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/_config.js new file mode 100755 index 000000000..013229479 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/_config.js @@ -0,0 +1,16 @@ +const { nodeResolve } = require('@rollup/plugin-node-resolve'); + +module.exports = { + description: 'resolves imports of node_modules module with halfway / subfolder access', + options: { + plugins: [nodeResolve()] + }, + pluginOptions: { + dynamicRequireTargets: [ + 'fixtures/function/dynamic-require-slash-access', + 'fixtures/function/dynamic-require-slash-access/sub', + 'fixtures/function/dynamic-require-slash-access/node_modules/custom-module', + 'fixtures/function/dynamic-require-slash-access/node_modules/custom-module2/*.js' + ] + } +}; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/index.js b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/index.js new file mode 100755 index 000000000..496245dfd --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/index.js @@ -0,0 +1 @@ +module.exports = 'same-directory'; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/main.js b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/main.js new file mode 100755 index 000000000..989622c67 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/main.js @@ -0,0 +1,14 @@ +/* eslint-disable import/no-dynamic-require, global-require */ + +function takeModule(name) { + return require(name); +} + +t.is(takeModule('.'), 'same-directory'); +t.is(takeModule('./'), 'same-directory'); +t.is(takeModule('.//'), 'same-directory'); + +t.is(takeModule('./sub'), 'sub'); + +t.is(takeModule('custom-module'), 'custom-module + sub'); +t.deepEqual(require('./sub/sub'), { parent: 'same-directory', customModule: 'custom-module' }); diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/node_modules/custom-module/index.js b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/node_modules/custom-module/index.js new file mode 100755 index 000000000..26ecfeb0b --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/node_modules/custom-module/index.js @@ -0,0 +1 @@ +module.exports = 'custom-module' + ' + ' + require('custom-module2/sub'); diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/node_modules/custom-module2/sub.js b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/node_modules/custom-module2/sub.js new file mode 100755 index 000000000..e74342ce6 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/node_modules/custom-module2/sub.js @@ -0,0 +1 @@ +module.exports = 'sub'; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/sub/index.js b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/sub/index.js new file mode 100755 index 000000000..e74342ce6 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/sub/index.js @@ -0,0 +1 @@ +module.exports = 'sub'; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/sub/sub.js b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/sub/sub.js new file mode 100755 index 000000000..a401d8f73 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/sub/sub.js @@ -0,0 +1,10 @@ +/* eslint-disable import/no-dynamic-require, global-require */ + +function takeModule(name) { + return require(name); +} + +module.exports = { + parent: takeModule('..'), + customModule: takeModule('custom-module') +}; diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index 05c8098dd..df9d83977 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -2750,6 +2750,206 @@ Generated by [AVA](https://avajs.dev). `, } +## dynamic-require-slash-access + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ + ␊ + function commonjsRegister (path, loader) {␊ + DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ + }␊ + ␊ + const DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ + const DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ + const DEFAULT_PARENT_MODULE = {␊ + id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ + };␊ + const CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ + ␊ + function normalize (path) {␊ + path = path.replace(/\\\\/g, '/');␊ + const parts = path.split('/');␊ + const slashed = parts[0] === '';␊ + for (let i = 1; i < parts.length; i++) {␊ + if (parts[i] === '.' || parts[i] === '') {␊ + parts.splice(i--, 1);␊ + }␊ + }␊ + for (let 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;␊ + }␊ + ␊ + function join () {␊ + if (arguments.length === 0)␊ + return '.';␊ + let joined;␊ + for (let i = 0; i < arguments.length; ++i) {␊ + let arg = arguments[i];␊ + if (arg.length > 0) {␊ + if (joined === undefined)␊ + joined = arg;␊ + else␊ + joined += '/' + arg;␊ + }␊ + }␊ + if (joined === undefined)␊ + return '.';␊ + ␊ + return joined;␊ + }␊ + ␊ + function isPossibleNodeModulesPath (modulePath) {␊ + let c0 = modulePath[0];␊ + if (c0 === '/' || c0 === '\\\\') return false;␊ + let 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 dirname (path) {␊ + if (path.length === 0)␊ + return '.';␊ + ␊ + let i = path.length - 1;␊ + while (i > 0) {␊ + const c = path.charCodeAt(i);␊ + if ((c === 47 || c === 92) && i !== path.length - 1)␊ + break;␊ + i--;␊ + }␊ + ␊ + if (i > 0)␊ + return path.substr(0, i);␊ + ␊ + if (path.chartCodeAt(0) === 47 || path.chartCodeAt(0) === 92)␊ + return path.charAt(0);␊ + ␊ + return '.';␊ + }␊ + ␊ + function commonjsRequire (path, originalModuleDir) {␊ + const shouldTryNodeModules = isPossibleNodeModulesPath(path);␊ + path = normalize(path);␊ + let relPath;␊ + while (true) {␊ + if (!shouldTryNodeModules) {␊ + relPath = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ + } else if (originalModuleDir) {␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + } else {␊ + relPath = normalize(join('node_modules', path));␊ + }␊ + for (let extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ + const resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ + let cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ + if (cachedModule) return cachedModule.exports;␊ + const loader = DYNAMIC_REQUIRE_LOADERS[resolvedPath];␊ + if (loader) {␊ + DYNAMIC_REQUIRE_CACHE[resolvedPath] = cachedModule = {␊ + id: resolvedPath,␊ + filename: resolvedPath,␊ + path: dirname(resolvedPath),␊ + exports: {},␊ + parent: DEFAULT_PARENT_MODULE,␊ + loaded: false,␊ + children: [],␊ + paths: [],␊ + require: function (path, base) {␊ + return commonjsRequire(path, (base === undefined || base === null) ? cachedModule.path : base);␊ + }␊ + };␊ + try {␊ + loader.call(commonjsGlobal, cachedModule, cachedModule.exports);␊ + } catch (error) {␊ + delete DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ + throw error;␊ + }␊ + cachedModule.loaded = true;␊ + return cachedModule.exports;␊ + } }␊ + if (!shouldTryNodeModules) break;␊ + const nextDir = normalize(originalModuleDir + '/..');␊ + if (nextDir === originalModuleDir) break;␊ + originalModuleDir = nextDir;␊ + }␊ + return require(path);␊ + }␊ + ␊ + commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ + ␊ + var dynamicRequireSlashAccess = 'same-directory';␊ + ␊ + var sub = 'sub';␊ + ␊ + var customModule = 'custom-module' + ' + ' + commonjsRequire("custom-module2/sub", "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/node_modules/custom-module");␊ + ␊ + commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/node_modules/custom-module2/sub.js", function (module, exports) {␊ + module.exports = 'sub';␊ + ␊ + });␊ + ␊ + commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-slash-access", function (module, exports) {␊ + module.exports = dynamicRequireSlashAccess;␊ + });␊ + commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/sub", function (module, exports) {␊ + module.exports = sub;␊ + });␊ + commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/node_modules/custom-module", function (module, exports) {␊ + module.exports = customModule;␊ + });␊ + ␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ + ␊ + function takeModule(name) {␊ + return commonjsRequire(name,"/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/sub");␊ + }␊ + ␊ + var sub$1 = {␊ + parent: takeModule('..'),␊ + customModule: takeModule('custom-module')␊ + };␊ + ␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ + ␊ + function takeModule$1(name) {␊ + return commonjsRequire(name,"/$$rollup_base$$/fixtures/function/dynamic-require-slash-access");␊ + }␊ + ␊ + t.is(takeModule$1('.'), 'same-directory');␊ + t.is(takeModule$1('./'), 'same-directory');␊ + t.is(takeModule$1('.//'), 'same-directory');␊ + ␊ + t.is(takeModule$1('./sub'), 'sub');␊ + ␊ + t.is(takeModule$1('custom-module'), 'custom-module + sub');␊ + t.deepEqual(sub$1, { parent: 'same-directory', customModule: 'custom-module' });␊ + ␊ + var main = {␊ + ␊ + };␊ + ␊ + module.exports = main;␊ + `, + } + ## es6-export-with-global-sniffing > Snapshot 1 diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index 9503cbcd6c5d95ef811d4426279092a9f3a3a871..f159e63c2383e6265772bfb4236d0a361992b269 100644 GIT binary patch literal 12356 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 literal 12218 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 n;o9R318vo>#9gDy8yEcX*fx*(iR=