From 681cd8c0f5fd1366aa5e5500fc3779d6824ae6ff Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Tue, 21 Sep 2021 21:06:38 +0200 Subject: [PATCH 01/22] fix(commonjs): attach correct plugin meta-data to commonjs modules (#1038) --- packages/commonjs/README.md | 11 +++++++ packages/commonjs/package.json | 2 +- packages/commonjs/src/generate-imports.js | 14 ++------ packages/commonjs/src/helpers.js | 1 - packages/commonjs/src/index.js | 18 ++++------ packages/commonjs/src/is-cjs.js | 27 --------------- packages/commonjs/src/proxies.js | 15 +++++---- packages/commonjs/src/resolve-id.js | 31 ++++++++++-------- packages/commonjs/src/transform-commonjs.js | 13 +++----- .../form/constant-template-literal/output.js | 1 - .../output.js | 2 +- .../form/ignore-ids-function/output.js | 1 - .../test/fixtures/form/ignore-ids/output.js | 1 - .../multi-entry-module-exports/output1.js | 1 - .../multiple-var-declarations-b/output.js | 1 - .../multiple-var-declarations-c/output.js | 1 - .../form/multiple-var-declarations/output.js | 2 -- .../fixtures/form/no-exports-entry/output.js | 1 - .../fixtures/form/require-collision/output.js | 1 - .../unambiguous-with-default-export/output.js | 1 - .../form/unambiguous-with-import/output.js | 1 - .../unambiguous-with-named-export/output.js | 1 - .../module-meta-properties/_config.js | 27 +++++++++++++++ .../function/module-meta-properties/dep.js | 1 + .../function/module-meta-properties/main.js | 3 ++ .../commonjs/test/snapshots/function.js.md | 21 ++++++++++++ .../commonjs/test/snapshots/function.js.snap | Bin 19344 -> 19289 bytes packages/commonjs/types/index.d.ts | 18 ++++++++++ 28 files changed, 122 insertions(+), 95 deletions(-) delete mode 100644 packages/commonjs/src/is-cjs.js create mode 100644 packages/commonjs/test/fixtures/function/module-meta-properties/_config.js create mode 100644 packages/commonjs/test/fixtures/function/module-meta-properties/dep.js create mode 100644 packages/commonjs/test/fixtures/function/module-meta-properties/main.js diff --git a/packages/commonjs/README.md b/packages/commonjs/README.md index 073cb735e..09e82a8e7 100644 --- a/packages/commonjs/README.md +++ b/packages/commonjs/README.md @@ -113,6 +113,17 @@ Default: `false` Instructs the plugin whether to enable mixed module transformations. This is useful in scenarios with modules that contain a mix of ES `import` statements and CommonJS `require` expressions. Set to `true` if `require` calls should be transformed to imports in mixed modules, or `false` if the `require` expressions should survive the transformation. The latter can be important if the code contains environment detection, or you are coding for an environment with special treatment for `require` calls such as [ElectronJS](https://www.electronjs.org/). See also the "ignore" option. +### `strictRequireSemantic` + +Type: `boolean | string | string[]`
+Default: `false` + +By default, this plugin will try to hoist all `require` statements as imports to the top of each file. While this works well for many code bases and allows for very efficient ESM output, it does not perfectly capture CommonJS semantics. This is especially problematic when there are circular `require` calls between CommonJS modules as those often rely on the lazy execution of nested `require` calls. + +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 a small impact on the size and performance of the generated code. + +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. + ### `ignore` Type: `string[] | ((id: string) => boolean)`
diff --git a/packages/commonjs/package.json b/packages/commonjs/package.json index a93b7ecf6..ca6f51bed 100644 --- a/packages/commonjs/package.json +++ b/packages/commonjs/package.json @@ -47,7 +47,7 @@ "require" ], "peerDependencies": { - "rollup": "^2.38.3" + "rollup": "^2.61.1" }, "dependencies": { "@rollup/pluginutils": "^3.1.0", diff --git a/packages/commonjs/src/generate-imports.js b/packages/commonjs/src/generate-imports.js index a39ac5977..187572c6a 100644 --- a/packages/commonjs/src/generate-imports.js +++ b/packages/commonjs/src/generate-imports.js @@ -2,14 +2,7 @@ import { dirname, resolve } from 'path'; import { sync as nodeResolveSync } from 'resolve'; -import { - EXPORTS_SUFFIX, - HELPERS_ID, - MODULE_SUFFIX, - PROXY_SUFFIX, - REQUIRE_SUFFIX, - wrapId -} from './helpers'; +import { EXPORTS_SUFFIX, HELPERS_ID, MODULE_SUFFIX, PROXY_SUFFIX, wrapId } from './helpers'; import { normalizePathSlashes } from './utils'; export function isRequireStatement(node, scope) { @@ -153,12 +146,9 @@ export function getRequireHandlers() { ); } for (const source of dynamicRegisterSources) { - imports.push(`import ${JSON.stringify(wrapId(source, REQUIRE_SUFFIX))};`); + imports.push(`import ${JSON.stringify(source)};`); } for (const source of requiredSources) { - if (!source.startsWith('\0')) { - imports.push(`import ${JSON.stringify(wrapId(source, REQUIRE_SUFFIX))};`); - } const { name, nodesUsingRequired } = requiredBySource[source]; imports.push( `import ${nodesUsingRequired.length ? `${name} from ` : ''}${JSON.stringify( diff --git a/packages/commonjs/src/helpers.js b/packages/commonjs/src/helpers.js index b358a9d0c..94f6c5719 100644 --- a/packages/commonjs/src/helpers.js +++ b/packages/commonjs/src/helpers.js @@ -3,7 +3,6 @@ export const wrapId = (id, suffix) => `\0${id}${suffix}`; export const unwrapId = (wrappedId, suffix) => wrappedId.slice(1, -suffix.length); export const PROXY_SUFFIX = '?commonjs-proxy'; -export const REQUIRE_SUFFIX = '?commonjs-require'; export const EXTERNAL_SUFFIX = '?commonjs-external'; export const EXPORTS_SUFFIX = '?commonjs-exports'; export const MODULE_SUFFIX = '?commonjs-module'; diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index 1a6abfc37..66e312bb3 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -26,7 +26,6 @@ import { PROXY_SUFFIX, unwrapId } from './helpers'; -import { setCommonJSMetaPromise } from './is-cjs'; import { hasCjsKeywords } from './parse'; import { getDynamicJsonProxy, @@ -43,6 +42,12 @@ import { getName, getVirtualPathForDynamicRequirePath, normalizePathSlashes } fr export default function commonjs(options = {}) { const extensions = options.extensions || ['.js']; const filter = createFilter(options.include, options.exclude); + const strictRequireSemanticFilter = + options.strictRequireSemantic === true + ? () => true + : !options.strictRequireSemantic + ? () => false + : createFilter(options.strictRequireSemantic); const { ignoreGlobal, ignoreDynamicRequires, @@ -77,7 +82,6 @@ export default function commonjs(options = {}) { const esModulesWithDefaultExport = new Set(); const esModulesWithNamedExports = new Set(); - const commonJsMetaPromises = new Map(); const ignoreRequire = typeof options.ignore === 'function' @@ -248,7 +252,7 @@ export default function commonjs(options = {}) { getRequireReturnsDefault(actualId), esModulesWithDefaultExport, esModulesWithNamedExports, - commonJsMetaPromises + this.load ); } @@ -277,14 +281,6 @@ export default function commonjs(options = {}) { } catch (err) { return this.error(err, err.loc); } - }, - - moduleParsed({ id, meta: { commonjs: commonjsMeta } }) { - if (commonjsMeta && commonjsMeta.isCommonJS != null) { - setCommonJSMetaPromise(commonJsMetaPromises, id, commonjsMeta); - return; - } - setCommonJSMetaPromise(commonJsMetaPromises, id, null); } }; } diff --git a/packages/commonjs/src/is-cjs.js b/packages/commonjs/src/is-cjs.js deleted file mode 100644 index 8c88f09fa..000000000 --- a/packages/commonjs/src/is-cjs.js +++ /dev/null @@ -1,27 +0,0 @@ -export function getCommonJSMetaPromise(commonJSMetaPromises, id) { - let commonJSMetaPromise = commonJSMetaPromises.get(id); - if (commonJSMetaPromise) return commonJSMetaPromise.promise; - - const promise = new Promise((resolve) => { - commonJSMetaPromise = { - resolve, - promise: null - }; - commonJSMetaPromises.set(id, commonJSMetaPromise); - }); - commonJSMetaPromise.promise = promise; - - return promise; -} - -export function setCommonJSMetaPromise(commonJSMetaPromises, id, commonjsMeta) { - const commonJSMetaPromise = commonJSMetaPromises.get(id); - if (commonJSMetaPromise) { - if (commonJSMetaPromise.resolve) { - commonJSMetaPromise.resolve(commonjsMeta); - commonJSMetaPromise.resolve = null; - } - } else { - commonJSMetaPromises.set(id, { promise: Promise.resolve(commonjsMeta), resolve: null }); - } -} diff --git a/packages/commonjs/src/proxies.js b/packages/commonjs/src/proxies.js index f8050bc6a..125a3d5f3 100644 --- a/packages/commonjs/src/proxies.js +++ b/packages/commonjs/src/proxies.js @@ -1,7 +1,6 @@ import { readFileSync } from 'fs'; import { DYNAMIC_JSON_PREFIX, HELPERS_ID } from './helpers'; -import { getCommonJSMetaPromise } from './is-cjs'; import { getName, getVirtualPathForDynamicRequirePath, normalizePathSlashes } from './utils'; // e.g. id === "commonjsHelpers?commonjsRegister" @@ -16,11 +15,11 @@ export function getUnknownRequireProxy(id, requireReturnsDefault) { const name = getName(id); const exported = requireReturnsDefault === 'auto' - ? `import {getDefaultExportFromNamespaceIfNotNamed} from "${HELPERS_ID}"; export default /*@__PURE__*/getDefaultExportFromNamespaceIfNotNamed(${name});` + ? `import { getDefaultExportFromNamespaceIfNotNamed } from "${HELPERS_ID}"; export default /*@__PURE__*/getDefaultExportFromNamespaceIfNotNamed(${name});` : requireReturnsDefault === 'preferred' - ? `import {getDefaultExportFromNamespaceIfPresent} from "${HELPERS_ID}"; export default /*@__PURE__*/getDefaultExportFromNamespaceIfPresent(${name});` + ? `import { getDefaultExportFromNamespaceIfPresent } from "${HELPERS_ID}"; export default /*@__PURE__*/getDefaultExportFromNamespaceIfPresent(${name});` : !requireReturnsDefault - ? `import {getAugmentedNamespace} from "${HELPERS_ID}"; export default /*@__PURE__*/getAugmentedNamespace(${name});` + ? `import { getAugmentedNamespace } from "${HELPERS_ID}"; export default /*@__PURE__*/getAugmentedNamespace(${name});` : `export default ${name};`; return `import * as ${name} from ${JSON.stringify(id)}; ${exported}`; } @@ -47,13 +46,15 @@ export async function getStaticRequireProxy( requireReturnsDefault, esModulesWithDefaultExport, esModulesWithNamedExports, - commonJsMetaPromises + loadModule ) { const name = getName(id); - const commonjsMeta = await getCommonJSMetaPromise(commonJsMetaPromises, id); + const { + meta: { commonjs: commonjsMeta } + } = await loadModule({ id }); if (commonjsMeta && commonjsMeta.isCommonJS) { return `export { __moduleExports as default } from ${JSON.stringify(id)};`; - } else if (commonjsMeta === null) { + } else if (!commonjsMeta) { return getUnknownRequireProxy(id, requireReturnsDefault); } else if (!requireReturnsDefault) { return `import { getAugmentedNamespace } from "${HELPERS_ID}"; import * as ${name} from ${JSON.stringify( diff --git a/packages/commonjs/src/resolve-id.js b/packages/commonjs/src/resolve-id.js index c22fe98b7..3a3b9a00a 100644 --- a/packages/commonjs/src/resolve-id.js +++ b/packages/commonjs/src/resolve-id.js @@ -13,7 +13,6 @@ import { isWrappedId, MODULE_SUFFIX, PROXY_SUFFIX, - REQUIRE_SUFFIX, unwrapId, wrapId } from './helpers'; @@ -66,14 +65,11 @@ export default function getResolveId(extensions) { } const isProxyModule = isWrappedId(importee, PROXY_SUFFIX); - const isRequiredModule = isWrappedId(importee, REQUIRE_SUFFIX); let isModuleRegistration = false; if (isProxyModule) { importee = unwrapId(importee, PROXY_SUFFIX); - } else if (isRequiredModule) { - importee = unwrapId(importee, REQUIRE_SUFFIX); - + } else { isModuleRegistration = isWrappedId(importee, DYNAMIC_REGISTER_SUFFIX); if (isModuleRegistration) { importee = unwrapId(importee, DYNAMIC_REGISTER_SUFFIX); @@ -98,20 +94,29 @@ export default function getResolveId(extensions) { Object.assign({}, resolveOptions, { skipSelf: true, custom: Object.assign({}, resolveOptions.custom, { - 'node-resolve': { isRequire: isProxyModule || isRequiredModule } + 'node-resolve': { isRequire: isProxyModule || isModuleRegistration } }) }) ).then((resolved) => { if (!resolved) { resolved = resolveExtensions(importee, importer); } - if (resolved && isProxyModule) { - resolved.id = wrapId(resolved.id, resolved.external ? EXTERNAL_SUFFIX : PROXY_SUFFIX); - resolved.external = false; - } else if (resolved && isModuleRegistration) { - resolved.id = wrapId(resolved.id, DYNAMIC_REGISTER_SUFFIX); - } else if (!resolved && (isProxyModule || isRequiredModule)) { - return { id: wrapId(importee, EXTERNAL_SUFFIX), external: false }; + if (isProxyModule) { + if (!resolved || resolved.external) { + return { + id: wrapId(resolved ? resolved.id : importee, EXTERNAL_SUFFIX), + external: false + }; + } + // This will make sure meta properties in "resolved" are correctly attached to the module + this.load(resolved); + return { + id: wrapId(resolved.id, PROXY_SUFFIX), + external: false + }; + } + if (resolved && isModuleRegistration) { + return { id: wrapId(resolved.id, DYNAMIC_REGISTER_SUFFIX), external: false }; } return resolved; }); diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index a86041c63..7698bf9f4 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -82,11 +82,8 @@ export default function transformCommonjs( const dynamicRegisterSources = new Set(); let hasRemovedRequire = false; - const { - addRequireStatement, - requiredSources, - rewriteRequireExpressionsAndGetImportBlock - } = getRequireHandlers(); + const { addRequireStatement, requiredSources, rewriteRequireExpressionsAndGetImportBlock } = + getRequireHandlers(); // See which names are assigned to. This is necessary to prevent // illegally replacing `var foo = require('foo')` with `import foo from 'foo'`, @@ -235,10 +232,8 @@ export default function transformCommonjs( let shouldRemoveRequireStatement = false; if (currentTryBlockEnd !== null) { - ({ - canConvertRequire, - shouldRemoveRequireStatement - } = getIgnoreTryCatchRequireStatementMode(node.arguments[0].value)); + ({ canConvertRequire, shouldRemoveRequireStatement } = + getIgnoreTryCatchRequireStatementMode(node.arguments[0].value)); if (shouldRemoveRequireStatement) { hasRemovedRequire = true; diff --git a/packages/commonjs/test/fixtures/form/constant-template-literal/output.js b/packages/commonjs/test/fixtures/form/constant-template-literal/output.js index ec6ef23c9..96927381c 100644 --- a/packages/commonjs/test/fixtures/form/constant-template-literal/output.js +++ b/packages/commonjs/test/fixtures/form/constant-template-literal/output.js @@ -1,6 +1,5 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __exports as input } from "\u0000fixtures/form/constant-template-literal/input.js?commonjs-exports" -import "\u0000tape?commonjs-require"; import require$$0 from "\u0000tape?commonjs-proxy"; var foo = require$$0; diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-reassign-exports-no-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-reassign-exports-no-__esModule/output.js index ac266b81e..a0c3ed4d7 100644 --- a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-reassign-exports-no-__esModule/output.js +++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-reassign-exports-no-__esModule/output.js @@ -3,4 +3,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; var input = { default: { foo: 'bar' }} export default input; -export { input as __moduleExports }; \ No newline at end of file +export { input as __moduleExports }; diff --git a/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js b/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js index 8e03d7deb..496cc2ba8 100644 --- a/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js +++ b/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js @@ -1,6 +1,5 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __exports as input } from "\u0000fixtures/form/ignore-ids-function/input.js?commonjs-exports" -import "\u0000bar?commonjs-require"; import require$$0 from "\u0000bar?commonjs-proxy"; var foo = require( 'foo' ); diff --git a/packages/commonjs/test/fixtures/form/ignore-ids/output.js b/packages/commonjs/test/fixtures/form/ignore-ids/output.js index 278e805a2..0df09cce8 100644 --- a/packages/commonjs/test/fixtures/form/ignore-ids/output.js +++ b/packages/commonjs/test/fixtures/form/ignore-ids/output.js @@ -1,6 +1,5 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __exports as input } from "\u0000fixtures/form/ignore-ids/input.js?commonjs-exports" -import "\u0000bar?commonjs-require"; import require$$0 from "\u0000bar?commonjs-proxy"; var foo = require( 'foo' ); diff --git a/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js index 7cf227a40..060d12a53 100644 --- a/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js +++ b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import "\u0000./input2.js?commonjs-require"; import require$$0 from "\u0000./input2.js?commonjs-proxy"; const t2 = require$$0; diff --git a/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js b/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js index 2537be812..7fc075484 100644 --- a/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js +++ b/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js @@ -1,6 +1,5 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations-b/input.js?commonjs-exports" -import "\u0000./a?commonjs-require"; import require$$0 from "\u0000./a?commonjs-proxy"; var a = require$$0 diff --git a/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js b/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js index 0e9886246..e8542c6c5 100644 --- a/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js +++ b/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js @@ -1,6 +1,5 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations-c/input.js?commonjs-exports" -import "\u0000./b?commonjs-require"; import require$$0 from "\u0000./b?commonjs-proxy"; var a = 'a' diff --git a/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js b/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js index 275bd35b0..a7de41c4b 100644 --- a/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js +++ b/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js @@ -1,8 +1,6 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations/input.js?commonjs-exports" -import "\u0000./a?commonjs-require"; import require$$0 from "\u0000./a?commonjs-proxy"; -import "\u0000./b?commonjs-require"; import require$$1 from "\u0000./b?commonjs-proxy"; var a = require$$0() diff --git a/packages/commonjs/test/fixtures/form/no-exports-entry/output.js b/packages/commonjs/test/fixtures/form/no-exports-entry/output.js index b9a72362d..45a5c8495 100644 --- a/packages/commonjs/test/fixtures/form/no-exports-entry/output.js +++ b/packages/commonjs/test/fixtures/form/no-exports-entry/output.js @@ -1,6 +1,5 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __exports as input_1 } from "\u0000fixtures/form/no-exports-entry/input.js?commonjs-exports" -import "\u0000./dummy?commonjs-require"; import require$$0 from "\u0000./dummy?commonjs-proxy"; var dummy = require$$0; diff --git a/packages/commonjs/test/fixtures/form/require-collision/output.js b/packages/commonjs/test/fixtures/form/require-collision/output.js index ff0f5b1ba..401ca324b 100644 --- a/packages/commonjs/test/fixtures/form/require-collision/output.js +++ b/packages/commonjs/test/fixtures/form/require-collision/output.js @@ -1,6 +1,5 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __exports as input } from "\u0000fixtures/form/require-collision/input.js?commonjs-exports" -import "\u0000foo?commonjs-require"; import require$$1 from "\u0000foo?commonjs-proxy"; (function() { diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js index fb8c36ea6..00f1c462a 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js @@ -1,6 +1,5 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __exports as input } from "\u0000fixtures/form/unambiguous-with-default-export/input.js?commonjs-exports" -import "\u0000./foo.js?commonjs-require"; import "\u0000./foo.js?commonjs-proxy"; export default {}; diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js index 2b859d8d7..b045cc0bd 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js @@ -1,6 +1,5 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __exports as input } from "\u0000fixtures/form/unambiguous-with-import/input.js?commonjs-exports" -import "\u0000./foo.js?commonjs-require"; import "\u0000./foo.js?commonjs-proxy"; import './bar.js'; diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js index 98d732a34..bfa3f4e51 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js @@ -1,6 +1,5 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __exports as input } from "\u0000fixtures/form/unambiguous-with-named-export/input.js?commonjs-exports" -import "\u0000./foo.js?commonjs-require"; import "\u0000./foo.js?commonjs-proxy"; export {}; diff --git a/packages/commonjs/test/fixtures/function/module-meta-properties/_config.js b/packages/commonjs/test/fixtures/function/module-meta-properties/_config.js new file mode 100644 index 000000000..63b09ffad --- /dev/null +++ b/packages/commonjs/test/fixtures/function/module-meta-properties/_config.js @@ -0,0 +1,27 @@ +module.exports = { + description: 'preserves meta properties attached to modules by resolvers', + options: { + plugins: [ + { + async resolveId(source, importer, options) { + if (source.endsWith('dep.js')) { + return { + ...(await this.resolve(source, importer, { skipSelf: true, ...options })), + meta: { test: 'provided' } + }; + } + return null; + }, + moduleParsed({ id, meta: { test } }) { + if (id.endsWith('dep.js')) { + if (test !== 'provided') { + throw new Error(`Meta property missing for ${id}.`); + } + } else if (test === 'provided') { + throw new Error(`Meta property was unexpectedly added to ${id}.`); + } + } + } + ] + } +}; diff --git a/packages/commonjs/test/fixtures/function/module-meta-properties/dep.js b/packages/commonjs/test/fixtures/function/module-meta-properties/dep.js new file mode 100644 index 000000000..94ecacb72 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/module-meta-properties/dep.js @@ -0,0 +1 @@ +exports.foo = 'foo'; diff --git a/packages/commonjs/test/fixtures/function/module-meta-properties/main.js b/packages/commonjs/test/fixtures/function/module-meta-properties/main.js new file mode 100644 index 000000000..ccf2c9e41 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/module-meta-properties/main.js @@ -0,0 +1,3 @@ +const dep = require('./dep.js'); + +t.is(dep.foo, 'foo'); diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index 1b9a679b2..39078a541 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -7956,3 +7956,24 @@ Generated by [AVA](https://avajs.dev). module.exports = main;␊ `, } + +## module-meta-properties + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var dep$1 = {};␊ + ␊ + dep$1.foo = 'foo';␊ + ␊ + const dep = dep$1;␊ + ␊ + t.is(dep.foo, 'foo');␊ + ␊ + module.exports = main;␊ + `, + } diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index c0d62a8ac68216740e33a11e525ef87a4bc0e32c..0a4924df3982b8e9748ecd319f2812f84995a7f7 100644 GIT binary patch literal 19289 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 boolean` function. From f55ba9647e86e04c6559f161f78bd8a399b1c576 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Thu, 28 Oct 2021 08:56:52 +0200 Subject: [PATCH 02/22] feat(commonjs): reimplement dynamic import handling (requires Node 12, no longer supports require.cache) (#1038) BREAKING CHANGES: requires Node 12 No longer supports require.cache --- packages/commonjs/package.json | 2 +- packages/commonjs/src/dynamic-modules.js | 144 + .../commonjs/src/dynamic-packages-manager.js | 56 - .../commonjs/src/dynamic-require-paths.js | 27 +- packages/commonjs/src/generate-exports.js | 38 +- packages/commonjs/src/generate-imports.js | 119 +- packages/commonjs/src/helpers.js | 222 +- packages/commonjs/src/index.js | 203 +- packages/commonjs/src/proxies.js | 30 +- packages/commonjs/src/resolve-id.js | 127 +- packages/commonjs/src/transform-commonjs.js | 195 +- packages/commonjs/src/utils.js | 4 + .../form/constant-template-literal/output.js | 6 +- .../output.js | 3 +- .../output.js | 3 +- .../output.js | 3 +- .../output.js | 3 +- .../output.js | 3 +- .../form/dynamic-template-literal/output.js | 6 +- .../form/ignore-ids-function/output.js | 6 +- .../test/fixtures/form/ignore-ids/output.js | 6 +- .../multi-entry-module-exports/output1.js | 3 +- .../multiple-var-declarations-b/output.js | 6 +- .../multiple-var-declarations-c/output.js | 6 +- .../form/multiple-var-declarations/output.js | 8 +- .../fixtures/form/no-exports-entry/output.js | 6 +- .../form/node-require-methods/output.js | 4 +- .../output.js | 3 +- .../form/optimised-named-export/output.js | 3 +- .../fixtures/form/require-collision/output.js | 6 +- .../fixtures/form/try-catch-remove/output.js | 4 +- .../unambiguous-with-default-export/output.js | 3 +- .../form/unambiguous-with-import/output.js | 3 +- .../unambiguous-with-named-export/output.js | 3 +- .../function/cjs-extension/_config.js | 3 + .../cjs-extension/export.cjs | 0 .../cjs-extension/main.js | 2 +- .../function/custom-options/_config.js | 4 +- .../fixtures/function/custom-options/main.js | 2 +- .../fixtures/function/custom-options/other.js | 2 +- .../dynamic-module-require/_config.js | 2 + .../_config.js | 2 + .../_config.js | 21 + .../dynamic-require-different-loader/main.js | 1 + .../submodule1.js | 0 .../submodule2.js | 0 .../_config.js | 7 + .../importer.js | 7 + .../dynamic-require-es-mixed-helpers/main.js | 2 - .../submodule.js | 2 + .../dynamic-require-root-circular/_config.js | 2 +- .../dynamic-require-slash-access/_config.js | 3 - .../dynamic-require-slash-access/main.js | 10 +- .../no-default-export-live-binding/_config.js | 3 - .../no-default-export-live-binding/dep1.js | 4 - .../no-default-export-live-binding/dep2.js | 2 - .../no-default-export-live-binding/dep3.js | 2 - .../no-default-export-live-binding/main.js | 15 - .../fixtures/function/reassign-module/main.js | 8 +- .../function/shorthand-require/_config.js | 3 + .../shorthand-require/main.js | 0 .../_config.js | 6 + .../assignExports.js | 2 + .../compiledEsm.js | 4 + .../main.js | 17 + .../reassignModuleExports.js | 3 + .../function/typeof-module-require/foo.js | 4 +- .../function/typeof-module-require/main.js | 2 +- .../unresolved-dependencies/_config.js | 9 +- .../dynamic-require-different-loader/main.js | 1 - .../dynamic-require-double-wrap/main.js | 1 - .../dynamic-require-double-wrap/submodule.js | 3 - .../importer.js | 2 - .../submodule.js | 1 - packages/commonjs/test/form.js | 111 +- .../commonjs/test/snapshots/function.js.md | 5145 ++++++----------- .../commonjs/test/snapshots/function.js.snap | Bin 19289 -> 17777 bytes packages/commonjs/test/snapshots/test.js.md | 19 - packages/commonjs/test/snapshots/test.js.snap | Bin 835 -> 757 bytes packages/commonjs/test/test.js | 73 - 80 files changed, 2508 insertions(+), 4268 deletions(-) create mode 100644 packages/commonjs/src/dynamic-modules.js delete mode 100644 packages/commonjs/src/dynamic-packages-manager.js create mode 100644 packages/commonjs/test/fixtures/function/cjs-extension/_config.js rename packages/commonjs/test/fixtures/{samples => function}/cjs-extension/export.cjs (100%) rename packages/commonjs/test/fixtures/{samples => function}/cjs-extension/main.js (69%) create mode 100644 packages/commonjs/test/fixtures/function/dynamic-require-different-loader/_config.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-different-loader/main.js rename packages/commonjs/test/fixtures/{samples => function}/dynamic-require-different-loader/submodule1.js (100%) rename packages/commonjs/test/fixtures/{samples => function}/dynamic-require-different-loader/submodule2.js (100%) create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/_config.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/importer.js rename packages/commonjs/test/fixtures/{samples => function}/dynamic-require-es-mixed-helpers/main.js (50%) create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/submodule.js delete mode 100644 packages/commonjs/test/fixtures/function/no-default-export-live-binding/_config.js delete mode 100644 packages/commonjs/test/fixtures/function/no-default-export-live-binding/dep1.js delete mode 100644 packages/commonjs/test/fixtures/function/no-default-export-live-binding/dep2.js delete mode 100644 packages/commonjs/test/fixtures/function/no-default-export-live-binding/dep3.js delete mode 100644 packages/commonjs/test/fixtures/function/no-default-export-live-binding/main.js create mode 100755 packages/commonjs/test/fixtures/function/shorthand-require/_config.js rename packages/commonjs/test/fixtures/{samples => function}/shorthand-require/main.js (100%) create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/assignExports.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/compiledEsm.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/reassignModuleExports.js delete mode 100755 packages/commonjs/test/fixtures/samples/dynamic-require-different-loader/main.js delete mode 100644 packages/commonjs/test/fixtures/samples/dynamic-require-double-wrap/main.js delete mode 100644 packages/commonjs/test/fixtures/samples/dynamic-require-double-wrap/submodule.js delete mode 100755 packages/commonjs/test/fixtures/samples/dynamic-require-es-mixed-helpers/importer.js delete mode 100755 packages/commonjs/test/fixtures/samples/dynamic-require-es-mixed-helpers/submodule.js diff --git a/packages/commonjs/package.json b/packages/commonjs/package.json index ca6f51bed..865e1f98f 100644 --- a/packages/commonjs/package.json +++ b/packages/commonjs/package.json @@ -16,7 +16,7 @@ "main": "dist/index.js", "module": "dist/index.es.js", "engines": { - "node": ">= 8.0.0" + "node": ">= 12.0.0" }, "scripts": { "build": "rollup -c", diff --git a/packages/commonjs/src/dynamic-modules.js b/packages/commonjs/src/dynamic-modules.js new file mode 100644 index 000000000..02b9845f3 --- /dev/null +++ b/packages/commonjs/src/dynamic-modules.js @@ -0,0 +1,144 @@ +import { getVirtualPathForDynamicRequirePath, normalizePathSlashes } from './utils'; + +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.');`; + +export function getDynamicRequireModules( + isDynamicRequireModulesEnabled, + dynamicRequireModuleSet, + commonDir, + ignoreDynamicRequires +) { + if (!isDynamicRequireModulesEnabled) { + return `export function commonjsRequire(path) { + ${FAILED_REQUIRE_ERROR} +}`; + } + const dynamicModuleIds = [...dynamicRequireModuleSet]; + const dynamicModuleImports = dynamicModuleIds + .map( + (id, index) => + `import ${ + id.endsWith('.json') ? `json${index}` : `{ __require as require${index} }` + } from ${JSON.stringify(id)};` + ) + .join('\n'); + const dynamicModuleProps = dynamicModuleIds + .map( + (id, index) => + `\t\t${JSON.stringify( + getVirtualPathForDynamicRequirePath(normalizePathSlashes(id), commonDir) + )}: ${id.endsWith('.json') ? `function () { return json${index}; }` : `require${index}`}` + ) + .join(',\n'); + return `${dynamicModuleImports} + +var dynamicModules; + +function getDynamicModules() { + return dynamicModules || (dynamicModules = { +${dynamicModuleProps} + }); +} + +export function commonjsRequire(path, originalModuleDir) { + var resolvedPath = commonjsResolveImpl(path, originalModuleDir, true); + if (resolvedPath !== null) { + return getDynamicModules()[resolvedPath](); + } + ${ignoreDynamicRequires ? 'return require(path);' : FAILED_REQUIRE_ERROR} +} + +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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path; + } else if (originalModuleDir) { + relPath = normalize(originalModuleDir + '/node_modules/' + path); + } else { + relPath = normalize(join('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; +} + +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/dynamic-packages-manager.js b/packages/commonjs/src/dynamic-packages-manager.js deleted file mode 100644 index 4e754850b..000000000 --- a/packages/commonjs/src/dynamic-packages-manager.js +++ /dev/null @@ -1,56 +0,0 @@ -import { existsSync, readFileSync } from 'fs'; -import { join } from 'path'; - -import { DYNAMIC_PACKAGES_ID, DYNAMIC_REGISTER_SUFFIX, HELPERS_ID, wrapId } from './helpers'; -import { getVirtualPathForDynamicRequirePath, normalizePathSlashes } from './utils'; - -export function getPackageEntryPoint(dirPath) { - let entryPoint = 'index.js'; - - try { - if (existsSync(join(dirPath, 'package.json'))) { - entryPoint = - JSON.parse(readFileSync(join(dirPath, 'package.json'), { encoding: 'utf8' })).main || - entryPoint; - } - } catch (ignored) { - // ignored - } - - return entryPoint; -} - -export function getDynamicPackagesModule(dynamicRequireModuleDirPaths, commonDir) { - let code = `const commonjsRegisterOrShort = require('${HELPERS_ID}?commonjsRegisterOrShort');`; - for (const dir of dynamicRequireModuleDirPaths) { - const entryPoint = getPackageEntryPoint(dir); - - code += `\ncommonjsRegisterOrShort(${JSON.stringify( - getVirtualPathForDynamicRequirePath(dir, commonDir) - )}, ${JSON.stringify(getVirtualPathForDynamicRequirePath(join(dir, entryPoint), commonDir))});`; - } - return code; -} - -export function getDynamicPackagesEntryIntro( - dynamicRequireModuleDirPaths, - dynamicRequireModuleSet -) { - let dynamicImports = Array.from( - dynamicRequireModuleSet, - (dynamicId) => `require(${JSON.stringify(wrapId(dynamicId, DYNAMIC_REGISTER_SUFFIX))});` - ).join('\n'); - - if (dynamicRequireModuleDirPaths.length) { - dynamicImports += `require(${JSON.stringify( - wrapId(DYNAMIC_PACKAGES_ID, DYNAMIC_REGISTER_SUFFIX) - )});`; - } - - return dynamicImports; -} - -export function isDynamicModuleImport(id, dynamicRequireModuleSet) { - const normalizedPath = normalizePathSlashes(id); - return dynamicRequireModuleSet.has(normalizedPath) && !normalizedPath.endsWith('.json'); -} diff --git a/packages/commonjs/src/dynamic-require-paths.js b/packages/commonjs/src/dynamic-require-paths.js index f944a0d33..849ab1a9e 100644 --- a/packages/commonjs/src/dynamic-require-paths.js +++ b/packages/commonjs/src/dynamic-require-paths.js @@ -1,11 +1,25 @@ -import { statSync } from 'fs'; - +import { existsSync, readFileSync, statSync } from 'fs'; import { join, resolve } from 'path'; import glob from 'glob'; import { normalizePathSlashes } from './utils'; -import { getPackageEntryPoint } from './dynamic-packages-manager'; + +function getPackageEntryPoint(dirPath) { + let entryPoint = 'index.js'; + + try { + if (existsSync(join(dirPath, 'package.json'))) { + entryPoint = + JSON.parse(readFileSync(join(dirPath, 'package.json'), { encoding: 'utf8' })).main || + entryPoint; + } + } catch (ignored) { + // ignored + } + + return entryPoint; +} function isDirectory(path) { try { @@ -16,7 +30,7 @@ function isDirectory(path) { return false; } -export default function getDynamicRequirePaths(patterns) { +export default function getDynamicRequireModuleSet(patterns) { const dynamicRequireModuleSet = new Set(); for (const pattern of !patterns || Array.isArray(patterns) ? patterns || [] : [patterns]) { const isNegated = pattern.startsWith('!'); @@ -28,8 +42,5 @@ export default function getDynamicRequirePaths(patterns) { } } } - const dynamicRequireModuleDirPaths = Array.from(dynamicRequireModuleSet.values()).filter((path) => - isDirectory(path) - ); - return { dynamicRequireModuleSet, dynamicRequireModuleDirPaths }; + return dynamicRequireModuleSet; } diff --git a/packages/commonjs/src/generate-exports.js b/packages/commonjs/src/generate-exports.js index f94ae3fe4..7dcb2cdaa 100644 --- a/packages/commonjs/src/generate-exports.js +++ b/packages/commonjs/src/generate-exports.js @@ -30,12 +30,43 @@ export function rewriteExportsAndGetExportsBlock( HELPERS_NAME, exportMode, detectWrappedDefault, - defaultIsModuleExports + defaultIsModuleExports, + usesRequireWrapper, + requireName ) { const exports = []; const exportDeclarations = []; - if (exportMode === 'replace') { + if (usesRequireWrapper) { + // TODO Lukas Extract + if (exportMode === 'replace') { + for (const { left } of moduleExportsAssignments) { + magicString.overwrite(left.start, left.end, exportsName); + } + } else { + // Collect and rewrite module.exports assignments + for (const { left } of moduleExportsAssignments) { + magicString.overwrite(left.start, left.end, `${moduleName}.exports`); + } + // Collect and rewrite named exports + for (const [exportName, { nodes }] of exportsAssignmentsByName) { + for (const node of nodes) { + magicString.overwrite(node.start, node.left.end, `${exportsName}.${exportName}`); + } + } + // Collect and rewrite exports.__esModule assignments + for (const expression of defineCompiledEsmExpressions) { + const moduleExportsExpression = + expression.type === 'CallExpression' ? expression.arguments[0] : expression.left.object; + magicString.overwrite( + moduleExportsExpression.start, + moduleExportsExpression.end, + exportsName + ); + } + } + exports.push(`${requireName} as __require`); + } else if (exportMode === 'replace') { getExportsForReplacedModuleExports( magicString, exports, @@ -165,7 +196,8 @@ function getExports( } if (!isRestorableCompiledEsm || defaultIsModuleExports === true) { - exportDeclarations.push(`export default ${exportsName};`); + // TODO Lukas handle ESM importing CommonJS + exports.push(`${exportsName} as default`); } else if (moduleExportsAssignments.length === 0 || defaultIsModuleExports === false) { exports.push(`${deconflictedDefaultExportName || exportsName} as default`); } else { diff --git a/packages/commonjs/src/generate-imports.js b/packages/commonjs/src/generate-imports.js index 187572c6a..8f621a260 100644 --- a/packages/commonjs/src/generate-imports.js +++ b/packages/commonjs/src/generate-imports.js @@ -2,7 +2,7 @@ import { dirname, resolve } from 'path'; import { sync as nodeResolveSync } from 'resolve'; -import { EXPORTS_SUFFIX, HELPERS_ID, MODULE_SUFFIX, PROXY_SUFFIX, wrapId } from './helpers'; +import { DYNAMIC_MODULES_ID, EXPORTS_SUFFIX, HELPERS_ID, MODULE_SUFFIX, wrapId } from './helpers'; import { normalizePathSlashes } from './utils'; export function isRequireStatement(node, scope) { @@ -87,53 +87,34 @@ export function hasDynamicModuleForPath(source, id, dynamicRequireModuleSet) { } export function getRequireHandlers() { - const requiredSources = []; - const requiredBySource = Object.create(null); - const requiredByNode = new Map(); - const requireExpressionsWithUsedReturnValue = []; - - function addRequireStatement(sourceId, node, scope, usesReturnValue) { - const required = getRequired(sourceId); - requiredByNode.set(node, { scope, required }); - if (usesReturnValue) { - required.nodesUsingRequired.push(node); - requireExpressionsWithUsedReturnValue.push(node); - } - } - - function getRequired(sourceId) { - if (!requiredBySource[sourceId]) { - requiredSources.push(sourceId); - - requiredBySource[sourceId] = { - source: sourceId, - name: null, - nodesUsingRequired: [] - }; - } + const requireExpressions = []; - return requiredBySource[sourceId]; + function addRequireStatement(sourceId, node, scope, usesReturnValue, toBeRemoved) { + requireExpressions.push({ sourceId, node, scope, usesReturnValue, toBeRemoved }); } - function rewriteRequireExpressionsAndGetImportBlock( + async function rewriteRequireExpressionsAndGetImportBlock( magicString, topLevelDeclarations, topLevelRequireDeclarators, reassignedNames, helpersName, - dynamicRegisterSources, + dynamicRequireName, moduleName, exportsName, id, - exportMode + exportMode, + resolveRequireSourcesAndGetMeta, + usesRequireWrapper, + usesRequire ) { - setRemainingImportNamesAndRewriteRequires( - requireExpressionsWithUsedReturnValue, - requiredByNode, - magicString - ); const imports = []; imports.push(`import * as ${helpersName} from "${HELPERS_ID}";`); + if (usesRequire) { + imports.push( + `import { commonjsRequire as ${dynamicRequireName} } from "${DYNAMIC_MODULES_ID}";` + ); + } if (exportMode === 'module') { imports.push( `import { __module as ${moduleName}, exports as ${exportsName} } from ${JSON.stringify( @@ -145,44 +126,58 @@ export function getRequireHandlers() { `import { __exports as ${exportsName} } from ${JSON.stringify(wrapId(id, EXPORTS_SUFFIX))}` ); } - for (const source of dynamicRegisterSources) { - imports.push(`import ${JSON.stringify(source)};`); - } - for (const source of requiredSources) { - const { name, nodesUsingRequired } = requiredBySource[source]; - imports.push( - `import ${nodesUsingRequired.length ? `${name} from ` : ''}${JSON.stringify( - source.startsWith('\0') ? source : wrapId(source, PROXY_SUFFIX) - )};` - ); + const requiresBySource = collectSources(requireExpressions); + // TODO Lukas consider extracting stuff + const result = await resolveRequireSourcesAndGetMeta( + usesRequireWrapper ? 'withRequireFunction' : true, + Object.keys(requiresBySource) + ); + let uid = 0; + for (const { source, id: resolveId, isCommonJS } of result) { + const requires = requiresBySource[source]; + let usesRequired = false; + let name; + const hasNameConflict = ({ scope }) => scope.contains(name); + do { + name = `require$$${uid}`; + uid += 1; + } while (requires.some(hasNameConflict)); + + // TODO Lukas extract constant + if (isCommonJS === 'withRequireFunction') { + for (const { node } of requires) { + magicString.overwrite(node.start, node.end, `${name}()`); + } + imports.push(`import { __require as ${name} } from ${JSON.stringify(resolveId)};`); + } else { + for (const { node, usesReturnValue, toBeRemoved } of requires) { + if (usesReturnValue) { + usesRequired = true; + magicString.overwrite(node.start, node.end, name); + } else { + magicString.remove(toBeRemoved.start, toBeRemoved.end); + } + } + imports.push(`import ${usesRequired ? `${name} from ` : ''}${JSON.stringify(resolveId)};`); + } } return imports.length ? `${imports.join('\n')}\n\n` : ''; } return { addRequireStatement, - requiredSources, rewriteRequireExpressionsAndGetImportBlock }; } -function setRemainingImportNamesAndRewriteRequires( - requireExpressionsWithUsedReturnValue, - requiredByNode, - magicString -) { - let uid = 0; - for (const requireExpression of requireExpressionsWithUsedReturnValue) { - const { required } = requiredByNode.get(requireExpression); - if (!required.name) { - let potentialName; - const isUsedName = (node) => requiredByNode.get(node).scope.contains(potentialName); - do { - potentialName = `require$$${uid}`; - uid += 1; - } while (required.nodesUsingRequired.some(isUsedName)); - required.name = potentialName; +function collectSources(requireExpressions) { + const requiresBySource = Object.create(null); + for (const { sourceId, node, scope, usesReturnValue, toBeRemoved } of requireExpressions) { + if (!requiresBySource[sourceId]) { + requiresBySource[sourceId] = []; } - magicString.overwrite(requireExpression.start, requireExpression.end, required.name); + const requires = requiresBySource[sourceId]; + requires.push({ node, scope, usesReturnValue, toBeRemoved }); } + return requiresBySource; } diff --git a/packages/commonjs/src/helpers.js b/packages/commonjs/src/helpers.js index 94f6c5719..381761110 100644 --- a/packages/commonjs/src/helpers.js +++ b/packages/commonjs/src/helpers.js @@ -6,17 +6,14 @@ export const PROXY_SUFFIX = '?commonjs-proxy'; export const EXTERNAL_SUFFIX = '?commonjs-external'; export const EXPORTS_SUFFIX = '?commonjs-exports'; export const MODULE_SUFFIX = '?commonjs-module'; +export const ES_IMPORT_SUFFIX = '?es-import'; -export const DYNAMIC_REGISTER_SUFFIX = '?commonjs-dynamic-register'; -export const DYNAMIC_JSON_PREFIX = '\0commonjs-dynamic-json:'; -export const DYNAMIC_PACKAGES_ID = '\0commonjs-dynamic-packages'; - +export const DYNAMIC_MODULES_ID = '\0commonjs-dynamic-modules'; export const HELPERS_ID = '\0commonjsHelpers.js'; // `x['default']` is used instead of `x.default` for backward compatibility with ES3 browsers. // Minifiers like uglify will usually transpile it back if compatibility with ES3 is not enabled. -// This will no longer be necessary once Rollup switches to ES6 output, likely -// in Rollup 3 +// This could be improved by inspecting Rollup's "generatedCode" option const HELPERS = ` export var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; @@ -49,215 +46,6 @@ export function getAugmentedNamespace(n) { } `; -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.');`; - -const HELPER_NON_DYNAMIC = ` -export function commonjsRequire (path) { - ${FAILED_REQUIRE_ERROR} -} -`; - -const getDynamicHelpers = (ignoreDynamicRequires) => ` -export function createModule(modulePath) { - return { - path: modulePath, - exports: {}, - require: function (path, base) { - return commonjsRequire(path, base == null ? modulePath : base); - } - }; -} - -export function commonjsRegister (path, loader) { - DYNAMIC_REQUIRE_LOADERS[path] = loader; -} - -export function commonjsRegisterOrShort (path, to) { - var resolvedPath = commonjsResolveImpl(path, null, true); - if (resolvedPath !== null && DYNAMIC_REQUIRE_CACHE[resolvedPath]) { - DYNAMIC_REQUIRE_CACHE[path] = DYNAMIC_REQUIRE_CACHE[resolvedPath]; - } else { - DYNAMIC_REQUIRE_SHORTS[path] = to; - } -} - -var DYNAMIC_REQUIRE_LOADERS = Object.create(null); -var DYNAMIC_REQUIRE_CACHE = Object.create(null); -var DYNAMIC_REQUIRE_SHORTS = Object.create(null); -var DEFAULT_PARENT_MODULE = { - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: [] -}; -var CHECKED_EXTENSIONS = ['', '.js', '.json']; - -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; -} - -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; -} - -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 dirname (path) { - if (path.length === 0) - return '.'; - - var i = path.length - 1; - while (i > 0) { - var 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 '.'; -} - -export function commonjsResolveImpl (path, originalModuleDir, testCache) { - var shouldTryNodeModules = isPossibleNodeModulesPath(path); - path = normalize(path); - var relPath; - if (path[0] === '/') { - originalModuleDir = '/'; - } - 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)); - } - - if (relPath.endsWith('/..')) { - break; // Travelled too far up, avoid infinite loop - } - - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) { - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex]; - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) { - return resolvedPath; - } - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) { - return resolvedPath; - } - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) { - return resolvedPath; - } - } - if (!shouldTryNodeModules) break; - var nextDir = normalize(originalModuleDir + '/..'); - if (nextDir === originalModuleDir) break; - originalModuleDir = nextDir; - } - return null; -} - -export function commonjsResolve (path, originalModuleDir) { - var resolvedPath = commonjsResolveImpl(path, originalModuleDir); - if (resolvedPath !== null) { - return resolvedPath; - } - return require.resolve(path); -} - -export function commonjsRequire (path, originalModuleDir) { - var resolvedPath = commonjsResolveImpl(path, originalModuleDir, true); - if (resolvedPath !== null) { - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath]; - if (cachedModule) return cachedModule.exports; - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath]; - if (shortTo) { - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo]; - if (cachedModule) - return cachedModule.exports; - resolvedPath = commonjsResolveImpl(shortTo, null, true); - } - var 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; - }; - } - ${ignoreDynamicRequires ? 'return require(path);' : FAILED_REQUIRE_ERROR} -} - -commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE; -commonjsRequire.resolve = commonjsResolve; -`; - -export function getHelpersModule(isDynamicRequireModulesEnabled, ignoreDynamicRequires) { - return `${HELPERS}${ - isDynamicRequireModulesEnabled ? getDynamicHelpers(ignoreDynamicRequires) : HELPER_NON_DYNAMIC - }`; +export function getHelpersModule() { + return HELPERS; } diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index 66e312bb3..af9afcc37 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -1,4 +1,4 @@ -import { dirname, extname } from 'path'; +import { extname } from 'path'; import { createFilter } from '@rollup/pluginutils'; import getCommonDir from 'commondir'; @@ -6,17 +6,12 @@ import getCommonDir from 'commondir'; import { peerDependencies } from '../package.json'; import analyzeTopLevelStatements from './analyze-top-level-statements'; +import { getDynamicRequireModules } from './dynamic-modules'; +import getDynamicRequireModuleSet from './dynamic-require-paths'; import { - getDynamicPackagesEntryIntro, - getDynamicPackagesModule, - isDynamicModuleImport -} from './dynamic-packages-manager'; -import getDynamicRequirePaths from './dynamic-require-paths'; -import { - DYNAMIC_JSON_PREFIX, - DYNAMIC_PACKAGES_ID, - DYNAMIC_REGISTER_SUFFIX, + DYNAMIC_MODULES_ID, + ES_IMPORT_SUFFIX, EXPORTS_SUFFIX, EXTERNAL_SUFFIX, getHelpersModule, @@ -24,20 +19,15 @@ import { isWrappedId, MODULE_SUFFIX, PROXY_SUFFIX, - unwrapId + unwrapId, + wrapId } from './helpers'; import { hasCjsKeywords } from './parse'; -import { - getDynamicJsonProxy, - getDynamicRequireProxy, - getSpecificHelperProxy, - getStaticRequireProxy, - getUnknownRequireProxy -} from './proxies'; -import getResolveId from './resolve-id'; +import { getStaticRequireProxy, getUnknownRequireProxy } from './proxies'; +import getResolveId, { resolveExtensions } from './resolve-id'; import validateRollupVersion from './rollup-version'; import transformCommonjs from './transform-commonjs'; -import { getName, getVirtualPathForDynamicRequirePath, normalizePathSlashes } from './utils'; +import { capitalize, getName, normalizePathSlashes } from './utils'; export default function commonjs(options = {}) { const extensions = options.extensions || ['.js']; @@ -71,10 +61,9 @@ export default function commonjs(options = {}) { ? defaultIsModuleExportsOption : () => typeof defaultIsModuleExportsOption === 'boolean' ? defaultIsModuleExportsOption : 'auto'; + const knownCjsModuleTypes = Object.create(null); - const { dynamicRequireModuleSet, dynamicRequireModuleDirPaths } = getDynamicRequirePaths( - options.dynamicRequireTargets - ); + const dynamicRequireModuleSet = getDynamicRequireModuleSet(options.dynamicRequireTargets); const isDynamicRequireModulesEnabled = dynamicRequireModuleSet.size > 0; const commonDir = isDynamicRequireModulesEnabled ? getCommonDir(null, Array.from(dynamicRequireModuleSet).concat(process.cwd())) @@ -111,12 +100,6 @@ export default function commonjs(options = {}) { const sourceMap = options.sourceMap !== false; function transformAndCheckExports(code, id) { - if (isDynamicRequireModulesEnabled && this.getModuleInfo(id).isEntry) { - // eslint-disable-next-line no-param-reassign - code = - getDynamicPackagesEntryIntro(dynamicRequireModuleDirPaths, dynamicRequireModuleSet) + code; - } - const { isEsModule, hasDefaultExport, hasNamedExports, ast } = analyzeTopLevelStatements( this.parse, code, @@ -136,13 +119,17 @@ export default function commonjs(options = {}) { return { meta: { commonjs: { isCommonJS: false } } }; } - // avoid wrapping as this is a commonjsRegister call - const disableWrap = isWrappedId(id, DYNAMIC_REGISTER_SUFFIX); - if (disableWrap) { - // eslint-disable-next-line no-param-reassign - id = unwrapId(id, DYNAMIC_REGISTER_SUFFIX); - } - + // TODO Lukas + // * test import from ESM -> additional proxy + // * test entry point + // * test interaction with dynamic require targets + // * test circular dependency: We must not use this.load without circularity check -> error in Rollup? + // When we write the imports, we already know that we are commonjs or mixed so we can rely on usesRequireWrapper and write that into a table + const usesRequireWrapper = + !isEsModule && + (dynamicRequireModuleSet.has(normalizePathSlashes(id)) || strictRequireSemanticFilter(id)); + + // TODO Lukas extract helpers return transformCommonjs( this.parse, code, @@ -155,10 +142,58 @@ export default function commonjs(options = {}) { sourceMap, isDynamicRequireModulesEnabled, dynamicRequireModuleSet, - disableWrap, commonDir, ast, - getDefaultIsModuleExports(id) + getDefaultIsModuleExports(id), + usesRequireWrapper, + // TODO Lukas extract + (isParentCommonJS, sources) => { + knownCjsModuleTypes[id] = isParentCommonJS; + return Promise.all( + sources.map(async (source) => { + // Never analyze or proxy internal modules + if (source.startsWith('\0')) { + return { source, id: source, isCommonJS: false }; + } + const resolved = + (await this.resolve(source, id, { + skipSelf: true, + custom: { + 'node-resolve': { isRequire: true } + } + })) || resolveExtensions(source, id, extensions); + if (!resolved) { + return { source, id: wrapId(source, EXTERNAL_SUFFIX), isCommonJS: false }; + } + if (resolved.external) { + return { source, id: wrapId(resolved.id, EXTERNAL_SUFFIX), isCommonJS: false }; + } + if (resolved.id in knownCjsModuleTypes) { + return { + source, + id: + knownCjsModuleTypes[resolved.id] === true + ? wrapId(resolved.id, PROXY_SUFFIX) + : resolved.id, + isCommonJS: knownCjsModuleTypes[resolved.id] + }; + } + const { + meta: { commonjs: commonjsMeta } + } = await this.load(resolved); + const isCommonJS = commonjsMeta && commonjsMeta.isCommonJS; + return { + source, + id: + // TODO Lukas extract constant + isCommonJS === 'withRequireFunction' + ? resolved.id + : wrapId(resolved.id, PROXY_SUFFIX), + isCommonJS + }; + }) + ); + } ); } @@ -178,40 +213,20 @@ export default function commonjs(options = {}) { load(id) { if (id === HELPERS_ID) { - return getHelpersModule(isDynamicRequireModulesEnabled, ignoreDynamicRequires); - } - - if (id.startsWith(HELPERS_ID)) { - return getSpecificHelperProxy(id); + return getHelpersModule(); } if (isWrappedId(id, MODULE_SUFFIX)) { - const actualId = unwrapId(id, MODULE_SUFFIX); - let name = getName(actualId); - let code; - if (isDynamicRequireModulesEnabled) { - if (['modulePath', 'commonjsRequire', 'createModule'].includes(name)) { - name = `${name}_`; - } - code = - `import {commonjsRequire, createModule} from "${HELPERS_ID}";\n` + - `var ${name} = createModule(${JSON.stringify( - getVirtualPathForDynamicRequirePath(dirname(actualId), commonDir) - )});\n` + - `export {${name} as __module}`; - } else { - code = `var ${name} = {exports: {}}; export {${name} as __module}`; - } + const name = getName(unwrapId(id, MODULE_SUFFIX)); return { - code, + code: `var ${name} = {exports: {}}; export {${name} as __module}`, syntheticNamedExports: '__module', meta: { commonjs: { isCommonJS: false } } }; } if (isWrappedId(id, EXPORTS_SUFFIX)) { - const actualId = unwrapId(id, EXPORTS_SUFFIX); - const name = getName(actualId); + const name = getName(unwrapId(id, EXPORTS_SUFFIX)); return { code: `var ${name} = {}; export {${name} as __exports}`, meta: { commonjs: { isCommonJS: false } } @@ -226,23 +241,40 @@ export default function commonjs(options = {}) { ); } - if (id === DYNAMIC_PACKAGES_ID) { - return getDynamicPackagesModule(dynamicRequireModuleDirPaths, commonDir); - } - - if (id.startsWith(DYNAMIC_JSON_PREFIX)) { - return getDynamicJsonProxy(id, commonDir); - } - - if (isDynamicModuleImport(id, dynamicRequireModuleSet)) { - return `export default require(${JSON.stringify(normalizePathSlashes(id))});`; + // TODO Lukas extract + if (isWrappedId(id, ES_IMPORT_SUFFIX)) { + const actualId = unwrapId(id, ES_IMPORT_SUFFIX); + const name = getName(actualId); + const exportsName = `${name}Exports`; + const requireModule = `require${capitalize(name)}`; + // TODO Lukas the ES wrapper might also just forward the exports object + let code = + `import { getDefaultExportFromCjs } from "${HELPERS_ID}";\n` + + `import { __require as ${requireModule} } from ${JSON.stringify(actualId)};\n` + + `var ${exportsName} = ${requireModule}();\n` + + `export { ${exportsName} as __moduleExports };`; + if (defaultIsModuleExports) { + code += `\nexport { ${exportsName} as default };`; + } else { + code += `export default /*@__PURE__*/getDefaultExportFromCjs(${exportsName});`; + } + return { + code, + syntheticNamedExports: '__moduleExports', + meta: { commonjs: { isCommonJS: false } } + }; } - if (isWrappedId(id, DYNAMIC_REGISTER_SUFFIX)) { - return getDynamicRequireProxy( - normalizePathSlashes(unwrapId(id, DYNAMIC_REGISTER_SUFFIX)), - commonDir - ); + if (id === DYNAMIC_MODULES_ID) { + return { + code: getDynamicRequireModules( + isDynamicRequireModulesEnabled, + dynamicRequireModuleSet, + commonDir, + ignoreDynamicRequires + ), + meta: { commonjs: { isCommonJS: false } } + }; } if (isWrappedId(id, PROXY_SUFFIX)) { @@ -259,25 +291,14 @@ export default function commonjs(options = {}) { return null; }, - transform(code, rawId) { - let id = rawId; - - if (isWrappedId(id, DYNAMIC_REGISTER_SUFFIX)) { - id = unwrapId(id, DYNAMIC_REGISTER_SUFFIX); - } - + transform(code, id) { const extName = extname(id); - if ( - extName !== '.cjs' && - id !== DYNAMIC_PACKAGES_ID && - !id.startsWith(DYNAMIC_JSON_PREFIX) && - (!filter(id) || !extensions.includes(extName)) - ) { + if (extName !== '.cjs' && (!filter(id) || !extensions.includes(extName))) { return null; } try { - return transformAndCheckExports.call(this, code, rawId); + return transformAndCheckExports.call(this, code, id); } catch (err) { return this.error(err, err.loc); } diff --git a/packages/commonjs/src/proxies.js b/packages/commonjs/src/proxies.js index 125a3d5f3..7fd0b0234 100644 --- a/packages/commonjs/src/proxies.js +++ b/packages/commonjs/src/proxies.js @@ -1,16 +1,9 @@ -import { readFileSync } from 'fs'; - -import { DYNAMIC_JSON_PREFIX, HELPERS_ID } from './helpers'; -import { getName, getVirtualPathForDynamicRequirePath, normalizePathSlashes } from './utils'; - -// e.g. id === "commonjsHelpers?commonjsRegister" -export function getSpecificHelperProxy(id) { - return `export {${id.split('?')[1]} as default} from "${HELPERS_ID}";`; -} +import { HELPERS_ID } from './helpers'; +import { getName } from './utils'; export function getUnknownRequireProxy(id, requireReturnsDefault) { if (requireReturnsDefault === true || id.endsWith('.json')) { - return `export {default} from ${JSON.stringify(id)};`; + return `export { default } from ${JSON.stringify(id)};`; } const name = getName(id); const exported = @@ -24,23 +17,6 @@ export function getUnknownRequireProxy(id, requireReturnsDefault) { return `import * as ${name} from ${JSON.stringify(id)}; ${exported}`; } -export function getDynamicJsonProxy(id, commonDir) { - const normalizedPath = normalizePathSlashes(id.slice(DYNAMIC_JSON_PREFIX.length)); - return `const commonjsRegister = require('${HELPERS_ID}?commonjsRegister');\ncommonjsRegister(${JSON.stringify( - getVirtualPathForDynamicRequirePath(normalizedPath, commonDir) - )}, function (module, exports) { - module.exports = require(${JSON.stringify(normalizedPath)}); -});`; -} - -export function getDynamicRequireProxy(normalizedPath, commonDir) { - return `const commonjsRegister = require('${HELPERS_ID}?commonjsRegister');\ncommonjsRegister(${JSON.stringify( - getVirtualPathForDynamicRequirePath(normalizedPath, commonDir) - )}, function (module, exports) { - ${readFileSync(normalizedPath, { encoding: 'utf8' })} -});`; -} - export async function getStaticRequireProxy( id, requireReturnsDefault, diff --git a/packages/commonjs/src/resolve-id.js b/packages/commonjs/src/resolve-id.js index 3a3b9a00a..ac59be3a8 100644 --- a/packages/commonjs/src/resolve-id.js +++ b/packages/commonjs/src/resolve-id.js @@ -4,16 +4,14 @@ import { statSync } from 'fs'; import { dirname, resolve, sep } from 'path'; import { - DYNAMIC_JSON_PREFIX, - DYNAMIC_PACKAGES_ID, - DYNAMIC_REGISTER_SUFFIX, + DYNAMIC_MODULES_ID, + ES_IMPORT_SUFFIX, EXPORTS_SUFFIX, EXTERNAL_SUFFIX, HELPERS_ID, isWrappedId, MODULE_SUFFIX, PROXY_SUFFIX, - unwrapId, wrapId } from './helpers'; @@ -28,59 +26,49 @@ function getCandidates(resolved, extensions) { ); } -export default function getResolveId(extensions) { - function resolveExtensions(importee, importer) { - // not our problem - if (importee[0] !== '.' || !importer) return undefined; +export function resolveExtensions(importee, importer, extensions) { + // not our problem + if (importee[0] !== '.' || !importer) return undefined; - const resolved = resolve(dirname(importer), importee); - const candidates = getCandidates(resolved, extensions); + const resolved = resolve(dirname(importer), importee); + const candidates = getCandidates(resolved, extensions); - for (let i = 0; i < candidates.length; i += 1) { - try { - const stats = statSync(candidates[i]); - if (stats.isFile()) return { id: candidates[i] }; - } catch (err) { - /* noop */ - } + for (let i = 0; i < candidates.length; i += 1) { + try { + const stats = statSync(candidates[i]); + if (stats.isFile()) return { id: candidates[i] }; + } catch (err) { + /* noop */ } - - return undefined; } - return function resolveId(importee, rawImporter, resolveOptions) { - if (isWrappedId(importee, MODULE_SUFFIX) || isWrappedId(importee, EXPORTS_SUFFIX)) { + return undefined; +} + +export default function getResolveId(extensions) { + return async function resolveId(importee, importer, resolveOptions) { + if ( + isWrappedId(importee, MODULE_SUFFIX) || + isWrappedId(importee, EXPORTS_SUFFIX) || + isWrappedId(importee, PROXY_SUFFIX) || + isWrappedId(importee, ES_IMPORT_SUFFIX) || + isWrappedId(importee, EXTERNAL_SUFFIX) + ) { return importee; } - const importer = - rawImporter && isWrappedId(rawImporter, DYNAMIC_REGISTER_SUFFIX) - ? unwrapId(rawImporter, DYNAMIC_REGISTER_SUFFIX) - : rawImporter; - // Except for exports, proxies are only importing resolved ids, // no need to resolve again - if (importer && isWrappedId(importer, PROXY_SUFFIX)) { + if ( + importer && + (importer === DYNAMIC_MODULES_ID || + isWrappedId(importer, PROXY_SUFFIX) || + isWrappedId(importer, ES_IMPORT_SUFFIX)) + ) { return importee; } - const isProxyModule = isWrappedId(importee, PROXY_SUFFIX); - let isModuleRegistration = false; - - if (isProxyModule) { - importee = unwrapId(importee, PROXY_SUFFIX); - } else { - isModuleRegistration = isWrappedId(importee, DYNAMIC_REGISTER_SUFFIX); - if (isModuleRegistration) { - importee = unwrapId(importee, DYNAMIC_REGISTER_SUFFIX); - } - } - - if ( - importee.startsWith(HELPERS_ID) || - importee === DYNAMIC_PACKAGES_ID || - importee.startsWith(DYNAMIC_JSON_PREFIX) - ) { + if (importee.startsWith(HELPERS_ID) || importee === DYNAMIC_MODULES_ID) { return importee; } @@ -88,37 +76,30 @@ export default function getResolveId(extensions) { return null; } - return this.resolve( - importee, - importer, - Object.assign({}, resolveOptions, { - skipSelf: true, - custom: Object.assign({}, resolveOptions.custom, { - 'node-resolve': { isRequire: isProxyModule || isModuleRegistration } - }) - }) - ).then((resolved) => { - if (!resolved) { - resolved = resolveExtensions(importee, importer); - } - if (isProxyModule) { - if (!resolved || resolved.external) { - return { - id: wrapId(resolved ? resolved.id : importee, EXTERNAL_SUFFIX), - external: false - }; + const resolved = + (await this.resolve(importee, importer, Object.assign({ skipSelf: true }, resolveOptions))) || + resolveExtensions(importee, importer, extensions); + let isCommonJsImporter = false; + if (importer) { + const moduleInfo = this.getModuleInfo(importer); + if (moduleInfo) { + const importerCommonJsMeta = moduleInfo.meta.commonjs; + if ( + importerCommonJsMeta && + (importerCommonJsMeta.isCommonJS || importerCommonJsMeta.isMixedModule) + ) { + isCommonJsImporter = true; } - // This will make sure meta properties in "resolved" are correctly attached to the module - this.load(resolved); - return { - id: wrapId(resolved.id, PROXY_SUFFIX), - external: false - }; } - if (resolved && isModuleRegistration) { - return { id: wrapId(resolved.id, DYNAMIC_REGISTER_SUFFIX), external: false }; + } + if (resolved && !isCommonJsImporter) { + const { + meta: { commonjs: commonjsMeta } + } = await this.load(resolved); + if (commonjsMeta && commonjsMeta.isCommonJS === 'withRequireFunction') { + return wrapId(resolved.id, ES_IMPORT_SUFFIX); } - return resolved; - }); + } + return resolved; }; } diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index 7698bf9f4..eda4632fc 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -27,21 +27,14 @@ import { isRequireStatement, isStaticRequireStatement } from './generate-imports'; -import { - DYNAMIC_JSON_PREFIX, - DYNAMIC_REGISTER_SUFFIX, - isWrappedId, - unwrapId, - wrapId -} from './helpers'; import { tryParse } from './parse'; -import { deconflict, getName, getVirtualPathForDynamicRequirePath } from './utils'; +import { capitalize, deconflict, getName, getVirtualPathForDynamicRequirePath } from './utils'; const exportsPattern = /^(?:module\.)?exports(?:\.([a-zA-Z_$][a-zA-Z_$0-9]*))?$/; const functionType = /^(?:FunctionDeclaration|FunctionExpression|ArrowFunctionExpression)$/; -export default function transformCommonjs( +export default async function transformCommonjs( parse, code, id, @@ -53,10 +46,11 @@ export default function transformCommonjs( sourceMap, isDynamicRequireModulesEnabled, dynamicRequireModuleSet, - disableWrap, commonDir, astCache, - defaultIsModuleExports + defaultIsModuleExports, + usesRequireWrapper, + resolveRequireSourcesAndGetMeta ) { const ast = astCache || tryParse(parse, code, id); const magicString = new MagicString(code); @@ -66,7 +60,6 @@ export default function transformCommonjs( global: false, require: false }; - let usesDynamicRequire = false; const virtualDynamicRequirePath = isDynamicRequireModulesEnabled && getVirtualPathForDynamicRequirePath(dirname(id), commonDir); let scope = attachScopes(ast, 'scope'); @@ -78,12 +71,11 @@ export default function transformCommonjs( const globals = new Set(); // TODO technically wrong since globals isn't populated yet, but ¯\_(ツ)_/¯ - const HELPERS_NAME = deconflict([scope], globals, 'commonjsHelpers'); - const dynamicRegisterSources = new Set(); + const helpersName = deconflict([scope], globals, 'commonjsHelpers'); + const dynamicRequireName = deconflict([scope], globals, 'commonjsRequire'); let hasRemovedRequire = false; - const { addRequireStatement, requiredSources, rewriteRequireExpressionsAndGetImportBlock } = - getRequireHandlers(); + const { addRequireStatement, rewriteRequireExpressionsAndGetImportBlock } = getRequireHandlers(); // See which names are assigned to. This is necessary to prevent // illegally replacing `var foo = require('foo')` with `import foo from 'foo'`, @@ -196,12 +188,15 @@ export default function transformCommonjs( return; } + // Transform require.resolve if ( node.callee.object && node.callee.object.name === 'require' && node.callee.property.name === 'resolve' && hasDynamicModuleForPath(id, '/', dynamicRequireModuleSet) ) { + // TODO Lukas reimplement + uses.require = true; const requireNode = node.callee.object; magicString.appendLeft( node.end - 1, @@ -209,23 +204,23 @@ export default function transformCommonjs( dirname(id) === '.' ? null /* default behavior */ : virtualDynamicRequirePath )}` ); - magicString.overwrite( - requireNode.start, - requireNode.end, - `${HELPERS_NAME}.commonjsRequire`, - { - storeName: true - } - ); + magicString.overwrite(requireNode.start, requireNode.end, dynamicRequireName, { + storeName: true + }); return; } - if (!isStaticRequireStatement(node, scope)) return; - if (!isDynamicRequireModulesEnabled) { - skippedNodes.add(node.callee); + // Ignore call expressions of dynamic requires, the callee will be transformed within Identifier + if (!isStaticRequireStatement(node, scope)) { + return; } + + // Otherwise we do not want to replace "require" with the internal helper + skippedNodes.add(node.callee); + uses.require = true; + + // TODO Lukas can the remaining logic be moved to generate-imports? if (!isIgnoredRequireStatement(node, ignoreRequire)) { - skippedNodes.add(node.callee); const usesReturnValue = parent.type !== 'ExpressionStatement'; let canConvertRequire = true; @@ -240,47 +235,27 @@ export default function transformCommonjs( } } - let sourceId = getRequireStringArg(node); - const isDynamicRegister = isWrappedId(sourceId, DYNAMIC_REGISTER_SUFFIX); - if (isDynamicRegister) { - sourceId = unwrapId(sourceId, DYNAMIC_REGISTER_SUFFIX); - if (sourceId.endsWith('.json')) { - sourceId = DYNAMIC_JSON_PREFIX + sourceId; - } - dynamicRegisterSources.add(wrapId(sourceId, DYNAMIC_REGISTER_SUFFIX)); - } else { - if ( - !sourceId.endsWith('.json') && - hasDynamicModuleForPath(sourceId, id, dynamicRequireModuleSet) - ) { - if (shouldRemoveRequireStatement) { - magicString.overwrite(node.start, node.end, `undefined`); - } else if (canConvertRequire) { - magicString.overwrite( - node.start, - node.end, - `${HELPERS_NAME}.commonjsRequire(${JSON.stringify( - getVirtualPathForDynamicRequirePath(sourceId, commonDir) - )}, ${JSON.stringify( - dirname(id) === '.' ? null /* default behavior */ : virtualDynamicRequirePath - )})` - ); - usesDynamicRequire = true; - } - return; + const sourceId = getRequireStringArg(node); + if (shouldRemoveRequireStatement) { + if (usesReturnValue) { + magicString.overwrite(node.start, node.end, `undefined`); + } else { + magicString.remove(parent.start, parent.end); } + return; + } - if (canConvertRequire) { - addRequireStatement(sourceId, node, scope, usesReturnValue); - } + if (canConvertRequire) { + addRequireStatement( + sourceId, + node, + scope, + usesReturnValue, + parent.type === 'ExpressionStatement' ? parent : node + ); } if (usesReturnValue) { - if (shouldRemoveRequireStatement) { - magicString.overwrite(node.start, node.end, `undefined`); - return; - } - if ( parent.type === 'VariableDeclarator' && !scope.parent && @@ -290,14 +265,6 @@ export default function transformCommonjs( // and does not conflict with variables in other places where this is imported topLevelRequireDeclarators.add(parent); } - } else { - // This is a bare import, e.g. `require('foo');` - - if (!canConvertRequire && !shouldRemoveRequireStatement) { - return; - } - - magicString.remove(parent.start, parent.end); } } return; @@ -313,13 +280,15 @@ export default function transformCommonjs( return; case 'Identifier': { const { name } = node; - if (!(isReference(node, parent) && !scope.contains(name))) return; + if (!isReference(node, parent) || scope.contains(name)) return; switch (name) { case 'require': + uses.require = true; if (isNodeRequirePropertyAccess(parent)) { + // TODO Lukas reimplement? if (hasDynamicModuleForPath(id, '/', dynamicRequireModuleSet)) { if (parent.property.name === 'cache') { - magicString.overwrite(node.start, node.end, `${HELPERS_NAME}.commonjsRequire`, { + magicString.overwrite(node.start, node.end, dynamicRequireName, { storeName: true }); } @@ -331,22 +300,25 @@ export default function transformCommonjs( if (isDynamicRequireModulesEnabled && isRequireStatement(parent, scope)) { magicString.appendLeft( parent.end - 1, - `,${JSON.stringify( + `, ${JSON.stringify( dirname(id) === '.' ? null /* default behavior */ : virtualDynamicRequirePath )}` ); } if (!ignoreDynamicRequires) { if (isShorthandProperty(parent)) { - magicString.appendRight(node.end, `: ${HELPERS_NAME}.commonjsRequire`); + magicString.appendRight(node.end, `: ${dynamicRequireName}`); } else { - magicString.overwrite(node.start, node.end, `${HELPERS_NAME}.commonjsRequire`, { + magicString.overwrite(node.start, node.end, dynamicRequireName, { storeName: true }); } } - usesDynamicRequire = true; return; + // TODO Lukas instead of wrapping, we rewrite everything + // module.exports -> exportsVar, except if it is an assignment, then it is moduleVar.exports + // module -> moduleVar + // only exceptions: Direct assignments to module or exports. Would work with new logic, though. case 'module': case 'exports': shouldWrap = true; @@ -355,7 +327,7 @@ export default function transformCommonjs( case 'global': uses.global = true; if (!ignoreGlobal) { - magicString.overwrite(node.start, node.end, `${HELPERS_NAME}.commonjsGlobal`, { + magicString.overwrite(node.start, node.end, `${helpersName}.commonjsGlobal`, { storeName: true }); } @@ -372,7 +344,8 @@ export default function transformCommonjs( } case 'MemberExpression': if (!isDynamicRequireModulesEnabled && isModuleRequire(node, scope)) { - magicString.overwrite(node.start, node.end, `${HELPERS_NAME}.commonjsRequire`, { + uses.require = true; + magicString.overwrite(node.start, node.end, dynamicRequireName, { storeName: true }); skippedNodes.add(node.object); @@ -390,7 +363,7 @@ export default function transformCommonjs( if (lexicalDepth === 0) { uses.global = true; if (!ignoreGlobal) { - magicString.overwrite(node.start, node.end, `${HELPERS_NAME}.commonjsGlobal`, { + magicString.overwrite(node.start, node.end, `${helpersName}.commonjsGlobal`, { storeName: true }); } @@ -432,34 +405,31 @@ export default function transformCommonjs( const nameBase = getName(id); const exportsName = deconflict([...exportsAccessScopes], globals, nameBase); const moduleName = deconflict([...moduleAccessScopes], globals, `${nameBase}Module`); + const requireName = deconflict([scope], globals, `require${capitalize(nameBase)}`); + const isRequiredName = deconflict([scope], globals, `hasRequired${capitalize(nameBase)}`); const deconflictedExportNames = Object.create(null); for (const [exportName, { scopes }] of exportsAssignmentsByName) { deconflictedExportNames[exportName] = deconflict([...scopes], globals, exportName); } // We cannot wrap ES/mixed modules - shouldWrap = - !isEsModule && - !disableWrap && - (shouldWrap || (uses.exports && moduleExportsAssignments.length > 0)); + shouldWrap = !isEsModule && (shouldWrap || (uses.exports && moduleExportsAssignments.length > 0)); const detectWrappedDefault = shouldWrap && (topLevelDefineCompiledEsmExpressions.length > 0 || code.indexOf('__esModule') >= 0); if ( !( - requiredSources.length || - dynamicRegisterSources.size || + shouldWrap || uses.module || uses.exports || uses.require || - usesDynamicRequire || hasRemovedRequire || topLevelDefineCompiledEsmExpressions.length > 0 ) && (ignoreGlobal || !uses.global) ) { - return { meta: { commonjs: { isCommonJS: false } } }; + return { meta: { commonjs: { isCommonJS: false, isMixedModule: false } } }; } let leadingComment = ''; @@ -481,19 +451,21 @@ export default function transformCommonjs( ? 'exports' : 'module'; - const importBlock = rewriteRequireExpressionsAndGetImportBlock( + const importBlock = await rewriteRequireExpressionsAndGetImportBlock( magicString, topLevelDeclarations, topLevelRequireDeclarators, reassignedNames, - HELPERS_NAME, - dynamicRegisterSources, + helpersName, + dynamicRequireName, moduleName, exportsName, id, - exportMode + exportMode, + resolveRequireSourcesAndGetMeta, + usesRequireWrapper, + uses.require ); - const exportBlock = isEsModule ? '' : rewriteExportsAndGetExportsBlock( @@ -508,16 +480,37 @@ export default function transformCommonjs( topLevelDefineCompiledEsmExpressions, deconflictedExportNames, code, - HELPERS_NAME, + helpersName, exportMode, detectWrappedDefault, - defaultIsModuleExports + defaultIsModuleExports, + usesRequireWrapper, + requireName ); if (shouldWrap) { wrapCode(magicString, uses, moduleName, exportsName); } + if (usesRequireWrapper) { + magicString + .trim() + .indent('\t') + .prepend( + `var ${isRequiredName}; + +function ${requireName} () { +\tif (${isRequiredName}) return ${exportsName}; +\t${isRequiredName} = 1; +` + ).append(` +\treturn ${exportsName}; +}`); + if (exportMode === 'replace') { + magicString.prepend(`var ${exportsName};\n`); + } + } + magicString .trim() .prepend(leadingComment + importBlock) @@ -526,7 +519,13 @@ export default function transformCommonjs( return { code: magicString.toString(), map: sourceMap ? magicString.generateMap() : null, - syntheticNamedExports: isEsModule ? false : '__moduleExports', - meta: { commonjs: { isCommonJS: !isEsModule } } + syntheticNamedExports: isEsModule || usesRequireWrapper ? false : '__moduleExports', + meta: { + // TODO Lukas extract constant + commonjs: { + isCommonJS: !isEsModule && (usesRequireWrapper ? 'withRequireFunction' : true), + isMixedModule: isEsModule + } + } }; } diff --git a/packages/commonjs/src/utils.js b/packages/commonjs/src/utils.js index e226a28fb..b7dc9cda1 100644 --- a/packages/commonjs/src/utils.js +++ b/packages/commonjs/src/utils.js @@ -41,3 +41,7 @@ export const getVirtualPathForDynamicRequirePath = (path, commonDir) => { ? VIRTUAL_PATH_BASE + normalizedPath.slice(commonDir.length) : normalizedPath; }; + +export function capitalize(name) { + return name[0].toUpperCase() + name.slice(1); +} diff --git a/packages/commonjs/test/fixtures/form/constant-template-literal/output.js b/packages/commonjs/test/fixtures/form/constant-template-literal/output.js index 96927381c..787983734 100644 --- a/packages/commonjs/test/fixtures/form/constant-template-literal/output.js +++ b/packages/commonjs/test/fixtures/form/constant-template-literal/output.js @@ -1,9 +1,9 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/constant-template-literal/input.js?commonjs-exports" -import require$$0 from "\u0000tape?commonjs-proxy"; +import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/constant-template-literal/tape.js?commonjs-proxy"; var foo = require$$0; console.log(foo); -export default input; -export { input as __moduleExports }; +export { input as __moduleExports, input as default }; diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-no-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-no-__esModule/output.js index a180c0faa..24b6fab18 100755 --- a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-no-__esModule/output.js +++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-no-__esModule/output.js @@ -4,5 +4,4 @@ import { __exports as input } from "\u0000fixtures/form/defaultIsModuleExports-a var _default = input.default = 2; var named = input.named = 3; -export default input; -export { input as __moduleExports, named }; +export { input as __moduleExports, named, input as default }; diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/output.js index 59c3241c0..c0cde8ae9 100755 --- a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/output.js +++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-__esModule/output.js @@ -4,5 +4,4 @@ import { __exports as input } from "\u0000fixtures/form/defaultIsModuleExports-f var _default = input.default = 2; var named = input.named = 3; -export default input; -export { input as __moduleExports, named }; +export { input as __moduleExports, named, input as default }; diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/output.js index 7376b2e0f..fd8c2d238 100755 --- a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/output.js +++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-no-default/output.js @@ -3,5 +3,4 @@ import { __exports as input } from "\u0000fixtures/form/defaultIsModuleExports-f var named = input.named = 3; -export default input; -export { input as __moduleExports, named }; +export { input as __moduleExports, named, input as default }; diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/output.js index 481eb01bc..48a71f980 100755 --- a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/output.js +++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-__esModule/output.js @@ -5,5 +5,4 @@ input.__esModule = true; var _default = input.default = 2; var named = input.named = 3; -export default input; -export { input as __moduleExports, named }; +export { input as __moduleExports, named, input as default }; diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/output.js index 1dcb6d233..512b2330e 100755 --- a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/output.js +++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-true-no-__esModule/output.js @@ -4,5 +4,4 @@ import { __exports as input } from "\u0000fixtures/form/defaultIsModuleExports-t var _default = input.default = 2; var named = input.named = 3; -export default input; -export { input as __moduleExports, named }; +export { input as __moduleExports, named, input as default }; diff --git a/packages/commonjs/test/fixtures/form/dynamic-template-literal/output.js b/packages/commonjs/test/fixtures/form/dynamic-template-literal/output.js index dda7d8f08..2b301a21b 100644 --- a/packages/commonjs/test/fixtures/form/dynamic-template-literal/output.js +++ b/packages/commonjs/test/fixtures/form/dynamic-template-literal/output.js @@ -1,9 +1,9 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/dynamic-template-literal/input.js?commonjs-exports" var pe = 'pe'; -var foo = commonjsHelpers.commonjsRequire(`ta${pe}`); +var foo = commonjsRequire(`ta${pe}`); console.log(foo); -export default input; -export { input as __moduleExports }; +export { input as __moduleExports, input as default }; diff --git a/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js b/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js index 496cc2ba8..5fc418cd4 100644 --- a/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js +++ b/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js @@ -1,9 +1,9 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/ignore-ids-function/input.js?commonjs-exports" -import require$$0 from "\u0000bar?commonjs-proxy"; +import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/ignore-ids-function/bar.js?commonjs-proxy"; var foo = require( 'foo' ); var bar = require$$0; -export default input; -export { input as __moduleExports }; +export { input as __moduleExports, input as default }; diff --git a/packages/commonjs/test/fixtures/form/ignore-ids/output.js b/packages/commonjs/test/fixtures/form/ignore-ids/output.js index 0df09cce8..83b9d1e9f 100644 --- a/packages/commonjs/test/fixtures/form/ignore-ids/output.js +++ b/packages/commonjs/test/fixtures/form/ignore-ids/output.js @@ -1,9 +1,9 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/ignore-ids/input.js?commonjs-exports" -import require$$0 from "\u0000bar?commonjs-proxy"; +import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/ignore-ids/bar.js?commonjs-proxy"; var foo = require( 'foo' ); var bar = require$$0; -export default input; -export { input as __moduleExports }; +export { input as __moduleExports, input as default }; diff --git a/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js index 060d12a53..cd261710a 100644 --- a/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js +++ b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js @@ -1,5 +1,6 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import require$$0 from "\u0000./input2.js?commonjs-proxy"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; +import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/multi-entry-module-exports/input2.js?commonjs-proxy"; const t2 = require$$0; diff --git a/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js b/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js index 7fc075484..0186bc7eb 100644 --- a/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js +++ b/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js @@ -1,11 +1,11 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations-b/input.js?commonjs-exports" -import require$$0 from "\u0000./a?commonjs-proxy"; +import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/a.js?commonjs-proxy"; var a = require$$0 , b = 42; console.log( a, b ); -export default input; -export { input as __moduleExports }; +export { input as __moduleExports, input as default }; diff --git a/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js b/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js index e8542c6c5..4101b47e8 100644 --- a/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js +++ b/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js @@ -1,6 +1,7 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations-c/input.js?commonjs-exports" -import require$$0 from "\u0000./b?commonjs-proxy"; +import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/b.js?commonjs-proxy"; var a = 'a' , b = require$$0 @@ -8,5 +9,4 @@ var a = 'a' console.log( a, b, c ); -export default input; -export { input as __moduleExports }; +export { input as __moduleExports, input as default }; diff --git a/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js b/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js index a7de41c4b..60c5118b9 100644 --- a/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js +++ b/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js @@ -1,12 +1,12 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations/input.js?commonjs-exports" -import require$$0 from "\u0000./a?commonjs-proxy"; -import require$$1 from "\u0000./b?commonjs-proxy"; +import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/multiple-var-declarations/a.js?commonjs-proxy"; +import require$$1 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/multiple-var-declarations/b.js?commonjs-proxy"; var a = require$$0() , b = require$$1; console.log( a, b ); -export default input; -export { input as __moduleExports }; +export { input as __moduleExports, input as default }; diff --git a/packages/commonjs/test/fixtures/form/no-exports-entry/output.js b/packages/commonjs/test/fixtures/form/no-exports-entry/output.js index 45a5c8495..3e83089b2 100644 --- a/packages/commonjs/test/fixtures/form/no-exports-entry/output.js +++ b/packages/commonjs/test/fixtures/form/no-exports-entry/output.js @@ -1,6 +1,7 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input_1 } from "\u0000fixtures/form/no-exports-entry/input.js?commonjs-exports" -import require$$0 from "\u0000./dummy?commonjs-proxy"; +import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/no-exports-entry/dummy.js?commonjs-proxy"; var dummy = require$$0; @@ -10,5 +11,4 @@ var foo = function () { var input = 42; -export default input_1; -export { input_1 as __moduleExports }; +export { input_1 as __moduleExports, input_1 as default }; diff --git a/packages/commonjs/test/fixtures/form/node-require-methods/output.js b/packages/commonjs/test/fixtures/form/node-require-methods/output.js index 1192a708d..b1ceb2c2a 100644 --- a/packages/commonjs/test/fixtures/form/node-require-methods/output.js +++ b/packages/commonjs/test/fixtures/form/node-require-methods/output.js @@ -1,9 +1,9 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/node-require-methods/input.js?commonjs-exports" var getFilePath = input.getFilePath = function getFilePath(someFile) { return require.resolve(someFile); }; -export default input; -export { input as __moduleExports, getFilePath }; +export { input as __moduleExports, getFilePath, input as default }; diff --git a/packages/commonjs/test/fixtures/form/optimised-named-export-conflicts/output.js b/packages/commonjs/test/fixtures/form/optimised-named-export-conflicts/output.js index 2a8ab72b4..a91b08d2d 100644 --- a/packages/commonjs/test/fixtures/form/optimised-named-export-conflicts/output.js +++ b/packages/commonjs/test/fixtures/form/optimised-named-export-conflicts/output.js @@ -7,5 +7,4 @@ var bar = 2; var foo_1 = input.foo = 'a'; var bar_1 = input.bar = 'b'; -export default input; -export { input as __moduleExports, foo_1 as foo, bar_1 as bar }; +export { input as __moduleExports, foo_1 as foo, bar_1 as bar, input as default }; diff --git a/packages/commonjs/test/fixtures/form/optimised-named-export/output.js b/packages/commonjs/test/fixtures/form/optimised-named-export/output.js index 4f5d1feca..e5ca89b12 100644 --- a/packages/commonjs/test/fixtures/form/optimised-named-export/output.js +++ b/packages/commonjs/test/fixtures/form/optimised-named-export/output.js @@ -4,5 +4,4 @@ import { __exports as input } from "\u0000fixtures/form/optimised-named-export/i var foo = input.foo = 'a'; var bar = input.bar = 'b'; -export default input; -export { input as __moduleExports, foo, bar }; +export { input as __moduleExports, foo, bar, input as default }; diff --git a/packages/commonjs/test/fixtures/form/require-collision/output.js b/packages/commonjs/test/fixtures/form/require-collision/output.js index 401ca324b..22eb3c645 100644 --- a/packages/commonjs/test/fixtures/form/require-collision/output.js +++ b/packages/commonjs/test/fixtures/form/require-collision/output.js @@ -1,6 +1,7 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/require-collision/input.js?commonjs-exports" -import require$$1 from "\u0000foo?commonjs-proxy"; +import require$$1 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/require-collision/foo.js?commonjs-proxy"; (function() { var foo = require$$1; @@ -8,5 +9,4 @@ import require$$1 from "\u0000foo?commonjs-proxy"; console.log(foo); })(); -export default input; -export { input as __moduleExports }; +export { input as __moduleExports, input as default }; diff --git a/packages/commonjs/test/fixtures/form/try-catch-remove/output.js b/packages/commonjs/test/fixtures/form/try-catch-remove/output.js index 1b73e073c..e18f11df0 100644 --- a/packages/commonjs/test/fixtures/form/try-catch-remove/output.js +++ b/packages/commonjs/test/fixtures/form/try-catch-remove/output.js @@ -1,5 +1,6 @@ /* eslint-disable global-require */ import * as commonjsHelpers from "_commonjsHelpers.js"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/try-catch-remove/input.js?commonjs-exports" try { @@ -8,5 +9,4 @@ try { /* ignore */ } -export default input; -export { input as __moduleExports }; +export { input as __moduleExports, input as default }; diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js index 00f1c462a..6c0116507 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js @@ -1,5 +1,6 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/unambiguous-with-default-export/input.js?commonjs-exports" -import "\u0000./foo.js?commonjs-proxy"; +import "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/foo.js?commonjs-proxy"; export default {}; diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js index b045cc0bd..b1dd5178e 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js @@ -1,5 +1,6 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/unambiguous-with-import/input.js?commonjs-exports" -import "\u0000./foo.js?commonjs-proxy"; +import "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/unambiguous-with-import/foo.js?commonjs-proxy"; import './bar.js'; diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js index bfa3f4e51..d7428f35e 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js @@ -1,5 +1,6 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; +import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/unambiguous-with-named-export/input.js?commonjs-exports" -import "\u0000./foo.js?commonjs-proxy"; +import "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/foo.js?commonjs-proxy"; export {}; diff --git a/packages/commonjs/test/fixtures/function/cjs-extension/_config.js b/packages/commonjs/test/fixtures/function/cjs-extension/_config.js new file mode 100644 index 000000000..1edda6c48 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/cjs-extension/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'imports .cjs file extension by default' +}; diff --git a/packages/commonjs/test/fixtures/samples/cjs-extension/export.cjs b/packages/commonjs/test/fixtures/function/cjs-extension/export.cjs similarity index 100% rename from packages/commonjs/test/fixtures/samples/cjs-extension/export.cjs rename to packages/commonjs/test/fixtures/function/cjs-extension/export.cjs diff --git a/packages/commonjs/test/fixtures/samples/cjs-extension/main.js b/packages/commonjs/test/fixtures/function/cjs-extension/main.js similarity index 69% rename from packages/commonjs/test/fixtures/samples/cjs-extension/main.js rename to packages/commonjs/test/fixtures/function/cjs-extension/main.js index b76e19952..fc1029fd7 100644 --- a/packages/commonjs/test/fixtures/samples/cjs-extension/main.js +++ b/packages/commonjs/test/fixtures/function/cjs-extension/main.js @@ -1,3 +1,3 @@ const { test } = require('./export.cjs'); -console.log(test); +t.is(test, 42); diff --git a/packages/commonjs/test/fixtures/function/custom-options/_config.js b/packages/commonjs/test/fixtures/function/custom-options/_config.js index a54562867..522f2c94a 100644 --- a/packages/commonjs/test/fixtures/function/custom-options/_config.js +++ b/packages/commonjs/test/fixtures/function/custom-options/_config.js @@ -22,10 +22,10 @@ module.exports = { 'other.js', 'main.js', // This is the important one - { custom: { test: 42, 'node-resolve': { isRequire: false } }, isEntry: true } + { custom: { test: 42 }, isEntry: true } ], ['main.js', void 0, { custom: {}, isEntry: true }], - ['main.js', void 0, { custom: { 'node-resolve': { isRequire: false } }, isEntry: true }] + ['main.js', void 0, { custom: {}, isEntry: true }] ]); }, resolveId(source, importer, options) { diff --git a/packages/commonjs/test/fixtures/function/custom-options/main.js b/packages/commonjs/test/fixtures/function/custom-options/main.js index c0b933d7b..36aa4b64f 100644 --- a/packages/commonjs/test/fixtures/function/custom-options/main.js +++ b/packages/commonjs/test/fixtures/function/custom-options/main.js @@ -1 +1 @@ -console.log('main'); +t.is('main', 'main'); diff --git a/packages/commonjs/test/fixtures/function/custom-options/other.js b/packages/commonjs/test/fixtures/function/custom-options/other.js index 8bbad80dc..edd7566fb 100644 --- a/packages/commonjs/test/fixtures/function/custom-options/other.js +++ b/packages/commonjs/test/fixtures/function/custom-options/other.js @@ -1 +1 @@ -console.log('other'); +throw new Error('Other should not be executed'); 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 0693ea19d..be6712858 100755 --- a/packages/commonjs/test/fixtures/function/dynamic-module-require/_config.js +++ b/packages/commonjs/test/fixtures/function/dynamic-module-require/_config.js @@ -1,4 +1,6 @@ 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 index 6085df3dc..c72a299c4 100755 --- a/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/_config.js +++ b/packages/commonjs/test/fixtures/function/dynamic-require-cache-reference/_config.js @@ -1,6 +1,8 @@ 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()] diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-different-loader/_config.js b/packages/commonjs/test/fixtures/function/dynamic-require-different-loader/_config.js new file mode 100644 index 000000000..886b59564 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-different-loader/_config.js @@ -0,0 +1,21 @@ +const path = require('path'); + +module.exports = { + description: 'handles dynamic requires when entry is from a custom loader', + options: { + plugins: [ + { + load(id) { + if (id === path.resolve('fixtures/function/dynamic-require-different-loader/main.js')) { + return 'import submodule1 from "./submodule1"; export default submodule1();'; + } + return null; + } + } + ] + }, + pluginOptions: { + dynamicRequireTargets: ['fixtures/function/dynamic-require-different-loader/submodule2.js'], + transformMixedEsModules: true + } +}; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-different-loader/main.js b/packages/commonjs/test/fixtures/function/dynamic-require-different-loader/main.js new file mode 100755 index 000000000..4b24999ae --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-different-loader/main.js @@ -0,0 +1 @@ +throw new Error('Should be replaced by a custom loader'); diff --git a/packages/commonjs/test/fixtures/samples/dynamic-require-different-loader/submodule1.js b/packages/commonjs/test/fixtures/function/dynamic-require-different-loader/submodule1.js similarity index 100% rename from packages/commonjs/test/fixtures/samples/dynamic-require-different-loader/submodule1.js rename to packages/commonjs/test/fixtures/function/dynamic-require-different-loader/submodule1.js diff --git a/packages/commonjs/test/fixtures/samples/dynamic-require-different-loader/submodule2.js b/packages/commonjs/test/fixtures/function/dynamic-require-different-loader/submodule2.js similarity index 100% rename from packages/commonjs/test/fixtures/samples/dynamic-require-different-loader/submodule2.js rename to packages/commonjs/test/fixtures/function/dynamic-require-different-loader/submodule2.js diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/_config.js b/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/_config.js new file mode 100755 index 000000000..df33c9e84 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/_config.js @@ -0,0 +1,7 @@ +module.exports = { + description: 'supports strict require semantic in mixed modules', + pluginOptions: { + strictRequireSemantic: true, + transformMixedEsModules: true + } +}; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/importer.js b/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/importer.js new file mode 100755 index 000000000..ab6eb9fa2 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/importer.js @@ -0,0 +1,7 @@ +t.is(global.hasSubmoduleRun, undefined, 'before require'); + +// eslint-disable-next-line global-require +export default require('./submodule.js'); + +t.is(global.hasSubmoduleRun, true, 'after require'); +delete global.hasSubmoduleRun; diff --git a/packages/commonjs/test/fixtures/samples/dynamic-require-es-mixed-helpers/main.js b/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/main.js similarity index 50% rename from packages/commonjs/test/fixtures/samples/dynamic-require-es-mixed-helpers/main.js rename to packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/main.js index 523e6c2dc..a7add1fba 100755 --- a/packages/commonjs/test/fixtures/samples/dynamic-require-es-mixed-helpers/main.js +++ b/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/main.js @@ -1,5 +1,3 @@ -/* eslint-disable import/no-dynamic-require, global-require */ - import result from './importer.js'; t.is(result, 'submodule'); diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/submodule.js b/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/submodule.js new file mode 100755 index 000000000..15eb5a9b1 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/submodule.js @@ -0,0 +1,2 @@ +global.hasSubmoduleRun = true; +module.exports = 'submodule'; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-root-circular/_config.js b/packages/commonjs/test/fixtures/function/dynamic-require-root-circular/_config.js index c426b3756..15ca843d9 100755 --- a/packages/commonjs/test/fixtures/function/dynamic-require-root-circular/_config.js +++ b/packages/commonjs/test/fixtures/function/dynamic-require-root-circular/_config.js @@ -1,7 +1,7 @@ const { nodeResolve } = require('@rollup/plugin-node-resolve'); module.exports = { - description: 'resolves circular references through indirect access (../ to module\'s root)', + description: "resolves circular references through indirect access (../ to module's root)", options: { plugins: [nodeResolve()] }, 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 index 0713326f6..013229479 100755 --- a/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/_config.js +++ b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/_config.js @@ -1,9 +1,6 @@ const { nodeResolve } = require('@rollup/plugin-node-resolve'); module.exports = { - // TODO This test is broken because for dynamic require targets with dependencies, the dependencies are hoisted - // above the dynamic register calls at the moment - skip: true, description: 'resolves imports of node_modules module with halfway / subfolder access', options: { plugins: [nodeResolve()] 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 index cee139817..111bd1688 100755 --- a/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/main.js +++ b/packages/commonjs/test/fixtures/function/dynamic-require-slash-access/main.js @@ -4,13 +4,13 @@ function takeModule(name) { return require(name); } -t.is(takeModule('.'), 'same-directory'); -t.is(takeModule('./'), 'same-directory'); -t.is(takeModule('.//'), 'same-directory'); +t.is(takeModule('.'), 'same-directory', '.'); +t.is(takeModule('./'), 'same-directory', './'); +t.is(takeModule('.//'), 'same-directory', './/'); -t.is(takeModule('./sub'), 'sub'); +t.is(takeModule('./sub'), 'sub', './sub'); -t.is(takeModule('custom-module'), 'custom-module + sub'); +t.is(takeModule('custom-module'), 'custom-module + sub', 'custom-module'); t.deepEqual(require('./sub/sub'), { parent: 'same-directory', customModule: 'custom-module + sub' diff --git a/packages/commonjs/test/fixtures/function/no-default-export-live-binding/_config.js b/packages/commonjs/test/fixtures/function/no-default-export-live-binding/_config.js deleted file mode 100644 index 13fadfa24..000000000 --- a/packages/commonjs/test/fixtures/function/no-default-export-live-binding/_config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - description: 'there should not be a live-binding for the default export' -}; diff --git a/packages/commonjs/test/fixtures/function/no-default-export-live-binding/dep1.js b/packages/commonjs/test/fixtures/function/no-default-export-live-binding/dep1.js deleted file mode 100644 index ec206b365..000000000 --- a/packages/commonjs/test/fixtures/function/no-default-export-live-binding/dep1.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - foo: 'foo', - update: () => (module.exports = { foo: 'bar' }) -}; diff --git a/packages/commonjs/test/fixtures/function/no-default-export-live-binding/dep2.js b/packages/commonjs/test/fixtures/function/no-default-export-live-binding/dep2.js deleted file mode 100644 index f3b624c2e..000000000 --- a/packages/commonjs/test/fixtures/function/no-default-export-live-binding/dep2.js +++ /dev/null @@ -1,2 +0,0 @@ -module.exports.foo = 'foo'; -module.exports.update = () => (module.exports = { foo: 'bar' }); diff --git a/packages/commonjs/test/fixtures/function/no-default-export-live-binding/dep3.js b/packages/commonjs/test/fixtures/function/no-default-export-live-binding/dep3.js deleted file mode 100644 index 2254de7eb..000000000 --- a/packages/commonjs/test/fixtures/function/no-default-export-live-binding/dep3.js +++ /dev/null @@ -1,2 +0,0 @@ -exports.foo = 'foo'; -module.exports.update = () => (module.exports = { foo: 'bar' }); diff --git a/packages/commonjs/test/fixtures/function/no-default-export-live-binding/main.js b/packages/commonjs/test/fixtures/function/no-default-export-live-binding/main.js deleted file mode 100644 index 75edbb4f4..000000000 --- a/packages/commonjs/test/fixtures/function/no-default-export-live-binding/main.js +++ /dev/null @@ -1,15 +0,0 @@ -import dep1 from './dep1.js'; -import dep2 from './dep2.js'; -import dep3 from './dep3.js'; - -t.is(dep1.foo, 'foo', 'dep1'); -dep1.update(); -t.is(dep1.foo, 'foo', 'dep1 updated'); - -t.is(dep2.foo, 'foo', 'dep2'); -dep2.update(); -t.is(dep2.foo, 'foo', 'dep2 updated'); - -t.is(dep3.foo, 'foo', 'dep3'); -dep3.update(); -t.is(dep3.foo, 'foo', 'dep3 updated'); diff --git a/packages/commonjs/test/fixtures/function/reassign-module/main.js b/packages/commonjs/test/fixtures/function/reassign-module/main.js index 1e30b5021..17bbecf93 100644 --- a/packages/commonjs/test/fixtures/function/reassign-module/main.js +++ b/packages/commonjs/test/fixtures/function/reassign-module/main.js @@ -3,7 +3,7 @@ const property = require('./property'); const arrayPattern = require('./array-pattern.js'); const assignmentPattern = require('./assignment-pattern.js'); -t.deepEqual(identifier, {}); -t.deepEqual(property, {}); -t.deepEqual(arrayPattern, {}); -t.deepEqual(assignmentPattern, {}); +t.deepEqual(identifier, {}, 'identifier'); +t.deepEqual(property, {}, 'property'); +t.deepEqual(arrayPattern, {}, 'arrayPattern'); +t.deepEqual(assignmentPattern, {}, 'assignmentPattern'); diff --git a/packages/commonjs/test/fixtures/function/shorthand-require/_config.js b/packages/commonjs/test/fixtures/function/shorthand-require/_config.js new file mode 100755 index 000000000..00d2b9db7 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/shorthand-require/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'correctly replaces shorthand `require` property in object' +}; diff --git a/packages/commonjs/test/fixtures/samples/shorthand-require/main.js b/packages/commonjs/test/fixtures/function/shorthand-require/main.js similarity index 100% rename from packages/commonjs/test/fixtures/samples/shorthand-require/main.js rename to packages/commonjs/test/fixtures/function/shorthand-require/main.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js new file mode 100644 index 000000000..30b61d0c5 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js @@ -0,0 +1,6 @@ +module.exports = { + description: 'supports using function wrappers for modules', + pluginOptions: { + strictRequireSemantic: ['fixtures/function/strict-require-semantic-exportmode-exports/*E*.js'] + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/assignExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/assignExports.js new file mode 100644 index 000000000..5e58a22e5 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/assignExports.js @@ -0,0 +1,2 @@ +exports.foo = 'foo'; +global.hasAssignExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/compiledEsm.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/compiledEsm.js new file mode 100644 index 000000000..b011461c8 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/compiledEsm.js @@ -0,0 +1,4 @@ +exports.__esModule = true; +Object.defineProperty(exports, '__esModule', { value: true }); +exports.foo = 'foo'; +global.hasCompiledEsmRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/main.js new file mode 100644 index 000000000..90fca158f --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/main.js @@ -0,0 +1,17 @@ +t.is(global.hasAssignExportsRun, undefined, 'before require'); +t.is(require('./assignExports.js').foo, 'foo'); + +t.is(global.hasAssignExportsRun, true, 'after require'); +delete global.hasAssignExportsRun; + +t.is(global.hasReassignModuleExportsRun, undefined, 'before require'); +t.is(require('./reassignModuleExports.js').foo, 'foo'); + +t.is(global.hasReassignModuleExportsRun, true, 'after require'); +delete global.hasReassignModuleExportsRun; + +t.is(global.hasCompiledEsmRun, undefined, 'before require'); +t.is(require('./compiledEsm.js').foo, 'foo'); + +t.is(global.hasCompiledEsmRun, true, 'after require'); +delete global.hasCompiledEsmRun; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/reassignModuleExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/reassignModuleExports.js new file mode 100644 index 000000000..d988c04a8 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/reassignModuleExports.js @@ -0,0 +1,3 @@ +module.exports = { bar: 'bar' }; +module.exports.foo = 'foo'; +global.hasReassignModuleExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/typeof-module-require/foo.js b/packages/commonjs/test/fixtures/function/typeof-module-require/foo.js index 8ddba70a6..8efe5218f 100644 --- a/packages/commonjs/test/fixtures/function/typeof-module-require/foo.js +++ b/packages/commonjs/test/fixtures/function/typeof-module-require/foo.js @@ -1,5 +1,5 @@ if (typeof module.require === 'function' && module.require) { - module.exports = 1; + module.exports = 'require detected'; } else { - module.exports = 2; + module.exports = 'could not detect require'; } diff --git a/packages/commonjs/test/fixtures/function/typeof-module-require/main.js b/packages/commonjs/test/fixtures/function/typeof-module-require/main.js index 6f32f015a..57de0e64f 100644 --- a/packages/commonjs/test/fixtures/function/typeof-module-require/main.js +++ b/packages/commonjs/test/fixtures/function/typeof-module-require/main.js @@ -1,3 +1,3 @@ import foo from './foo.js'; -t.is(foo, 1); +t.is(foo, 'require detected'); diff --git a/packages/commonjs/test/fixtures/function/unresolved-dependencies/_config.js b/packages/commonjs/test/fixtures/function/unresolved-dependencies/_config.js index a7daf279e..72b184cf6 100644 --- a/packages/commonjs/test/fixtures/function/unresolved-dependencies/_config.js +++ b/packages/commonjs/test/fixtures/function/unresolved-dependencies/_config.js @@ -11,9 +11,12 @@ module.exports = { plugins: [ { buildEnd() { - assert.strictEqual(warnings.length, 1); - assert.strictEqual(warnings[0].code, 'UNRESOLVED_IMPORT'); - assert.strictEqual(warnings[0].source, 'path'); + assert.deepStrictEqual( + warnings.map(({ code, source }) => { + return { code, source }; + }), + [{ code: 'UNRESOLVED_IMPORT', source: 'path' }] + ); } } ] diff --git a/packages/commonjs/test/fixtures/samples/dynamic-require-different-loader/main.js b/packages/commonjs/test/fixtures/samples/dynamic-require-different-loader/main.js deleted file mode 100755 index 8adb18ef2..000000000 --- a/packages/commonjs/test/fixtures/samples/dynamic-require-different-loader/main.js +++ /dev/null @@ -1 +0,0 @@ -// will be actually be loaded by the custom loader diff --git a/packages/commonjs/test/fixtures/samples/dynamic-require-double-wrap/main.js b/packages/commonjs/test/fixtures/samples/dynamic-require-double-wrap/main.js deleted file mode 100644 index d064297ec..000000000 --- a/packages/commonjs/test/fixtures/samples/dynamic-require-double-wrap/main.js +++ /dev/null @@ -1 +0,0 @@ -require('./submodule'); diff --git a/packages/commonjs/test/fixtures/samples/dynamic-require-double-wrap/submodule.js b/packages/commonjs/test/fixtures/samples/dynamic-require-double-wrap/submodule.js deleted file mode 100644 index 837892314..000000000 --- a/packages/commonjs/test/fixtures/samples/dynamic-require-double-wrap/submodule.js +++ /dev/null @@ -1,3 +0,0 @@ -Object.defineProperty(exports, '__esModule', { value: true }); - -module.exports = 'submodule'; diff --git a/packages/commonjs/test/fixtures/samples/dynamic-require-es-mixed-helpers/importer.js b/packages/commonjs/test/fixtures/samples/dynamic-require-es-mixed-helpers/importer.js deleted file mode 100755 index 6acaa9d43..000000000 --- a/packages/commonjs/test/fixtures/samples/dynamic-require-es-mixed-helpers/importer.js +++ /dev/null @@ -1,2 +0,0 @@ -// eslint-disable-next-line global-require -export default require('./submodule.js'); diff --git a/packages/commonjs/test/fixtures/samples/dynamic-require-es-mixed-helpers/submodule.js b/packages/commonjs/test/fixtures/samples/dynamic-require-es-mixed-helpers/submodule.js deleted file mode 100755 index c285d34bc..000000000 --- a/packages/commonjs/test/fixtures/samples/dynamic-require-es-mixed-helpers/submodule.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 'submodule'; diff --git a/packages/commonjs/test/form.js b/packages/commonjs/test/form.js index f9de9cb65..d551cc43b 100644 --- a/packages/commonjs/test/form.js +++ b/packages/commonjs/test/form.js @@ -1,6 +1,7 @@ /* eslint-disable global-require, import/no-dynamic-require, no-console */ import * as fs from 'fs'; +import * as path from 'path'; import * as acorn from 'acorn'; import test from 'ava'; @@ -15,7 +16,12 @@ const transformContext = { ecmaVersion: 9, sourceType: 'module', ...options - }) + }), + resolve: (source, importer) => + Promise.resolve({ + id: `${path.resolve(path.dirname(importer), source)}${path.extname(source) ? '' : '.js'}` + }), + load: ({ id }) => Promise.resolve({ id, meta: {} }) }; fs.readdirSync('./fixtures/form').forEach((dir) => { @@ -37,55 +43,58 @@ fs.readdirSync('./fixtures/form').forEach((dir) => { inputEntries.push(['output', `fixtures/form/${dir}/input.js`]); } - (config.solo ? test.only : test)(dir, async (t) => { - for (const [outputName, id] of inputEntries) { - const { transform } = commonjs(config.options); - - transformContext.getModuleInfo = (moduleId) => { - return { - isEntry: config.entry && moduleId === id, - importers: - config.importers && config.importers[outputName] - ? config.importers[outputName].map((x) => `fixtures/form/${dir}/${x}`) - : [] + (config.solo ? test.only : test)(dir, (t) => + Promise.all( + inputEntries.map(async ([outputName, id]) => { + const { transform } = commonjs(config.options); + + transformContext.getModuleInfo = (moduleId) => { + return { + isEntry: config.entry && moduleId === id, + importers: + config.importers && config.importers[outputName] + ? config.importers[outputName].map((x) => `fixtures/form/${dir}/${x}`) + : [] + }; }; - }; - transformContext.error = (base, props) => { - let error = base; - if (!(base instanceof Error)) error = Object.assign(new Error(base.message), base); - if (props) Object.assign(error, props); - throw error; - }; - - const input = fs.readFileSync(id, 'utf-8'); - - let outputFile = `fixtures/form/${dir}/${outputName}`; - if (fs.existsSync(`${outputFile}.${process.platform}.js`)) { - outputFile += `.${process.platform}.js`; - } else { - outputFile += '.js'; - } - - const expected = fs.readFileSync(outputFile, 'utf-8').trim(); - const transformed = transform.call(transformContext, input, id); - const actual = (transformed ? transformed.code : input).trim().replace(/\0/g, '_'); - - // uncomment to update snapshots - // fs.writeFileSync(outputFile, `${actual}\n`); - - // trim whitespace from line endings, - // this will benefit issues like `form/try-catch-remove` where whitespace is left in the line, - // and testing on windows (\r\n) - t.is( - actual - .split('\n') - .map((x) => x.trimEnd()) - .join('\n'), - expected - .split('\n') - .map((x) => x.trimEnd()) - .join('\n') - ); - } - }); + transformContext.error = (base, props) => { + let error = base; + if (!(base instanceof Error)) error = Object.assign(new Error(base.message), base); + if (props) Object.assign(error, props); + throw error; + }; + + const input = fs.readFileSync(id, 'utf-8'); + + let outputFile = `fixtures/form/${dir}/${outputName}`; + if (fs.existsSync(`${outputFile}.${process.platform}.js`)) { + outputFile += `.${process.platform}.js`; + } else { + outputFile += '.js'; + } + + const expected = fs.readFileSync(outputFile, 'utf-8').trim(); + // eslint-disable-next-line no-await-in-loop + const transformed = await transform.call(transformContext, input, id); + const actual = (transformed ? transformed.code : input).trim().replace(/\0/g, '_'); + + // uncomment to update snapshots + // fs.writeFileSync(outputFile, `${actual}\n`); + + // trim whitespace from line endings, + // this will benefit issues like `form/try-catch-remove` where whitespace is left in the line, + // and testing on windows (\r\n) + t.is( + actual + .split('\n') + .map((x) => x.trimEnd()) + .join('\n'), + expected + .split('\n') + .map((x) => x.trimEnd()) + .join('\n') + ); + }) + ) + ); }); diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index 39078a541..48dcc52e9 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -11,16 +11,14 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ - var foo$2 = {exports: {}};␊ + var foo$1 = {exports: {}};␊ ␊ const foo = {};␊ ␊ - foo$2.exports = foo;␊ - foo$2.exports.bar = 1;␊ - ␊ - var foo$1 = foo$2.exports;␊ + foo$1.exports = foo;␊ + foo$1.exports.bar = 1;␊ ␊ - t.is(foo$1.bar, 1);␊ + t.is(foo$1.exports.bar, 1);␊ `, } @@ -31,19 +29,17 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ - var document$2 = {exports: {}};␊ + var document$1 = {exports: {}};␊ ␊ /* eslint-disable */␊ ␊ if (typeof document !== 'undefined') {␊ - document$2.exports = document;␊ + document$1.exports = document;␊ } else {␊ - document$2.exports = { fake: true };␊ + document$1.exports = { fake: true };␊ }␊ ␊ - var document$1 = document$2.exports;␊ - ␊ - t.deepEqual(document$1, { real: true });␊ + t.deepEqual(document$1.exports, { real: true });␊ `, } @@ -158,6 +154,27 @@ Generated by [AVA](https://avajs.dev). `, } +## cjs-extension + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var _export = {␊ + test: 42␊ + };␊ + ␊ + const { test } = _export;␊ + ␊ + t.is(test, 42);␊ + ␊ + module.exports = main;␊ + `, + } + ## custom-options > Snapshot 1 @@ -165,7 +182,7 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ - console.log('main');␊ + t.is('main', 'main');␊ `, } @@ -273,16 +290,14 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ - var x$2 = {exports: {}};␊ + var x$1 = {exports: {}};␊ ␊ const x = {};␊ ␊ - x$2.exports = x;␊ - x$2.exports.default = x;␊ - ␊ - var x$1 = x$2.exports;␊ + x$1.exports = x;␊ + x$1.exports.default = x;␊ ␊ - t.is(x$1.default, x$1);␊ + t.is(x$1.exports.default, x$1.exports);␊ `, } @@ -293,16 +308,14 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ - var x$2 = {exports: {}};␊ + var x$1 = {exports: {}};␊ ␊ const x = {};␊ ␊ - x$2.exports = x;␊ - x$2.exports.default = 42;␊ + x$1.exports = x;␊ + x$1.exports.default = 42;␊ ␊ - var x$1 = x$2.exports;␊ - ␊ - t.deepEqual(x$1, { default: 42 });␊ + t.deepEqual(x$1.exports, { default: 42 });␊ `, } @@ -334,119 +347,60 @@ Generated by [AVA](https://avajs.dev). `, } -## dynamic-module-require +## dynamic-require > 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 submodule;␊ + var hasRequiredSubmodule;␊ ␊ - function createModule(modulePath) {␊ - return {␊ - path: modulePath,␊ - exports: {},␊ - require: function (path, base) {␊ - return commonjsRequire(path, base == null ? modulePath : base);␊ - }␊ + function requireSubmodule () {␊ + if (hasRequiredSubmodule) return submodule;␊ + hasRequiredSubmodule = 1;␊ + submodule = function () {␊ + return 'Hello there';␊ };␊ + return submodule;␊ }␊ ␊ - function commonjsRegister$1 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ - }␊ - ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ + var dynamicModules;␊ ␊ - 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;␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require/submodule.js": requireSubmodule␊ + });␊ }␊ ␊ - 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;␊ - }␊ + function commonjsRequire(path, originalModuleDir) {␊ + var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return getDynamicModules()[resolvedPath]();␊ }␊ - if (joined === undefined)␊ - return '.';␊ - ␊ - return joined;␊ + 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 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 commonjsResolve (path, originalModuleDir) {␊ + const resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ }␊ ␊ - function dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ - ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var 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 '.';␊ - }␊ + commonjsRequire.resolve = commonjsResolve;␊ ␊ - function commonjsResolveImpl (path, originalModuleDir, testCache) {␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ @@ -460,15 +414,9 @@ Generated by [AVA](https://avajs.dev). break; // Travelled too far up, avoid infinite loop␊ }␊ ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ + for (var extensionIndex = 0; extensionIndex < checkedExtensions.length; extensionIndex++) {␊ + var resolvedPath = relPath + checkedExtensions[extensionIndex];␊ + if (modules[resolvedPath]) {␊ return resolvedPath;␊ }␊ }␊ @@ -480,73 +428,62 @@ Generated by [AVA](https://avajs.dev). return null;␊ }␊ ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ + 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 commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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 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;␊ }␊ ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ - ␊ - var main$1 = createModule("/$$rollup_base$$/fixtures/function/dynamic-module-require");␊ - ␊ - const commonjsRegister = commonjsRegister$1;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-module-require/submodule.js", function (module, exports) {␊ - module.exports = function () {␊ - return 'Hello there';␊ - };␊ + 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 = {};␊ ␊ - (function (module) {␊ /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ let message;␊ ␊ function takeModule(withName) {␊ - return module.require(`./${withName}`);␊ + return commonjsRequire(`./${withName}`, "/$$rollup_base$$/fixtures/function/dynamic-require");␊ }␊ ␊ try {␊ @@ -557,117 +494,85 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ t.is(message, 'Hello there');␊ - }(main$1));␊ - ␊ - var main = main$1.exports;␊ ␊ module.exports = main;␊ `, } -## dynamic-require +## dynamic-require-absolute-import > 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 direct;␊ + var hasRequiredDirect;␊ ␊ - function commonjsRegister$1 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ + function requireDirect () {␊ + if (hasRequiredDirect) return direct;␊ + hasRequiredDirect = 1;␊ + direct = 'direct';␊ + return direct;␊ }␊ ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ + var nested;␊ + var hasRequiredNested;␊ ␊ - 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;␊ + function requireNested () {␊ + if (hasRequiredNested) return nested;␊ + hasRequiredNested = 1;␊ + nested = 'nested';␊ + return nested;␊ }␊ ␊ - 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 parent;␊ + var hasRequiredParent;␊ ␊ - 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 requireParent () {␊ + if (hasRequiredParent) return parent;␊ + hasRequiredParent = 1;␊ + parent = 'parent';␊ + return parent;␊ }␊ ␊ - function dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ + var dynamicModules;␊ ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var c = path.charCodeAt(i);␊ - if ((c === 47 || c === 92) && i !== path.length - 1)␊ - break;␊ - i--;␊ - }␊ - ␊ - if (i > 0)␊ - return path.substr(0, i);␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-absolute-import/sub/node_modules/module/direct.js": requireDirect,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-absolute-import/sub/node_modules/module/nested/nested.js": requireNested,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-absolute-import/node_modules/parent-module/parent.js": requireParent␊ + });␊ + }␊ ␊ - if (path.chartCodeAt(0) === 47 || path.chartCodeAt(0) === 92)␊ - return path.charAt(0);␊ + 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.');␊ + }␊ ␊ - return '.';␊ + function commonjsResolve (path, originalModuleDir) {␊ + const resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ }␊ ␊ - function commonjsResolveImpl (path, originalModuleDir, testCache) {␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ @@ -681,15 +586,9 @@ Generated by [AVA](https://avajs.dev). break; // Travelled too far up, avoid infinite loop␊ }␊ ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ + for (var extensionIndex = 0; extensionIndex < checkedExtensions.length; extensionIndex++) {␊ + var resolvedPath = relPath + checkedExtensions[extensionIndex];␊ + if (modules[resolvedPath]) {␊ return resolvedPath;␊ }␊ }␊ @@ -701,108 +600,16 @@ Generated by [AVA](https://avajs.dev). return null;␊ }␊ ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ - }␊ - ␊ - function commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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.');␊ - }␊ - ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ - ␊ - var main = {};␊ - ␊ - const commonjsRegister = commonjsRegister$1;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require/submodule.js", function (module, exports) {␊ - module.exports = function () {␊ - return 'Hello there';␊ - };␊ - ␊ - });␊ - ␊ - /* eslint-disable import/no-dynamic-require, global-require */␊ - ␊ - let message;␊ - ␊ - function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`,"/$$rollup_base$$/fixtures/function/dynamic-require");␊ - }␊ - ␊ - try {␊ - const submodule = takeModule('submodule');␊ - message = submodule();␊ - } catch (err) {␊ - ({ message } = err);␊ - }␊ - ␊ - t.is(message, 'Hello there');␊ - ␊ - module.exports = main;␊ - `, - } - -## dynamic-require-absolute-import - -> 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$3 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ + 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;␊ }␊ ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ - ␊ function normalize (path) {␊ path = path.replace(/\\\\/g, '/');␊ var parts = path.split('/');␊ @@ -820,180 +627,35 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ path = parts.join('/');␊ - if (slashed && path[0] !== '/')␊ - path = '/' + path;␊ - else if (path.length === 0)␊ - path = '.';␊ + if (slashed && path[0] !== '/') path = '/' + path;␊ + else if (path.length === 0) path = '.';␊ return path;␊ }␊ ␊ function join () {␊ - if (arguments.length === 0)␊ - return '.';␊ + if (arguments.length === 0) return '.';␊ var joined;␊ for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ + var arg = arguments[i];␊ + if (arg.length > 0) {␊ if (joined === undefined)␊ - joined = arg;␊ + joined = arg;␊ else␊ - joined += '/' + arg;␊ - }␊ + joined += '/' + arg;␊ + }␊ }␊ - if (joined === undefined)␊ - return '.';␊ - ␊ + if (joined === undefined) return '.';␊ return joined;␊ }␊ ␊ - 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 dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ - ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var 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 commonjsResolveImpl (path, originalModuleDir, testCache) {␊ - var shouldTryNodeModules = isPossibleNodeModulesPath(path);␊ - path = normalize(path);␊ - var relPath;␊ - if (path[0] === '/') {␊ - originalModuleDir = '/';␊ - }␊ - 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));␊ - }␊ - ␊ - if (relPath.endsWith('/..')) {␊ - break; // Travelled too far up, avoid infinite loop␊ - }␊ - ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - }␊ - if (!shouldTryNodeModules) break;␊ - var nextDir = normalize(originalModuleDir + '/..');␊ - if (nextDir === originalModuleDir) break;␊ - originalModuleDir = nextDir;␊ - }␊ - return null;␊ - }␊ - ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ - }␊ - ␊ - function commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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.');␊ - }␊ - ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ - ␊ var main = {};␊ ␊ - const commonjsRegister$2 = commonjsRegister$3;␊ - commonjsRegister$2("/$$rollup_base$$/fixtures/function/dynamic-require-absolute-import/sub/node_modules/module/direct.js", function (module, exports) {␊ - module.exports = 'direct';␊ - ␊ - });␊ - ␊ - const commonjsRegister$1 = commonjsRegister$3;␊ - commonjsRegister$1("/$$rollup_base$$/fixtures/function/dynamic-require-absolute-import/sub/node_modules/module/nested/nested.js", function (module, exports) {␊ - module.exports = 'nested';␊ - ␊ - });␊ - ␊ - const commonjsRegister = commonjsRegister$3;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-absolute-import/node_modules/parent-module/parent.js", function (module, exports) {␊ - module.exports = 'parent';␊ - ␊ - });␊ - ␊ var submodule = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(name) {␊ - return commonjsRequire(name,"/$$rollup_base$$/fixtures/function/dynamic-require-absolute-import/sub");␊ + return commonjsRequire(name, "/$$rollup_base$$/fixtures/function/dynamic-require-absolute-import/sub");␊ }␊ ␊ submodule.moduleDirect = takeModule('module/direct');␊ @@ -1012,118 +674,69 @@ Generated by [AVA](https://avajs.dev). `, } -## dynamic-require-cache-reference +## dynamic-require-code-splitting > Snapshot 1 { - 'main.js': `'use strict';␊ + 'generated-lib2.js': `'use strict';␊ ␊ - var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ + var target1;␊ + var hasRequiredTarget1;␊ ␊ - function commonjsRegister$2 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ + function requireTarget1 () {␊ + if (hasRequiredTarget1) return target1;␊ + hasRequiredTarget1 = 1;␊ + target1 = '1';␊ + return target1;␊ }␊ ␊ - function commonjsRegisterOrShort$1 (path, to) {␊ - var resolvedPath = commonjsResolveImpl(path, null);␊ - if (resolvedPath !== null && DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - DYNAMIC_REQUIRE_CACHE[path] = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - } else {␊ - DYNAMIC_REQUIRE_SHORTS[path] = to;␊ - }␊ + var target2;␊ + var hasRequiredTarget2;␊ + ␊ + function requireTarget2 () {␊ + if (hasRequiredTarget2) return target2;␊ + hasRequiredTarget2 = 1;␊ + target2 = '2';␊ + return target2;␊ }␊ ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ + var dynamicModules;␊ ␊ - 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;␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-code-splitting/target1.js": requireTarget1,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-code-splitting/target2.js": requireTarget2␊ + });␊ }␊ ␊ - 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;␊ - }␊ + function commonjsRequire(path, originalModuleDir) {␊ + var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return getDynamicModules()[resolvedPath]();␊ }␊ - if (joined === undefined)␊ - return '.';␊ - ␊ - return joined;␊ + 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 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 commonjsResolve (path, originalModuleDir) {␊ + const resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ }␊ ␊ - function dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ - ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var 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 '.';␊ - }␊ + commonjsRequire.resolve = commonjsResolve;␊ ␊ - function commonjsResolveImpl (path, originalModuleDir, testCache) {␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ @@ -1137,15 +750,9 @@ Generated by [AVA](https://avajs.dev). break; // Travelled too far up, avoid infinite loop␊ }␊ ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ + for (var extensionIndex = 0; extensionIndex < checkedExtensions.length; extensionIndex++) {␊ + var resolvedPath = relPath + checkedExtensions[extensionIndex];␊ + if (modules[resolvedPath]) {␊ return resolvedPath;␊ }␊ }␊ @@ -1157,139 +764,16 @@ Generated by [AVA](https://avajs.dev). return null;␊ }␊ ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ - }␊ - ␊ - function commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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.');␊ - }␊ - ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ - ␊ - var main = {};␊ - ␊ - const commonjsRegister$1 = commonjsRegister$2;␊ - commonjsRegister$1("/$$rollup_base$$/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module/index.js", function (module, exports) {␊ - module.exports = {␊ - foo: 'bar',␊ - };␊ - ␊ - });␊ - ␊ - 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];␊ - }␊ - }␊ - ␊ - var stealthy = function stealth(cacheObject, cb) {␊ - let orig = Object.create(null);␊ - ␊ - mv(cacheObject, orig);␊ - clear(cacheObject);␊ - ␊ - let res = cb();␊ - ␊ - clear(cacheObject);␊ - mv(orig, cacheObject);␊ - ␊ - return res;␊ - };␊ - ␊ - const commonjsRegister = commonjsRegister$2;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module2/index.js", function (module, exports) {␊ - const stealthRequire = stealthy;␊ - ␊ - module.exports = stealthRequire(commonjsRequire.cache, () => {␊ - let m = commonjsRequire("custom-module", "/$$rollup_base$$/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module2");␊ - m.foo = 'baz';␊ - return m;␊ - });␊ - ␊ - });␊ - ␊ - const commonjsRegisterOrShort = commonjsRegisterOrShort$1;␊ - commonjsRegisterOrShort("/$$rollup_base$$/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module", "/$$rollup_base$$/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module/index.js");␊ - commonjsRegisterOrShort("/$$rollup_base$$/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module2", "/$$rollup_base$$/fixtures/function/dynamic-require-cache-reference/node_modules/custom-module2/index.js");␊ - ␊ - const a = commonjsRequire("custom-module2", "/$$rollup_base$$/fixtures/function/dynamic-require-cache-reference");␊ - const b = commonjsRequire("custom-module", "/$$rollup_base$$/fixtures/function/dynamic-require-cache-reference");␊ - ␊ - t.is(a.foo, 'baz');␊ - t.is(b.foo, 'bar');␊ - ␊ - module.exports = main;␊ - `, - } - -## dynamic-require-code-splitting - -> Snapshot 1 - - { - 'generated-lib2.js': `'use strict';␊ - ␊ - var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ - ␊ - function commonjsRegister$2 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ + 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;␊ }␊ ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ - ␊ function normalize (path) {␊ path = path.replace(/\\\\/g, '/');␊ var parts = path.split('/');␊ @@ -1307,1179 +791,145 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ path = parts.join('/');␊ - if (slashed && path[0] !== '/')␊ - path = '/' + path;␊ - else if (path.length === 0)␊ - path = '.';␊ + if (slashed && path[0] !== '/') path = '/' + path;␊ + else if (path.length === 0) path = '.';␊ return path;␊ }␊ ␊ function join () {␊ - if (arguments.length === 0)␊ - return '.';␊ + if (arguments.length === 0) return '.';␊ var joined;␊ for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ + var arg = arguments[i];␊ + if (arg.length > 0) {␊ if (joined === undefined)␊ - joined = arg;␊ + joined = arg;␊ else␊ - joined += '/' + arg;␊ - }␊ + joined += '/' + arg;␊ + }␊ }␊ - if (joined === undefined)␊ - return '.';␊ - ␊ + if (joined === undefined) return '.';␊ return joined;␊ }␊ ␊ - 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;␊ - }␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ - function dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ + let message;␊ ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var c = path.charCodeAt(i);␊ - if ((c === 47 || c === 92) && i !== path.length - 1)␊ - break;␊ - i--;␊ + for (const index of [1, 2]) {␊ + try {␊ + message = commonjsRequire(`./target${index}.js`, "/$$rollup_base$$/fixtures/function/dynamic-require-code-splitting");␊ + } catch (err) {␊ + ({ message } = err);␊ }␊ + t.is(message, index.toString());␊ + }␊ ␊ - if (i > 0)␊ - return path.substr(0, i);␊ - ␊ - if (path.chartCodeAt(0) === 47 || path.chartCodeAt(0) === 92)␊ - return path.charAt(0);␊ + exports.commonjsRequire = commonjsRequire;␊ + `, + 'main.js': `'use strict';␊ ␊ - return '.';␊ - }␊ + var lib2 = require('./generated-lib2.js');␊ ␊ - function commonjsResolveImpl (path, originalModuleDir, testCache) {␊ - var shouldTryNodeModules = isPossibleNodeModulesPath(path);␊ - path = normalize(path);␊ - var relPath;␊ - if (path[0] === '/') {␊ - originalModuleDir = '/';␊ - }␊ - 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));␊ - }␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ - if (relPath.endsWith('/..')) {␊ - break; // Travelled too far up, avoid infinite loop␊ - }␊ + let message;␊ ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - }␊ - if (!shouldTryNodeModules) break;␊ - var nextDir = normalize(originalModuleDir + '/..');␊ - if (nextDir === originalModuleDir) break;␊ - originalModuleDir = nextDir;␊ - }␊ - return null;␊ + for (const index of [1, 2]) {␊ + try {␊ + message = lib2.commonjsRequire(`./target${index}.js`, "/$$rollup_base$$/fixtures/function/dynamic-require-code-splitting");␊ + } catch (err) {␊ + ({ message } = err);␊ + }␊ + t.is(message, index.toString());␊ }␊ - ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ - }␊ - ␊ - function commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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.');␊ - }␊ - ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ - ␊ - const commonjsRegister$1 = commonjsRegister$2;␊ - commonjsRegister$1("/$$rollup_base$$/fixtures/function/dynamic-require-code-splitting/target1.js", function (module, exports) {␊ - module.exports = '1';␊ - ␊ - });␊ - ␊ - const commonjsRegister = commonjsRegister$2;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-code-splitting/target2.js", function (module, exports) {␊ - module.exports = '2';␊ - ␊ - });␊ - ␊ - /* eslint-disable import/no-dynamic-require, global-require */␊ - ␊ - let message;␊ - ␊ - for (const index of [1, 2]) {␊ - try {␊ - message = commonjsRequire(`./target${index}.js`,"/$$rollup_base$$/fixtures/function/dynamic-require-code-splitting");␊ - } catch (err) {␊ - ({ message } = err);␊ - }␊ - t.is(message, index.toString());␊ - }␊ - ␊ - exports.commonjsRequire = commonjsRequire;␊ - `, - 'main.js': `'use strict';␊ - ␊ - var lib2 = require('./generated-lib2.js');␊ - ␊ - /* eslint-disable import/no-dynamic-require, global-require */␊ - ␊ - let message;␊ - ␊ - for (const index of [1, 2]) {␊ - try {␊ - message = lib2.commonjsRequire(`./target${index}.js`,"/$$rollup_base$$/fixtures/function/dynamic-require-code-splitting");␊ - } catch (err) {␊ - ({ message } = err);␊ - }␊ - t.is(message, index.toString());␊ - }␊ - `, - 'main2.js': `'use strict';␊ + `, + 'main2.js': `'use strict';␊ ␊ require('./generated-lib2.js');␊ ␊ `, } - -## dynamic-require-es-entry - -> 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$1 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ - }␊ - ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ - ␊ - 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;␊ - }␊ - ␊ - 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;␊ - }␊ - ␊ - 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 dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ - ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var 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 commonjsResolveImpl (path, originalModuleDir, testCache) {␊ - var shouldTryNodeModules = isPossibleNodeModulesPath(path);␊ - path = normalize(path);␊ - var relPath;␊ - if (path[0] === '/') {␊ - originalModuleDir = '/';␊ - }␊ - 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));␊ - }␊ - ␊ - if (relPath.endsWith('/..')) {␊ - break; // Travelled too far up, avoid infinite loop␊ - }␊ - ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - }␊ - if (!shouldTryNodeModules) break;␊ - var nextDir = normalize(originalModuleDir + '/..');␊ - if (nextDir === originalModuleDir) break;␊ - originalModuleDir = nextDir;␊ - }␊ - return null;␊ - }␊ - ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ - }␊ - ␊ - function commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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.');␊ - }␊ - ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ - ␊ - const commonjsRegister = commonjsRegister$1;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-es-entry/submodule.js", function (module, exports) {␊ - module.exports = 'submodule';␊ - ␊ - });␊ - ␊ - /* eslint-disable import/no-dynamic-require, global-require */␊ - ␊ - function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`,"/$$rollup_base$$/fixtures/function/dynamic-require-es-entry");␊ - }␊ - ␊ - var importer = takeModule('submodule.js');␊ - ␊ - t.is(importer, 'submodule');␊ - `, - } - -## dynamic-require-extensions - -> 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$1 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ - }␊ - ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ - ␊ - 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;␊ - }␊ - ␊ - 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;␊ - }␊ - ␊ - 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 dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ - ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var 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 commonjsResolveImpl (path, originalModuleDir, testCache) {␊ - var shouldTryNodeModules = isPossibleNodeModulesPath(path);␊ - path = normalize(path);␊ - var relPath;␊ - if (path[0] === '/') {␊ - originalModuleDir = '/';␊ - }␊ - 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));␊ - }␊ - ␊ - if (relPath.endsWith('/..')) {␊ - break; // Travelled too far up, avoid infinite loop␊ - }␊ - ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - }␊ - if (!shouldTryNodeModules) break;␊ - var nextDir = normalize(originalModuleDir + '/..');␊ - if (nextDir === originalModuleDir) break;␊ - originalModuleDir = nextDir;␊ - }␊ - return null;␊ - }␊ - ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ - }␊ - ␊ - function commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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.');␊ - }␊ - ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ - ␊ - var main = {};␊ - ␊ - const commonjsRegister = commonjsRegister$1;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-extensions/submodule.js", function (module, exports) {␊ - module.exports = { name: 'submodule', value: null };␊ - ␊ - });␊ - ␊ - /* eslint-disable import/no-dynamic-require, global-require */␊ - ␊ - function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`,"/$$rollup_base$$/fixtures/function/dynamic-require-extensions");␊ - }␊ - ␊ - const withExtension = takeModule('submodule.js');␊ - const withoutExtension = takeModule('submodule');␊ - ␊ - t.is(withExtension.name, 'submodule');␊ - t.is(withoutExtension.name, 'submodule');␊ - ␊ - withExtension.value = 'mutated';␊ - ␊ - t.is(withoutExtension.value, 'mutated');␊ - ␊ - module.exports = main;␊ - `, - } - -## dynamic-require-fallback - -> Snapshot 1 - - { - 'main.js': `'use strict';␊ - ␊ - var main = {};␊ - ␊ - /* eslint-disable import/no-dynamic-require, global-require */␊ - ␊ - function takeModule(withName) {␊ - return require(withName);␊ - }␊ - ␊ - // The bundled code will run from test/helpers/util.js␊ - t.is(takeModule('../fixtures/function/dynamic-require-fallback/dep.js'), 'dep');␊ - ␊ - module.exports = main;␊ - `, - } - -## dynamic-require-from-es-import - -> 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$1 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ - }␊ - ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ - ␊ - 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;␊ - }␊ - ␊ - 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;␊ - }␊ - ␊ - 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 dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ - ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var 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 commonjsResolveImpl (path, originalModuleDir, testCache) {␊ - var shouldTryNodeModules = isPossibleNodeModulesPath(path);␊ - path = normalize(path);␊ - var relPath;␊ - if (path[0] === '/') {␊ - originalModuleDir = '/';␊ - }␊ - 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));␊ - }␊ - ␊ - if (relPath.endsWith('/..')) {␊ - break; // Travelled too far up, avoid infinite loop␊ - }␊ - ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - }␊ - if (!shouldTryNodeModules) break;␊ - var nextDir = normalize(originalModuleDir + '/..');␊ - if (nextDir === originalModuleDir) break;␊ - originalModuleDir = nextDir;␊ - }␊ - return null;␊ - }␊ - ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ - }␊ - ␊ - function commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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.');␊ - }␊ - ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ - ␊ - const commonjsRegister = commonjsRegister$1;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-from-es-import/submodule.js", function (module, exports) {␊ - module.exports = 'submodule';␊ - ␊ - });␊ - ␊ - var submodule = commonjsRequire("/$$rollup_base$$/fixtures/function/dynamic-require-from-es-import/submodule.js", "/$$rollup_base$$/fixtures/function/dynamic-require-from-es-import");␊ - ␊ - t.is(submodule, 'submodule');␊ - `, - } - -## dynamic-require-globs - -> 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$3 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ - }␊ - ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ - ␊ - 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;␊ - }␊ - ␊ - 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;␊ - }␊ - ␊ - 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 dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ - ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var 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 commonjsResolveImpl (path, originalModuleDir, testCache) {␊ - var shouldTryNodeModules = isPossibleNodeModulesPath(path);␊ - path = normalize(path);␊ - var relPath;␊ - if (path[0] === '/') {␊ - originalModuleDir = '/';␊ - }␊ - 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));␊ - }␊ - ␊ - if (relPath.endsWith('/..')) {␊ - break; // Travelled too far up, avoid infinite loop␊ - }␊ - ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - }␊ - if (!shouldTryNodeModules) break;␊ - var nextDir = normalize(originalModuleDir + '/..');␊ - if (nextDir === originalModuleDir) break;␊ - originalModuleDir = nextDir;␊ - }␊ - return null;␊ - }␊ - ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ - }␊ - ␊ - function commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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.');␊ - }␊ - ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ - ␊ - var main = {};␊ - ␊ - const commonjsRegister$2 = commonjsRegister$3;␊ - commonjsRegister$2("/$$rollup_base$$/fixtures/function/dynamic-require-globs/submodule1.js", function (module, exports) {␊ - module.exports = 'submodule1';␊ - ␊ - });␊ - ␊ - const commonjsRegister$1 = commonjsRegister$3;␊ - commonjsRegister$1("/$$rollup_base$$/fixtures/function/dynamic-require-globs/submodule2.js", function (module, exports) {␊ - module.exports = 'submodule2';␊ - ␊ - });␊ - ␊ - const commonjsRegister = commonjsRegister$3;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-globs/extramodule1.js", function (module, exports) {␊ - module.exports = 'extramodule1';␊ - ␊ - });␊ + +## dynamic-require-different-loader + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ ␊ - /* eslint-disable import/no-dynamic-require, global-require */␊ + var submodule2;␊ + var hasRequiredSubmodule2;␊ ␊ - function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`,"/$$rollup_base$$/fixtures/function/dynamic-require-globs");␊ + function requireSubmodule2 () {␊ + if (hasRequiredSubmodule2) return submodule2;␊ + hasRequiredSubmodule2 = 1;␊ + submodule2 = function () {␊ + return 'Hello there';␊ + };␊ + return submodule2;␊ }␊ ␊ - t.is(takeModule('submodule1.js'), 'submodule1');␊ - t.is(takeModule('submodule2.js'), 'submodule2');␊ - t.is(takeModule('extramodule1.js'), 'extramodule1');␊ - t.throws(() => takeModule('extramodule2.js'), {␊ - message:␊ - 'Could not dynamically require "./extramodule2.js". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.'␊ - });␊ + const fn = requireSubmodule2();␊ + ␊ + var main = fn();␊ ␊ module.exports = main;␊ `, } -## dynamic-require-instances +## dynamic-require-es-entry > 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$2 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ - }␊ + var submodule;␊ + var hasRequiredSubmodule;␊ ␊ - function commonjsRegisterOrShort$1 (path, to) {␊ - var resolvedPath = commonjsResolveImpl(path, null);␊ - if (resolvedPath !== null && DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - DYNAMIC_REQUIRE_CACHE[path] = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - } else {␊ - DYNAMIC_REQUIRE_SHORTS[path] = to;␊ - }␊ + function requireSubmodule () {␊ + if (hasRequiredSubmodule) return submodule;␊ + hasRequiredSubmodule = 1;␊ + submodule = 'submodule';␊ + return submodule;␊ }␊ ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ + var dynamicModules;␊ ␊ - 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;␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-es-entry/submodule.js": requireSubmodule␊ + });␊ }␊ ␊ - 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;␊ - }␊ + function commonjsRequire(path, originalModuleDir) {␊ + var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return getDynamicModules()[resolvedPath]();␊ }␊ - if (joined === undefined)␊ - return '.';␊ - ␊ - return joined;␊ + 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 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 commonjsResolve (path, originalModuleDir) {␊ + const resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ }␊ ␊ - function dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ - ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var 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 '.';␊ - }␊ + commonjsRequire.resolve = commonjsResolve;␊ ␊ - function commonjsResolveImpl (path, originalModuleDir, testCache) {␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ @@ -2493,15 +943,9 @@ Generated by [AVA](https://avajs.dev). break; // Travelled too far up, avoid infinite loop␊ }␊ ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ + for (var extensionIndex = 0; extensionIndex < checkedExtensions.length; extensionIndex++) {␊ + var resolvedPath = relPath + checkedExtensions[extensionIndex];␊ + if (modules[resolvedPath]) {␊ return resolvedPath;␊ }␊ }␊ @@ -2513,113 +957,16 @@ Generated by [AVA](https://avajs.dev). return null;␊ }␊ ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ - }␊ - ␊ - function commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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.');␊ - }␊ - ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ - ␊ - var main = {};␊ - ␊ - const commonjsRegister$1 = commonjsRegister$2;␊ - commonjsRegister$1("/$$rollup_base$$/fixtures/function/dynamic-require-instances/direct/index.js", function (module, exports) {␊ - module.exports = { name: 'direct', value: null };␊ - ␊ - });␊ - ␊ - const commonjsRegister = commonjsRegister$2;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-instances/package/main.js", function (module, exports) {␊ - module.exports = { name: 'package', value: null };␊ - ␊ - });␊ - ␊ - const commonjsRegisterOrShort = commonjsRegisterOrShort$1;␊ - commonjsRegisterOrShort("/$$rollup_base$$/fixtures/function/dynamic-require-instances/direct", "/$$rollup_base$$/fixtures/function/dynamic-require-instances/direct/index.js");␊ - commonjsRegisterOrShort("/$$rollup_base$$/fixtures/function/dynamic-require-instances/package", "/$$rollup_base$$/fixtures/function/dynamic-require-instances/package/main.js");␊ - ␊ - /* eslint-disable import/no-dynamic-require, global-require */␊ - ␊ - function takeModule(withName) {␊ - return commonjsRequire(withName,"/$$rollup_base$$/fixtures/function/dynamic-require-instances");␊ - }␊ - ␊ - takeModule('./direct').value = 'direct-instance';␊ - t.is(takeModule('./direct/index.js').value, 'direct-instance');␊ - t.is(commonjsRequire("./direct/index.js", "/$$rollup_base$$/fixtures/function/dynamic-require-instances").value, 'direct-instance');␊ - ␊ - takeModule('./package').value = 'package-instance';␊ - t.is(takeModule('./package/main.js').value, 'package-instance');␊ - t.is(commonjsRequire("./package/main.js", "/$$rollup_base$$/fixtures/function/dynamic-require-instances").value, 'package-instance');␊ - ␊ - module.exports = main;␊ - `, - } - -## dynamic-require-json - -> 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$1 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ + 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;␊ }␊ ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ - ␊ function normalize (path) {␊ path = path.replace(/\\\\/g, '/');␊ var parts = path.split('/');␊ @@ -2637,71 +984,125 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ path = parts.join('/');␊ - if (slashed && path[0] !== '/')␊ - path = '/' + path;␊ - else if (path.length === 0)␊ - path = '.';␊ + if (slashed && path[0] !== '/') path = '/' + path;␊ + else if (path.length === 0) path = '.';␊ return path;␊ }␊ ␊ function join () {␊ - if (arguments.length === 0)␊ - return '.';␊ + if (arguments.length === 0) return '.';␊ var joined;␊ for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ + var arg = arguments[i];␊ + if (arg.length > 0) {␊ if (joined === undefined)␊ - joined = arg;␊ + joined = arg;␊ else␊ - joined += '/' + arg;␊ - }␊ + joined += '/' + arg;␊ + }␊ }␊ - if (joined === undefined)␊ - return '.';␊ - ␊ + if (joined === undefined) return '.';␊ return joined;␊ }␊ ␊ - 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;␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ + ␊ + function takeModule(withName) {␊ + return commonjsRequire(`./${withName}`, "/$$rollup_base$$/fixtures/function/dynamic-require-es-entry");␊ }␊ ␊ - function dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ + var importer = takeModule('submodule.js');␊ ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var c = path.charCodeAt(i);␊ - if ((c === 47 || c === 92) && i !== path.length - 1)␊ - break;␊ - i--;␊ - }␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ + ␊ + t.is(importer, 'submodule');␊ + `, + } + +## dynamic-require-es-mixed-helpers + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ ␊ - if (i > 0)␊ - return path.substr(0, i);␊ + var submodule;␊ + var hasRequiredSubmodule;␊ ␊ - if (path.chartCodeAt(0) === 47 || path.chartCodeAt(0) === 92)␊ - return path.charAt(0);␊ + function requireSubmodule () {␊ + if (hasRequiredSubmodule) return submodule;␊ + hasRequiredSubmodule = 1;␊ + commonjsGlobal.hasSubmoduleRun = true;␊ + submodule = 'submodule';␊ + return submodule;␊ + }␊ + ␊ + t.is(global.hasSubmoduleRun, undefined, 'before require');␊ + ␊ + // eslint-disable-next-line global-require␊ + var result = requireSubmodule();␊ + ␊ + t.is(global.hasSubmoduleRun, true, 'after require');␊ + delete global.hasSubmoduleRun;␊ + ␊ + t.is(result, 'submodule');␊ + `, + } + +## dynamic-require-extensions + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var submodule;␊ + var hasRequiredSubmodule;␊ + ␊ + function requireSubmodule () {␊ + if (hasRequiredSubmodule) return submodule;␊ + hasRequiredSubmodule = 1;␊ + submodule = { name: 'submodule', value: null };␊ + return submodule;␊ + }␊ + ␊ + var dynamicModules;␊ + ␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-extensions/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.');␊ + }␊ ␊ - return '.';␊ + function commonjsResolve (path, originalModuleDir) {␊ + const resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ }␊ ␊ - function commonjsResolveImpl (path, originalModuleDir, testCache) {␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ @@ -2715,15 +1116,9 @@ Generated by [AVA](https://avajs.dev). break; // Travelled too far up, avoid infinite loop␊ }␊ ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ + for (var extensionIndex = 0; extensionIndex < checkedExtensions.length; extensionIndex++) {␊ + var resolvedPath = relPath + checkedExtensions[extensionIndex];␊ + if (modules[resolvedPath]) {␊ return resolvedPath;␊ }␊ }␊ @@ -2735,221 +1130,195 @@ Generated by [AVA](https://avajs.dev). return null;␊ }␊ ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ + 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 commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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 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;␊ }␊ ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ + 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 value = "present";␊ - var require$$1 = {␊ - value: value␊ - };␊ - ␊ - const commonjsRegister = commonjsRegister$1;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-json/dynamic.json", function (module, exports) {␊ - module.exports = require$$1;␊ - });␊ - ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`,"/$$rollup_base$$/fixtures/function/dynamic-require-json");␊ + return commonjsRequire(`./${withName}`, "/$$rollup_base$$/fixtures/function/dynamic-require-extensions");␊ }␊ ␊ - t.deepEqual(takeModule('dynamic.json'), { value: 'present' });␊ - t.deepEqual(takeModule('dynamic'), { value: 'present' });␊ + const withExtension = takeModule('submodule.js');␊ + const withoutExtension = takeModule('submodule');␊ + ␊ + t.is(withExtension.name, 'submodule');␊ + t.is(withoutExtension.name, 'submodule');␊ + ␊ + withExtension.value = 'mutated';␊ + ␊ + t.is(withoutExtension.value, 'mutated');␊ ␊ module.exports = main;␊ `, } -## dynamic-require-no-fallback +## dynamic-require-fallback > Snapshot 1 { 'main.js': `'use strict';␊ ␊ - function commonjsRequire (path) {␊ - 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.');␊ - }␊ - ␊ var main = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(withName);␊ + return require(withName);␊ }␊ ␊ - t.throws(() => takeModule('./dep.js'), {␊ - message:␊ - 'Could not dynamically require "./dep.js". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.'␊ - });␊ + // The bundled code will run from test/helpers/util.js␊ + t.is(takeModule('../fixtures/function/dynamic-require-fallback/dep.js'), 'dep');␊ ␊ module.exports = main;␊ `, } -## dynamic-require-package +## dynamic-require-from-es-import > 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 submodule;␊ + var hasRequiredSubmodule;␊ ␊ - function commonjsRegister$3 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ + function requireSubmodule () {␊ + if (hasRequiredSubmodule) return submodule;␊ + hasRequiredSubmodule = 1;␊ + submodule = 'submodule';␊ + return submodule;␊ }␊ ␊ - function commonjsRegisterOrShort$1 (path, to) {␊ - var resolvedPath = commonjsResolveImpl(path, null);␊ - if (resolvedPath !== null && DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - DYNAMIC_REQUIRE_CACHE[path] = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - } else {␊ - DYNAMIC_REQUIRE_SHORTS[path] = to;␊ - }␊ - }␊ + var submoduleExports = requireSubmodule();␊ ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ + t.is(submoduleExports, 'submodule');␊ + `, + } + +## dynamic-require-globs + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ ␊ - 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 submodule1;␊ + var hasRequiredSubmodule1;␊ + ␊ + function requireSubmodule1 () {␊ + if (hasRequiredSubmodule1) return submodule1;␊ + hasRequiredSubmodule1 = 1;␊ + submodule1 = 'submodule1';␊ + return submodule1;␊ }␊ ␊ - 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 '.';␊ + var submodule2;␊ + var hasRequiredSubmodule2;␊ ␊ - return joined;␊ + function requireSubmodule2 () {␊ + if (hasRequiredSubmodule2) return submodule2;␊ + hasRequiredSubmodule2 = 1;␊ + submodule2 = 'submodule2';␊ + return submodule2;␊ }␊ ␊ - 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;␊ - }␊ + var extramodule1;␊ + var hasRequiredExtramodule1;␊ ␊ - function dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ + function requireExtramodule1 () {␊ + if (hasRequiredExtramodule1) return extramodule1;␊ + hasRequiredExtramodule1 = 1;␊ + extramodule1 = 'extramodule1';␊ + return extramodule1;␊ + }␊ ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var c = path.charCodeAt(i);␊ - if ((c === 47 || c === 92) && i !== path.length - 1)␊ - break;␊ - i--;␊ - }␊ + var dynamicModules;␊ ␊ - if (i > 0)␊ - return path.substr(0, i);␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-globs/submodule1.js": requireSubmodule1,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-globs/submodule2.js": requireSubmodule2,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-globs/extramodule1.js": requireExtramodule1␊ + });␊ + }␊ ␊ - if (path.chartCodeAt(0) === 47 || path.chartCodeAt(0) === 92)␊ - return path.charAt(0);␊ + 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.');␊ + }␊ ␊ - return '.';␊ + function commonjsResolve (path, originalModuleDir) {␊ + const resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ }␊ ␊ - function commonjsResolveImpl (path, originalModuleDir, testCache) {␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ @@ -2963,15 +1332,9 @@ Generated by [AVA](https://avajs.dev). break; // Travelled too far up, avoid infinite loop␊ }␊ ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ + for (var extensionIndex = 0; extensionIndex < checkedExtensions.length; extensionIndex++) {␊ + var resolvedPath = relPath + checkedExtensions[extensionIndex];␊ + if (modules[resolvedPath]) {␊ return resolvedPath;␊ }␊ }␊ @@ -2983,141 +1346,16 @@ Generated by [AVA](https://avajs.dev). return null;␊ }␊ ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ - }␊ - ␊ - function commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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.');␊ - }␊ - ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ - ␊ - var main = {};␊ - ␊ - const commonjsRegister$2 = commonjsRegister$3;␊ - commonjsRegister$2("/$$rollup_base$$/fixtures/function/dynamic-require-package/entry.js", function (module, exports) {␊ - module.exports = 'same-directory';␊ - ␊ - });␊ - ␊ - const commonjsRegister$1 = commonjsRegister$3;␊ - commonjsRegister$1("/$$rollup_base$$/fixtures/function/dynamic-require-package/sub/entry.js", function (module, exports) {␊ - module.exports = 'sub';␊ - ␊ - });␊ - ␊ - const commonjsRegister = commonjsRegister$3;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-package/node_modules/custom-module/entry.js", function (module, exports) {␊ - module.exports = 'custom-module';␊ - ␊ - });␊ - ␊ - const commonjsRegisterOrShort = commonjsRegisterOrShort$1;␊ - commonjsRegisterOrShort("/$$rollup_base$$/fixtures/function/dynamic-require-package", "/$$rollup_base$$/fixtures/function/dynamic-require-package/entry.js");␊ - commonjsRegisterOrShort("/$$rollup_base$$/fixtures/function/dynamic-require-package/sub", "/$$rollup_base$$/fixtures/function/dynamic-require-package/sub/entry.js");␊ - commonjsRegisterOrShort("/$$rollup_base$$/fixtures/function/dynamic-require-package/node_modules/custom-module", "/$$rollup_base$$/fixtures/function/dynamic-require-package/node_modules/custom-module/entry.js");␊ - ␊ - /* eslint-disable import/no-dynamic-require, global-require */␊ - ␊ - function takeModule$1(name) {␊ - return commonjsRequire(name,"/$$rollup_base$$/fixtures/function/dynamic-require-package/sub");␊ - }␊ - ␊ - var sub = {␊ - parent: takeModule$1('..'),␊ - customModule: takeModule$1('custom-module')␊ - };␊ - ␊ - /* eslint-disable import/no-dynamic-require, global-require */␊ - ␊ - function takeModule(name) {␊ - return commonjsRequire(name,"/$$rollup_base$$/fixtures/function/dynamic-require-package");␊ - }␊ - ␊ - 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');␊ - t.deepEqual(sub, { parent: 'same-directory', customModule: 'custom-module' });␊ - ␊ - module.exports = main;␊ - `, - } - -## dynamic-require-package-sub - -> Snapshot 1 - - { - 'entry.js': `'use strict';␊ - ␊ - var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ - ␊ - function commonjsRegister$2 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ - }␊ - ␊ - function commonjsRegisterOrShort$1 (path, to) {␊ - var resolvedPath = commonjsResolveImpl(path, null);␊ - if (resolvedPath !== null && DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - DYNAMIC_REQUIRE_CACHE[path] = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - } else {␊ - DYNAMIC_REQUIRE_SHORTS[path] = to;␊ - }␊ + 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;␊ }␊ ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ - ␊ function normalize (path) {␊ path = path.replace(/\\\\/g, '/');␊ var parts = path.split('/');␊ @@ -3135,201 +1373,148 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ path = parts.join('/');␊ - if (slashed && path[0] !== '/')␊ - path = '/' + path;␊ - else if (path.length === 0)␊ - path = '.';␊ + if (slashed && path[0] !== '/') path = '/' + path;␊ + else if (path.length === 0) path = '.';␊ return path;␊ }␊ ␊ function join () {␊ - if (arguments.length === 0)␊ - return '.';␊ + if (arguments.length === 0) return '.';␊ var joined;␊ for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ + var arg = arguments[i];␊ + if (arg.length > 0) {␊ if (joined === undefined)␊ - joined = arg;␊ + joined = arg;␊ else␊ - joined += '/' + arg;␊ - }␊ + joined += '/' + arg;␊ + }␊ }␊ - if (joined === undefined)␊ - return '.';␊ - ␊ + if (joined === undefined) return '.';␊ return joined;␊ }␊ ␊ - 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;␊ + var main = {};␊ + ␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ + ␊ + function takeModule(withName) {␊ + return commonjsRequire(`./${withName}`, "/$$rollup_base$$/fixtures/function/dynamic-require-globs");␊ }␊ ␊ - function dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ + t.is(takeModule('submodule1.js'), 'submodule1');␊ + t.is(takeModule('submodule2.js'), 'submodule2');␊ + t.is(takeModule('extramodule1.js'), 'extramodule1');␊ + t.throws(() => takeModule('extramodule2.js'), {␊ + message:␊ + 'Could not dynamically require "./extramodule2.js". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.'␊ + });␊ ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var c = path.charCodeAt(i);␊ - if ((c === 47 || c === 92) && i !== path.length - 1)␊ - break;␊ - i--;␊ - }␊ + module.exports = main;␊ + `, + } + +## dynamic-require-instances + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var direct;␊ + var hasRequiredDirect;␊ ␊ - if (i > 0)␊ - return path.substr(0, i);␊ + function requireDirect () {␊ + if (hasRequiredDirect) return direct;␊ + hasRequiredDirect = 1;␊ + direct = { name: 'direct', value: null };␊ + return direct;␊ + }␊ ␊ - if (path.chartCodeAt(0) === 47 || path.chartCodeAt(0) === 92)␊ - return path.charAt(0);␊ + var main$1;␊ + var hasRequiredMain;␊ ␊ - return '.';␊ + function requireMain () {␊ + if (hasRequiredMain) return main$1;␊ + hasRequiredMain = 1;␊ + main$1 = { name: 'package', value: null };␊ + return main$1;␊ }␊ ␊ - function commonjsResolveImpl (path, originalModuleDir, testCache) {␊ - var shouldTryNodeModules = isPossibleNodeModulesPath(path);␊ - path = normalize(path);␊ - var relPath;␊ - if (path[0] === '/') {␊ - originalModuleDir = '/';␊ - }␊ - 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));␊ - }␊ + var dynamicModules;␊ ␊ - if (relPath.endsWith('/..')) {␊ - break; // Travelled too far up, avoid infinite loop␊ - }␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-instances/direct": requireDirect,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-instances/direct/index.js": requireDirect,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-instances/package": requireMain,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-instances/package/main.js": requireMain␊ + });␊ + }␊ ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - }␊ - if (!shouldTryNodeModules) break;␊ - var nextDir = normalize(originalModuleDir + '/..');␊ - if (nextDir === originalModuleDir) break;␊ - originalModuleDir = nextDir;␊ + function commonjsRequire(path, originalModuleDir) {␊ + var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return getDynamicModules()[resolvedPath]();␊ }␊ - return null;␊ + 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) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + const resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ if (resolvedPath !== null) {␊ return resolvedPath;␊ }␊ return require.resolve(path);␊ }␊ ␊ - function commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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.');␊ - }␊ - ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ commonjsRequire.resolve = commonjsResolve;␊ ␊ - var entry = {};␊ - ␊ - const commonjsRegister$1 = commonjsRegister$2;␊ - commonjsRegister$1("/$$rollup_base$$/fixtures/function/dynamic-require-package-sub/node_modules/custom-module/entry.js", function (module, exports) {␊ - module.exports = 'custom-module';␊ - ␊ - });␊ - ␊ - var main = "./entry.js";␊ - var require$$1 = {␊ - main: main␊ - };␊ - ␊ - const commonjsRegister = commonjsRegister$2;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-package-sub/node_modules/custom-module/package.json", function (module, exports) {␊ - module.exports = require$$1;␊ - });␊ - ␊ - const commonjsRegisterOrShort = commonjsRegisterOrShort$1;␊ - commonjsRegisterOrShort("/$$rollup_base$$/fixtures/function/dynamic-require-package-sub/node_modules/custom-module", "/$$rollup_base$$/fixtures/function/dynamic-require-package-sub/node_modules/custom-module/entry.js");␊ - ␊ - t.is(commonjsRequire("custom-module", "/$$rollup_base$$/fixtures/function/dynamic-require-package-sub/sub"), 'custom-module');␊ - ␊ - module.exports = entry;␊ - `, - } - -## dynamic-require-relative-paths - -> Snapshot 1 - - { - 'main.js': `'use strict';␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ + } else if (originalModuleDir) {␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + } else {␊ + relPath = normalize(join('node_modules', path));␊ + }␊ ␊ - var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ + if (relPath.endsWith('/..')) {␊ + break; // Travelled too far up, avoid infinite loop␊ + }␊ ␊ - function commonjsRegister$2 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ + 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;␊ }␊ ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ + 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, '/');␊ @@ -3348,71 +1533,94 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ path = parts.join('/');␊ - if (slashed && path[0] !== '/')␊ - path = '/' + path;␊ - else if (path.length === 0)␊ - path = '.';␊ + if (slashed && path[0] !== '/') path = '/' + path;␊ + else if (path.length === 0) path = '.';␊ return path;␊ }␊ ␊ function join () {␊ - if (arguments.length === 0)␊ - return '.';␊ + if (arguments.length === 0) return '.';␊ var joined;␊ for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ + var arg = arguments[i];␊ + if (arg.length > 0) {␊ if (joined === undefined)␊ - joined = arg;␊ + joined = arg;␊ else␊ - joined += '/' + arg;␊ - }␊ + joined += '/' + arg;␊ + }␊ }␊ - if (joined === undefined)␊ - return '.';␊ - ␊ + if (joined === undefined) return '.';␊ return joined;␊ }␊ ␊ - 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;␊ + var main = {};␊ + ␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ + ␊ + function takeModule(withName) {␊ + return commonjsRequire(withName, "/$$rollup_base$$/fixtures/function/dynamic-require-instances");␊ }␊ ␊ - function dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ + takeModule('./direct').value = 'direct-instance';␊ + t.is(takeModule('./direct/index.js').value, 'direct-instance');␊ + t.is(requireDirect().value, 'direct-instance');␊ + ␊ + takeModule('./package').value = 'package-instance';␊ + t.is(takeModule('./package/main.js').value, 'package-instance');␊ + t.is(requireMain().value, 'package-instance');␊ ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var c = path.charCodeAt(i);␊ - if ((c === 47 || c === 92) && i !== path.length - 1)␊ - break;␊ - i--;␊ - }␊ + module.exports = main;␊ + `, + } + +## dynamic-require-json + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var value = "present";␊ + var json0 = {␊ + value: value␊ + };␊ ␊ - if (i > 0)␊ - return path.substr(0, i);␊ + var dynamicModules;␊ + ␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-json/dynamic.json": function () { return json0; }␊ + });␊ + }␊ ␊ - if (path.chartCodeAt(0) === 47 || path.chartCodeAt(0) === 92)␊ - return path.charAt(0);␊ + 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.');␊ + }␊ ␊ - return '.';␊ + function commonjsResolve (path, originalModuleDir) {␊ + const resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ }␊ ␊ - function commonjsResolveImpl (path, originalModuleDir, testCache) {␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ @@ -3426,15 +1634,9 @@ Generated by [AVA](https://avajs.dev). break; // Travelled too far up, avoid infinite loop␊ }␊ ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ + for (var extensionIndex = 0; extensionIndex < checkedExtensions.length; extensionIndex++) {␊ + var resolvedPath = relPath + checkedExtensions[extensionIndex];␊ + if (modules[resolvedPath]) {␊ return resolvedPath;␊ }␊ }␊ @@ -3446,197 +1648,174 @@ Generated by [AVA](https://avajs.dev). return null;␊ }␊ ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ + 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 commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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 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;␊ }␊ ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ + 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 = {};␊ ␊ - const commonjsRegister$1 = commonjsRegister$2;␊ - commonjsRegister$1("/$$rollup_base$$/fixtures/function/dynamic-require-relative-paths/sub/submodule.js", function (module, exports) {␊ - module.exports = 'submodule';␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ - });␊ + function takeModule(withName) {␊ + return commonjsRequire(`./${withName}`, "/$$rollup_base$$/fixtures/function/dynamic-require-json");␊ + }␊ ␊ - const commonjsRegister = commonjsRegister$2;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-relative-paths/sub/subsub/subsubmodule.js", function (module, exports) {␊ - module.exports = 'subsubmodule';␊ + t.deepEqual(takeModule('dynamic.json'), { value: 'present' });␊ + t.deepEqual(takeModule('dynamic'), { value: 'present' });␊ ␊ - });␊ + module.exports = main;␊ + `, + } + +## dynamic-require-no-fallback + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + function commonjsRequire(path) {␊ + 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.');␊ + }␊ + ␊ + var main = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ - function takeModuleWithDelimiter(name, delimiter) {␊ - return commonjsRequire(`.${delimiter}${name.replace(/=/g, delimiter)}`,"/$$rollup_base$$/fixtures/function/dynamic-require-relative-paths");␊ + function takeModule(withName) {␊ + return commonjsRequire(withName);␊ }␊ ␊ - t.is(takeModuleWithDelimiter('sub=submodule.js', '/'), 'submodule');␊ - t.is(takeModuleWithDelimiter('sub=subsub=subsubmodule.js', '/'), 'subsubmodule');␊ - t.is(takeModuleWithDelimiter('sub=submodule.js', '\\\\'), 'submodule');␊ - t.is(takeModuleWithDelimiter('sub=subsub=subsubmodule.js', '\\\\'), 'subsubmodule');␊ + t.throws(() => takeModule('./dep.js'), {␊ + message:␊ + 'Could not dynamically require "./dep.js". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.'␊ + });␊ ␊ module.exports = main;␊ `, } -## dynamic-require-resolve-index +## dynamic-require-package > 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 entry$2;␊ + var hasRequiredEntry$2;␊ ␊ - function commonjsRegister$3 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ + function requireEntry$2 () {␊ + if (hasRequiredEntry$2) return entry$2;␊ + hasRequiredEntry$2 = 1;␊ + entry$2 = 'same-directory';␊ + return entry$2;␊ }␊ ␊ - function commonjsRegisterOrShort$1 (path, to) {␊ - var resolvedPath = commonjsResolveImpl(path, null);␊ - if (resolvedPath !== null && DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - DYNAMIC_REQUIRE_CACHE[path] = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - } else {␊ - DYNAMIC_REQUIRE_SHORTS[path] = to;␊ - }␊ + var entry$1;␊ + var hasRequiredEntry$1;␊ + ␊ + function requireEntry$1 () {␊ + if (hasRequiredEntry$1) return entry$1;␊ + hasRequiredEntry$1 = 1;␊ + entry$1 = 'sub';␊ + return entry$1;␊ }␊ ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ + var entry;␊ + var hasRequiredEntry;␊ ␊ - 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;␊ + function requireEntry () {␊ + if (hasRequiredEntry) return entry;␊ + hasRequiredEntry = 1;␊ + entry = 'custom-module';␊ + return entry;␊ }␊ ␊ - 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 '.';␊ + var dynamicModules;␊ ␊ - return joined;␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-package": requireEntry$2,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-package/entry.js": requireEntry$2,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-package/sub": requireEntry$1,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-package/sub/entry.js": requireEntry$1,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-package/node_modules/custom-module": requireEntry,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-package/node_modules/custom-module/entry.js": requireEntry␊ + });␊ }␊ ␊ - 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 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 dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ - ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var 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 commonjsResolve (path, originalModuleDir) {␊ + const resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ }␊ ␊ - function commonjsResolveImpl (path, originalModuleDir, testCache) {␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ @@ -3650,15 +1829,9 @@ Generated by [AVA](https://avajs.dev). break; // Travelled too far up, avoid infinite loop␊ }␊ ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ + for (var extensionIndex = 0; extensionIndex < checkedExtensions.length; extensionIndex++) {␊ + var resolvedPath = relPath + checkedExtensions[extensionIndex];␊ + if (modules[resolvedPath]) {␊ return resolvedPath;␊ }␊ }␊ @@ -3670,85 +1843,60 @@ Generated by [AVA](https://avajs.dev). return null;␊ }␊ ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ + 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 commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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 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;␊ }␊ ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ + 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 = {};␊ ␊ - const commonjsRegister$2 = commonjsRegister$3;␊ - commonjsRegister$2("/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/index.js", function (module, exports) {␊ - module.exports = 'same-directory';␊ - ␊ - });␊ - ␊ - const commonjsRegister$1 = commonjsRegister$3;␊ - commonjsRegister$1("/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/sub/index.js", function (module, exports) {␊ - module.exports = 'sub';␊ - ␊ - });␊ - ␊ - const commonjsRegister = commonjsRegister$3;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/node_modules/custom-module/index.js", function (module, exports) {␊ - module.exports = 'custom-module';␊ - ␊ - });␊ - ␊ - const commonjsRegisterOrShort = commonjsRegisterOrShort$1;␊ - commonjsRegisterOrShort("/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index", "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/index.js");␊ - commonjsRegisterOrShort("/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/sub", "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/sub/index.js");␊ - commonjsRegisterOrShort("/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/node_modules/custom-module", "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/node_modules/custom-module/index.js");␊ - ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule$1(name) {␊ - return commonjsRequire(name,"/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/sub");␊ + return commonjsRequire(name, "/$$rollup_base$$/fixtures/function/dynamic-require-package/sub");␊ }␊ ␊ var sub = {␊ @@ -3759,7 +1907,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(name) {␊ - return commonjsRequire(name,"/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index");␊ + return commonjsRequire(name, "/$$rollup_base$$/fixtures/function/dynamic-require-package");␊ }␊ ␊ t.is(takeModule('.'), 'same-directory');␊ @@ -3775,35 +1923,130 @@ Generated by [AVA](https://avajs.dev). `, } -## dynamic-require-resolve-reference +## dynamic-require-package-sub + +> Snapshot 1 + + { + 'entry.js': `'use strict';␊ + ␊ + var entry$1;␊ + var hasRequiredEntry;␊ + ␊ + function requireEntry () {␊ + if (hasRequiredEntry) return entry$1;␊ + hasRequiredEntry = 1;␊ + entry$1 = 'custom-module';␊ + return entry$1;␊ + }␊ + ␊ + var entry = {};␊ + ␊ + t.is(requireEntry(), 'custom-module');␊ + ␊ + module.exports = entry;␊ + `, + } + +## dynamic-require-relative-paths > 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 submodule;␊ + var hasRequiredSubmodule;␊ + ␊ + function requireSubmodule () {␊ + if (hasRequiredSubmodule) return submodule;␊ + hasRequiredSubmodule = 1;␊ + submodule = 'submodule';␊ + return submodule;␊ + }␊ + ␊ + var subsubmodule;␊ + var hasRequiredSubsubmodule;␊ + ␊ + function requireSubsubmodule () {␊ + if (hasRequiredSubsubmodule) return subsubmodule;␊ + hasRequiredSubsubmodule = 1;␊ + subsubmodule = 'subsubmodule';␊ + return subsubmodule;␊ + }␊ ␊ - function commonjsRegister$2 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ + var dynamicModules;␊ + ␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-relative-paths/sub/submodule.js": requireSubmodule,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-relative-paths/sub/subsub/subsubmodule.js": requireSubsubmodule␊ + });␊ }␊ ␊ - function commonjsRegisterOrShort$1 (path, to) {␊ - var resolvedPath = commonjsResolveImpl(path, null);␊ - if (resolvedPath !== null && DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - DYNAMIC_REQUIRE_CACHE[path] = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - } else {␊ - DYNAMIC_REQUIRE_SHORTS[path] = to;␊ + 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.');␊ }␊ ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ + } else if (originalModuleDir) {␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + } else {␊ + relPath = normalize(join('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, '/');␊ @@ -3822,71 +2065,121 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ path = parts.join('/');␊ - if (slashed && path[0] !== '/')␊ - path = '/' + path;␊ - else if (path.length === 0)␊ - path = '.';␊ + if (slashed && path[0] !== '/') path = '/' + path;␊ + else if (path.length === 0) path = '.';␊ return path;␊ }␊ ␊ function join () {␊ - if (arguments.length === 0)␊ - return '.';␊ + if (arguments.length === 0) return '.';␊ var joined;␊ for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ + var arg = arguments[i];␊ + if (arg.length > 0) {␊ if (joined === undefined)␊ - joined = arg;␊ + joined = arg;␊ else␊ - joined += '/' + arg;␊ - }␊ + joined += '/' + arg;␊ + }␊ }␊ - if (joined === undefined)␊ - return '.';␊ - ␊ + if (joined === undefined) return '.';␊ return joined;␊ }␊ ␊ - 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;␊ + var main = {};␊ + ␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ + ␊ + function takeModuleWithDelimiter(name, delimiter) {␊ + return commonjsRequire(`.${delimiter}${name.replace(/=/g, delimiter)}`, "/$$rollup_base$$/fixtures/function/dynamic-require-relative-paths");␊ }␊ ␊ - function dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ + t.is(takeModuleWithDelimiter('sub=submodule.js', '/'), 'submodule');␊ + t.is(takeModuleWithDelimiter('sub=subsub=subsubmodule.js', '/'), 'subsubmodule');␊ + t.is(takeModuleWithDelimiter('sub=submodule.js', '\\\\'), 'submodule');␊ + t.is(takeModuleWithDelimiter('sub=subsub=subsubmodule.js', '\\\\'), 'subsubmodule');␊ ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var c = path.charCodeAt(i);␊ - if ((c === 47 || c === 92) && i !== path.length - 1)␊ - break;␊ - i--;␊ - }␊ + module.exports = main;␊ + `, + } + +## dynamic-require-resolve-index + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var dynamicRequireResolveIndex;␊ + var hasRequiredDynamicRequireResolveIndex;␊ + ␊ + function requireDynamicRequireResolveIndex () {␊ + if (hasRequiredDynamicRequireResolveIndex) return dynamicRequireResolveIndex;␊ + hasRequiredDynamicRequireResolveIndex = 1;␊ + dynamicRequireResolveIndex = 'same-directory';␊ + return dynamicRequireResolveIndex;␊ + }␊ + ␊ + var sub$1;␊ + var hasRequiredSub;␊ + ␊ + function requireSub () {␊ + if (hasRequiredSub) return sub$1;␊ + hasRequiredSub = 1;␊ + sub$1 = 'sub';␊ + return sub$1;␊ + }␊ ␊ - if (i > 0)␊ - return path.substr(0, i);␊ + var customModule;␊ + var hasRequiredCustomModule;␊ ␊ - if (path.chartCodeAt(0) === 47 || path.chartCodeAt(0) === 92)␊ - return path.charAt(0);␊ + function requireCustomModule () {␊ + if (hasRequiredCustomModule) return customModule;␊ + hasRequiredCustomModule = 1;␊ + customModule = 'custom-module';␊ + return customModule;␊ + }␊ + ␊ + var dynamicModules;␊ + ␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index": requireDynamicRequireResolveIndex,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/index.js": requireDynamicRequireResolveIndex,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/sub": requireSub,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/sub/index.js": requireSub,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/node_modules/custom-module": requireCustomModule,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/node_modules/custom-module/index.js": requireCustomModule␊ + });␊ + }␊ + ␊ + 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.');␊ + }␊ ␊ - return '.';␊ + function commonjsResolve (path, originalModuleDir) {␊ + const resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ }␊ ␊ - function commonjsResolveImpl (path, originalModuleDir, testCache) {␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ @@ -3900,15 +2193,9 @@ Generated by [AVA](https://avajs.dev). break; // Travelled too far up, avoid infinite loop␊ }␊ ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ + for (var extensionIndex = 0; extensionIndex < checkedExtensions.length; extensionIndex++) {␊ + var resolvedPath = relPath + checkedExtensions[extensionIndex];␊ + if (modules[resolvedPath]) {␊ return resolvedPath;␊ }␊ }␊ @@ -3920,117 +2207,16 @@ Generated by [AVA](https://avajs.dev). return null;␊ }␊ ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ - }␊ - ␊ - function commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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.');␊ - }␊ - ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ - ␊ - var main = {};␊ - ␊ - const commonjsRegister$1 = commonjsRegister$2;␊ - commonjsRegister$1("/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module/index.js", function (module, exports) {␊ - module.exports = {␊ - foo: 'bar',␊ - };␊ - ␊ - });␊ - ␊ - const commonjsRegister = commonjsRegister$2;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2/index.js", function (module, exports) {␊ - module.exports = () => {␊ - return commonjsRequire.resolve('custom-module',"/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2");␊ - };␊ - ␊ - });␊ - ␊ - const commonjsRegisterOrShort = commonjsRegisterOrShort$1;␊ - commonjsRegisterOrShort("/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module", "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module/index.js");␊ - commonjsRegisterOrShort("/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2", "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2/index.js");␊ - ␊ - t.is(␊ - commonjsRequire("custom-module2", "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference")(),␊ - '/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module'␊ - );␊ - ␊ - module.exports = main;␊ - `, - } - -## dynamic-require-root-circular - -> 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$2 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ - }␊ - ␊ - function commonjsRegisterOrShort$1 (path, to) {␊ - var resolvedPath = commonjsResolveImpl(path, null);␊ - if (resolvedPath !== null && DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - DYNAMIC_REQUIRE_CACHE[path] = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - } else {␊ - DYNAMIC_REQUIRE_SHORTS[path] = to;␊ - }␊ + 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;␊ }␊ ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ - ␊ function normalize (path) {␊ path = path.replace(/\\\\/g, '/');␊ var parts = path.split('/');␊ @@ -4048,71 +2234,128 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ path = parts.join('/');␊ - if (slashed && path[0] !== '/')␊ - path = '/' + path;␊ - else if (path.length === 0)␊ - path = '.';␊ + if (slashed && path[0] !== '/') path = '/' + path;␊ + else if (path.length === 0) path = '.';␊ return path;␊ }␊ ␊ function join () {␊ - if (arguments.length === 0)␊ - return '.';␊ + if (arguments.length === 0) return '.';␊ var joined;␊ for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ + var arg = arguments[i];␊ + if (arg.length > 0) {␊ if (joined === undefined)␊ - joined = arg;␊ + joined = arg;␊ else␊ - joined += '/' + arg;␊ - }␊ + joined += '/' + arg;␊ + }␊ }␊ - if (joined === undefined)␊ - return '.';␊ - ␊ + if (joined === undefined) return '.';␊ return joined;␊ }␊ ␊ - 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;␊ + var main = {};␊ + ␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ + ␊ + function takeModule$1(name) {␊ + return commonjsRequire(name, "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/sub");␊ + }␊ + ␊ + var sub = {␊ + parent: takeModule$1('..'),␊ + customModule: takeModule$1('custom-module')␊ + };␊ + ␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ + ␊ + function takeModule(name) {␊ + return commonjsRequire(name, "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index");␊ + }␊ + ␊ + 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');␊ + t.deepEqual(sub, { parent: 'same-directory', customModule: 'custom-module' });␊ + ␊ + module.exports = main;␊ + `, + } + +## dynamic-require-resolve-reference + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var customModule;␊ + var hasRequiredCustomModule;␊ + ␊ + function requireCustomModule () {␊ + if (hasRequiredCustomModule) return customModule;␊ + hasRequiredCustomModule = 1;␊ + customModule = {␊ + foo: 'bar',␊ + };␊ + return customModule;␊ }␊ ␊ - function dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ + var customModule2;␊ + var hasRequiredCustomModule2;␊ ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var c = path.charCodeAt(i);␊ - if ((c === 47 || c === 92) && i !== path.length - 1)␊ - break;␊ - i--;␊ - }␊ + function requireCustomModule2 () {␊ + if (hasRequiredCustomModule2) return customModule2;␊ + hasRequiredCustomModule2 = 1;␊ + customModule2 = () => {␊ + return commonjsRequire.resolve('custom-module',"/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2");␊ + };␊ + return customModule2;␊ + }␊ ␊ - if (i > 0)␊ - return path.substr(0, i);␊ + var dynamicModules;␊ ␊ - if (path.chartCodeAt(0) === 47 || path.chartCodeAt(0) === 92)␊ - return path.charAt(0);␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module": requireCustomModule,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module/index.js": requireCustomModule,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2": requireCustomModule2,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2/index.js": requireCustomModule2␊ + });␊ + }␊ + ␊ + 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.');␊ + }␊ ␊ - return '.';␊ + function commonjsResolve (path, originalModuleDir) {␊ + const resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ }␊ ␊ - function commonjsResolveImpl (path, originalModuleDir, testCache) {␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ @@ -4126,15 +2369,9 @@ Generated by [AVA](https://avajs.dev). break; // Travelled too far up, avoid infinite loop␊ }␊ ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ + for (var extensionIndex = 0; extensionIndex < checkedExtensions.length; extensionIndex++) {␊ + var resolvedPath = relPath + checkedExtensions[extensionIndex];␊ + if (modules[resolvedPath]) {␊ return resolvedPath;␊ }␊ }␊ @@ -4146,94 +2383,119 @@ Generated by [AVA](https://avajs.dev). return null;␊ }␊ ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ + 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 commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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 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;␊ }␊ ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ + 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 = {};␊ ␊ - const commonjsRegister$1 = commonjsRegister$2;␊ - commonjsRegister$1("/$$rollup_base$$/fixtures/function/dynamic-require-root-circular/node_modules/custom-module/index.js", function (module, exports) {␊ - const circular = commonjsRequire("./lib/circular", "/$$rollup_base$$/fixtures/function/dynamic-require-root-circular/node_modules/custom-module");␊ + t.is(␊ + requireCustomModule2()(),␊ + '/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module'␊ + );␊ + ␊ + module.exports = main;␊ + `, + } + +## dynamic-require-root-circular + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var customModule = {exports: {}};␊ ␊ - circular.extend1(module.exports);␊ + var circular = {};␊ ␊ - module.exports.get1 = function () {␊ - return 'all good';␊ - };␊ + var hasRequiredCircular;␊ ␊ - circular.extend2(module.exports);␊ + function requireCircular () {␊ + if (hasRequiredCircular) return circular;␊ + hasRequiredCircular = 1;␊ + const lib = requireCustomModule();␊ ␊ - });␊ + circular.extend1 = function (exports) {␊ + exports.get2 = function () {␊ + return 'indirect ref';␊ + };␊ + };␊ ␊ - const commonjsRegister = commonjsRegister$2;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-root-circular/node_modules/custom-module/lib/circular.js", function (module, exports) {␊ - const lib = commonjsRequire("../", "/$$rollup_base$$/fixtures/function/dynamic-require-root-circular/node_modules/custom-module/lib");␊ + circular.extend2 = function (exports) {␊ + exports.get3 = lib.get1;␊ + };␊ + return circular;␊ + }␊ ␊ - module.exports.extend1 = function (exports) {␊ - exports.get2 = function () {␊ - return 'indirect ref';␊ - };␊ - };␊ + var hasRequiredCustomModule;␊ ␊ - module.exports.extend2 = function (exports) {␊ - exports.get3 = lib.get1;␊ - };␊ + function requireCustomModule () {␊ + if (hasRequiredCustomModule) return customModule.exports;␊ + hasRequiredCustomModule = 1;␊ + (function (module) {␊ + const circular = requireCircular();␊ ␊ - });␊ + circular.extend1(module.exports);␊ + ␊ + customModule.exports.get1 = function () {␊ + return 'all good';␊ + };␊ ␊ - const commonjsRegisterOrShort = commonjsRegisterOrShort$1;␊ - commonjsRegisterOrShort("/$$rollup_base$$/fixtures/function/dynamic-require-root-circular/node_modules/custom-module", "/$$rollup_base$$/fixtures/function/dynamic-require-root-circular/node_modules/custom-module/index.js");␊ + circular.extend2(module.exports);␊ + }(customModule));␊ + return customModule.exports;␊ + }␊ + ␊ + var main = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ - const custom = commonjsRequire("custom-module", "/$$rollup_base$$/fixtures/function/dynamic-require-root-circular");␊ + const custom = requireCustomModule();␊ ␊ t.is(custom.get1(), 'all good');␊ t.is(custom.get2(), 'indirect ref');␊ @@ -4243,109 +2505,94 @@ Generated by [AVA](https://avajs.dev). `, } -## dynamic-require-targets-fallback +## 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 : {};␊ + var dynamicRequireSlashAccess;␊ + var hasRequiredDynamicRequireSlashAccess;␊ ␊ - function commonjsRegister$1 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ + function requireDynamicRequireSlashAccess () {␊ + if (hasRequiredDynamicRequireSlashAccess) return dynamicRequireSlashAccess;␊ + hasRequiredDynamicRequireSlashAccess = 1;␊ + dynamicRequireSlashAccess = 'same-directory';␊ + return dynamicRequireSlashAccess;␊ }␊ ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ + var sub$2;␊ + var hasRequiredSub$1;␊ ␊ - 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;␊ + function requireSub$1 () {␊ + if (hasRequiredSub$1) return sub$2;␊ + hasRequiredSub$1 = 1;␊ + sub$2 = 'sub';␊ + return sub$2;␊ }␊ ␊ - 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 '.';␊ + var sub$1;␊ + var hasRequiredSub;␊ ␊ - return joined;␊ + function requireSub () {␊ + if (hasRequiredSub) return sub$1;␊ + hasRequiredSub = 1;␊ + sub$1 = 'sub';␊ + return sub$1;␊ }␊ ␊ - 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;␊ - }␊ + var customModule;␊ + var hasRequiredCustomModule;␊ ␊ - function dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ + function requireCustomModule () {␊ + if (hasRequiredCustomModule) return customModule;␊ + hasRequiredCustomModule = 1;␊ + customModule = 'custom-module' + ' + ' + requireSub();␊ + return customModule;␊ + }␊ ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var c = path.charCodeAt(i);␊ - if ((c === 47 || c === 92) && i !== path.length - 1)␊ - break;␊ - i--;␊ - }␊ + var dynamicModules;␊ ␊ - if (i > 0)␊ - return path.substr(0, i);␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access": requireDynamicRequireSlashAccess,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/index.js": requireDynamicRequireSlashAccess,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/sub": requireSub$1,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/sub/index.js": requireSub$1,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/node_modules/custom-module": requireCustomModule,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/node_modules/custom-module/index.js": requireCustomModule,␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/node_modules/custom-module2/sub.js": requireSub␊ + });␊ + }␊ ␊ - if (path.chartCodeAt(0) === 47 || path.chartCodeAt(0) === 92)␊ - return path.charAt(0);␊ + 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.');␊ + }␊ ␊ - return '.';␊ + function commonjsResolve (path, originalModuleDir) {␊ + const resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ }␊ ␊ - function commonjsResolveImpl (path, originalModuleDir, testCache) {␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ @@ -4359,15 +2606,9 @@ Generated by [AVA](https://avajs.dev). break; // Travelled too far up, avoid infinite loop␊ }␊ ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ + for (var extensionIndex = 0; extensionIndex < checkedExtensions.length; extensionIndex++) {␊ + var resolvedPath = relPath + checkedExtensions[extensionIndex];␊ + if (modules[resolvedPath]) {␊ return resolvedPath;␊ }␊ }␊ @@ -4379,98 +2620,177 @@ Generated by [AVA](https://avajs.dev). return null;␊ }␊ ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ + 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 commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - return require(path);␊ + 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;␊ }␊ ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ + 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 = {};␊ ␊ - const commonjsRegister = commonjsRegister$1;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-targets-fallback/dep1.js", function (module, exports) {␊ - module.exports = 'dep';␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ + ␊ + function takeModule$1(name) {␊ + return commonjsRequire(name, "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/sub");␊ + }␊ ␊ - });␊ + var sub = {␊ + parent: takeModule$1('..'),␊ + customModule: takeModule$1('custom-module')␊ + };␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ - function takeModule(withName) {␊ - return commonjsRequire(withName,"/$$rollup_base$$/fixtures/function/dynamic-require-targets-fallback");␊ + function takeModule(name) {␊ + return commonjsRequire(name, "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access");␊ }␊ ␊ - t.is(takeModule('./dep1.js'), 'dep');␊ - // The bundled code will run from test/helpers/util.js␊ - t.is(takeModule('../fixtures/function/dynamic-require-targets-fallback/dep2.js'), 'dep');␊ + t.is(takeModule('.'), 'same-directory', '.');␊ + t.is(takeModule('./'), 'same-directory', './');␊ + t.is(takeModule('.//'), 'same-directory', './/');␊ + ␊ + t.is(takeModule('./sub'), 'sub', './sub');␊ + ␊ + t.is(takeModule('custom-module'), 'custom-module + sub', 'custom-module');␊ + t.deepEqual(sub, {␊ + parent: 'same-directory',␊ + customModule: 'custom-module + sub'␊ + });␊ ␊ module.exports = main;␊ `, } -## dynamic-require-targets-no-fallback +## dynamic-require-targets-fallback > 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 dep1;␊ + var hasRequiredDep1;␊ + ␊ + function requireDep1 () {␊ + if (hasRequiredDep1) return dep1;␊ + hasRequiredDep1 = 1;␊ + dep1 = 'dep';␊ + return dep1;␊ + }␊ + ␊ + var dynamicModules;␊ + ␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-targets-fallback/dep1.js": requireDep1␊ + });␊ + }␊ + ␊ + function commonjsRequire(path, originalModuleDir) {␊ + var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return getDynamicModules()[resolvedPath]();␊ + }␊ + return require(path);␊ + }␊ + ␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ + } else if (originalModuleDir) {␊ + relPath = normalize(originalModuleDir + '/node_modules/' + path);␊ + } else {␊ + relPath = normalize(join('node_modules', path));␊ + }␊ + ␊ + if (relPath.endsWith('/..')) {␊ + break; // Travelled too far up, avoid infinite loop␊ + }␊ ␊ - function commonjsRegister$1 (path, loader) {␊ - DYNAMIC_REQUIRE_LOADERS[path] = loader;␊ + 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;␊ }␊ ␊ - var DYNAMIC_REQUIRE_LOADERS = Object.create(null);␊ - var DYNAMIC_REQUIRE_CACHE = Object.create(null);␊ - var DYNAMIC_REQUIRE_SHORTS = Object.create(null);␊ - var DEFAULT_PARENT_MODULE = {␊ - id: '<' + 'rollup>', exports: {}, parent: undefined, filename: null, loaded: false, children: [], paths: []␊ - };␊ - var CHECKED_EXTENSIONS = ['', '.js', '.json'];␊ + 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, '/');␊ @@ -4489,71 +2809,95 @@ Generated by [AVA](https://avajs.dev). }␊ }␊ path = parts.join('/');␊ - if (slashed && path[0] !== '/')␊ - path = '/' + path;␊ - else if (path.length === 0)␊ - path = '.';␊ + if (slashed && path[0] !== '/') path = '/' + path;␊ + else if (path.length === 0) path = '.';␊ return path;␊ }␊ ␊ function join () {␊ - if (arguments.length === 0)␊ - return '.';␊ + if (arguments.length === 0) return '.';␊ var joined;␊ for (var i = 0; i < arguments.length; ++i) {␊ - var arg = arguments[i];␊ - if (arg.length > 0) {␊ + var arg = arguments[i];␊ + if (arg.length > 0) {␊ if (joined === undefined)␊ - joined = arg;␊ + joined = arg;␊ else␊ - joined += '/' + arg;␊ - }␊ + joined += '/' + arg;␊ + }␊ }␊ - if (joined === undefined)␊ - return '.';␊ - ␊ + if (joined === undefined) return '.';␊ return joined;␊ }␊ ␊ - 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;␊ + var main = {};␊ + ␊ + /* eslint-disable import/no-dynamic-require, global-require */␊ + ␊ + function takeModule(withName) {␊ + return commonjsRequire(withName, "/$$rollup_base$$/fixtures/function/dynamic-require-targets-fallback");␊ }␊ ␊ - function dirname (path) {␊ - if (path.length === 0)␊ - return '.';␊ + t.is(takeModule('./dep1.js'), 'dep');␊ + // The bundled code will run from test/helpers/util.js␊ + t.is(takeModule('../fixtures/function/dynamic-require-targets-fallback/dep2.js'), 'dep');␊ ␊ - var i = path.length - 1;␊ - while (i > 0) {␊ - var c = path.charCodeAt(i);␊ - if ((c === 47 || c === 92) && i !== path.length - 1)␊ - break;␊ - i--;␊ - }␊ + module.exports = main;␊ + `, + } + +## dynamic-require-targets-no-fallback + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var dep1;␊ + var hasRequiredDep1;␊ + ␊ + function requireDep1 () {␊ + if (hasRequiredDep1) return dep1;␊ + hasRequiredDep1 = 1;␊ + dep1 = 'dep';␊ + return dep1;␊ + }␊ ␊ - if (i > 0)␊ - return path.substr(0, i);␊ + var dynamicModules;␊ ␊ - if (path.chartCodeAt(0) === 47 || path.chartCodeAt(0) === 92)␊ - return path.charAt(0);␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/$$rollup_base$$/fixtures/function/dynamic-require-targets-no-fallback/dep1.js": requireDep1␊ + });␊ + }␊ + ␊ + 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.');␊ + }␊ ␊ - return '.';␊ + function commonjsResolve (path, originalModuleDir) {␊ + const resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ }␊ ␊ - function commonjsResolveImpl (path, originalModuleDir, testCache) {␊ + 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 = originalModuleDir ? normalize(originalModuleDir + '/' + path) : path;␊ @@ -4567,15 +2911,9 @@ Generated by [AVA](https://avajs.dev). break; // Travelled too far up, avoid infinite loop␊ }␊ ␊ - for (var extensionIndex = 0; extensionIndex < CHECKED_EXTENSIONS.length; extensionIndex++) {␊ - var resolvedPath = relPath + CHECKED_EXTENSIONS[extensionIndex];␊ - if (DYNAMIC_REQUIRE_CACHE[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_SHORTS[resolvedPath]) {␊ - return resolvedPath;␊ - }␊ - if (DYNAMIC_REQUIRE_LOADERS[resolvedPath]) {␊ + for (var extensionIndex = 0; extensionIndex < checkedExtensions.length; extensionIndex++) {␊ + var resolvedPath = relPath + checkedExtensions[extensionIndex];␊ + if (modules[resolvedPath]) {␊ return resolvedPath;␊ }␊ }␊ @@ -4587,68 +2925,60 @@ Generated by [AVA](https://avajs.dev). return null;␊ }␊ ␊ - function commonjsResolve (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ + 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 commonjsRequire (path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - var cachedModule = DYNAMIC_REQUIRE_CACHE[resolvedPath];␊ - if (cachedModule) return cachedModule.exports;␊ - var shortTo = DYNAMIC_REQUIRE_SHORTS[resolvedPath];␊ - if (shortTo) {␊ - cachedModule = DYNAMIC_REQUIRE_CACHE[shortTo];␊ - if (cachedModule)␊ - return cachedModule.exports;␊ - resolvedPath = commonjsResolveImpl(shortTo, null);␊ - }␊ - var 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;␊ - } }␊ - 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 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;␊ }␊ ␊ - commonjsRequire.cache = DYNAMIC_REQUIRE_CACHE;␊ - commonjsRequire.resolve = commonjsResolve;␊ + 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 = {};␊ ␊ - const commonjsRegister = commonjsRegister$1;␊ - commonjsRegister("/$$rollup_base$$/fixtures/function/dynamic-require-targets-no-fallback/dep1.js", function (module, exports) {␊ - module.exports = 'dep';␊ - ␊ - });␊ - ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(withName,"/$$rollup_base$$/fixtures/function/dynamic-require-targets-no-fallback");␊ + return commonjsRequire(withName, "/$$rollup_base$$/fixtures/function/dynamic-require-targets-no-fallback");␊ }␊ ␊ t.is(takeModule('./dep1.js'), 'dep');␊ @@ -5522,20 +3852,20 @@ Generated by [AVA](https://avajs.dev). ␊ var main$1 = {};␊ ␊ - var require$$0$1 = 'other.js';␊ + var require$$0 = 'other.js';␊ ␊ - var require$$1 = 'both.js';␊ + var require$$2 = 'both.js';␊ ␊ - const other = require$$0$1;␊ - const both$1 = require$$1;␊ + const other = require$$0;␊ + const both$1 = require$$2;␊ ␊ t.deepEqual(other, 'other.js', 'other other');␊ t.deepEqual(both$1, 'both.js', 'other both');␊ ␊ - var require$$0 = 'main.js';␊ + var require$$1 = 'main.js';␊ ␊ - const main = require$$0;␊ - const both = require$$1;␊ + const main = require$$1;␊ + const both = require$$2;␊ ␊ t.deepEqual(main, 'main.js', 'main main');␊ t.deepEqual(both, 'both.js', 'main both');␊ @@ -6201,6 +4531,27 @@ Generated by [AVA](https://avajs.dev). `, } +## module-meta-properties + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var dep$1 = {};␊ + ␊ + dep$1.foo = 'foo';␊ + ␊ + const dep = dep$1;␊ + ␊ + t.is(dep.foo, 'foo');␊ + ␊ + module.exports = main;␊ + `, + } + ## module_require > Snapshot 1 @@ -6465,50 +4816,6 @@ Generated by [AVA](https://avajs.dev). `, } -## no-default-export-live-binding - -> Snapshot 1 - - { - 'main.js': `'use strict';␊ - ␊ - var dep1 = {␊ - foo: 'foo',␊ - update: () => (dep1 = { foo: 'bar' })␊ - };␊ - ␊ - var dep1$1 = dep1;␊ - ␊ - var dep2$1 = {exports: {}};␊ - ␊ - dep2$1.exports.foo = 'foo';␊ - dep2$1.exports.update = () => (dep2$1.exports = { foo: 'bar' });␊ - ␊ - var dep2 = dep2$1.exports;␊ - ␊ - var dep3$1 = {exports: {}};␊ - ␊ - (function (module, exports) {␊ - exports.foo = 'foo';␊ - module.exports.update = () => (module.exports = { foo: 'bar' });␊ - }(dep3$1, dep3$1.exports));␊ - ␊ - var dep3 = dep3$1.exports;␊ - ␊ - t.is(dep1$1.foo, 'foo', 'dep1');␊ - dep1$1.update();␊ - t.is(dep1$1.foo, 'foo', 'dep1 updated');␊ - ␊ - t.is(dep2.foo, 'foo', 'dep2');␊ - dep2.update();␊ - t.is(dep2.foo, 'foo', 'dep2 updated');␊ - ␊ - t.is(dep3.foo, 'foo', 'dep3');␊ - dep3.update();␊ - t.is(dep3.foo, 'foo', 'dep3 updated');␊ - `, - } - ## no-exports-entry > Snapshot 1 @@ -6535,7 +4842,7 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ - var main$1 = {};␊ + var main = {};␊ ␊ var dep$1 = {};␊ ␊ @@ -6545,8 +4852,6 @@ Generated by [AVA](https://avajs.dev). ␊ t.is(dep.foo, 'bar');␊ ␊ - var main = main$1;␊ - ␊ module.exports = main;␊ `, } @@ -6768,10 +5073,10 @@ Generated by [AVA](https://avajs.dev). const arrayPattern = arrayPattern$1.exports;␊ const assignmentPattern = assignmentPattern$1.exports;␊ ␊ - t.deepEqual(identifier, {});␊ - t.deepEqual(property, {});␊ - t.deepEqual(arrayPattern, {});␊ - t.deepEqual(assignmentPattern, {});␊ + t.deepEqual(identifier, {}, 'identifier');␊ + t.deepEqual(property, {}, 'property');␊ + t.deepEqual(arrayPattern, {}, 'arrayPattern');␊ + t.deepEqual(assignmentPattern, {}, 'assignmentPattern');␊ ␊ module.exports = main;␊ `, @@ -7094,6 +5399,29 @@ Generated by [AVA](https://avajs.dev). `, } +## shorthand-require + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + function commonjsRequire(path) {␊ + 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.');␊ + }␊ + ␊ + const HOST = {␊ + require: commonjsRequire␊ + };␊ + ␊ + var main = {␊ + HOST␊ + };␊ + ␊ + module.exports = main;␊ + `, + } + ## skips-dead-branches > Snapshot 1 @@ -7114,6 +5442,78 @@ Generated by [AVA](https://avajs.dev). `, } +## strict-require-semantic-exportmode-exports + +> 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 assignExports = {};␊ + ␊ + var hasRequiredAssignExports;␊ + ␊ + function requireAssignExports () {␊ + if (hasRequiredAssignExports) return assignExports;␊ + hasRequiredAssignExports = 1;␊ + assignExports.foo = 'foo';␊ + commonjsGlobal.hasAssignExportsRun = true;␊ + return assignExports;␊ + }␊ + ␊ + var reassignModuleExports = {exports: {}};␊ + ␊ + var hasRequiredReassignModuleExports;␊ + ␊ + function requireReassignModuleExports () {␊ + if (hasRequiredReassignModuleExports) return reassignModuleExports.exports;␊ + hasRequiredReassignModuleExports = 1;␊ + reassignModuleExports.exports = { bar: 'bar' };␊ + reassignModuleExports.exports.foo = 'foo';␊ + commonjsGlobal.hasReassignModuleExportsRun = true;␊ + return reassignModuleExports.exports;␊ + }␊ + ␊ + var compiledEsm = {};␊ + ␊ + var hasRequiredCompiledEsm;␊ + ␊ + function requireCompiledEsm () {␊ + if (hasRequiredCompiledEsm) return compiledEsm;␊ + hasRequiredCompiledEsm = 1;␊ + compiledEsm.__esModule = true;␊ + Object.defineProperty(compiledEsm, '__esModule', { value: true });␊ + compiledEsm.foo = 'foo';␊ + commonjsGlobal.hasCompiledEsmRun = true;␊ + return compiledEsm;␊ + }␊ + ␊ + t.is(commonjsGlobal.hasAssignExportsRun, undefined, 'before require');␊ + t.is(requireAssignExports().foo, 'foo');␊ + ␊ + t.is(commonjsGlobal.hasAssignExportsRun, true, 'after require');␊ + delete commonjsGlobal.hasAssignExportsRun;␊ + ␊ + t.is(commonjsGlobal.hasReassignModuleExportsRun, undefined, 'before require');␊ + t.is(requireReassignModuleExports().foo, 'foo');␊ + ␊ + t.is(commonjsGlobal.hasReassignModuleExportsRun, true, 'after require');␊ + delete commonjsGlobal.hasReassignModuleExportsRun;␊ + ␊ + t.is(commonjsGlobal.hasCompiledEsmRun, undefined, 'before require');␊ + t.is(requireCompiledEsm().foo, 'foo');␊ + ␊ + t.is(commonjsGlobal.hasCompiledEsmRun, true, 'after require');␊ + delete commonjsGlobal.hasCompiledEsmRun;␊ + ␊ + module.exports = main;␊ + `, + } + ## this > Snapshot 1 @@ -7840,6 +6240,8 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ + var main = {};␊ + ␊ /* eslint-disable global-require */␊ ␊ try {␊ @@ -7847,6 +6249,8 @@ Generated by [AVA](https://avajs.dev). } catch (ignored) {␊ /* ignore */␊ }␊ + ␊ + module.exports = main;␊ `, } @@ -7857,6 +6261,8 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ + var main = {};␊ + ␊ /* eslint-disable global-require */␊ ␊ try {␊ @@ -7864,6 +6270,8 @@ Generated by [AVA](https://avajs.dev). } catch (ignored) {␊ /* ignore */␊ }␊ + ␊ + module.exports = main;␊ `, } @@ -7874,6 +6282,8 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ + var main = {};␊ + ␊ /* eslint-disable global-require */␊ ␊ try {␊ @@ -7881,6 +6291,8 @@ Generated by [AVA](https://avajs.dev). } catch (ignored) {␊ /* ignore */␊ }␊ + ␊ + module.exports = main;␊ `, } @@ -7891,21 +6303,19 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ - function commonjsRequire (path) {␊ + function commonjsRequire(path) {␊ 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.');␊ }␊ ␊ - var foo$1 = {exports: {}};␊ + var foo = {exports: {}};␊ ␊ if (typeof commonjsRequire === 'function' && commonjsRequire) {␊ - foo$1.exports = 1;␊ + foo.exports = 'require detected';␊ } else {␊ - foo$1.exports = 2;␊ + foo.exports = 'could not detect require';␊ }␊ ␊ - var foo = foo$1.exports;␊ - ␊ - t.is(foo, 1);␊ + t.is(foo.exports, 'require detected');␊ `, } @@ -7916,21 +6326,19 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ - function commonjsRequire (path) {␊ + function commonjsRequire(path) {␊ 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.');␊ }␊ ␊ - var foo$1 = {exports: {}};␊ + var foo = {exports: {}};␊ ␊ if (typeof commonjsRequire === 'function' && commonjsRequire) {␊ - foo$1.exports = 1;␊ + foo.exports = 1;␊ } else {␊ - foo$1.exports = 2;␊ + foo.exports = 2;␊ }␊ ␊ - var foo = foo$1.exports;␊ - ␊ - t.is(foo, 1);␊ + t.is(foo.exports, 1);␊ `, } @@ -7956,24 +6364,3 @@ Generated by [AVA](https://avajs.dev). module.exports = main;␊ `, } - -## module-meta-properties - -> Snapshot 1 - - { - 'main.js': `'use strict';␊ - ␊ - var main = {};␊ - ␊ - var dep$1 = {};␊ - ␊ - dep$1.foo = 'foo';␊ - ␊ - const dep = dep$1;␊ - ␊ - t.is(dep.foo, 'foo');␊ - ␊ - module.exports = main;␊ - `, - } diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index 0a4924df3982b8e9748ecd319f2812f84995a7f7..7a81a3203873a762eb6a06beac2e7ad476cb0729 100644 GIT binary patch literal 17777 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

r{x^+&2wo4-mT~Qpt6?sIA+V=&g6o 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 CPjJ2f literal 19289 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 Snapshot 1 - - `'use strict';␊ - ␊ - var main = {};␊ - ␊ - var _export = {␊ - test: 42␊ - };␊ - ␊ - const { test } = _export;␊ - ␊ - console.log(test);␊ - ␊ - module.exports = main;␊ - ` diff --git a/packages/commonjs/test/snapshots/test.js.snap b/packages/commonjs/test/snapshots/test.js.snap index 7289e90120f6001788a886f6c570be5a4fc6852f..4ae913ba519108606626637e674eb70e138a7477 100644 GIT binary patch literal 757 zcmV>RzVbP?2n4uc=Vv;~$F%00000000A( zR6B1IK@dJWLFlfd=AluDebL;SBMq3M6!+87s*JrlwUHnwtZC^Tye`d7x2)|#} z@A~X{>Gr$TT6E<#dzR7GlSRW=FwX1DnRCX4>~SWSCKM7WSRiv%%i3=2(?GgS8Zu6I zMBJr99@z9zHx@E+Am{ru*@~NKL~{=Gp+};WRzQlB!XS_FJtCk(7>6442Y4?PfF=>+ zve;w^X+#tXCCds^9!M5*NLpzaMs!UGa$pm+=Amx^gs}iSq7oP;(snnZd{4HZ2<0kT zufqy%#p3WeKoIjp!aly&$b82=#r> z!}$96GBz{MQvm~OFf4DDvtPytRj)g1MceEZ+c0WieF+;&(nv0OqqyqW^|u6mxoXXh zEkoy~Hmp8wsQOhuNCk3@oP(zZo`Re;m>UgxT-U__?dj-&x+5kNW~U(QbC4>Vpbt_e z=<@Ok#!N~(4K;o9Z$Q~vb`EJGmOU!h(!CDlk~Z&<4o$iwpf*<$Fj)vTcc<#iBd|;b z2TX4&It07cDtxa#{m_jfmZzfc-c4h5x;sf}p9-xaZpeZK-c njUq?&TenYd*5q&Dlv+xK8`G3$4;HcW|F5Or=+V0uO$7h|pY&kK literal 835 zcmV-J1HAk}RzVs)(|`>#e=t^ zASft!=uN7K(xXQYf}Xq;^q}}R2>NDr^P@3}U?96Q@6CJP_ul(v?<$HirCh#!u5{1d zQs@W!$^NlNA7hI6y~Y=N^Kw$(nb=rbUHba`{MO@`w5H>Vvite_TW7&IvR7Pd9^Izj zV$!;e|Mv@*Oy@!F!i%|*d;FPmKPIjFlZx`?;hs-#T}?l2eR{R~?&pt~w6ZBhnNSW% z%-EE2IKC5020j6wGpEXvMO9s?tdlC&Ys7XuvdUbwD2$QRLi24?Y<&4$MTs?_s2tmElri#K%J zrIcxM$ts9>;PnW1X5&Urd4TB?f{uk~hT|5z;ja(G*U0T { - const bundle = await rollup({ - input: 'fixtures/samples/cjs-extension/main.js', - plugins: [commonjs()] - }); - t.snapshot(await getCodeFromBundle(bundle)); -}); - -test('registers dynamic requires when entry is from a different loader', async (t) => { - const bundle = await rollup({ - input: 'fixtures/samples/dynamic-require-different-loader/main.js', - plugins: [ - { - load(id) { - if (id === path.resolve('fixtures/samples/dynamic-require-different-loader/main.js')) { - return 'import submodule1 from "./submodule1"; export default submodule1();'; - } - return null; - } - }, - commonjs({ - dynamicRequireTargets: ['fixtures/samples/dynamic-require-different-loader/submodule2.js'], - transformMixedEsModules: true - }) - ] - }); - - t.is((await executeBundle(bundle, t)).exports, 'Hello there'); -}); - -test('transforms the es file with a `commonjsRequire` and no `require`s', async (t) => { - const bundle = await rollup({ - input: 'fixtures/samples/dynamic-require-es-mixed-helpers/main.js', - plugins: [ - commonjs({ - dynamicRequireTargets: ['fixtures/samples/dynamic-require-es-mixed-helpers/submodule.js'], - transformMixedEsModules: true - }) - ] - }); - - const code = await getCodeFromBundle(bundle); - - t.is(/commonjsRequire\(["']\.\/submodule\.js/.test(code), true); -}); - -test('does not wrap commonjsRegister calls in createCommonjsModule', async (t) => { - const bundle = await rollup({ - input: 'fixtures/samples/dynamic-require-double-wrap/main.js', - plugins: [ - commonjs({ - sourceMap: true, - dynamicRequireTargets: ['fixtures/samples/dynamic-require-double-wrap/submodule.js'] - }) - ] - }); - - const code = await getCodeFromBundle(bundle, { exports: 'named' }); - - t.not(/createCommonjsModule\(function/.test(code), true); -}); - -test('does not replace shorthand `require` property in object', async (t) => { - const bundle = await rollup({ - input: 'fixtures/samples/shorthand-require/main.js', - plugins: [commonjs()] - }); - - const code = await getCodeFromBundle(bundle, { exports: 'named' }); - - t.is(/require: commonjsRequire/.test(code), true); -}); - // This test uses worker threads to simulate an empty internal cache and needs at least Node 12 if (Number(/^v(\d+)/.exec(process.version)[1]) >= 12) { test('can be cached across instances', async (t) => { From 003845fcd58c726db3b159e0f40846586c0ca2b2 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Sat, 6 Nov 2021 07:13:04 +0100 Subject: [PATCH 03/22] feat(commonjs): add strictRequires option to wrap modules (#1038) --- packages/commonjs/src/generate-exports.js | 87 ++-- packages/commonjs/src/generate-imports.js | 84 +-- packages/commonjs/src/helpers.js | 2 + packages/commonjs/src/index.js | 122 +---- packages/commonjs/src/proxies.js | 23 +- packages/commonjs/src/resolve-id.js | 3 +- .../commonjs/src/resolve-require-sources.js | 54 ++ packages/commonjs/src/transform-commonjs.js | 12 +- .../output.js | 4 +- .../output.js | 4 +- .../output.js | 4 +- .../form/typeof-module-exports/output.js | 18 +- .../_config.js | 6 + .../strict-require-semantic-circular/main.js | 2 + .../strict-require-semantic-circular/other.js | 1 + .../strict-require-semantic-entry/_config.js | 20 + .../strict-require-semantic-entry/main.js | 1 + .../strict-require-semantic-entry/other.js | 1 + .../_config.js | 2 +- .../assignExports.js | 1 + .../main.js | 16 +- .../reassignModuleExports.js | 3 - .../wrappedExports.js | 4 + .../_config.js | 6 + .../assignModuleAndExports.js | 3 + .../assignModuleExports.js | 6 + .../main.js | 17 + .../wrappedModuleExports.js | 3 + .../_config.js | 6 + .../main.js | 5 + .../replaceModuleExports.js | 2 + .../_config.js | 6 + .../strict-require-semantic-from-esm/dep.js | 1 + .../strict-require-semantic-from-esm/main.js | 4 + .../strict.js | 1 + .../samples/cjs-with-esm-property/lib.js | 10 +- .../samples/cjs-with-esm-property/main.js | 4 +- .../commonjs/test/snapshots/function.js.md | 491 +++++++++++++----- .../commonjs/test/snapshots/function.js.snap | Bin 17777 -> 18579 bytes 39 files changed, 711 insertions(+), 328 deletions(-) create mode 100644 packages/commonjs/src/resolve-require-sources.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-circular/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-circular/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-circular/other.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-entry/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-entry/other.js delete mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/reassignModuleExports.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/wrappedExports.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleAndExports.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleExports.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/wrappedModuleExports.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/replaceModuleExports.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/dep.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/strict.js diff --git a/packages/commonjs/src/generate-exports.js b/packages/commonjs/src/generate-exports.js index 7dcb2cdaa..1c5faa41d 100644 --- a/packages/commonjs/src/generate-exports.js +++ b/packages/commonjs/src/generate-exports.js @@ -11,8 +11,9 @@ export function wrapCode(magicString, uses, moduleName, exportsName) { } magicString .trim() + .indent('\t') .prepend(`(function (${args.join(', ')}) {\n`) - .append(`\n}(${passedArgs.join(', ')}));`); + .append(`\n} (${passedArgs.join(', ')}));`); } export function rewriteExportsAndGetExportsBlock( @@ -38,34 +39,18 @@ export function rewriteExportsAndGetExportsBlock( const exportDeclarations = []; if (usesRequireWrapper) { - // TODO Lukas Extract - if (exportMode === 'replace') { - for (const { left } of moduleExportsAssignments) { - magicString.overwrite(left.start, left.end, exportsName); - } - } else { - // Collect and rewrite module.exports assignments - for (const { left } of moduleExportsAssignments) { - magicString.overwrite(left.start, left.end, `${moduleName}.exports`); - } - // Collect and rewrite named exports - for (const [exportName, { nodes }] of exportsAssignmentsByName) { - for (const node of nodes) { - magicString.overwrite(node.start, node.left.end, `${exportsName}.${exportName}`); - } - } - // Collect and rewrite exports.__esModule assignments - for (const expression of defineCompiledEsmExpressions) { - const moduleExportsExpression = - expression.type === 'CallExpression' ? expression.arguments[0] : expression.left.object; - magicString.overwrite( - moduleExportsExpression.start, - moduleExportsExpression.end, - exportsName - ); - } - } - exports.push(`${requireName} as __require`); + getExportsWhenUsingRequireWrapper( + magicString, + wrapped, + exportMode, + exports, + moduleExportsAssignments, + exportsAssignmentsByName, + moduleName, + exportsName, + requireName, + defineCompiledEsmExpressions + ); } else if (exportMode === 'replace') { getExportsForReplacedModuleExports( magicString, @@ -109,6 +94,49 @@ export function rewriteExportsAndGetExportsBlock( return `\n\n${exportDeclarations.join('\n')}`; } +function getExportsWhenUsingRequireWrapper( + magicString, + wrapped, + exportMode, + exports, + moduleExportsAssignments, + exportsAssignmentsByName, + moduleName, + exportsName, + requireName, + defineCompiledEsmExpressions +) { + if (!wrapped) { + if (exportMode === 'replace') { + for (const { left } of moduleExportsAssignments) { + magicString.overwrite(left.start, left.end, exportsName); + } + } else { + // Collect and rewrite module.exports assignments + for (const { left } of moduleExportsAssignments) { + magicString.overwrite(left.start, left.end, `${moduleName}.exports`); + } + // Collect and rewrite named exports + for (const [exportName, { nodes }] of exportsAssignmentsByName) { + for (const node of nodes) { + magicString.overwrite(node.start, node.left.end, `${exportsName}.${exportName}`); + } + } + // Collect and rewrite exports.__esModule assignments + for (const expression of defineCompiledEsmExpressions) { + const moduleExportsExpression = + expression.type === 'CallExpression' ? expression.arguments[0] : expression.left.object; + magicString.overwrite( + moduleExportsExpression.start, + moduleExportsExpression.end, + exportsName + ); + } + } + } + exports.push(`${requireName} as __require`); +} + function getExportsForReplacedModuleExports( magicString, exports, @@ -196,7 +224,6 @@ function getExports( } if (!isRestorableCompiledEsm || defaultIsModuleExports === true) { - // TODO Lukas handle ESM importing CommonJS exports.push(`${exportsName} as default`); } else if (moduleExportsAssignments.length === 0 || defaultIsModuleExports === false) { exports.push(`${deconflictedDefaultExportName || exportsName} as default`); diff --git a/packages/commonjs/src/generate-imports.js b/packages/commonjs/src/generate-imports.js index 8f621a260..22a59027d 100644 --- a/packages/commonjs/src/generate-imports.js +++ b/packages/commonjs/src/generate-imports.js @@ -2,7 +2,14 @@ import { dirname, resolve } from 'path'; import { sync as nodeResolveSync } from 'resolve'; -import { DYNAMIC_MODULES_ID, EXPORTS_SUFFIX, HELPERS_ID, MODULE_SUFFIX, wrapId } from './helpers'; +import { + DYNAMIC_MODULES_ID, + EXPORTS_SUFFIX, + HELPERS_ID, + IS_WRAPPED_COMMONJS, + MODULE_SUFFIX, + wrapId +} from './helpers'; import { normalizePathSlashes } from './utils'; export function isRequireStatement(node, scope) { @@ -106,6 +113,7 @@ export function getRequireHandlers() { exportMode, resolveRequireSourcesAndGetMeta, usesRequireWrapper, + isEsModule, usesRequire ) { const imports = []; @@ -127,40 +135,12 @@ export function getRequireHandlers() { ); } const requiresBySource = collectSources(requireExpressions); - // TODO Lukas consider extracting stuff - const result = await resolveRequireSourcesAndGetMeta( - usesRequireWrapper ? 'withRequireFunction' : true, + const requireTargets = await resolveRequireSourcesAndGetMeta( + id, + usesRequireWrapper ? IS_WRAPPED_COMMONJS : !isEsModule, Object.keys(requiresBySource) ); - let uid = 0; - for (const { source, id: resolveId, isCommonJS } of result) { - const requires = requiresBySource[source]; - let usesRequired = false; - let name; - const hasNameConflict = ({ scope }) => scope.contains(name); - do { - name = `require$$${uid}`; - uid += 1; - } while (requires.some(hasNameConflict)); - - // TODO Lukas extract constant - if (isCommonJS === 'withRequireFunction') { - for (const { node } of requires) { - magicString.overwrite(node.start, node.end, `${name}()`); - } - imports.push(`import { __require as ${name} } from ${JSON.stringify(resolveId)};`); - } else { - for (const { node, usesReturnValue, toBeRemoved } of requires) { - if (usesReturnValue) { - usesRequired = true; - magicString.overwrite(node.start, node.end, name); - } else { - magicString.remove(toBeRemoved.start, toBeRemoved.end); - } - } - imports.push(`import ${usesRequired ? `${name} from ` : ''}${JSON.stringify(resolveId)};`); - } - } + processRequireExpressions(imports, requireTargets, requiresBySource, magicString); return imports.length ? `${imports.join('\n')}\n\n` : ''; } @@ -181,3 +161,41 @@ function collectSources(requireExpressions) { } return requiresBySource; } + +function processRequireExpressions(imports, requireTargets, requiresBySource, magicString) { + const generateRequireName = getGenerateRequireName(); + for (const { source, id: resolveId, isCommonJS } of requireTargets) { + const requires = requiresBySource[source]; + const name = generateRequireName(requires); + if (isCommonJS === IS_WRAPPED_COMMONJS) { + for (const { node } of requires) { + magicString.overwrite(node.start, node.end, `${name}()`); + } + imports.push(`import { __require as ${name} } from ${JSON.stringify(resolveId)};`); + } else { + let usesRequired = false; + for (const { node, usesReturnValue, toBeRemoved } of requires) { + if (usesReturnValue) { + usesRequired = true; + magicString.overwrite(node.start, node.end, name); + } else { + magicString.remove(toBeRemoved.start, toBeRemoved.end); + } + } + imports.push(`import ${usesRequired ? `${name} from ` : ''}${JSON.stringify(resolveId)};`); + } + } +} + +function getGenerateRequireName() { + let uid = 0; + return (requires) => { + let name; + const hasNameConflict = ({ scope }) => scope.contains(name); + do { + name = `require$$${uid}`; + uid += 1; + } while (requires.some(hasNameConflict)); + return name; + }; +} diff --git a/packages/commonjs/src/helpers.js b/packages/commonjs/src/helpers.js index 381761110..fe080ee0e 100644 --- a/packages/commonjs/src/helpers.js +++ b/packages/commonjs/src/helpers.js @@ -11,6 +11,8 @@ export const ES_IMPORT_SUFFIX = '?es-import'; export const DYNAMIC_MODULES_ID = '\0commonjs-dynamic-modules'; export const HELPERS_ID = '\0commonjsHelpers.js'; +export const IS_WRAPPED_COMMONJS = 'withRequireFunction'; + // `x['default']` is used instead of `x.default` for backward compatibility with ES3 browsers. // Minifiers like uglify will usually transpile it back if compatibility with ES3 is not enabled. // This could be improved by inspecting Rollup's "generatedCode" option diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index af9afcc37..5fa50e419 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -19,17 +19,24 @@ import { isWrappedId, MODULE_SUFFIX, PROXY_SUFFIX, - unwrapId, - wrapId + unwrapId } from './helpers'; import { hasCjsKeywords } from './parse'; -import { getStaticRequireProxy, getUnknownRequireProxy } from './proxies'; -import getResolveId, { resolveExtensions } from './resolve-id'; +import { getEsImportProxy, getStaticRequireProxy, getUnknownRequireProxy } from './proxies'; +import getResolveId from './resolve-id'; +import { getResolveRequireSourcesAndGetMeta } from './resolve-require-sources'; import validateRollupVersion from './rollup-version'; import transformCommonjs from './transform-commonjs'; -import { capitalize, getName, normalizePathSlashes } from './utils'; +import { getName, normalizePathSlashes } from './utils'; export default function commonjs(options = {}) { + const { + ignoreGlobal, + ignoreDynamicRequires, + requireReturnsDefault: requireReturnsDefaultOption, + defaultIsModuleExports: defaultIsModuleExportsOption, + esmExternals + } = options; const extensions = options.extensions || ['.js']; const filter = createFilter(options.include, options.exclude); const strictRequireSemanticFilter = @@ -38,17 +45,12 @@ export default function commonjs(options = {}) { : !options.strictRequireSemantic ? () => false : createFilter(options.strictRequireSemantic); - const { - ignoreGlobal, - ignoreDynamicRequires, - requireReturnsDefault: requireReturnsDefaultOption, - defaultIsModuleExports: defaultIsModuleExportsOption, - esmExternals - } = options; + const getRequireReturnsDefault = typeof requireReturnsDefaultOption === 'function' ? requireReturnsDefaultOption : () => requireReturnsDefaultOption; + let esmExternalIds; const isEsmExternal = typeof esmExternals === 'function' @@ -56,13 +58,14 @@ export default function commonjs(options = {}) { : Array.isArray(esmExternals) ? ((esmExternalIds = new Set(esmExternals)), (id) => esmExternalIds.has(id)) : () => esmExternals; + const getDefaultIsModuleExports = typeof defaultIsModuleExportsOption === 'function' ? defaultIsModuleExportsOption : () => typeof defaultIsModuleExportsOption === 'boolean' ? defaultIsModuleExportsOption : 'auto'; - const knownCjsModuleTypes = Object.create(null); + const resolveRequireSourcesAndGetMeta = getResolveRequireSourcesAndGetMeta(extensions); const dynamicRequireModuleSet = getDynamicRequireModuleSet(options.dynamicRequireTargets); const isDynamicRequireModulesEnabled = dynamicRequireModuleSet.size > 0; const commonDir = isDynamicRequireModulesEnabled @@ -119,17 +122,10 @@ export default function commonjs(options = {}) { return { meta: { commonjs: { isCommonJS: false } } }; } - // TODO Lukas - // * test import from ESM -> additional proxy - // * test entry point - // * test interaction with dynamic require targets - // * test circular dependency: We must not use this.load without circularity check -> error in Rollup? - // When we write the imports, we already know that we are commonjs or mixed so we can rely on usesRequireWrapper and write that into a table const usesRequireWrapper = !isEsModule && (dynamicRequireModuleSet.has(normalizePathSlashes(id)) || strictRequireSemanticFilter(id)); - // TODO Lukas extract helpers return transformCommonjs( this.parse, code, @@ -146,54 +142,7 @@ export default function commonjs(options = {}) { ast, getDefaultIsModuleExports(id), usesRequireWrapper, - // TODO Lukas extract - (isParentCommonJS, sources) => { - knownCjsModuleTypes[id] = isParentCommonJS; - return Promise.all( - sources.map(async (source) => { - // Never analyze or proxy internal modules - if (source.startsWith('\0')) { - return { source, id: source, isCommonJS: false }; - } - const resolved = - (await this.resolve(source, id, { - skipSelf: true, - custom: { - 'node-resolve': { isRequire: true } - } - })) || resolveExtensions(source, id, extensions); - if (!resolved) { - return { source, id: wrapId(source, EXTERNAL_SUFFIX), isCommonJS: false }; - } - if (resolved.external) { - return { source, id: wrapId(resolved.id, EXTERNAL_SUFFIX), isCommonJS: false }; - } - if (resolved.id in knownCjsModuleTypes) { - return { - source, - id: - knownCjsModuleTypes[resolved.id] === true - ? wrapId(resolved.id, PROXY_SUFFIX) - : resolved.id, - isCommonJS: knownCjsModuleTypes[resolved.id] - }; - } - const { - meta: { commonjs: commonjsMeta } - } = await this.load(resolved); - const isCommonJS = commonjsMeta && commonjsMeta.isCommonJS; - return { - source, - id: - // TODO Lukas extract constant - isCommonJS === 'withRequireFunction' - ? resolved.id - : wrapId(resolved.id, PROXY_SUFFIX), - isCommonJS - }; - }) - ); - } + resolveRequireSourcesAndGetMeta(this) ); } @@ -241,40 +190,17 @@ export default function commonjs(options = {}) { ); } - // TODO Lukas extract if (isWrappedId(id, ES_IMPORT_SUFFIX)) { - const actualId = unwrapId(id, ES_IMPORT_SUFFIX); - const name = getName(actualId); - const exportsName = `${name}Exports`; - const requireModule = `require${capitalize(name)}`; - // TODO Lukas the ES wrapper might also just forward the exports object - let code = - `import { getDefaultExportFromCjs } from "${HELPERS_ID}";\n` + - `import { __require as ${requireModule} } from ${JSON.stringify(actualId)};\n` + - `var ${exportsName} = ${requireModule}();\n` + - `export { ${exportsName} as __moduleExports };`; - if (defaultIsModuleExports) { - code += `\nexport { ${exportsName} as default };`; - } else { - code += `export default /*@__PURE__*/getDefaultExportFromCjs(${exportsName});`; - } - return { - code, - syntheticNamedExports: '__moduleExports', - meta: { commonjs: { isCommonJS: false } } - }; + return getEsImportProxy(unwrapId(id, ES_IMPORT_SUFFIX), defaultIsModuleExports); } if (id === DYNAMIC_MODULES_ID) { - return { - code: getDynamicRequireModules( - isDynamicRequireModulesEnabled, - dynamicRequireModuleSet, - commonDir, - ignoreDynamicRequires - ), - meta: { commonjs: { isCommonJS: false } } - }; + return getDynamicRequireModules( + isDynamicRequireModulesEnabled, + dynamicRequireModuleSet, + commonDir, + ignoreDynamicRequires + ); } if (isWrappedId(id, PROXY_SUFFIX)) { diff --git a/packages/commonjs/src/proxies.js b/packages/commonjs/src/proxies.js index 7fd0b0234..2935612ac 100644 --- a/packages/commonjs/src/proxies.js +++ b/packages/commonjs/src/proxies.js @@ -1,5 +1,5 @@ import { HELPERS_ID } from './helpers'; -import { getName } from './utils'; +import { capitalize, getName } from './utils'; export function getUnknownRequireProxy(id, requireReturnsDefault) { if (requireReturnsDefault === true || id.endsWith('.json')) { @@ -46,3 +46,24 @@ export async function getStaticRequireProxy( } return `export { default } from ${JSON.stringify(id)};`; } + +export function getEsImportProxy(id, defaultIsModuleExports) { + const name = getName(id); + const exportsName = `${name}Exports`; + const requireModule = `require${capitalize(name)}`; + let code = + `import { getDefaultExportFromCjs } from "${HELPERS_ID}";\n` + + `import { __require as ${requireModule} } from ${JSON.stringify(id)};\n` + + `var ${exportsName} = ${requireModule}();\n` + + `export { ${exportsName} as __moduleExports };`; + if (defaultIsModuleExports) { + code += `\nexport { ${exportsName} as default };`; + } else { + code += `export default /*@__PURE__*/getDefaultExportFromCjs(${exportsName});`; + } + return { + code, + syntheticNamedExports: '__moduleExports', + meta: { commonjs: { isCommonJS: false } } + }; +} diff --git a/packages/commonjs/src/resolve-id.js b/packages/commonjs/src/resolve-id.js index ac59be3a8..d87309bc7 100644 --- a/packages/commonjs/src/resolve-id.js +++ b/packages/commonjs/src/resolve-id.js @@ -9,6 +9,7 @@ import { EXPORTS_SUFFIX, EXTERNAL_SUFFIX, HELPERS_ID, + IS_WRAPPED_COMMONJS, isWrappedId, MODULE_SUFFIX, PROXY_SUFFIX, @@ -96,7 +97,7 @@ export default function getResolveId(extensions) { const { meta: { commonjs: commonjsMeta } } = await this.load(resolved); - if (commonjsMeta && commonjsMeta.isCommonJS === 'withRequireFunction') { + if (commonjsMeta && commonjsMeta.isCommonJS === IS_WRAPPED_COMMONJS) { return wrapId(resolved.id, ES_IMPORT_SUFFIX); } } diff --git a/packages/commonjs/src/resolve-require-sources.js b/packages/commonjs/src/resolve-require-sources.js new file mode 100644 index 000000000..5be46a0c9 --- /dev/null +++ b/packages/commonjs/src/resolve-require-sources.js @@ -0,0 +1,54 @@ +import { EXTERNAL_SUFFIX, IS_WRAPPED_COMMONJS, PROXY_SUFFIX, wrapId } from './helpers'; +import { resolveExtensions } from './resolve-id'; + +// TODO Lukas auto-detect circular dependencies +// * only return once all dependencies have been analyzed +// * wait for this.load dependencies unless they already have an entry in knownCjsModuleTypes to avoid deadlocks +// as those have already started being processed +// * only analyze cycles if we do not have an explicit config +export function getResolveRequireSourcesAndGetMeta(extensions) { + const knownCjsModuleTypes = Object.create(null); + return (rollupContext) => (id, isParentCommonJS, sources) => { + knownCjsModuleTypes[id] = isParentCommonJS; + return Promise.all( + sources.map(async (source) => { + // Never analyze or proxy internal modules + if (source.startsWith('\0')) { + return { source, id: source, isCommonJS: false }; + } + const resolved = + (await rollupContext.resolve(source, id, { + skipSelf: true, + custom: { + 'node-resolve': { isRequire: true } + } + })) || resolveExtensions(source, id, extensions); + if (!resolved) { + return { source, id: wrapId(source, EXTERNAL_SUFFIX), isCommonJS: false }; + } + if (resolved.external) { + return { source, id: wrapId(resolved.id, EXTERNAL_SUFFIX), isCommonJS: false }; + } + if (resolved.id in knownCjsModuleTypes) { + return { + source, + id: + knownCjsModuleTypes[resolved.id] === IS_WRAPPED_COMMONJS + ? resolved.id + : wrapId(resolved.id, PROXY_SUFFIX), + isCommonJS: knownCjsModuleTypes[resolved.id] + }; + } + const { + meta: { commonjs: commonjsMeta } + } = await rollupContext.load(resolved); + const isCommonJS = commonjsMeta && commonjsMeta.isCommonJS; + return { + source, + id: isCommonJS === IS_WRAPPED_COMMONJS ? resolved.id : wrapId(resolved.id, PROXY_SUFFIX), + isCommonJS + }; + }) + ); + }; +} diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index eda4632fc..3716e6f35 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -27,6 +27,7 @@ import { isRequireStatement, isStaticRequireStatement } from './generate-imports'; +import { IS_WRAPPED_COMMONJS } from './helpers'; import { tryParse } from './parse'; import { capitalize, deconflict, getName, getVirtualPathForDynamicRequirePath } from './utils'; @@ -195,7 +196,7 @@ export default async function transformCommonjs( node.callee.property.name === 'resolve' && hasDynamicModuleForPath(id, '/', dynamicRequireModuleSet) ) { - // TODO Lukas reimplement + // TODO Lukas reimplement? uses.require = true; const requireNode = node.callee.object; magicString.appendLeft( @@ -219,7 +220,6 @@ export default async function transformCommonjs( skippedNodes.add(node.callee); uses.require = true; - // TODO Lukas can the remaining logic be moved to generate-imports? if (!isIgnoredRequireStatement(node, ignoreRequire)) { const usesReturnValue = parent.type !== 'ExpressionStatement'; @@ -315,10 +315,6 @@ export default async function transformCommonjs( } } return; - // TODO Lukas instead of wrapping, we rewrite everything - // module.exports -> exportsVar, except if it is an assignment, then it is moduleVar.exports - // module -> moduleVar - // only exceptions: Direct assignments to module or exports. Would work with new logic, though. case 'module': case 'exports': shouldWrap = true; @@ -464,6 +460,7 @@ export default async function transformCommonjs( exportMode, resolveRequireSourcesAndGetMeta, usesRequireWrapper, + isEsModule, uses.require ); const exportBlock = isEsModule @@ -521,9 +518,8 @@ function ${requireName} () { map: sourceMap ? magicString.generateMap() : null, syntheticNamedExports: isEsModule || usesRequireWrapper ? false : '__moduleExports', meta: { - // TODO Lukas extract constant commonjs: { - isCommonJS: !isEsModule && (usesRequireWrapper ? 'withRequireFunction' : true), + isCommonJS: !isEsModule && (usesRequireWrapper ? IS_WRAPPED_COMMONJS : true), isMixedModule: isEsModule } } diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-reassign-exports-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-reassign-exports-__esModule/output.js index 54f0fd3f5..5d2e8817a 100644 --- a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-reassign-exports-__esModule/output.js +++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-auto-reassign-exports-__esModule/output.js @@ -2,8 +2,8 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __module as inputModule, exports as input } from "\u0000fixtures/form/defaultIsModuleExports-auto-reassign-exports-__esModule/input.js?commonjs-module" (function (module) { -module.exports = { __esModule: true, default: { foo: 'bar' }} -}(inputModule)); + module.exports = { __esModule: true, default: { foo: 'bar' }} +} (inputModule)); export default /*@__PURE__*/commonjsHelpers.getDefaultExportFromCjs(input); export { input as __moduleExports }; diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-__esModule/output.js index 3d98b2c44..06b76067d 100644 --- a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-__esModule/output.js +++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-__esModule/output.js @@ -2,8 +2,8 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __module as inputModule, exports as input } from "\u0000fixtures/form/defaultIsModuleExports-false-reassign-exports-__esModule/input.js?commonjs-module" (function (module) { -module.exports = { __esModule: true, default: { foo: 'bar' }}; -}(inputModule)); + module.exports = { __esModule: true, default: { foo: 'bar' }}; +} (inputModule)); export default input.default; export { input as __moduleExports }; diff --git a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-no-__esModule/output.js b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-no-__esModule/output.js index 2c8183e6e..448a18947 100644 --- a/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-no-__esModule/output.js +++ b/packages/commonjs/test/fixtures/form/defaultIsModuleExports-false-reassign-exports-no-__esModule/output.js @@ -2,8 +2,8 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __module as inputModule, exports as input } from "\u0000fixtures/form/defaultIsModuleExports-false-reassign-exports-no-__esModule/input.js?commonjs-module" (function (module) { -module.exports = { default: { foo: 'bar' }}; -}(inputModule)); + module.exports = { default: { foo: 'bar' }}; +} (inputModule)); export default input.default; export { input as __moduleExports }; diff --git a/packages/commonjs/test/fixtures/form/typeof-module-exports/output.js b/packages/commonjs/test/fixtures/form/typeof-module-exports/output.js index 174b58185..17e00f801 100644 --- a/packages/commonjs/test/fixtures/form/typeof-module-exports/output.js +++ b/packages/commonjs/test/fixtures/form/typeof-module-exports/output.js @@ -2,16 +2,16 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { __module as inputModule, exports as input } from "\u0000fixtures/form/typeof-module-exports/input.js?commonjs-module" (function (module, exports) { -var foo = 42; + var foo = 42; -if ( 'object' === 'object' && 'object' === 'object' ) { - module.exports = foo; -} else if ( typeof undefined === 'function' && undefined.amd ) { - undefined([], function () { return foo; }); -} else { - window.foo = foo; -} -}(inputModule, input)); + if ( 'object' === 'object' && 'object' === 'object' ) { + module.exports = foo; + } else if ( typeof undefined === 'function' && undefined.amd ) { + undefined([], function () { return foo; }); + } else { + window.foo = foo; + } +} (inputModule, input)); export default input; export { input as __moduleExports }; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/_config.js new file mode 100644 index 000000000..073d40526 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/_config.js @@ -0,0 +1,6 @@ +module.exports = { + description: 'handles circular dependencies with strict require semantic', + pluginOptions: { + strictRequireSemantic: true + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/main.js new file mode 100644 index 000000000..b49deee73 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/main.js @@ -0,0 +1,2 @@ +exports.foo = 'foo'; +t.is(require('./other.js').foo, 'foo'); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/other.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/other.js new file mode 100644 index 000000000..fbe0d2a97 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/other.js @@ -0,0 +1 @@ +exports.foo = require('./main.js').foo; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js new file mode 100644 index 000000000..0ba3d13b4 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js @@ -0,0 +1,20 @@ +const assert = require('assert'); + +module.exports = { + description: 'strict require semantic modules can be entry points', + options: { + input: [ + 'fixtures/function/strict-require-semantic-entry/main.js', + 'fixtures/function/strict-require-semantic-entry/other.js' + ], + output: { + chunkFileNames: 'generated-[name].js' + } + }, + pluginOptions: { + strictRequireSemantic: ['fixtures/function/strict-require-semantic-entry/main.js'] + }, + exports(exports) { + assert.deepStrictEqual(exports, { foo: 'foo' }); + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/main.js new file mode 100644 index 000000000..94ecacb72 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/main.js @@ -0,0 +1 @@ +exports.foo = 'foo'; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/other.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/other.js new file mode 100644 index 000000000..44c7e1527 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/other.js @@ -0,0 +1 @@ +t.is(require('./main.js').foo, 'foo'); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js index 30b61d0c5..dde0e4242 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js @@ -1,5 +1,5 @@ module.exports = { - description: 'supports using function wrappers for modules', + description: 'supports using function wrappers for modules for export mode "exports"', pluginOptions: { strictRequireSemantic: ['fixtures/function/strict-require-semantic-exportmode-exports/*E*.js'] } diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/assignExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/assignExports.js index 5e58a22e5..8c69cda39 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/assignExports.js +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/assignExports.js @@ -1,2 +1,3 @@ exports.foo = 'foo'; +module.exports.bar = 'bar'; global.hasAssignExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/main.js index 90fca158f..c8523a512 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/main.js +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/main.js @@ -1,17 +1,17 @@ t.is(global.hasAssignExportsRun, undefined, 'before require'); -t.is(require('./assignExports.js').foo, 'foo'); +t.deepEqual(require('./assignExports.js'), { foo: 'foo', bar: 'bar' }); t.is(global.hasAssignExportsRun, true, 'after require'); delete global.hasAssignExportsRun; -t.is(global.hasReassignModuleExportsRun, undefined, 'before require'); -t.is(require('./reassignModuleExports.js').foo, 'foo'); - -t.is(global.hasReassignModuleExportsRun, true, 'after require'); -delete global.hasReassignModuleExportsRun; - t.is(global.hasCompiledEsmRun, undefined, 'before require'); -t.is(require('./compiledEsm.js').foo, 'foo'); +t.deepEqual(require('./compiledEsm.js'), { foo: 'foo', __esModule: true }); t.is(global.hasCompiledEsmRun, true, 'after require'); delete global.hasCompiledEsmRun; + +t.is(global.hasWrappedExportsRun, undefined, 'before require'); +t.deepEqual(require('./wrappedExports.js'), { foo: 'foo' }); + +t.is(global.hasWrappedExportsRun, true, 'after require'); +delete global.hasWrappedExportsRun; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/reassignModuleExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/reassignModuleExports.js deleted file mode 100644 index d988c04a8..000000000 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/reassignModuleExports.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { bar: 'bar' }; -module.exports.foo = 'foo'; -global.hasReassignModuleExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/wrappedExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/wrappedExports.js new file mode 100644 index 000000000..11c17d4cc --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/wrappedExports.js @@ -0,0 +1,4 @@ +exports.foo = 'foo'; +exports = {}; +exports.bar = 'bar'; +global.hasWrappedExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js new file mode 100644 index 000000000..e8dd75b4f --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js @@ -0,0 +1,6 @@ +module.exports = { + description: 'supports using function wrappers for modules for export mode "module"', + pluginOptions: { + strictRequireSemantic: ['fixtures/function/strict-require-semantic-exportmode-module/*E*.js'] + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleAndExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleAndExports.js new file mode 100644 index 000000000..887e1707f --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleAndExports.js @@ -0,0 +1,3 @@ +module.exports = { foo: 'foo' }; +module.exports.bar = 'bar'; +global.hasAssignModuleAndExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleExports.js new file mode 100644 index 000000000..654fd144a --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleExports.js @@ -0,0 +1,6 @@ +if (Math.random() > 0.5) { + module.exports = { foo: 'foo' }; +} else { + module.exports = { foo: 'foo' }; +} +global.hasAssignModuleExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/main.js new file mode 100644 index 000000000..3e28a77a2 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/main.js @@ -0,0 +1,17 @@ +t.is(global.hasAssignModuleExportsRun, undefined, 'before require'); +t.is(require('./assignModuleExports.js').foo, 'foo'); + +t.is(global.hasAssignModuleExportsRun, true, 'after require'); +delete global.hasAssignModuleExportsRun; + +t.is(global.hasAssignModuleAndExportsRun, undefined, 'before require'); +t.is(require('./assignModuleAndExports.js').foo, 'foo'); + +t.is(global.hasAssignModuleAndExportsRun, true, 'after require'); +delete global.hasAssignModuleAndExportsRun; + +t.is(global.hasWrappedModuleExportsRun, undefined, 'before require'); +t.is(require('./wrappedModuleExports.js').foo, 'foo'); + +t.is(global.hasWrappedModuleExportsRun, true, 'after require'); +delete global.hasWrappedModuleExportsRun; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/wrappedModuleExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/wrappedModuleExports.js new file mode 100644 index 000000000..00b083b31 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/wrappedModuleExports.js @@ -0,0 +1,3 @@ +module.exports = { foo: 'foo' }; +exports = {}; +global.hasWrappedModuleExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js new file mode 100644 index 000000000..6f9c03a62 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js @@ -0,0 +1,6 @@ +module.exports = { + description: 'supports using function wrappers for modules for export mode "replace"', + pluginOptions: { + strictRequireSemantic: ['fixtures/function/strict-require-semantic-exportmode-replace/*E*.js'] + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/main.js new file mode 100644 index 000000000..4b6423503 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/main.js @@ -0,0 +1,5 @@ +t.is(global.hasReplaceModuleExportsRun, undefined, 'before require'); +t.is(require('./replaceModuleExports.js').foo, 'foo'); + +t.is(global.hasReplaceModuleExportsRun, true, 'after require'); +delete global.hasReplaceModuleExportsRun; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/replaceModuleExports.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/replaceModuleExports.js new file mode 100644 index 000000000..07a8f2e9a --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/replaceModuleExports.js @@ -0,0 +1,2 @@ +module.exports = { foo: 'foo' }; +global.hasReplaceModuleExportsRun = true; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js new file mode 100644 index 000000000..56fdd8541 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js @@ -0,0 +1,6 @@ +module.exports = { + description: 'handles importing wrapped modules from ESM', + pluginOptions: { + strictRequireSemantic: ['fixtures/function/strict-require-semantic-from-esm/strict.js'] + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/dep.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/dep.js new file mode 100644 index 000000000..242f91140 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/dep.js @@ -0,0 +1 @@ +t.is(require('./strict').foo, 'foo'); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/main.js new file mode 100644 index 000000000..95d8d3beb --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/main.js @@ -0,0 +1,4 @@ +import { foo } from './strict.js'; +import './dep.js'; + +t.is(foo, 'foo'); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/strict.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/strict.js new file mode 100644 index 000000000..94ecacb72 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/strict.js @@ -0,0 +1 @@ +exports.foo = 'foo'; diff --git a/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/lib.js b/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/lib.js index 657003611..46d1bf449 100644 --- a/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/lib.js +++ b/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/lib.js @@ -1,4 +1,6 @@ -module.exports = { - "default": () => { console.log('beep') }, - __esModule: true -}; \ No newline at end of file +module.exports = { + default: () => { + t.is('beep', 'beep'); + }, + __esModule: true +}; diff --git a/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/main.js b/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/main.js index aed3937f1..e97281701 100644 --- a/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/main.js +++ b/packages/commonjs/test/fixtures/samples/cjs-with-esm-property/main.js @@ -1,3 +1,3 @@ -import fn from './lib' +import fn from './lib'; -fn() \ No newline at end of file +fn(); diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index 48dcc52e9..5715c0ae2 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -128,27 +128,27 @@ Generated by [AVA](https://avajs.dev). var dep = {};␊ ␊ (function (exports) {␊ - const main$1 = main;␊ + const main$1 = main;␊ ␊ - addExports(exports);␊ + addExports(exports);␊ ␊ - function addExports(exported) {␊ - // eslint-disable-next-line no-param-reassign␊ - exported.getMain = () => main$1;␊ - }␊ - }(dep));␊ + function addExports(exported) {␊ + // eslint-disable-next-line no-param-reassign␊ + exported.getMain = () => main$1;␊ + }␊ + } (dep));␊ ␊ (function (exports) {␊ - const dep$1 = dep;␊ + const dep$1 = dep;␊ ␊ - addExports();␊ - t.is(dep$1.getMain().foo, 'foo');␊ + addExports();␊ + t.is(dep$1.getMain().foo, 'foo');␊ ␊ - function addExports(exported) {␊ - // eslint-disable-next-line no-param-reassign␊ - exports.foo = 'foo';␊ - }␊ - }(main));␊ + function addExports(exported) {␊ + // eslint-disable-next-line no-param-reassign␊ + exports.foo = 'foo';␊ + }␊ + } (main));␊ ␊ exports["default"] = main;␊ `, @@ -2478,16 +2478,16 @@ Generated by [AVA](https://avajs.dev). if (hasRequiredCustomModule) return customModule.exports;␊ hasRequiredCustomModule = 1;␊ (function (module) {␊ - const circular = requireCircular();␊ + const circular = requireCircular();␊ ␊ - circular.extend1(module.exports);␊ + circular.extend1(module.exports);␊ ␊ - customModule.exports.get1 = function () {␊ - return 'all good';␊ - };␊ + module.exports.get1 = function () {␊ + return 'all good';␊ + };␊ ␊ - circular.extend2(module.exports);␊ - }(customModule));␊ + circular.extend2(module.exports);␊ + } (customModule));␊ return customModule.exports;␊ }␊ ␊ @@ -3364,10 +3364,10 @@ Generated by [AVA](https://avajs.dev). var dep$1 = {exports: {}};␊ ␊ (function (module, exports) {␊ - exports.foo = 'foo';␊ - module.exports = { replaced: true };␊ - exports.bar = 'bar';␊ - }(dep$1, dep$1.exports));␊ + exports.foo = 'foo';␊ + module.exports = { replaced: true };␊ + exports.bar = 'bar';␊ + } (dep$1, dep$1.exports));␊ ␊ const dep = dep$1.exports;␊ ␊ @@ -3477,13 +3477,13 @@ Generated by [AVA](https://avajs.dev). var encode = {};␊ ␊ (function (exports) {␊ - exports.encodeURIComponent = function () {␊ - return encodeURIComponent(this.str);␊ - };␊ + exports.encodeURIComponent = function () {␊ + return encodeURIComponent(this.str);␊ + };␊ ␊ - // to ensure module is wrapped␊ - commonjsGlobal.foo = exports;␊ - }(encode));␊ + // to ensure module is wrapped␊ + commonjsGlobal.foo = exports;␊ + } (encode));␊ ␊ /* eslint-disable */␊ ␊ @@ -4380,15 +4380,15 @@ Generated by [AVA](https://avajs.dev). var other = {exports: {}};␊ ␊ (function (module, exports) {␊ - exports.default = 42;␊ + exports.default = 42;␊ ␊ - addCompiledMarker(module.exports);␊ + addCompiledMarker(module.exports);␊ ␊ - function addCompiledMarker(exports) {␊ - // eslint-disable-next-line no-param-reassign␊ - exports.__esModule = true;␊ - }␊ - }(other, other.exports));␊ + function addCompiledMarker(exports) {␊ + // eslint-disable-next-line no-param-reassign␊ + exports.__esModule = true;␊ + }␊ + } (other, other.exports));␊ ␊ var foo = /*@__PURE__*/getDefaultExportFromCjs(other.exports);␊ ␊ @@ -4406,13 +4406,13 @@ Generated by [AVA](https://avajs.dev). var other = {exports: {}};␊ ␊ (function (module) {␊ - addDefaultExport(module.exports);␊ + addDefaultExport(module.exports);␊ ␊ - function addDefaultExport(exports) {␊ - // eslint-disable-next-line no-param-reassign␊ - exports.default = 42;␊ - }␊ - }(other));␊ + function addDefaultExport(exports) {␊ + // eslint-disable-next-line no-param-reassign␊ + exports.default = 42;␊ + }␊ + } (other));␊ ␊ var foo = other.exports;␊ ␊ @@ -4519,13 +4519,13 @@ Generated by [AVA](https://avajs.dev). ␊ (function (exports) {␊ ␊ - modifyExports(exports);␊ + modifyExports(exports);␊ ␊ - function modifyExports(exported) {␊ - // eslint-disable-next-line no-param-reassign␊ - exported.foo = 'bar';␊ - }␊ - }(main));␊ + function modifyExports(exported) {␊ + // eslint-disable-next-line no-param-reassign␊ + exported.foo = 'bar';␊ + }␊ + } (main));␊ ␊ module.exports = main;␊ `, @@ -4632,10 +4632,10 @@ Generated by [AVA](https://avajs.dev). var x = {exports: {}};␊ ␊ (function (module) {␊ - window.addExport = (key, value) => {␊ - module.exports[key] = value;␊ - };␊ - }(x));␊ + window.addExport = (key, value) => {␊ + module.exports[key] = value;␊ + };␊ + } (x));␊ ␊ t.is(x.exports.named, undefined);␊ ␊ @@ -4655,13 +4655,13 @@ Generated by [AVA](https://avajs.dev). var x = {exports: {}};␊ ␊ (function (module) {␊ - Object.defineProperty(module.exports, 'named', {␊ - enumerable: true,␊ - get: function get() {␊ - return 'foo';␊ - }␊ - });␊ - }(x));␊ + Object.defineProperty(module.exports, 'named', {␊ + enumerable: true,␊ + get: function get() {␊ + return 'foo';␊ + }␊ + });␊ + } (x));␊ ␊ t.is(x.exports.named, 'foo');␊ `, @@ -4733,8 +4733,8 @@ Generated by [AVA](https://avajs.dev). ␊ (function (exports) {␊ ␊ - exports.default = 'foo';␊ - }(foo$1));␊ + exports.default = 'foo';␊ + } (foo$1));␊ ␊ var foo = /*@__PURE__*/getDefaultExportFromCjs(foo$1);␊ ␊ @@ -4756,14 +4756,14 @@ Generated by [AVA](https://avajs.dev). var foo$1 = {};␊ ␊ (function (exports) {␊ - Object.defineProperty(exports, '__esModule', { value: true });␊ + Object.defineProperty(exports, '__esModule', { value: true });␊ ␊ - {␊ - Object.defineProperty(exports, '__esModule', { value: true });␊ - }␊ + {␊ + Object.defineProperty(exports, '__esModule', { value: true });␊ + }␊ ␊ - exports.default = 'foo';␊ - }(foo$1));␊ + exports.default = 'foo';␊ + } (foo$1));␊ ␊ var foo = /*@__PURE__*/getDefaultExportFromCjs(foo$1);␊ ␊ @@ -4988,30 +4988,30 @@ Generated by [AVA](https://avajs.dev). var identifier$1 = {};␊ ␊ (function (exports) {␊ - exports = 'foo';␊ - t.is(exports, 'foo');␊ - }(identifier$1));␊ + exports = 'foo';␊ + t.is(exports, 'foo');␊ + } (identifier$1));␊ ␊ var property$1 = {};␊ ␊ (function (exports) {␊ - ({ foo: exports } = { foo: 'foo' });␊ - t.is(exports, 'foo');␊ - }(property$1));␊ + ({ foo: exports } = { foo: 'foo' });␊ + t.is(exports, 'foo');␊ + } (property$1));␊ ␊ var arrayPattern$1 = {};␊ ␊ (function (exports) {␊ - [exports] = ['foo'];␊ - t.is(exports, 'foo');␊ - }(arrayPattern$1));␊ + [exports] = ['foo'];␊ + t.is(exports, 'foo');␊ + } (arrayPattern$1));␊ ␊ var assignmentPattern$1 = {};␊ ␊ (function (exports) {␊ - ({ exports = 'foo' } = {});␊ - t.is(exports, 'foo');␊ - }(assignmentPattern$1));␊ + ({ exports = 'foo' } = {});␊ + t.is(exports, 'foo');␊ + } (assignmentPattern$1));␊ ␊ const identifier = identifier$1;␊ const property = property$1;␊ @@ -5039,34 +5039,34 @@ Generated by [AVA](https://avajs.dev). var identifier$1 = {exports: {}};␊ ␊ (function (module) {␊ - // eslint-disable-next-line no-global-assign␊ - module = 'foo';␊ - t.is(module, 'foo');␊ - }(identifier$1));␊ + // eslint-disable-next-line no-global-assign␊ + module = 'foo';␊ + t.is(module, 'foo');␊ + } (identifier$1));␊ ␊ var property$1 = {exports: {}};␊ ␊ (function (module) {␊ - // eslint-disable-next-line no-global-assign␊ - ({ foo: module } = { foo: 'foo' });␊ - t.is(module, 'foo');␊ - }(property$1));␊ + // eslint-disable-next-line no-global-assign␊ + ({ foo: module } = { foo: 'foo' });␊ + t.is(module, 'foo');␊ + } (property$1));␊ ␊ var arrayPattern$1 = {exports: {}};␊ ␊ (function (module) {␊ - // eslint-disable-next-line no-global-assign␊ - [module] = ['foo'];␊ - t.is(module, 'foo');␊ - }(arrayPattern$1));␊ + // eslint-disable-next-line no-global-assign␊ + [module] = ['foo'];␊ + t.is(module, 'foo');␊ + } (arrayPattern$1));␊ ␊ var assignmentPattern$1 = {exports: {}};␊ ␊ (function (module) {␊ - // eslint-disable-next-line no-global-assign␊ - ({ module = 'foo' } = {});␊ - t.is(module, 'foo');␊ - }(assignmentPattern$1));␊ + // eslint-disable-next-line no-global-assign␊ + ({ module = 'foo' } = {});␊ + t.is(module, 'foo');␊ + } (assignmentPattern$1));␊ ␊ const identifier = identifier$1.exports;␊ const property = property$1.exports;␊ @@ -5442,6 +5442,82 @@ Generated by [AVA](https://avajs.dev). `, } +## strict-require-semantic-circular + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var other = {};␊ + ␊ + var hasRequiredOther;␊ + ␊ + function requireOther () {␊ + if (hasRequiredOther) return other;␊ + hasRequiredOther = 1;␊ + other.foo = requireMain().foo;␊ + return other;␊ + }␊ + ␊ + var hasRequiredMain;␊ + ␊ + function requireMain () {␊ + if (hasRequiredMain) return main;␊ + hasRequiredMain = 1;␊ + main.foo = 'foo';␊ + t.is(requireOther().foo, 'foo');␊ + return main;␊ + }␊ + ␊ + var mainExports = requireMain();␊ + ␊ + module.exports = mainExports;␊ + `, + } + +## strict-require-semantic-entry + +> Snapshot 1 + + { + 'generated-main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var hasRequiredMain;␊ + ␊ + function requireMain () {␊ + if (hasRequiredMain) return main;␊ + hasRequiredMain = 1;␊ + main.foo = 'foo';␊ + return main;␊ + }␊ + ␊ + exports.requireMain = requireMain;␊ + `, + 'main.js': `'use strict';␊ + ␊ + var main = require('./generated-main.js');␊ + ␊ + var mainExports = main.requireMain();␊ + ␊ + module.exports = mainExports;␊ + `, + 'other.js': `'use strict';␊ + ␊ + var main = require('./generated-main.js');␊ + ␊ + var other = {};␊ + ␊ + t.is(main.requireMain().foo, 'foo');␊ + ␊ + module.exports = other;␊ + `, + } + ## strict-require-semantic-exportmode-exports > Snapshot 1 @@ -5461,23 +5537,11 @@ Generated by [AVA](https://avajs.dev). if (hasRequiredAssignExports) return assignExports;␊ hasRequiredAssignExports = 1;␊ assignExports.foo = 'foo';␊ + assignExports.bar = 'bar';␊ commonjsGlobal.hasAssignExportsRun = true;␊ return assignExports;␊ }␊ ␊ - var reassignModuleExports = {exports: {}};␊ - ␊ - var hasRequiredReassignModuleExports;␊ - ␊ - function requireReassignModuleExports () {␊ - if (hasRequiredReassignModuleExports) return reassignModuleExports.exports;␊ - hasRequiredReassignModuleExports = 1;␊ - reassignModuleExports.exports = { bar: 'bar' };␊ - reassignModuleExports.exports.foo = 'foo';␊ - commonjsGlobal.hasReassignModuleExportsRun = true;␊ - return reassignModuleExports.exports;␊ - }␊ - ␊ var compiledEsm = {};␊ ␊ var hasRequiredCompiledEsm;␊ @@ -5492,28 +5556,178 @@ Generated by [AVA](https://avajs.dev). return compiledEsm;␊ }␊ ␊ + var wrappedExports = {};␊ + ␊ + var hasRequiredWrappedExports;␊ + ␊ + function requireWrappedExports () {␊ + if (hasRequiredWrappedExports) return wrappedExports;␊ + hasRequiredWrappedExports = 1;␊ + (function (exports) {␊ + exports.foo = 'foo';␊ + exports = {};␊ + exports.bar = 'bar';␊ + commonjsGlobal.hasWrappedExportsRun = true;␊ + } (wrappedExports));␊ + return wrappedExports;␊ + }␊ + ␊ t.is(commonjsGlobal.hasAssignExportsRun, undefined, 'before require');␊ - t.is(requireAssignExports().foo, 'foo');␊ + t.deepEqual(requireAssignExports(), { foo: 'foo', bar: 'bar' });␊ ␊ t.is(commonjsGlobal.hasAssignExportsRun, true, 'after require');␊ delete commonjsGlobal.hasAssignExportsRun;␊ ␊ - t.is(commonjsGlobal.hasReassignModuleExportsRun, undefined, 'before require');␊ - t.is(requireReassignModuleExports().foo, 'foo');␊ - ␊ - t.is(commonjsGlobal.hasReassignModuleExportsRun, true, 'after require');␊ - delete commonjsGlobal.hasReassignModuleExportsRun;␊ - ␊ t.is(commonjsGlobal.hasCompiledEsmRun, undefined, 'before require');␊ - t.is(requireCompiledEsm().foo, 'foo');␊ + t.deepEqual(requireCompiledEsm(), { foo: 'foo', __esModule: true });␊ ␊ t.is(commonjsGlobal.hasCompiledEsmRun, true, 'after require');␊ delete commonjsGlobal.hasCompiledEsmRun;␊ ␊ + t.is(commonjsGlobal.hasWrappedExportsRun, undefined, 'before require');␊ + t.deepEqual(requireWrappedExports(), { foo: 'foo' });␊ + ␊ + t.is(commonjsGlobal.hasWrappedExportsRun, true, 'after require');␊ + delete commonjsGlobal.hasWrappedExportsRun;␊ + ␊ module.exports = main;␊ `, } +## strict-require-semantic-exportmode-module + +> 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 assignModuleExports = {exports: {}};␊ + ␊ + var hasRequiredAssignModuleExports;␊ + ␊ + function requireAssignModuleExports () {␊ + if (hasRequiredAssignModuleExports) return assignModuleExports.exports;␊ + hasRequiredAssignModuleExports = 1;␊ + if (Math.random() > 0.5) {␊ + assignModuleExports.exports = { foo: 'foo' };␊ + } else {␊ + assignModuleExports.exports = { foo: 'foo' };␊ + }␊ + commonjsGlobal.hasAssignModuleExportsRun = true;␊ + return assignModuleExports.exports;␊ + }␊ + ␊ + var assignModuleAndExports = {exports: {}};␊ + ␊ + var hasRequiredAssignModuleAndExports;␊ + ␊ + function requireAssignModuleAndExports () {␊ + if (hasRequiredAssignModuleAndExports) return assignModuleAndExports.exports;␊ + hasRequiredAssignModuleAndExports = 1;␊ + assignModuleAndExports.exports = { foo: 'foo' };␊ + assignModuleAndExports.exports.bar = 'bar';␊ + commonjsGlobal.hasAssignModuleAndExportsRun = true;␊ + return assignModuleAndExports.exports;␊ + }␊ + ␊ + var wrappedModuleExports = {exports: {}};␊ + ␊ + var hasRequiredWrappedModuleExports;␊ + ␊ + function requireWrappedModuleExports () {␊ + if (hasRequiredWrappedModuleExports) return wrappedModuleExports.exports;␊ + hasRequiredWrappedModuleExports = 1;␊ + (function (module, exports) {␊ + module.exports = { foo: 'foo' };␊ + commonjsGlobal.hasWrappedModuleExportsRun = true;␊ + } (wrappedModuleExports));␊ + return wrappedModuleExports.exports;␊ + }␊ + ␊ + t.is(commonjsGlobal.hasAssignModuleExportsRun, undefined, 'before require');␊ + t.is(requireAssignModuleExports().foo, 'foo');␊ + ␊ + t.is(commonjsGlobal.hasAssignModuleExportsRun, true, 'after require');␊ + delete commonjsGlobal.hasAssignModuleExportsRun;␊ + ␊ + t.is(commonjsGlobal.hasAssignModuleAndExportsRun, undefined, 'before require');␊ + t.is(requireAssignModuleAndExports().foo, 'foo');␊ + ␊ + t.is(commonjsGlobal.hasAssignModuleAndExportsRun, true, 'after require');␊ + delete commonjsGlobal.hasAssignModuleAndExportsRun;␊ + ␊ + t.is(commonjsGlobal.hasWrappedModuleExportsRun, undefined, 'before require');␊ + t.is(requireWrappedModuleExports().foo, 'foo');␊ + ␊ + t.is(commonjsGlobal.hasWrappedModuleExportsRun, true, 'after require');␊ + delete commonjsGlobal.hasWrappedModuleExportsRun;␊ + ␊ + module.exports = main;␊ + `, + } + +## strict-require-semantic-exportmode-replace + +> 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 replaceModuleExports;␊ + var hasRequiredReplaceModuleExports;␊ + ␊ + function requireReplaceModuleExports () {␊ + if (hasRequiredReplaceModuleExports) return replaceModuleExports;␊ + hasRequiredReplaceModuleExports = 1;␊ + replaceModuleExports = { foo: 'foo' };␊ + commonjsGlobal.hasReplaceModuleExportsRun = true;␊ + return replaceModuleExports;␊ + }␊ + ␊ + t.is(commonjsGlobal.hasReplaceModuleExportsRun, undefined, 'before require');␊ + t.is(requireReplaceModuleExports().foo, 'foo');␊ + ␊ + t.is(commonjsGlobal.hasReplaceModuleExportsRun, true, 'after require');␊ + delete commonjsGlobal.hasReplaceModuleExportsRun;␊ + ␊ + module.exports = main;␊ + `, + } + +## strict-require-semantic-from-esm + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var strict = {};␊ + ␊ + var hasRequiredStrict;␊ + ␊ + function requireStrict () {␊ + if (hasRequiredStrict) return strict;␊ + hasRequiredStrict = 1;␊ + strict.foo = 'foo';␊ + return strict;␊ + }␊ + ␊ + var strictExports = requireStrict();␊ + ␊ + t.is(requireStrict().foo, 'foo');␊ + ␊ + t.is(strictExports.foo, 'foo');␊ + `, + } + ## this > Snapshot 1 @@ -5612,11 +5826,11 @@ Generated by [AVA](https://avajs.dev). ␊ (function (module) {␊ ␊ - module.exports = 'bar';␊ - {␊ - return;␊ - }␊ - }(foo$1));␊ + module.exports = 'bar';␊ + {␊ + return;␊ + }␊ + } (foo$1));␊ ␊ const foo = foo$1.exports;␊ ␊ @@ -6364,3 +6578,32 @@ Generated by [AVA](https://avajs.dev). module.exports = main;␊ `, } + +## require-mixed-module + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var other = 'foo';␊ + ␊ + const foo = other;␊ + ␊ + var dep$1 = 'default';␊ + ␊ + var dep$2 = /*#__PURE__*/Object.freeze({␊ + __proto__: null,␊ + foo: foo,␊ + 'default': dep$1␊ + });␊ + ␊ + const dep = dep$2;␊ + ␊ + t.deepEqual(dep, { default: 'default', ns: { default: 'bar', foo: 'foo' } });␊ + ␊ + module.exports = main;␊ + `, + } diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index 7a81a3203873a762eb6a06beac2e7ad476cb0729..ab054b8b038a4b16352f76ba1c8b9ceeb9ccad87 100644 GIT binary patch literal 18579 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 GR{{V(xZ`{P literal 17777 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

r{x^+&2wo4-mT~Qpt6?sIA+V=&g6o zNOK#ugI6>ry2v$%9!_IWU7!Cje7 z(Ycp@m@6lgG`|o+68d0wsJYGu%Hp3J>Fard#{%>FPrr%k07E)xGBXlytw*KHrfuM- zr+FIC%^ii(_2?f>8w3)@y(ThdI~28@JSLbu4x;CCSo=TIL<;J3h^hhipKY2te*+=_ zF~7XkA$3>W)kPBEbnD-@wB1vX&e7ln#soQeHnp~_cTWBe;wLcGwRvmV2fI>AP6Cv- zu#~n)OWJ6IQADwz-vb+0PVSt<;p*0S>5oq8#?rsMXo~gMw_TO96Tl$G*5_#U>PAF} z66>P|KtHllq|QvNN&tuOO`P^~oV3pe2m!+4QiO1x&SYqEGaDI5*5}$Nz>~-*TCM5DxZ7Zku`(uU< zCjJ<70ml=6oVg6hV}6%9?Hzc0>`ZtQ4C&AB>0?Nvc*{rRMwc5G;ppNZou8l7+n8`? zTtOvzMiZ#WZ$YVf$p_+tS3xZEL`6Ox3ruf7wK$)yrLDGR7zUNEL$|E6~XmimQ| zAI`E?C=--&qoN`UWRHm^M>pX~L&K44_ikMv&tSZ3!s|IIJ#m~vk^6b%6#@`ltZZ`& za5)DHcZQBtQMZBaq>rb9Nlm~(_X`T^_gpAK^I~k~1<)y2uPfoXXB)fBq2|JYM!xcISuMxHV&JcI-G9CDCtZ3DTQD)pjT#rIlZoIBxbHyhAAN%duIkS-(U?-iPCmdHZ+lCgM^vDM6lc1Vp=#PtsV_~{FsT^d4Br!ar5Cmxnq-vYQViL<2ci=1}sTv zamYuY)-0)vR*x| zWc*7F88KFIte-NXUjeQZf3ZFDg^szLnQ~Bs3~S^hI;39-NNASYf#RElN&qIz(;sOC zd1yGas}HoUd4L*kC@uJ0L4@WcX7jl1AuY{3nQ-w0+IuEBfp9T}2&e-P<@EqTl=@b( zhPYW)2d9b}2|#T*W+%gVMQhzdZ-hS8lbamCyJ3+?=cOSh+7?NtGGgy`EDaTI%85Vj z=-k9{=n;WL)zosoQCQIL=5SG^%c*;i!F@6)>v!qLd; z=!X~;an z^U&hIVgYGf7|Oo&r8{Bze_7I!M~lfOlaTxFnApP2zeh&o?qmCqM1?W5*=rZsQ9p&STqc7$AN(cm7L703R~Gp zdt328+m(2P)mE}426s(W1_kR9B~?}1!E;5=cR>>2&wnL+DHh(X-Ou@x%%Cz2Q$d`& z6WsmTis?+J=+O(o>j>QH%b>PjE1TO&Vhe)04>gMiXmIO;x#gbYr|RG9Y7s}`UD_~; zZ$8s5fUs0hmT;C&hxc(WAIY_GYAel$#x1XQ5P_u7w?c@Oh=$B%Z5-Ja;j;|0ex1tZ z$Y2p;_+?tSkgU)kGoXK1>zBOwYPVV@M(5%_Z2+bLBnBQHVs?0d=z%5^Mga??nXaSY zkv6{M$1cGwT7F9Ygj1YTxa64R5u-3GfAODWYcTnfS;;|@djp0Zws6t}1UV#G(*Fx| z1dIE1Kt{N6w-`Ehr;7o~Vurpno=E8FcCb1Dp<2%xnQW-VNB~JR6Kc=K699t(d9X-< zB_a`2Mm5T9c3LX&Av(dWz{5N}Rp$Jj29Qh=$#e3euPA5z46~w&1e0c7Z9!c~S(WrV z#wwe?VuXH^2$mfJ*ps+|OM{1WiAgY-5LR1kh$I)au%O>WNWLO`DoRB(jg`E6*wSas>qReRg8ui_;rPuV zXs!d!;?Qb{1S|txvNRoSYcpbQv1^IqovFgRyto3S%u>JVC<}Oojs%pV{k{P;xEd*9NB=+ zJ0+NLzCl}5sJy~oJ7EX2(QL(n9qI9IzJ&R3%qUTs4Od(!$ zl<@`gAu&JH=(>+lzynv>o}|mfCk99?pVB*`QhIOM`btS9NK{%>yX9%{*y;kg>D!=} zbr>#GS_$TOHK&6vF&)B-IURL8Kz{m&SGsfA1Y^jWNU1C#hZJIWEype5)wA?2M*XEs^jd1=T4>$Ez-+lp1xUS{uG~EJp}AYu#IH zq`1#iB0~3rG57FWjx?qye8`c0C+LZkkPxY0c|L&A6d$xQ@xA$2} zNU}G`$#TqUN6$SFTfX&dLtwj9Z4Y`h7@CXYftINwA;_L`P zo1pHAHUZA&Nr)K+X{2{v6I6nEaC^Szv#q)jg=R9F?j*WKvf8vK<6y&y z!t1&KTY1cebm@)JY-5Y=#rO9ytf>T5;olHvImP0Nr}FheK9}TTgTAT#jBVn(Z9bo3 z=gA7^$%-xU$%;h<26qT6b*tDq0YBG12|jEi9A$kZQY9?RwZ%hApfgVwt0I!OirJ`# z)OAF1*TEJL^1M!%j{w0EBRDZ4g@?e;@Ic#e4y{j)8r>Fw;hu90-~R*onYV%jLIMCX CPjJ2f From 771ef4a90747fbef00629e3955e288af581109ab Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Tue, 9 Nov 2021 09:26:46 +0100 Subject: [PATCH 04/22] feat(commonjs): automatically wrap cyclic modules (#1038) --- packages/commonjs/README.md | 30 +-- packages/commonjs/src/generate-imports.js | 11 +- packages/commonjs/src/index.js | 44 ++-- .../commonjs/src/resolve-require-sources.js | 114 +++++++---- packages/commonjs/src/transform-commonjs.js | 23 +-- packages/commonjs/src/utils.js | 26 ++- .../form/constant-template-literal/output.js | 2 +- .../form/ignore-ids-function/output.js | 2 +- .../test/fixtures/form/ignore-ids/output.js | 2 +- .../multi-entry-module-exports/output1.js | 2 +- .../multiple-var-declarations-b/output.js | 2 +- .../multiple-var-declarations-c/output.js | 2 +- .../form/multiple-var-declarations/output.js | 4 +- .../fixtures/form/no-exports-entry/output.js | 2 +- .../fixtures/form/require-collision/output.js | 2 +- .../unambiguous-with-default-export/output.js | 2 +- .../form/unambiguous-with-import/output.js | 2 +- .../unambiguous-with-named-export/output.js | 2 +- .../circular-dependencies-wrapped/_config.js | 3 + .../function/circular-dependencies/_config.js | 3 + .../_config.js | 2 +- .../strict-require-semantic-auto/_config.js | 7 + .../a-imports-b.js | 2 + .../b-imports-c.js | 1 + .../c-imports-a.js | 1 + .../strict-require-semantic-auto/main.js | 1 + .../_config.js | 2 +- .../_config.js | 3 + .../a-imports-b.js | 2 + .../b-imports-c.js | 1 + .../c-imports-a.js | 1 + .../main.js | 1 + .../_config.js | 23 +++ .../main.js | 1 + .../strict-require-semantic-debug/_config.js | 29 +++ .../a-imports-b.js | 2 + .../b-imports-c.js | 1 + .../c-imports-a.js | 1 + .../strict-require-semantic-debug/main.js | 1 + .../strict-require-semantic-entry/_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- .../_config.js | 2 +- packages/commonjs/test/form.js | 147 +++++++------- .../commonjs/test/snapshots/function.js.md | 189 +++++++++++++++--- .../commonjs/test/snapshots/function.js.snap | Bin 18579 -> 19153 bytes packages/commonjs/test/types.ts | 3 +- packages/commonjs/types/index.d.ts | 53 +++-- 49 files changed, 541 insertions(+), 223 deletions(-) create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-auto/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-auto/a-imports-b.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-auto/b-imports-c.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-auto/c-imports-a.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-auto/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/a-imports-b.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/b-imports-c.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/c-imports-a.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-debug-none/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-debug-none/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-debug/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-debug/a-imports-b.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-debug/b-imports-c.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-debug/c-imports-a.js create mode 100644 packages/commonjs/test/fixtures/function/strict-require-semantic-debug/main.js diff --git a/packages/commonjs/README.md b/packages/commonjs/README.md index 09e82a8e7..715f7e778 100644 --- a/packages/commonjs/README.md +++ b/packages/commonjs/README.md @@ -44,13 +44,30 @@ Then call `rollup` either via the [CLI](https://www.rollupjs.org/guide/en/#comma ## Options +### `strictRequires` + +Type: `"auto" | boolean | "debug" | string[]`
+Default: `"auto"` + +By default, this plugin will try to hoist `require` statements as imports to the top of each file. While this works well for many code bases and allows for very efficient ESM output, it does not perfectly capture CommonJS semantics as the order of side effects like log statements may change. But it is especially problematic when there are circular `require` calls between CommonJS modules as those often rely on the lazy execution of nested `require` calls. + +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. + +`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. + ### `dynamicRequireTargets` Type: `string | string[]`
Default: `[]` Some modules contain dynamic `require` calls, or require modules that contain circular dependencies, which are not handled well by static imports. -Including those modules as `dynamicRequireTargets` will simulate a CommonJS (NodeJS-like) environment for them with support for dynamic and circular dependencies. +Including those modules as `dynamicRequireTargets` will simulate a CommonJS (NodeJS-like) environment for them with support for dynamic dependencies. It also enables `strictRequires` for those modules, see above. _Note: In extreme cases, this feature may result in some paths being rendered as absolute in the final bundle. The plugin tries to avoid exposing paths from the local machine, but if you are `dynamicRequirePaths` with paths that are far away from your project's folder, that may require replacing strings like `"/Users/John/Desktop/foo-project/"` -> `"/"`._ @@ -113,17 +130,6 @@ Default: `false` Instructs the plugin whether to enable mixed module transformations. This is useful in scenarios with modules that contain a mix of ES `import` statements and CommonJS `require` expressions. Set to `true` if `require` calls should be transformed to imports in mixed modules, or `false` if the `require` expressions should survive the transformation. The latter can be important if the code contains environment detection, or you are coding for an environment with special treatment for `require` calls such as [ElectronJS](https://www.electronjs.org/). See also the "ignore" option. -### `strictRequireSemantic` - -Type: `boolean | string | string[]`
-Default: `false` - -By default, this plugin will try to hoist all `require` statements as imports to the top of each file. While this works well for many code bases and allows for very efficient ESM output, it does not perfectly capture CommonJS semantics. This is especially problematic when there are circular `require` calls between CommonJS modules as those often rely on the lazy execution of nested `require` calls. - -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 a small impact on the size and performance of the generated code. - -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. - ### `ignore` Type: `string[] | ((id: string) => boolean)`
diff --git a/packages/commonjs/src/generate-imports.js b/packages/commonjs/src/generate-imports.js index 22a59027d..e90152d36 100644 --- a/packages/commonjs/src/generate-imports.js +++ b/packages/commonjs/src/generate-imports.js @@ -112,7 +112,7 @@ export function getRequireHandlers() { id, exportMode, resolveRequireSourcesAndGetMeta, - usesRequireWrapper, + needsRequireWrapper, isEsModule, usesRequire ) { @@ -135,13 +135,16 @@ export function getRequireHandlers() { ); } const requiresBySource = collectSources(requireExpressions); - const requireTargets = await resolveRequireSourcesAndGetMeta( + const { requireTargets, usesRequireWrapper } = await resolveRequireSourcesAndGetMeta( id, - usesRequireWrapper ? IS_WRAPPED_COMMONJS : !isEsModule, + needsRequireWrapper ? IS_WRAPPED_COMMONJS : !isEsModule, Object.keys(requiresBySource) ); processRequireExpressions(imports, requireTargets, requiresBySource, magicString); - return imports.length ? `${imports.join('\n')}\n\n` : ''; + return { + importBlock: imports.length ? `${imports.join('\n')}\n\n` : '', + usesRequireWrapper + }; } return { diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index 5fa50e419..b3e277e0e 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -1,4 +1,4 @@ -import { extname } from 'path'; +import { extname, relative } from 'path'; import { createFilter } from '@rollup/pluginutils'; import getCommonDir from 'commondir'; @@ -27,7 +27,7 @@ import getResolveId from './resolve-id'; import { getResolveRequireSourcesAndGetMeta } from './resolve-require-sources'; import validateRollupVersion from './rollup-version'; import transformCommonjs from './transform-commonjs'; -import { getName, normalizePathSlashes } from './utils'; +import { getName, getStrictRequiresFilter, normalizePathSlashes } from './utils'; export default function commonjs(options = {}) { const { @@ -39,12 +39,7 @@ export default function commonjs(options = {}) { } = options; const extensions = options.extensions || ['.js']; const filter = createFilter(options.include, options.exclude); - const strictRequireSemanticFilter = - options.strictRequireSemantic === true - ? () => true - : !options.strictRequireSemantic - ? () => false - : createFilter(options.strictRequireSemantic); + const { strictRequiresFilter, detectCycles } = getStrictRequiresFilter(options); const getRequireReturnsDefault = typeof requireReturnsDefaultOption === 'function' @@ -65,7 +60,10 @@ export default function commonjs(options = {}) { : () => typeof defaultIsModuleExportsOption === 'boolean' ? defaultIsModuleExportsOption : 'auto'; - const resolveRequireSourcesAndGetMeta = getResolveRequireSourcesAndGetMeta(extensions); + const { resolveRequireSourcesAndGetMeta, getWrappedIds } = getResolveRequireSourcesAndGetMeta( + extensions, + detectCycles + ); const dynamicRequireModuleSet = getDynamicRequireModuleSet(options.dynamicRequireTargets); const isDynamicRequireModulesEnabled = dynamicRequireModuleSet.size > 0; const commonDir = isDynamicRequireModulesEnabled @@ -122,9 +120,9 @@ export default function commonjs(options = {}) { return { meta: { commonjs: { isCommonJS: false } } }; } - const usesRequireWrapper = + const needsRequireWrapper = !isEsModule && - (dynamicRequireModuleSet.has(normalizePathSlashes(id)) || strictRequireSemanticFilter(id)); + (dynamicRequireModuleSet.has(normalizePathSlashes(id)) || strictRequiresFilter(id)); return transformCommonjs( this.parse, @@ -141,7 +139,7 @@ export default function commonjs(options = {}) { commonDir, ast, getDefaultIsModuleExports(id), - usesRequireWrapper, + needsRequireWrapper, resolveRequireSourcesAndGetMeta(this) ); } @@ -158,6 +156,28 @@ export default function commonjs(options = {}) { } }, + buildEnd() { + if (options.strictRequires === 'debug') { + const wrappedIds = getWrappedIds(); + if (wrappedIds.length) { + this.warn({ + code: 'WRAPPED_IDS', + ids: wrappedIds, + message: `The commonjs plugin automatically wrapped the following files:\n[\n${wrappedIds + .map((id) => `\t${JSON.stringify(relative(process.cwd(), id))}`) + .join(',\n')}\n]` + }); + } else { + // TODO Lukas test + this.warn({ + code: 'WRAPPED_IDS', + ids: wrappedIds, + message: 'The commonjs plugin did not wrap any files.' + }); + } + } + }, + resolveId, load(id) { diff --git a/packages/commonjs/src/resolve-require-sources.js b/packages/commonjs/src/resolve-require-sources.js index 5be46a0c9..ce3727288 100644 --- a/packages/commonjs/src/resolve-require-sources.js +++ b/packages/commonjs/src/resolve-require-sources.js @@ -1,54 +1,80 @@ import { EXTERNAL_SUFFIX, IS_WRAPPED_COMMONJS, PROXY_SUFFIX, wrapId } from './helpers'; import { resolveExtensions } from './resolve-id'; -// TODO Lukas auto-detect circular dependencies -// * only return once all dependencies have been analyzed -// * wait for this.load dependencies unless they already have an entry in knownCjsModuleTypes to avoid deadlocks -// as those have already started being processed -// * only analyze cycles if we do not have an explicit config -export function getResolveRequireSourcesAndGetMeta(extensions) { +export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { const knownCjsModuleTypes = Object.create(null); - return (rollupContext) => (id, isParentCommonJS, sources) => { - knownCjsModuleTypes[id] = isParentCommonJS; - return Promise.all( - sources.map(async (source) => { - // Never analyze or proxy internal modules - if (source.startsWith('\0')) { - return { source, id: source, isCommonJS: false }; - } - const resolved = - (await rollupContext.resolve(source, id, { - skipSelf: true, - custom: { - 'node-resolve': { isRequire: true } + const dependentModules = Object.create(null); + const getDependentModules = (id) => + dependentModules[id] || (dependentModules[id] = Object.create(null)); + + return { + getWrappedIds: () => + Object.keys(knownCjsModuleTypes).filter( + (id) => knownCjsModuleTypes[id] === IS_WRAPPED_COMMONJS + ), + resolveRequireSourcesAndGetMeta: (rollupContext) => async (id, isParentCommonJS, sources) => { + knownCjsModuleTypes[id] = isParentCommonJS; + const requireTargets = await Promise.all( + sources.map(async (source) => { + // Never analyze or proxy internal modules + if (source.startsWith('\0')) { + return { id: source, allowProxy: false }; + } + const resolved = + (await rollupContext.resolve(source, id, { + skipSelf: true, + custom: { + 'node-resolve': { isRequire: true } + } + })) || resolveExtensions(source, id, extensions); + if (!resolved) { + return { id: wrapId(source, EXTERNAL_SUFFIX), allowProxy: false }; + } + const childId = resolved.id; + if (resolved.external) { + return { id: wrapId(childId, EXTERNAL_SUFFIX), allowProxy: false }; + } + const parentDependentModules = getDependentModules(id); + const childDependentModules = getDependentModules(childId); + childDependentModules[id] = true; + for (const dependentId of Object.keys(parentDependentModules)) { + childDependentModules[dependentId] = true; + } + if (parentDependentModules[childId]) { + // If we depend on one of our dependencies, we have a cycle. Then all modules that + // we depend on that also depend on the same module are part of a cycle as well. + if (detectCycles && isParentCommonJS) { + knownCjsModuleTypes[id] = IS_WRAPPED_COMMONJS; + knownCjsModuleTypes[childId] = IS_WRAPPED_COMMONJS; + for (const dependentId of Object.keys(parentDependentModules)) { + if (getDependentModules(dependentId)[childId]) { + knownCjsModuleTypes[dependentId] = IS_WRAPPED_COMMONJS; + } + } } - })) || resolveExtensions(source, id, extensions); - if (!resolved) { - return { source, id: wrapId(source, EXTERNAL_SUFFIX), isCommonJS: false }; - } - if (resolved.external) { - return { source, id: wrapId(resolved.id, EXTERNAL_SUFFIX), isCommonJS: false }; - } - if (resolved.id in knownCjsModuleTypes) { + } else { + // This makes sure the current transform handler waits for all direct dependencies to be + // loaded and transformed and therefore for all transitive CommonJS dependencies to be + // loaded as well so that all cycles have been found and knownCjsModuleTypes is reliable. + await rollupContext.load(resolved); + } + return { id: childId, allowProxy: true }; + }) + ); + return { + requireTargets: requireTargets.map(({ id: dependencyId, allowProxy }, index) => { + const isCommonJS = knownCjsModuleTypes[dependencyId]; return { - source, + source: sources[index], id: - knownCjsModuleTypes[resolved.id] === IS_WRAPPED_COMMONJS - ? resolved.id - : wrapId(resolved.id, PROXY_SUFFIX), - isCommonJS: knownCjsModuleTypes[resolved.id] + allowProxy && isCommonJS !== IS_WRAPPED_COMMONJS + ? wrapId(dependencyId, PROXY_SUFFIX) + : dependencyId, + isCommonJS }; - } - const { - meta: { commonjs: commonjsMeta } - } = await rollupContext.load(resolved); - const isCommonJS = commonjsMeta && commonjsMeta.isCommonJS; - return { - source, - id: isCommonJS === IS_WRAPPED_COMMONJS ? resolved.id : wrapId(resolved.id, PROXY_SUFFIX), - isCommonJS - }; - }) - ); + }), + usesRequireWrapper: knownCjsModuleTypes[id] === IS_WRAPPED_COMMONJS + }; + } }; } diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index 3716e6f35..fed2690d6 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -50,7 +50,7 @@ export default async function transformCommonjs( commonDir, astCache, defaultIsModuleExports, - usesRequireWrapper, + needsRequireWrapper, resolveRequireSourcesAndGetMeta ) { const ast = astCache || tryParse(parse, code, id); @@ -227,9 +227,10 @@ export default async function transformCommonjs( let shouldRemoveRequireStatement = false; if (currentTryBlockEnd !== null) { - ({ canConvertRequire, shouldRemoveRequireStatement } = - getIgnoreTryCatchRequireStatementMode(node.arguments[0].value)); - + const ignoreTryCatchRequire = getIgnoreTryCatchRequireStatementMode( + node.arguments[0].value + ); + ({ canConvertRequire, shouldRemoveRequireStatement } = ignoreTryCatchRequire); if (shouldRemoveRequireStatement) { hasRemovedRequire = true; } @@ -447,7 +448,7 @@ export default async function transformCommonjs( ? 'exports' : 'module'; - const importBlock = await rewriteRequireExpressionsAndGetImportBlock( + const { importBlock, usesRequireWrapper } = await rewriteRequireExpressionsAndGetImportBlock( magicString, topLevelDeclarations, topLevelRequireDeclarators, @@ -459,7 +460,7 @@ export default async function transformCommonjs( id, exportMode, resolveRequireSourcesAndGetMeta, - usesRequireWrapper, + needsRequireWrapper, isEsModule, uses.require ); @@ -490,17 +491,15 @@ export default async function transformCommonjs( } if (usesRequireWrapper) { - magicString - .trim() - .indent('\t') - .prepend( - `var ${isRequiredName}; + magicString.trim().indent('\t'); + magicString.prepend( + `var ${isRequiredName}; function ${requireName} () { \tif (${isRequiredName}) return ${exportsName}; \t${isRequiredName} = 1; ` - ).append(` + ).append(` \treturn ${exportsName}; }`); if (exportMode === 'replace') { diff --git a/packages/commonjs/src/utils.js b/packages/commonjs/src/utils.js index b7dc9cda1..d66765c93 100644 --- a/packages/commonjs/src/utils.js +++ b/packages/commonjs/src/utils.js @@ -2,7 +2,7 @@ import { basename, dirname, extname } from 'path'; -import { makeLegalIdentifier } from '@rollup/pluginutils'; +import { createFilter, makeLegalIdentifier } from '@rollup/pluginutils'; export function deconflict(scopes, globals, identifier) { let i = 1; @@ -34,6 +34,7 @@ export function normalizePathSlashes(path) { return path.replace(/\\/g, '/'); } +// TODO Lukas get rid of this? const VIRTUAL_PATH_BASE = '/$$rollup_base$$'; export const getVirtualPathForDynamicRequirePath = (path, commonDir) => { const normalizedPath = normalizePathSlashes(path); @@ -45,3 +46,26 @@ export const getVirtualPathForDynamicRequirePath = (path, commonDir) => { export function capitalize(name) { return name[0].toUpperCase() + name.slice(1); } + +export function getStrictRequiresFilter({ strictRequires }) { + switch (strictRequires) { + case true: + return { strictRequiresFilter: () => true, detectCycles: false }; + // eslint-disable-next-line no-undefined + case undefined: + case 'auto': + case 'debug': + case null: + return { strictRequiresFilter: () => false, detectCycles: true }; + case false: + return { strictRequiresFilter: () => false, detectCycles: false }; + default: + if (typeof strictRequires === 'string' || Array.isArray(strictRequires)) { + return { + strictRequiresFilter: createFilter(strictRequires), + detectCycles: false + }; + } + throw new Error('Unexpected value for "strictRequires" option.'); + } +} diff --git a/packages/commonjs/test/fixtures/form/constant-template-literal/output.js b/packages/commonjs/test/fixtures/form/constant-template-literal/output.js index 787983734..08f8bd02d 100644 --- a/packages/commonjs/test/fixtures/form/constant-template-literal/output.js +++ b/packages/commonjs/test/fixtures/form/constant-template-literal/output.js @@ -1,7 +1,7 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/constant-template-literal/input.js?commonjs-exports" -import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/constant-template-literal/tape.js?commonjs-proxy"; +import require$$0 from "\u0000CWD/fixtures/form/constant-template-literal/tape.js?commonjs-proxy"; var foo = require$$0; console.log(foo); diff --git a/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js b/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js index 5fc418cd4..de90c6826 100644 --- a/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js +++ b/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js @@ -1,7 +1,7 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/ignore-ids-function/input.js?commonjs-exports" -import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/ignore-ids-function/bar.js?commonjs-proxy"; +import require$$0 from "\u0000CWD/fixtures/form/ignore-ids-function/bar.js?commonjs-proxy"; var foo = require( 'foo' ); var bar = require$$0; diff --git a/packages/commonjs/test/fixtures/form/ignore-ids/output.js b/packages/commonjs/test/fixtures/form/ignore-ids/output.js index 83b9d1e9f..e37256ccb 100644 --- a/packages/commonjs/test/fixtures/form/ignore-ids/output.js +++ b/packages/commonjs/test/fixtures/form/ignore-ids/output.js @@ -1,7 +1,7 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/ignore-ids/input.js?commonjs-exports" -import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/ignore-ids/bar.js?commonjs-proxy"; +import require$$0 from "\u0000CWD/fixtures/form/ignore-ids/bar.js?commonjs-proxy"; var foo = require( 'foo' ); var bar = require$$0; diff --git a/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js index cd261710a..5bf32420e 100644 --- a/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js +++ b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js @@ -1,6 +1,6 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; -import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/multi-entry-module-exports/input2.js?commonjs-proxy"; +import require$$0 from "\u0000CWD/fixtures/form/multi-entry-module-exports/input2.js?commonjs-proxy"; const t2 = require$$0; diff --git a/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js b/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js index 0186bc7eb..05bb39f86 100644 --- a/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js +++ b/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js @@ -1,7 +1,7 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations-b/input.js?commonjs-exports" -import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/a.js?commonjs-proxy"; +import require$$0 from "\u0000CWD/fixtures/form/multiple-var-declarations-b/a.js?commonjs-proxy"; var a = require$$0 , b = 42; diff --git a/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js b/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js index 4101b47e8..74dc40f2e 100644 --- a/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js +++ b/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js @@ -1,7 +1,7 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations-c/input.js?commonjs-exports" -import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/b.js?commonjs-proxy"; +import require$$0 from "\u0000CWD/fixtures/form/multiple-var-declarations-c/b.js?commonjs-proxy"; var a = 'a' , b = require$$0 diff --git a/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js b/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js index 60c5118b9..38a4a54aa 100644 --- a/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js +++ b/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js @@ -1,8 +1,8 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations/input.js?commonjs-exports" -import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/multiple-var-declarations/a.js?commonjs-proxy"; -import require$$1 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/multiple-var-declarations/b.js?commonjs-proxy"; +import require$$0 from "\u0000CWD/fixtures/form/multiple-var-declarations/a.js?commonjs-proxy"; +import require$$1 from "\u0000CWD/fixtures/form/multiple-var-declarations/b.js?commonjs-proxy"; var a = require$$0() , b = require$$1; diff --git a/packages/commonjs/test/fixtures/form/no-exports-entry/output.js b/packages/commonjs/test/fixtures/form/no-exports-entry/output.js index 3e83089b2..b10040f7b 100644 --- a/packages/commonjs/test/fixtures/form/no-exports-entry/output.js +++ b/packages/commonjs/test/fixtures/form/no-exports-entry/output.js @@ -1,7 +1,7 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input_1 } from "\u0000fixtures/form/no-exports-entry/input.js?commonjs-exports" -import require$$0 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/no-exports-entry/dummy.js?commonjs-proxy"; +import require$$0 from "\u0000CWD/fixtures/form/no-exports-entry/dummy.js?commonjs-proxy"; var dummy = require$$0; diff --git a/packages/commonjs/test/fixtures/form/require-collision/output.js b/packages/commonjs/test/fixtures/form/require-collision/output.js index 22eb3c645..d760dbf85 100644 --- a/packages/commonjs/test/fixtures/form/require-collision/output.js +++ b/packages/commonjs/test/fixtures/form/require-collision/output.js @@ -1,7 +1,7 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/require-collision/input.js?commonjs-exports" -import require$$1 from "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/require-collision/foo.js?commonjs-proxy"; +import require$$1 from "\u0000CWD/fixtures/form/require-collision/foo.js?commonjs-proxy"; (function() { var foo = require$$1; diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js index 6c0116507..51bfef8ef 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js @@ -1,6 +1,6 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/unambiguous-with-default-export/input.js?commonjs-exports" -import "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/foo.js?commonjs-proxy"; +import "\u0000CWD/fixtures/form/unambiguous-with-default-export/foo.js?commonjs-proxy"; export default {}; diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js index b1dd5178e..8b277a597 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js @@ -1,6 +1,6 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/unambiguous-with-import/input.js?commonjs-exports" -import "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/unambiguous-with-import/foo.js?commonjs-proxy"; +import "\u0000CWD/fixtures/form/unambiguous-with-import/foo.js?commonjs-proxy"; import './bar.js'; diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js index d7428f35e..c84e44011 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js @@ -1,6 +1,6 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/unambiguous-with-named-export/input.js?commonjs-exports" -import "\u0000/Users/lukastaegert/Github/rollup-plugins/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/foo.js?commonjs-proxy"; +import "\u0000CWD/fixtures/form/unambiguous-with-named-export/foo.js?commonjs-proxy"; export {}; diff --git a/packages/commonjs/test/fixtures/function/circular-dependencies-wrapped/_config.js b/packages/commonjs/test/fixtures/function/circular-dependencies-wrapped/_config.js index 0b7a53026..cda7e0f2f 100644 --- a/packages/commonjs/test/fixtures/function/circular-dependencies-wrapped/_config.js +++ b/packages/commonjs/test/fixtures/function/circular-dependencies-wrapped/_config.js @@ -9,5 +9,8 @@ module.exports = { output: { exports: 'named' } + }, + pluginOptions: { + strictRequires: false } }; diff --git a/packages/commonjs/test/fixtures/function/circular-dependencies/_config.js b/packages/commonjs/test/fixtures/function/circular-dependencies/_config.js index 78fe11373..c561742f0 100644 --- a/packages/commonjs/test/fixtures/function/circular-dependencies/_config.js +++ b/packages/commonjs/test/fixtures/function/circular-dependencies/_config.js @@ -9,5 +9,8 @@ module.exports = { output: { exports: 'named' } + }, + pluginOptions: { + strictRequires: false } }; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/_config.js b/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/_config.js index df33c9e84..d9b26bed7 100755 --- a/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/_config.js +++ b/packages/commonjs/test/fixtures/function/dynamic-require-es-mixed-helpers/_config.js @@ -1,7 +1,7 @@ module.exports = { description: 'supports strict require semantic in mixed modules', pluginOptions: { - strictRequireSemantic: true, + strictRequires: true, transformMixedEsModules: true } }; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/_config.js new file mode 100644 index 000000000..8249fa044 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/_config.js @@ -0,0 +1,7 @@ +module.exports = { + description: + 'automatically detects cycles and switches those modules to strict semantics for "auto"', + pluginOptions: { + strictRequires: 'auto' + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/a-imports-b.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/a-imports-b.js new file mode 100644 index 000000000..f3e51c119 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/a-imports-b.js @@ -0,0 +1,2 @@ +exports.a = 'a'; +t.is(require('./b-imports-c').a, 'a'); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/b-imports-c.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/b-imports-c.js new file mode 100644 index 000000000..53d3bc879 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/b-imports-c.js @@ -0,0 +1 @@ +exports.a = require('./c-imports-a.js').a; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/c-imports-a.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/c-imports-a.js new file mode 100644 index 000000000..dc755f527 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/c-imports-a.js @@ -0,0 +1 @@ +exports.a = require('./a-imports-b').a; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/main.js new file mode 100644 index 000000000..7aa9154de --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/main.js @@ -0,0 +1 @@ +require('./a-imports-b'); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/_config.js index 073d40526..04efeeef1 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/_config.js +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/_config.js @@ -1,6 +1,6 @@ module.exports = { description: 'handles circular dependencies with strict require semantic', pluginOptions: { - strictRequireSemantic: true + strictRequires: true } }; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/_config.js new file mode 100644 index 000000000..52f7e94ef --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'automatically detects cycles and switches those modules to strict semantics' +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/a-imports-b.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/a-imports-b.js new file mode 100644 index 000000000..f3e51c119 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/a-imports-b.js @@ -0,0 +1,2 @@ +exports.a = 'a'; +t.is(require('./b-imports-c').a, 'a'); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/b-imports-c.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/b-imports-c.js new file mode 100644 index 000000000..53d3bc879 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/b-imports-c.js @@ -0,0 +1 @@ +exports.a = require('./c-imports-a.js').a; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/c-imports-a.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/c-imports-a.js new file mode 100644 index 000000000..dc755f527 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/c-imports-a.js @@ -0,0 +1 @@ +exports.a = require('./a-imports-b').a; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/main.js new file mode 100644 index 000000000..7aa9154de --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/main.js @@ -0,0 +1 @@ +require('./a-imports-b'); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-debug-none/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-debug-none/_config.js new file mode 100644 index 000000000..d570e0882 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-debug-none/_config.js @@ -0,0 +1,23 @@ +const assert = require('assert'); + +const warnings = []; + +module.exports = { + description: 'has correct debug output when there are no cycles', + pluginOptions: { + strictRequires: 'debug' + }, + options: { + onwarn(warning) { + if (warning.pluginCode !== 'WRAPPED_IDS') { + throw new Error(`Unexpected warning ${warning.code}: ${warning.message}`); + } + warnings.push(warning); + } + }, + exports() { + assert.strictEqual(warnings.length, 1); + assert.deepStrictEqual(warnings[0].ids, []); + assert.strictEqual(warnings[0].message, 'The commonjs plugin did not wrap any files.'); + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-debug-none/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-debug-none/main.js new file mode 100644 index 000000000..cb1c2c01e --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-debug-none/main.js @@ -0,0 +1 @@ +module.exports = 'bar'; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/_config.js new file mode 100644 index 000000000..1845e2eb9 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/_config.js @@ -0,0 +1,29 @@ +const assert = require('assert'); +const path = require('path'); + +const warnings = []; + +module.exports = { + description: + 'automatically detects cycles and switches those modules to strict semantics for "debug"', + pluginOptions: { + strictRequires: 'debug' + }, + options: { + onwarn(warning) { + if (warning.code === 'CIRCULAR_DEPENDENCY') return; + if (warning.pluginCode !== 'WRAPPED_IDS') { + throw new Error(`Unexpected warning ${warning.code}: ${warning.message}`); + } + warnings.push(warning); + } + }, + exports() { + assert.strictEqual(warnings.length, 1); + assert.deepStrictEqual(warnings[0].ids, [ + path.join(__dirname, 'a-imports-b.js'), + path.join(__dirname, 'b-imports-c.js'), + path.join(__dirname, 'c-imports-a.js') + ]); + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/a-imports-b.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/a-imports-b.js new file mode 100644 index 000000000..f3e51c119 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/a-imports-b.js @@ -0,0 +1,2 @@ +exports.a = 'a'; +t.is(require('./b-imports-c').a, 'a'); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/b-imports-c.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/b-imports-c.js new file mode 100644 index 000000000..53d3bc879 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/b-imports-c.js @@ -0,0 +1 @@ +exports.a = require('./c-imports-a.js').a; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/c-imports-a.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/c-imports-a.js new file mode 100644 index 000000000..dc755f527 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/c-imports-a.js @@ -0,0 +1 @@ +exports.a = require('./a-imports-b').a; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/main.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/main.js new file mode 100644 index 000000000..7aa9154de --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/main.js @@ -0,0 +1 @@ +require('./a-imports-b'); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js index 0ba3d13b4..757ac2cab 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js @@ -12,7 +12,7 @@ module.exports = { } }, pluginOptions: { - strictRequireSemantic: ['fixtures/function/strict-require-semantic-entry/main.js'] + strictRequires: ['fixtures/function/strict-require-semantic-entry/main.js'] }, exports(exports) { assert.deepStrictEqual(exports, { foo: 'foo' }); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js index dde0e4242..683e0b747 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js @@ -1,6 +1,6 @@ module.exports = { description: 'supports using function wrappers for modules for export mode "exports"', pluginOptions: { - strictRequireSemantic: ['fixtures/function/strict-require-semantic-exportmode-exports/*E*.js'] + strictRequires: ['fixtures/function/strict-require-semantic-exportmode-exports/*E*.js'] } }; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js index e8dd75b4f..dda61ff86 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js @@ -1,6 +1,6 @@ module.exports = { description: 'supports using function wrappers for modules for export mode "module"', pluginOptions: { - strictRequireSemantic: ['fixtures/function/strict-require-semantic-exportmode-module/*E*.js'] + strictRequires: ['fixtures/function/strict-require-semantic-exportmode-module/*E*.js'] } }; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js index 6f9c03a62..4f1cd0f78 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js @@ -1,6 +1,6 @@ module.exports = { description: 'supports using function wrappers for modules for export mode "replace"', pluginOptions: { - strictRequireSemantic: ['fixtures/function/strict-require-semantic-exportmode-replace/*E*.js'] + strictRequires: ['fixtures/function/strict-require-semantic-exportmode-replace/*E*.js'] } }; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js index 56fdd8541..9ba78e6a5 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js +++ b/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js @@ -1,6 +1,6 @@ module.exports = { description: 'handles importing wrapped modules from ESM', pluginOptions: { - strictRequireSemantic: ['fixtures/function/strict-require-semantic-from-esm/strict.js'] + strictRequires: ['fixtures/function/strict-require-semantic-from-esm/strict.js'] } }; diff --git a/packages/commonjs/test/form.js b/packages/commonjs/test/form.js index d551cc43b..3dcc25740 100644 --- a/packages/commonjs/test/form.js +++ b/packages/commonjs/test/form.js @@ -24,77 +24,84 @@ const transformContext = { load: ({ id }) => Promise.resolve({ id, meta: {} }) }; -fs.readdirSync('./fixtures/form').forEach((dir) => { - let config; - - try { - config = require(`./fixtures/form/${dir}/_config.js`); - } catch (err) { - config = {}; - } +// Do not run on Windows as we have full path names in the output +if (path.sep === '/') { + fs.readdirSync('./fixtures/form').forEach((dir) => { + let config; + + try { + config = require(`./fixtures/form/${dir}/_config.js`); + } catch (err) { + config = {}; + } - const inputEntries = []; + const inputEntries = []; - if (typeof config.multi === 'object') { - for (const [key, entry] of Object.entries(config.multi)) { - inputEntries.push([key, `fixtures/form/${dir}/${entry}`]); + if (typeof config.multi === 'object') { + for (const [key, entry] of Object.entries(config.multi)) { + inputEntries.push([key, `fixtures/form/${dir}/${entry}`]); + } + } else { + inputEntries.push(['output', `fixtures/form/${dir}/input.js`]); } - } else { - inputEntries.push(['output', `fixtures/form/${dir}/input.js`]); - } - - (config.solo ? test.only : test)(dir, (t) => - Promise.all( - inputEntries.map(async ([outputName, id]) => { - const { transform } = commonjs(config.options); - - transformContext.getModuleInfo = (moduleId) => { - return { - isEntry: config.entry && moduleId === id, - importers: - config.importers && config.importers[outputName] - ? config.importers[outputName].map((x) => `fixtures/form/${dir}/${x}`) - : [] + + (config.solo ? test.only : test)(dir, (t) => + Promise.all( + inputEntries.map(async ([outputName, id]) => { + const { transform } = commonjs(config.options); + + transformContext.getModuleInfo = (moduleId) => { + return { + isEntry: config.entry && moduleId === id, + importers: + config.importers && config.importers[outputName] + ? config.importers[outputName].map((x) => `fixtures/form/${dir}/${x}`) + : [] + }; }; - }; - transformContext.error = (base, props) => { - let error = base; - if (!(base instanceof Error)) error = Object.assign(new Error(base.message), base); - if (props) Object.assign(error, props); - throw error; - }; - - const input = fs.readFileSync(id, 'utf-8'); - - let outputFile = `fixtures/form/${dir}/${outputName}`; - if (fs.existsSync(`${outputFile}.${process.platform}.js`)) { - outputFile += `.${process.platform}.js`; - } else { - outputFile += '.js'; - } - - const expected = fs.readFileSync(outputFile, 'utf-8').trim(); - // eslint-disable-next-line no-await-in-loop - const transformed = await transform.call(transformContext, input, id); - const actual = (transformed ? transformed.code : input).trim().replace(/\0/g, '_'); - - // uncomment to update snapshots - // fs.writeFileSync(outputFile, `${actual}\n`); - - // trim whitespace from line endings, - // this will benefit issues like `form/try-catch-remove` where whitespace is left in the line, - // and testing on windows (\r\n) - t.is( - actual - .split('\n') - .map((x) => x.trimEnd()) - .join('\n'), - expected - .split('\n') - .map((x) => x.trimEnd()) - .join('\n') - ); - }) - ) - ); -}); + transformContext.error = (base, props) => { + let error = base; + if (!(base instanceof Error)) error = Object.assign(new Error(base.message), base); + if (props) Object.assign(error, props); + throw error; + }; + + const input = fs.readFileSync(id, 'utf-8'); + + let outputFile = `fixtures/form/${dir}/${outputName}`; + if (fs.existsSync(`${outputFile}.${process.platform}.js`)) { + outputFile += `.${process.platform}.js`; + } else { + outputFile += '.js'; + } + + const expected = fs.readFileSync(outputFile, 'utf-8').trim(); + // eslint-disable-next-line no-await-in-loop + const transformed = await transform.call(transformContext, input, id); + let actual = (transformed ? transformed.code : input).trim().replace(/\0/g, '_'); + const cwd = process.cwd(); + while (actual.indexOf(cwd) >= 0) { + actual = actual.replace(process.cwd(), 'CWD'); + } + + // uncomment to update snapshots + // fs.writeFileSync(outputFile, `${actual}\n`); + + // trim whitespace from line endings, + // this will benefit issues like `form/try-catch-remove` where whitespace is left in the line, + // and testing on windows (\r\n) + t.is( + actual + .split('\n') + .map((x) => x.trimEnd()) + .join('\n'), + expected + .split('\n') + .map((x) => x.trimEnd()) + .join('\n') + ); + }) + ) + ); + }); +} diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index 5715c0ae2..c9311e099 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -5442,6 +5442,55 @@ Generated by [AVA](https://avajs.dev). `, } +## strict-require-semantic-auto + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var aImportsB = {};␊ + ␊ + var bImportsC = {};␊ + ␊ + var cImportsA = {};␊ + ␊ + var hasRequiredCImportsA;␊ + ␊ + function requireCImportsA () {␊ + if (hasRequiredCImportsA) return cImportsA;␊ + hasRequiredCImportsA = 1;␊ + cImportsA.a = requireAImportsB().a;␊ + return cImportsA;␊ + }␊ + ␊ + var hasRequiredBImportsC;␊ + ␊ + function requireBImportsC () {␊ + if (hasRequiredBImportsC) return bImportsC;␊ + hasRequiredBImportsC = 1;␊ + bImportsC.a = requireCImportsA().a;␊ + return bImportsC;␊ + }␊ + ␊ + var hasRequiredAImportsB;␊ + ␊ + function requireAImportsB () {␊ + if (hasRequiredAImportsB) return aImportsB;␊ + hasRequiredAImportsB = 1;␊ + aImportsB.a = 'a';␊ + t.is(requireBImportsC().a, 'a');␊ + return aImportsB;␊ + }␊ + ␊ + requireAImportsB();␊ + ␊ + module.exports = main;␊ + `, + } + ## strict-require-semantic-circular > Snapshot 1 @@ -5478,6 +5527,117 @@ Generated by [AVA](https://avajs.dev). `, } +## strict-require-semantic-cycle-detection + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var aImportsB = {};␊ + ␊ + var bImportsC = {};␊ + ␊ + var cImportsA = {};␊ + ␊ + var hasRequiredCImportsA;␊ + ␊ + function requireCImportsA () {␊ + if (hasRequiredCImportsA) return cImportsA;␊ + hasRequiredCImportsA = 1;␊ + cImportsA.a = requireAImportsB().a;␊ + return cImportsA;␊ + }␊ + ␊ + var hasRequiredBImportsC;␊ + ␊ + function requireBImportsC () {␊ + if (hasRequiredBImportsC) return bImportsC;␊ + hasRequiredBImportsC = 1;␊ + bImportsC.a = requireCImportsA().a;␊ + return bImportsC;␊ + }␊ + ␊ + var hasRequiredAImportsB;␊ + ␊ + function requireAImportsB () {␊ + if (hasRequiredAImportsB) return aImportsB;␊ + hasRequiredAImportsB = 1;␊ + aImportsB.a = 'a';␊ + t.is(requireBImportsC().a, 'a');␊ + return aImportsB;␊ + }␊ + ␊ + requireAImportsB();␊ + ␊ + module.exports = main;␊ + `, + } + +## strict-require-semantic-debug + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var aImportsB = {};␊ + ␊ + var bImportsC = {};␊ + ␊ + var cImportsA = {};␊ + ␊ + var hasRequiredCImportsA;␊ + ␊ + function requireCImportsA () {␊ + if (hasRequiredCImportsA) return cImportsA;␊ + hasRequiredCImportsA = 1;␊ + cImportsA.a = requireAImportsB().a;␊ + return cImportsA;␊ + }␊ + ␊ + var hasRequiredBImportsC;␊ + ␊ + function requireBImportsC () {␊ + if (hasRequiredBImportsC) return bImportsC;␊ + hasRequiredBImportsC = 1;␊ + bImportsC.a = requireCImportsA().a;␊ + return bImportsC;␊ + }␊ + ␊ + var hasRequiredAImportsB;␊ + ␊ + function requireAImportsB () {␊ + if (hasRequiredAImportsB) return aImportsB;␊ + hasRequiredAImportsB = 1;␊ + aImportsB.a = 'a';␊ + t.is(requireBImportsC().a, 'a');␊ + return aImportsB;␊ + }␊ + ␊ + requireAImportsB();␊ + ␊ + module.exports = main;␊ + `, + } + +## strict-require-semantic-debug-none + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = 'bar';␊ + ␊ + module.exports = main;␊ + `, + } + ## strict-require-semantic-entry > Snapshot 1 @@ -6578,32 +6738,3 @@ Generated by [AVA](https://avajs.dev). module.exports = main;␊ `, } - -## require-mixed-module - -> Snapshot 1 - - { - 'main.js': `'use strict';␊ - ␊ - var main = {};␊ - ␊ - var other = 'foo';␊ - ␊ - const foo = other;␊ - ␊ - var dep$1 = 'default';␊ - ␊ - var dep$2 = /*#__PURE__*/Object.freeze({␊ - __proto__: null,␊ - foo: foo,␊ - 'default': dep$1␊ - });␊ - ␊ - const dep = dep$2;␊ - ␊ - t.deepEqual(dep, { default: 'default', ns: { default: 'bar', foo: 'foo' } });␊ - ␊ - module.exports = main;␊ - `, - } diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index ab054b8b038a4b16352f76ba1c8b9ceeb9ccad87..71ddc9153d0d9342ba798d1498193c98856035c3 100644 GIT binary patch literal 19153 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 literal 18579 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 GR{{V(xZ`{P diff --git a/packages/commonjs/test/types.ts b/packages/commonjs/test/types.ts index 8c010a0d2..d91cebfba 100644 --- a/packages/commonjs/test/types.ts +++ b/packages/commonjs/test/types.ts @@ -20,7 +20,8 @@ const config: RollupOptions = { sourceMap: false, transformMixedEsModules: false, ignore: ['conditional-runtime-dependency'], - dynamicRequireTargets: ['node_modules/logform/*.js'] + dynamicRequireTargets: ['node_modules/logform/*.js'], + strictRequires: ['node_modules/foo/*.js'] }) ] }; diff --git a/packages/commonjs/types/index.d.ts b/packages/commonjs/types/index.d.ts index 24c0d8633..3337ed6ee 100644 --- a/packages/commonjs/types/index.d.ts +++ b/packages/commonjs/types/index.d.ts @@ -8,10 +8,10 @@ interface RollupCommonJSOptions { /** * A minimatch pattern, or array of patterns, which specifies the files in * the build the plugin should operate on. By default, all files with - * extension `".cjs"` or those in `extensions` are included, but you can narrow - * this list by only including specific files. These files will be analyzed - * and transpiled if either the analysis does not find ES module specific - * statements or `transformMixedEsModules` is `true`. + * extension `".cjs"` or those in `extensions` are included, but you can + * narrow this list by only including specific files. These files will be + * analyzed and transpiled if either the analysis does not find ES module + * specific statements or `transformMixedEsModules` is `true`. * @default undefined */ include?: FilterPattern; @@ -66,23 +66,38 @@ interface RollupCommonJSOptions { */ transformMixedEsModules?: boolean; /** - * By default, this plugin will try to hoist all `require` statements as - * imports to the top of each file. While this works well for many code bases - * and allows for very efficient ESM output, it does not perfectly capture - * CommonJS semantics. This is especially problematic when there are circular - * `require` calls between CommonJS modules as those often rely on the lazy - * execution of nested `require` calls. + * By default, this plugin will try to hoist `require` statements as imports + * to the top of each file. While this works well for many code bases and + * allows for very efficient ESM output, it does not perfectly capture + * CommonJS semantics as the order of side effects like log statements may + * change. But it is especially problematic when there are circular `require` + * calls between CommonJS modules as those often rely on the lazy execution of + * nested `require` calls. * * 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 a small impact on the size and + * 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. + * + * `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, 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. + * @default "auto" */ - strictRequireSemantic?: boolean | FilterPattern; + strictRequires?: boolean | FilterPattern; /** * Sometimes you have to leave require statements unconverted. Pass an array * containing the IDs or a `id => boolean` function. @@ -93,14 +108,16 @@ interface RollupCommonJSOptions { * In most cases, where `require` calls are inside a `try-catch` clause, * they should be left unconverted as it requires an optional dependency * that may or may not be installed beside the rolled up package. - * Due to the conversion of `require` to a static `import` - the call is hoisted - * to the top of the file, outside of the `try-catch` clause. + * Due to the conversion of `require` to a static `import` - the call is + * hoisted to the top of the file, outside of the `try-catch` clause. * * - `true`: All `require` calls inside a `try` will be left unconverted. - * - `false`: All `require` calls inside a `try` will be converted as if the `try-catch` clause is not there. + * - `false`: All `require` calls inside a `try` will be converted as if the + * `try-catch` clause is not there. * - `remove`: Remove all `require` calls from inside any `try` block. * - `string[]`: Pass an array containing the IDs to left unconverted. - * - `((id: string) => boolean|'remove')`: Pass a function that control individual IDs. + * - `((id: string) => boolean|'remove')`: Pass a function that control + * individual IDs. * * @default false */ @@ -191,8 +208,8 @@ interface RollupCommonJSOptions { * Some modules contain dynamic `require` calls, or require modules that * contain circular dependencies, which are not handled well by static * imports. Including those modules as `dynamicRequireTargets` will simulate a - * CommonJS (NodeJS-like) environment for them with support for dynamic and - * circular dependencies. + * CommonJS (NodeJS-like) environment for them with support for dynamic + * dependencies. It also enables `strictRequires` for those modules. * * Note: In extreme cases, this feature may result in some paths being * rendered as absolute in the final bundle. The plugin tries to avoid From aae44a2c8802d35f5f2c80175251c9358aef29f5 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Fri, 12 Nov 2021 12:54:11 +0100 Subject: [PATCH 05/22] feat(commonjs): Infer type for unidentified modules (#1038) --- packages/commonjs/src/index.js | 29 ++- .../commonjs/src/resolve-require-sources.js | 3 + packages/commonjs/src/transform-commonjs.js | 4 +- .../_config.js | 0 .../a-imports-b.js | 0 .../b-imports-c.js | 0 .../c-imports-a.js | 0 .../main.js | 0 .../_config.js | 0 .../main.js | 0 .../other.js | 0 .../_config.js | 0 .../a-imports-b.js | 0 .../b-imports-c.js | 0 .../c-imports-a.js | 0 .../main.js | 0 .../_config.js | 0 .../main.js | 0 .../_config.js | 0 .../a-imports-b.js | 0 .../b-imports-c.js | 0 .../c-imports-a.js | 0 .../main.js | 0 .../_config.js | 31 +++ .../main.js | 0 .../_config.js | 2 +- .../assignExports.js | 0 .../compiledEsm.js | 0 .../main.js | 0 .../wrappedExports.js | 0 .../_config.js | 2 +- .../assignModuleAndExports.js | 0 .../assignModuleExports.js | 0 .../main.js | 0 .../wrappedModuleExports.js | 0 .../_config.js | 2 +- .../main.js | 0 .../replaceModuleExports.js | 0 .../_config.js | 7 + .../error.js | 1 + .../main.js | 2 + .../_config.js | 2 +- .../dep.js | 0 .../main.js | 0 .../strict.js | 0 .../_config.js | 6 +- .../strict-requires-multiple-entry/main.js | 1 + .../other.js | 0 .../commonjs/test/snapshots/function.js.md | 191 +++++++++++++----- .../commonjs/test/snapshots/function.js.snap | Bin 19153 -> 19636 bytes 50 files changed, 220 insertions(+), 63 deletions(-) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-auto => strict-requires-auto}/_config.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-auto => strict-requires-auto}/a-imports-b.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-auto => strict-requires-auto}/b-imports-c.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-auto => strict-requires-auto}/c-imports-a.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-auto => strict-requires-auto}/main.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-circular => strict-requires-circular}/_config.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-circular => strict-requires-circular}/main.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-circular => strict-requires-circular}/other.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-cycle-detection => strict-requires-cycle-detection}/_config.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-cycle-detection => strict-requires-cycle-detection}/a-imports-b.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-cycle-detection => strict-requires-cycle-detection}/b-imports-c.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-cycle-detection => strict-requires-cycle-detection}/c-imports-a.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-cycle-detection => strict-requires-cycle-detection}/main.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-debug-none => strict-requires-debug-none}/_config.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-debug-none => strict-requires-debug-none}/main.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-debug => strict-requires-debug}/_config.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-debug => strict-requires-debug}/a-imports-b.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-debug => strict-requires-debug}/b-imports-c.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-debug => strict-requires-debug}/c-imports-a.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-debug => strict-requires-debug}/main.js (100%) create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-entry-node-resolve/_config.js rename packages/commonjs/test/fixtures/function/{strict-require-semantic-entry => strict-requires-entry-node-resolve}/main.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-exportmode-exports => strict-requires-exportmode-exports}/_config.js (59%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-exportmode-exports => strict-requires-exportmode-exports}/assignExports.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-exportmode-exports => strict-requires-exportmode-exports}/compiledEsm.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-exportmode-exports => strict-requires-exportmode-exports}/main.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-exportmode-exports => strict-requires-exportmode-exports}/wrappedExports.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-exportmode-module => strict-requires-exportmode-module}/_config.js (59%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-exportmode-module => strict-requires-exportmode-module}/assignModuleAndExports.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-exportmode-module => strict-requires-exportmode-module}/assignModuleExports.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-exportmode-module => strict-requires-exportmode-module}/main.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-exportmode-module => strict-requires-exportmode-module}/wrappedModuleExports.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-exportmode-replace => strict-requires-exportmode-replace}/_config.js (59%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-exportmode-replace => strict-requires-exportmode-replace}/main.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-exportmode-replace => strict-requires-exportmode-replace}/replaceModuleExports.js (100%) create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/error.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/main.js rename packages/commonjs/test/fixtures/function/{strict-require-semantic-from-esm => strict-requires-from-esm}/_config.js (55%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-from-esm => strict-requires-from-esm}/dep.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-from-esm => strict-requires-from-esm}/main.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-from-esm => strict-requires-from-esm}/strict.js (100%) rename packages/commonjs/test/fixtures/function/{strict-require-semantic-entry => strict-requires-multiple-entry}/_config.js (60%) create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-multiple-entry/main.js rename packages/commonjs/test/fixtures/function/{strict-require-semantic-entry => strict-requires-multiple-entry}/other.js (100%) diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index b3e277e0e..53be16678 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -60,10 +60,11 @@ export default function commonjs(options = {}) { : () => typeof defaultIsModuleExportsOption === 'boolean' ? defaultIsModuleExportsOption : 'auto'; - const { resolveRequireSourcesAndGetMeta, getWrappedIds } = getResolveRequireSourcesAndGetMeta( - extensions, - detectCycles - ); + const { + resolveRequireSourcesAndGetMeta, + getWrappedIds, + isRequiredId + } = getResolveRequireSourcesAndGetMeta(extensions, detectCycles); const dynamicRequireModuleSet = getDynamicRequireModuleSet(options.dynamicRequireTargets); const isDynamicRequireModulesEnabled = dynamicRequireModuleSet.size > 0; const commonDir = isDynamicRequireModulesEnabled @@ -115,7 +116,8 @@ export default function commonjs(options = {}) { if ( !dynamicRequireModuleSet.has(normalizePathSlashes(id)) && - (!hasCjsKeywords(code, ignoreGlobal) || (isEsModule && !options.transformMixedEsModules)) + (!(hasCjsKeywords(code, ignoreGlobal) || isRequiredId(id)) || + (isEsModule && !options.transformMixedEsModules)) ) { return { meta: { commonjs: { isCommonJS: false } } }; } @@ -140,13 +142,28 @@ export default function commonjs(options = {}) { ast, getDefaultIsModuleExports(id), needsRequireWrapper, - resolveRequireSourcesAndGetMeta(this) + resolveRequireSourcesAndGetMeta(this), + isRequiredId(id) ); } return { name: 'commonjs', + options(options) { + // Always sort the node-resolve plugin after the commonjs plugin as otherwise CommonJS entries + // will not work with strictRequires: true + const { plugins } = options; + if (Array.isArray(plugins)) { + const cjsIndex = plugins.findIndex((plugin) => plugin.name === 'commonjs'); + const nodeResolveIndex = plugins.findIndex((plugin) => plugin.name === 'node-resolve'); + if (nodeResolveIndex >= 0 && nodeResolveIndex < cjsIndex) { + plugins.splice(cjsIndex + 1, 0, plugins[nodeResolveIndex]); + plugins.splice(nodeResolveIndex, 1); + } + } + }, + buildStart() { validateRollupVersion(this.meta.rollupVersion, peerDependencies.rollup); if (options.namedExports != null) { diff --git a/packages/commonjs/src/resolve-require-sources.js b/packages/commonjs/src/resolve-require-sources.js index ce3727288..08b0de297 100644 --- a/packages/commonjs/src/resolve-require-sources.js +++ b/packages/commonjs/src/resolve-require-sources.js @@ -3,6 +3,7 @@ import { resolveExtensions } from './resolve-id'; export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { const knownCjsModuleTypes = Object.create(null); + const requiredIds = Object.create(null); const dependentModules = Object.create(null); const getDependentModules = (id) => dependentModules[id] || (dependentModules[id] = Object.create(null)); @@ -12,6 +13,7 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { Object.keys(knownCjsModuleTypes).filter( (id) => knownCjsModuleTypes[id] === IS_WRAPPED_COMMONJS ), + isRequiredId: (id) => requiredIds[id], resolveRequireSourcesAndGetMeta: (rollupContext) => async (id, isParentCommonJS, sources) => { knownCjsModuleTypes[id] = isParentCommonJS; const requireTargets = await Promise.all( @@ -34,6 +36,7 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { if (resolved.external) { return { id: wrapId(childId, EXTERNAL_SUFFIX), allowProxy: false }; } + requiredIds[childId] = true; const parentDependentModules = getDependentModules(id); const childDependentModules = getDependentModules(childId); childDependentModules[id] = true; diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index fed2690d6..c6cfbdc1a 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -51,7 +51,8 @@ export default async function transformCommonjs( astCache, defaultIsModuleExports, needsRequireWrapper, - resolveRequireSourcesAndGetMeta + resolveRequireSourcesAndGetMeta, + isRequired ) { const ast = astCache || tryParse(parse, code, id); const magicString = new MagicString(code); @@ -418,6 +419,7 @@ export default async function transformCommonjs( if ( !( shouldWrap || + isRequired || uses.module || uses.exports || uses.require || diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-auto/_config.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-auto/_config.js rename to packages/commonjs/test/fixtures/function/strict-requires-auto/_config.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/a-imports-b.js b/packages/commonjs/test/fixtures/function/strict-requires-auto/a-imports-b.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-auto/a-imports-b.js rename to packages/commonjs/test/fixtures/function/strict-requires-auto/a-imports-b.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/b-imports-c.js b/packages/commonjs/test/fixtures/function/strict-requires-auto/b-imports-c.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-auto/b-imports-c.js rename to packages/commonjs/test/fixtures/function/strict-requires-auto/b-imports-c.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/c-imports-a.js b/packages/commonjs/test/fixtures/function/strict-requires-auto/c-imports-a.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-auto/c-imports-a.js rename to packages/commonjs/test/fixtures/function/strict-requires-auto/c-imports-a.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-auto/main.js b/packages/commonjs/test/fixtures/function/strict-requires-auto/main.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-auto/main.js rename to packages/commonjs/test/fixtures/function/strict-requires-auto/main.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-circular/_config.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-circular/_config.js rename to packages/commonjs/test/fixtures/function/strict-requires-circular/_config.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/main.js b/packages/commonjs/test/fixtures/function/strict-requires-circular/main.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-circular/main.js rename to packages/commonjs/test/fixtures/function/strict-requires-circular/main.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-circular/other.js b/packages/commonjs/test/fixtures/function/strict-requires-circular/other.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-circular/other.js rename to packages/commonjs/test/fixtures/function/strict-requires-circular/other.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-cycle-detection/_config.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/_config.js rename to packages/commonjs/test/fixtures/function/strict-requires-cycle-detection/_config.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/a-imports-b.js b/packages/commonjs/test/fixtures/function/strict-requires-cycle-detection/a-imports-b.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/a-imports-b.js rename to packages/commonjs/test/fixtures/function/strict-requires-cycle-detection/a-imports-b.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/b-imports-c.js b/packages/commonjs/test/fixtures/function/strict-requires-cycle-detection/b-imports-c.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/b-imports-c.js rename to packages/commonjs/test/fixtures/function/strict-requires-cycle-detection/b-imports-c.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/c-imports-a.js b/packages/commonjs/test/fixtures/function/strict-requires-cycle-detection/c-imports-a.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/c-imports-a.js rename to packages/commonjs/test/fixtures/function/strict-requires-cycle-detection/c-imports-a.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/main.js b/packages/commonjs/test/fixtures/function/strict-requires-cycle-detection/main.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-cycle-detection/main.js rename to packages/commonjs/test/fixtures/function/strict-requires-cycle-detection/main.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-debug-none/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-debug-none/_config.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-debug-none/_config.js rename to packages/commonjs/test/fixtures/function/strict-requires-debug-none/_config.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-debug-none/main.js b/packages/commonjs/test/fixtures/function/strict-requires-debug-none/main.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-debug-none/main.js rename to packages/commonjs/test/fixtures/function/strict-requires-debug-none/main.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-debug/_config.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-debug/_config.js rename to packages/commonjs/test/fixtures/function/strict-requires-debug/_config.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/a-imports-b.js b/packages/commonjs/test/fixtures/function/strict-requires-debug/a-imports-b.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-debug/a-imports-b.js rename to packages/commonjs/test/fixtures/function/strict-requires-debug/a-imports-b.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/b-imports-c.js b/packages/commonjs/test/fixtures/function/strict-requires-debug/b-imports-c.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-debug/b-imports-c.js rename to packages/commonjs/test/fixtures/function/strict-requires-debug/b-imports-c.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/c-imports-a.js b/packages/commonjs/test/fixtures/function/strict-requires-debug/c-imports-a.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-debug/c-imports-a.js rename to packages/commonjs/test/fixtures/function/strict-requires-debug/c-imports-a.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-debug/main.js b/packages/commonjs/test/fixtures/function/strict-requires-debug/main.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-debug/main.js rename to packages/commonjs/test/fixtures/function/strict-requires-debug/main.js diff --git a/packages/commonjs/test/fixtures/function/strict-requires-entry-node-resolve/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-entry-node-resolve/_config.js new file mode 100644 index 000000000..d5ae8bbb1 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-entry-node-resolve/_config.js @@ -0,0 +1,31 @@ +const assert = require('assert'); + +const { nodeResolve } = require('@rollup/plugin-node-resolve'); + +module.exports = { + description: + 'strict require semantic modules can be entry points when the node-resolve plugin is used', + pluginOptions: { + strictRequires: true + }, + options: { + plugins: [ + { + name: 'before-node', + buildStart({ plugins }) { + assert.deepStrictEqual( + plugins.map((plugin) => plugin.name), + ['before-node', 'after-node', 'commonjs', 'node-resolve'] + ); + } + }, + nodeResolve(), + { + name: 'after-node' + } + ] + }, + exports(exports) { + assert.deepStrictEqual(exports, { foo: 'foo' }); + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/main.js b/packages/commonjs/test/fixtures/function/strict-requires-entry-node-resolve/main.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-entry/main.js rename to packages/commonjs/test/fixtures/function/strict-requires-entry-node-resolve/main.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-exports/_config.js similarity index 59% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js rename to packages/commonjs/test/fixtures/function/strict-requires-exportmode-exports/_config.js index 683e0b747..350658699 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/_config.js +++ b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-exports/_config.js @@ -1,6 +1,6 @@ module.exports = { description: 'supports using function wrappers for modules for export mode "exports"', pluginOptions: { - strictRequires: ['fixtures/function/strict-require-semantic-exportmode-exports/*E*.js'] + strictRequires: ['fixtures/function/strict-requires-exportmode-exports/*E*.js'] } }; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/assignExports.js b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-exports/assignExports.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/assignExports.js rename to packages/commonjs/test/fixtures/function/strict-requires-exportmode-exports/assignExports.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/compiledEsm.js b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-exports/compiledEsm.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/compiledEsm.js rename to packages/commonjs/test/fixtures/function/strict-requires-exportmode-exports/compiledEsm.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/main.js b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-exports/main.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/main.js rename to packages/commonjs/test/fixtures/function/strict-requires-exportmode-exports/main.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/wrappedExports.js b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-exports/wrappedExports.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-exports/wrappedExports.js rename to packages/commonjs/test/fixtures/function/strict-requires-exportmode-exports/wrappedExports.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-module/_config.js similarity index 59% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js rename to packages/commonjs/test/fixtures/function/strict-requires-exportmode-module/_config.js index dda61ff86..6ca355ff8 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/_config.js +++ b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-module/_config.js @@ -1,6 +1,6 @@ module.exports = { description: 'supports using function wrappers for modules for export mode "module"', pluginOptions: { - strictRequires: ['fixtures/function/strict-require-semantic-exportmode-module/*E*.js'] + strictRequires: ['fixtures/function/strict-requires-exportmode-module/*E*.js'] } }; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleAndExports.js b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-module/assignModuleAndExports.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleAndExports.js rename to packages/commonjs/test/fixtures/function/strict-requires-exportmode-module/assignModuleAndExports.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleExports.js b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-module/assignModuleExports.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/assignModuleExports.js rename to packages/commonjs/test/fixtures/function/strict-requires-exportmode-module/assignModuleExports.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/main.js b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-module/main.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/main.js rename to packages/commonjs/test/fixtures/function/strict-requires-exportmode-module/main.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/wrappedModuleExports.js b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-module/wrappedModuleExports.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-module/wrappedModuleExports.js rename to packages/commonjs/test/fixtures/function/strict-requires-exportmode-module/wrappedModuleExports.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-replace/_config.js similarity index 59% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js rename to packages/commonjs/test/fixtures/function/strict-requires-exportmode-replace/_config.js index 4f1cd0f78..1766448d1 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/_config.js +++ b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-replace/_config.js @@ -1,6 +1,6 @@ module.exports = { description: 'supports using function wrappers for modules for export mode "replace"', pluginOptions: { - strictRequires: ['fixtures/function/strict-require-semantic-exportmode-replace/*E*.js'] + strictRequires: ['fixtures/function/strict-requires-exportmode-replace/*E*.js'] } }; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/main.js b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-replace/main.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/main.js rename to packages/commonjs/test/fixtures/function/strict-requires-exportmode-replace/main.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/replaceModuleExports.js b/packages/commonjs/test/fixtures/function/strict-requires-exportmode-replace/replaceModuleExports.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-exportmode-replace/replaceModuleExports.js rename to packages/commonjs/test/fixtures/function/strict-requires-exportmode-replace/replaceModuleExports.js diff --git a/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/_config.js new file mode 100644 index 000000000..aa3d115c7 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/_config.js @@ -0,0 +1,7 @@ +module.exports = { + description: + 'identifies files without module features as commonjs if they are required by another file', + pluginOptions: { + strictRequires: true + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/error.js b/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/error.js new file mode 100644 index 000000000..85dbb8dd0 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/error.js @@ -0,0 +1 @@ +throw new Error('FAIL'); diff --git a/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/main.js b/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/main.js new file mode 100644 index 000000000..c10a2ca10 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/main.js @@ -0,0 +1,2 @@ +// eslint-disable-next-line global-require +t.is(0 && require('./error.js'), 0); diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-from-esm/_config.js similarity index 55% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js rename to packages/commonjs/test/fixtures/function/strict-requires-from-esm/_config.js index 9ba78e6a5..f445b5c88 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/_config.js +++ b/packages/commonjs/test/fixtures/function/strict-requires-from-esm/_config.js @@ -1,6 +1,6 @@ module.exports = { description: 'handles importing wrapped modules from ESM', pluginOptions: { - strictRequires: ['fixtures/function/strict-require-semantic-from-esm/strict.js'] + strictRequires: ['fixtures/function/strict-requires-from-esm/strict.js'] } }; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/dep.js b/packages/commonjs/test/fixtures/function/strict-requires-from-esm/dep.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/dep.js rename to packages/commonjs/test/fixtures/function/strict-requires-from-esm/dep.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/main.js b/packages/commonjs/test/fixtures/function/strict-requires-from-esm/main.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/main.js rename to packages/commonjs/test/fixtures/function/strict-requires-from-esm/main.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/strict.js b/packages/commonjs/test/fixtures/function/strict-requires-from-esm/strict.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-from-esm/strict.js rename to packages/commonjs/test/fixtures/function/strict-requires-from-esm/strict.js diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-multiple-entry/_config.js similarity index 60% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js rename to packages/commonjs/test/fixtures/function/strict-requires-multiple-entry/_config.js index 757ac2cab..6e3b65ee2 100644 --- a/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/_config.js +++ b/packages/commonjs/test/fixtures/function/strict-requires-multiple-entry/_config.js @@ -4,15 +4,15 @@ module.exports = { description: 'strict require semantic modules can be entry points', options: { input: [ - 'fixtures/function/strict-require-semantic-entry/main.js', - 'fixtures/function/strict-require-semantic-entry/other.js' + 'fixtures/function/strict-requires-multiple-entry/main.js', + 'fixtures/function/strict-requires-multiple-entry/other.js' ], output: { chunkFileNames: 'generated-[name].js' } }, pluginOptions: { - strictRequires: ['fixtures/function/strict-require-semantic-entry/main.js'] + strictRequires: ['fixtures/function/strict-requires-multiple-entry/main.js'] }, exports(exports) { assert.deepStrictEqual(exports, { foo: 'foo' }); diff --git a/packages/commonjs/test/fixtures/function/strict-requires-multiple-entry/main.js b/packages/commonjs/test/fixtures/function/strict-requires-multiple-entry/main.js new file mode 100644 index 000000000..94ecacb72 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-multiple-entry/main.js @@ -0,0 +1 @@ +exports.foo = 'foo'; diff --git a/packages/commonjs/test/fixtures/function/strict-require-semantic-entry/other.js b/packages/commonjs/test/fixtures/function/strict-requires-multiple-entry/other.js similarity index 100% rename from packages/commonjs/test/fixtures/function/strict-require-semantic-entry/other.js rename to packages/commonjs/test/fixtures/function/strict-requires-multiple-entry/other.js diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index c9311e099..260d58e48 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -3588,9 +3588,7 @@ Generated by [AVA](https://avajs.dev). ␊ var require$$5 = 'bar';␊ ␊ - var none = /*#__PURE__*/Object.freeze({␊ - __proto__: null␊ - });␊ + var none = {};␊ ␊ const externalNamed = require$$0;␊ const externalMixed = require$$1;␊ @@ -3698,11 +3696,7 @@ Generated by [AVA](https://avajs.dev). ␊ var require$$5 = /*@__PURE__*/getAugmentedNamespace(_default$1);␊ ␊ - var none = /*#__PURE__*/Object.freeze({␊ - __proto__: null␊ - });␊ - ␊ - var require$$6 = /*@__PURE__*/getAugmentedNamespace(none);␊ + var none = {};␊ ␊ const externalNamed = require$$0;␊ const externalMixed = require$$1;␊ @@ -3711,7 +3705,7 @@ Generated by [AVA](https://avajs.dev). const namedExports = require$$3;␊ const mixedExports = require$$4;␊ const defaultExport = require$$5;␊ - const noExports = require$$6;␊ + const noExports = none;␊ ␊ t.deepEqual(namedExports, { foo: 'foo' }, 'named exports');␊ t.deepEqual(mixedExports, { foo: 'foo', default: 'bar' }, 'mixed exports');␊ @@ -4004,9 +3998,7 @@ Generated by [AVA](https://avajs.dev). 'default': _default␊ });␊ ␊ - var none = /*#__PURE__*/Object.freeze({␊ - __proto__: null␊ - });␊ + var none = {};␊ ␊ const externalNamed = externalEsmNamed__namespace;␊ const externalMixed = externalEsmMixed__namespace;␊ @@ -4085,9 +4077,7 @@ Generated by [AVA](https://avajs.dev). ␊ var require$$5 = 'bar';␊ ␊ - var none = /*#__PURE__*/Object.freeze({␊ - __proto__: null␊ - });␊ + var none = {};␊ ␊ const externalNamed = require$$0;␊ const externalMixed = require$$1;␊ @@ -4235,11 +4225,7 @@ Generated by [AVA](https://avajs.dev). ␊ var require$$5 = /*@__PURE__*/getAugmentedNamespace(_default$1);␊ ␊ - var none = /*#__PURE__*/Object.freeze({␊ - __proto__: null␊ - });␊ - ␊ - var require$$6 = /*@__PURE__*/getAugmentedNamespace(none);␊ + var none = {};␊ ␊ const externalNamed = require$$0;␊ const externalMixed = require$$1;␊ @@ -4248,7 +4234,7 @@ Generated by [AVA](https://avajs.dev). const namedExports = require$$3;␊ const mixedExports = require$$4;␊ const defaultExport = require$$5;␊ - const noExports = require$$6;␊ + const noExports = none;␊ ␊ t.deepEqual(namedExports, { foo: 'foo' }, 'named exports');␊ t.deepEqual(mixedExports, { foo: 'foo', default: 'bar' }, 'mixed exports');␊ @@ -5442,7 +5428,7 @@ Generated by [AVA](https://avajs.dev). `, } -## strict-require-semantic-auto +## strict-requires-auto > Snapshot 1 @@ -5491,7 +5477,7 @@ Generated by [AVA](https://avajs.dev). `, } -## strict-require-semantic-circular +## strict-requires-circular > Snapshot 1 @@ -5527,7 +5513,7 @@ Generated by [AVA](https://avajs.dev). `, } -## strict-require-semantic-cycle-detection +## strict-requires-cycle-detection > Snapshot 1 @@ -5576,7 +5562,7 @@ Generated by [AVA](https://avajs.dev). `, } -## strict-require-semantic-debug +## strict-requires-debug > Snapshot 1 @@ -5625,7 +5611,7 @@ Generated by [AVA](https://avajs.dev). `, } -## strict-require-semantic-debug-none +## strict-requires-debug-none > Snapshot 1 @@ -5638,12 +5624,12 @@ Generated by [AVA](https://avajs.dev). `, } -## strict-require-semantic-entry +## strict-requires-entry > Snapshot 1 { - 'generated-main.js': `'use strict';␊ + 'main.js': `'use strict';␊ ␊ var main = {};␊ ␊ @@ -5656,29 +5642,13 @@ Generated by [AVA](https://avajs.dev). return main;␊ }␊ ␊ - exports.requireMain = requireMain;␊ - `, - 'main.js': `'use strict';␊ - ␊ - var main = require('./generated-main.js');␊ - ␊ - var mainExports = main.requireMain();␊ + var mainExports = requireMain();␊ ␊ module.exports = mainExports;␊ `, - 'other.js': `'use strict';␊ - ␊ - var main = require('./generated-main.js');␊ - ␊ - var other = {};␊ - ␊ - t.is(main.requireMain().foo, 'foo');␊ - ␊ - module.exports = other;␊ - `, } -## strict-require-semantic-exportmode-exports +## strict-requires-exportmode-exports > Snapshot 1 @@ -5754,7 +5724,7 @@ Generated by [AVA](https://avajs.dev). `, } -## strict-require-semantic-exportmode-module +## strict-requires-exportmode-module > Snapshot 1 @@ -5830,7 +5800,7 @@ Generated by [AVA](https://avajs.dev). `, } -## strict-require-semantic-exportmode-replace +## strict-requires-exportmode-replace > Snapshot 1 @@ -5862,7 +5832,32 @@ Generated by [AVA](https://avajs.dev). `, } -## strict-require-semantic-from-esm +## strict-requires-file-without-module-type + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var hasRequiredMain;␊ + ␊ + function requireMain () {␊ + if (hasRequiredMain) return main;␊ + hasRequiredMain = 1;␊ + // eslint-disable-next-line global-require␊ + t.is(0 , 0);␊ + return main;␊ + }␊ + ␊ + var mainExports = requireMain();␊ + ␊ + module.exports = mainExports;␊ + `, + } + +## strict-requires-from-esm > Snapshot 1 @@ -5888,6 +5883,80 @@ Generated by [AVA](https://avajs.dev). `, } +## strict-requires-magic-string + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + Object.defineProperty(exports, '__esModule', { value: true });␊ + ␊ + var main = {};␊ + ␊ + var hasRequiredMain;␊ + ␊ + function requireMain () {␊ + if (hasRequiredMain) return main;␊ + hasRequiredMain = 1;␊ + console.log('hey');␊ + // magic-string@0.25.7␊ + const m = new MagicString('0123456789');␊ + console.log(␊ + m.prependRight(0, 'W').prependLeft(3, 'AB').appendRight(9, 'XY').remove(6, 8).toString()␊ + );␊ + const bundle = new MagicString.Bundle();␊ + bundle.addSource({ filename: 'foo.txt', content: m });␊ + const map = bundle.generateMap({ file: 'bundle.txt', includeContent: true, hires: true });␊ + console.log(JSON.stringify(map));␊ + main.foo = 'foo';␊ + return main;␊ + }␊ + ␊ + exports.__require = requireMain;␊ + `, + } + +## strict-requires-multiple-entry + +> Snapshot 1 + + { + 'generated-main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var hasRequiredMain;␊ + ␊ + function requireMain () {␊ + if (hasRequiredMain) return main;␊ + hasRequiredMain = 1;␊ + main.foo = 'foo';␊ + return main;␊ + }␊ + ␊ + exports.requireMain = requireMain;␊ + `, + 'main.js': `'use strict';␊ + ␊ + var main = require('./generated-main.js');␊ + ␊ + var mainExports = main.requireMain();␊ + ␊ + module.exports = mainExports;␊ + `, + 'other.js': `'use strict';␊ + ␊ + var main = require('./generated-main.js');␊ + ␊ + var other = {};␊ + ␊ + t.is(main.requireMain().foo, 'foo');␊ + ␊ + module.exports = other;␊ + `, + } + ## this > Snapshot 1 @@ -6738,3 +6807,27 @@ Generated by [AVA](https://avajs.dev). module.exports = main;␊ `, } + +## strict-requires-entry-node-resolve + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var hasRequiredMain;␊ + ␊ + function requireMain () {␊ + if (hasRequiredMain) return main;␊ + hasRequiredMain = 1;␊ + main.foo = 'foo';␊ + return main;␊ + }␊ + ␊ + var mainExports = requireMain();␊ + ␊ + module.exports = mainExports;␊ + `, + } diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index 71ddc9153d0d9342ba798d1498193c98856035c3..4ec48d232698616a4f850a2f6ddcf378ff8b05e9 100644 GIT binary patch literal 19636 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 literal 19153 zcmZs?V~j3Luq`~;V|(`4dd9YG+qP}nwr$TI+qP}n`rdQC`|IZRpRTNQx>KtwoyzJe z0aXD4C0he~Cv!Vz0#`<85TF2&s9j0JNTB~6pw~PQ-dV%XyQlO- zO^NldY5MV~#vF>-K(5GRvKu6SkOv_96KZB#ku?|-v)TWE(s(5=3$B9+1}K{QFMz<2 zTq)#N*S}I%72MfnlziFM-SSGPQky(YA`qW%ce>r)?9{m3?o3+SV4h-~KmkstbC_!! z?nO>pZ5s5`aAiP$HetQfF>HN5BS3$?_s`XCd`>9KrhQh0=V)5lqJ3M;m|LfDy^z>F$O3OVs|>6gr~myZ)i}-cSWFq{ zEVA`dnh~9Sb;B0@vN}1<(rxZ%9;4*(_|BjMZs?JmjbjYnLSwleQGdH@Fuv=JU(Pzj zZkUmtPP*ZWJ_2tJxiVXIP%XUehc)=Vm&wTjdphF`tlQtl^my;X#CEX$of6{1`r5n; zq6nb)4z5`?>Eub>xV$&@dj1wPfZ~nOup&7t&e6BF>p$69{d!!qH=y8cokz%=g4Pl` z-^mZI`8I9yzFn2->8ZWCyh0e2c02b(!DK0r;N69M|jRi6kC*F_5KUqi`(gXye$sf_hDPf*NW(j)`(y3%V#FLCXJ@u zr!EbFqtWy^t}Pw%f(xS?0wRc5$ZksGH8A31JZAHTFwskQr^m~sc z3Op0ibA)8DJZsr`NgxZ(`?eR~n$6|rTg=vg=!}UE*k$A3r8^J1*?uzG41?jhKlgI4v3y;Zd6qqLH6HiFuhM^V z=BzOXdp9ocrC!tI6hK>JM3e%>YX&ZX_O1{VomVuqO|k9J-7?T>QnjMmcc|Tkp;>5sXdtPI_0Q0So*vDbdvDew!@U?%;?=bAJA!A)v#-VU~KO=J-pxZ zwcCpiF>cS}g$?bc-=~b;e`HT@hdK-$jvKMP+iA`A;`Ll%021?P8Ihjos$h+7IIL!T z_oCW_)J%6dj-ztuy0`v|$~^k$qTB3ji#!Ka#~b*(E$`p7q<}7gGYPrCd6u&M+IuB( zULJ?_wzAe6d-EmXxh6Gi(Z$(X_OthojmjTlh+5yzP;#|&$c`(X!Ehg^fk8jq=RT_f z8@H~DCqKE(ap5_uUAE{}8^6cJZ(Epd?)Q)rrd*rvD?AhdHE%1->ngFY`|``WpQrg# zyv_Ry0X?$+JYPqi(#WIryjmKx!|B?r998StaMo*z$kz+%1xs7OL;qS$SjFu+2^R~y z^_jB3{5Y+VE;_8g0TYY5RY2w`$i%`MAm8d@jFu zR&C|&a~CyN&7ogmZdCg{4~~kv{i?M*ioxIM*xdRZoKqXg5T&JmeC*D<`tO<%U@_S* zlKBwLzvZNhE{jc!3dy@1_DRcVETC~-q8{m=NbgpC*5cP^@j0JH$G_XY-V;`*wId45 zewUb2y?0(NKSyNpntz|lMt|D%u4ynoo~`8%$L+d)`fK>Oj(^N@yMN!F^kzrrUQg0T zBK$O6eh(_>z75wjjM%iE#(vov+^P z@jk5&^)oty;qREyeRw!H&-1w-IIL+(_515*3(FJKNh2?>n!d#{HbWh7OjZOdjC`$6SOZ@J)I6mu53pRvIrCwwqI-sgkxG>?|wd=3nD^;H}d`nla=XmDO zAFL}HTldqd+1CoMf?wXl5tm$#{YWc%XAbpsJMQnxgj?(9ucQWGF>mL)iR-q(IaKu$ zKf7Lr=h4knuu;GIuWG{i9CH0LzCQSaR21GXgK_e_nQ&Dfm&pgWUUnFv+i%=4uE$T9 zSr5xKr>yGr?>iOz94CTMUpEx-cCT57UHoOvkB`pQpSMvcuI=E09JZ{HYrS8WCWhCX z`$MDE9Ur0B zUHj31T`XQe0RWFBrnAQ;dN=F)ChJN>2IWQKrX5_U3Lhe`N_M=o$D_`35_^YlZ`A7b z4Ol1+_@Tb?FwpOd)%|I9_wD<{ZibWG8#mN6moX*`Pj`i()ALBlOU>tftZcKJ6IQ6~ zdzu-~_wHi#I;Z#Rrqj2#bC%8L3k%i<>*>0PP1k$-45jYFJPt;${Gpe9qHiv(zxFP| zFV6Q3__I_;mizqA&}G&~nlJ;leN1;|A90V9IUh^JSSU?jN{N9+=TV#h8ee zbf?oe+Vwg)2H)4z;-|q`lK$7ezvRgL)6P7!&85p%%Pp1ugCjnLeh=L?bBr( zF9ic%P{F5v!dDwzTrD;l&*Oaej@My0zvr0}=Es?vei`E(-6|QKd+kZ8&802g^F1zl zDEv>HMc3OnYuz-*Uf_ljg5Kiq_U>}^z#Ms1RkYgAqVt_i-ET?d#W{J8Z_`bm4ukVn zs>;aaZuGmWaxdUl<@wR84i6{yF(e{?)mp`*tKH=*q1%tW!KzNr#_cRQ0^CwO~Z@c~M@Ub)Z*9QkjlHdtYHSu=Wm6^i?c;P$!b>(&=e~d8uu_ijZ^a@DE zIQ_jp-_~3Ey|ZKU@*53uJ2N9PuPmK-`WkO^4j*&`Y_G>!`!iWO7*v($agsMxf(+;=wF}?BILr%y)3x zy~8fe^Oyu|3fuBB=o6haK>*E=|9YIbLg2q{)lA>=Y`0I7=erO%I}(d)*zXLs?Yt)V zoit;_SzNWDM(ab$#Qc|*Y&*xbTwF(F;h+B=_y4k^j$sAEb08Mu^g1pP@7AS%pA?@e z{n+uj|CiBymn#3&i|ue~B38>j#BOwNoBX-^Q5nsI>~N=yxPUqVYAe< zUG-~DbQZB#8U1UW>G2sl$?9QrN@<7p8zz9E_g^You~-$2&&u-^47`~4_Az9Ca!;ps z4M74e=*IWy|!Xqp>-0!Wfa7-P_RNsX%QcfMeC%(hTuci*32SZcLO? z6+_ffc{AwjWXc&g0Tzm{8@XU? z9;n&0)a;iHuv`|#o{xJ`f05U2e-nnTv%QvVIYK^1tznaB0IBEg5w1eBH-!N?(pDoI z9{VxVZMFql7vXIxtX$dYoCuTWkymL5qfHpGocJ%(B%1x2wUyMb!247a->~dSXo9JU1el+tO~K^>ziDfi#Zb$;M+H5)F%hj zvv`UHkh)*M<&R@nZz%!9;MFQsfxx_ZdJ4;)JuYeM(%M zNwp+c_iITMuy{Nhk}jl4;k;;m(|hTFlS~Z%X3t8W_7`c-hLlDOEfl5J2k9(j81m;m6i}a#oz6k&?!LjpAhh zX|3pGOfZAKt9XJm`p4Hq@@dw!L^&jedpr72<%$M@{*nVKipDX9>>Sq4b-c#BeklBu z)2%`R={XvVps+~1W@L>_i|f`P*1~_-tAR`wRwJ}vpB%-gGuUGt)$3#1hV?CIeq`cA43pldKWAG zcmVl0c!6A1g0xGg#r*ZphFej=C;t@31ri~zf`EQ@ExmyO2!hMcS@P%kgX+bZkoQvr zf?aY6Q#Z>4FC>phqC`5Bv=QWpgMAtL&M8u`&FIQtg&o0dR=B_1{Wa)Sq5%qDfnh( zL2K&-P8!5gS)(w+4@+{bgljGj?6~a-W|}^d$}-R+Z)s;lqoDftQEYSco{YNB*lh59 zr-!#c0H+r7E*-GYaD{PkOP_f|Z<1=&EXp2&>}(W$ltMAwQr zZtxeWVhECs0TL)*CfOS`NFk!oTOmSHIsae}XE{mUqEGq3Sj{OZ&t5ap%YPg+mrp?} zi37vepR|DKuT=x6ix|GnD!Sk!mBq*mChsU=v$Yvx0t{rux-s=8{K$oQ^yrBR`(tB3 z27jmf9Rsvc17TWz5$x<`Jij5Hm4Lj)U(pj!d@>LZU>tHwD{%4F@u2%_;H*YExcXLED&YxV>6q4z z>9es_K76olfs!Tj8*aOQY)QkR5`k%jKy(B*@%zmCjr1FuFYPVDGid2ITL<(6)|#1t z6@!HJgCOsGEW8qox4>#qk1Z4Nn@f3y&GnFR<*`A~*ENsDkrpUT)#;85VaAO$P@w$1 zUE?XN5g{(1K!}2?TX^olG*bHLoVQx?l>_lC;@<^?NdG9_149m~;Jp9CtEN?YRL*x0 zA3Pd}u;!=0jD3t3S_HMv33nMb>L|FdFX#X_7?i_}T!0`{i3n5=-*i14GU_xO2g*lj zOl{;Hv*a5z-z?5&tj{Zi#R-SsXdxy__%2K^7zAtC z!}~^UAxKIqg~!IBGV}j17AOn!@uM4r1g-b$3k&StdX zz7|}lU}e5Vz{?sRO7%w<%cDmCGMpKNxhB;Bnvd5NPX%W`q#k1K*G9RNJfT+r`qLy4 zc@r~#1!=}4h>4>QubZ6-1>fpQ)@B@-V>3>|DRBD7KbUUFDk?7jfHJyp0GbX~!$BMv zhx1^MJ^JjeE;G?4*=9EQ~2eO8IjIBys0P$#%WWR{T zXj7jq6S|U0j??Voom8CPI4kpt8l8hLc}Aqc7{dTf0;hOQcmpw>rcJ2TT1&-HAmw6ws*F{YR#%s*ho#`0pS*y+5q6ug-Z94;!-ypP&H zFS-d_HRvKYo+YiG6#=iPa$Fo5#-&&fTZ70X?M#p|eFe^kRTThQ!MChFfA5s%*}k{H zlJ2=*o1mGv%@TZx1ByAVTV3fC7XJa4Ay$Rzs;Y4@THg~o(H-CsxY;7W@D;&CN{jl9 zubNH2+Gj#zoX|sN7_w0W%SISyej5Y?5ivtjjfUUf5Wh@alf+~G`^ zFWoPnCq9E_9HEuEu*vDKwML%4v5xK?8Qes|LUKL!rnLI_Ss6r)^ysmO0St8j8 z!QwWheh4?h+{5xm@9eHH$uZYNsgoWA87^I)MU!0}Dx23Z5SG`^iF%NX3sNXLS+l$g znb>pL`W-n{r$HH-wnG29Lk>o|L@73wN?6I7c_YNxbCS3{MiQN~?HEa#1txFpK@#r} z9%@XO^*zZ1yR0Df)S}qPg35v-o7OszU6hIj5xl0ndfjl|eqMAtE_f0oi?&Nv%UDNI zPL#;XaVNh1P3WD!xjwsNE|H4p77r7c$~iq)GC&3ONVK|adm=GdK*=K0w&7Sd4I4@T zY1wpXjj_B)w0N-OBs%mTiK^}5U6bGoi}~HAGUUE1xtW;&+(pr{x21NZzbXQ%QuL(k zDG(mWSW3;ZzLHXvbM1Dh=T}KEaQ)Ux9~ESkAH=$*|6g+SI5|WxHUcMv%R{5TxMQd= zij8|Jab5k@A#PADK!!m9TAP0-hdBF8nNp|8HWcYWw;vzd|M5nqKHvfTE0JI&JJtUb zRZ}hkW#5U+SH)F&J^Cu#we!7swb)Opr4Y$AABPY_oTO(nYp-f)vQWvC)0%UiB#=KZ ziA5Fqk8tBGv}_Ax*3Z8-TEeTXWx%7Y>w6O9!~$dkj44tK#qL0W@nLt5AE8a&F@3{Az>#)o?C2sC_FNp;}hFAV3h>{ZP<|@j~H)1bRVSS;25f z>=e*hsBi$FJWGz@>gHU+eR_rY_q%38Q;!NKhhK4QMVsDwR%%Q0)B?+lF+oj7K z&()tLz~9)&&J2kRXNXDe78lcznT?8UFf7@6av7*q;InFQI^==thH3&b1M^^TF#h;j z(3&Of7bm><(Bzjwq^#0>0Tm@CSe1JM-Qfdv*QfY7bAguVv5m9>*S4bQvyHUOAoz{yaNxtWJlxEnmt#`(`ki!B`(V^UA!5K z+~)^w*^JBMhRp<}LxSG~b&8C8R+OCB#C2N>Q7TeYUOhSN>H4h>v<(wj> z);OV(aqvQduJLHqyiJIE`(#|_S(W#tJ(x==U8%-&vejV`h1~WAif>AjYphc*^?3VY4Oh5{JDIZ z03U?K3lLERG<#;AuSh9^Bcn!DQZ9Q)lz?~BS{!BNQy`MjKz=mb%v8PM#|Y0|xW3%DCSlJtx$JO^ zASurod7#w}zSjq=6)=x#qOS5*yg~MWPA+m!=iZJb&h{d=-RSH941a2 zPw{RNrJLBe(q1yi09#o9b1qk0Z$JmsJTTn>MhEQ8llf3MoC4t{kxz7I^+)M}L$h#n zeMiv7#fH|kyk{E>cIO2oJ`dncyDqMGcFQAy0cBVe4thf@Mt*)HmQsXlNo7X&?oQs% zR%vt2tUcuO&kiT&kQxG~Y3Kt2EJ@p^GkG5u)Ph-A8*g6pk$6Nf2FX8)q>8zl^8ivI zm>{AS#e!WpFPW+YWg5v;SwQ!TK(3HdDOh_yhK0BJ31jZ^0ab7t@K77<6>g?q3{m2}F1%D?8-NIw*XvI^>M?gGNgk-v$+RO@QSQyhp3~ zC!6_lSnB;J2KKdTzRC^*%M4XYK;*vN#p0g!9|ZJ>whpWF7ddv_Iaut_ba0*}C^jTT zx2^szE29kXOB9W&55SdvRA;|yD(VV^NqU&eng`6Pav7CrKD_^pf`?-5X!UgNehFI5 zvUH@gG;~Y3=&4~NT_w%`#2Zi0D$xkPh@xGu)2o}HmH#b2ottqoKjmnC#M$tGzvd2e z%@yL}{o(oFdA1+WD5!cIkRmktW>{_?{7i|WxhTSn#dn5S!Xig9SBZCnEthe^E?(@)m>L6kJ3JzAotCHB|O2>~Y8ESEJ6cSrmTh0QWjtR$foi zLT4cMNXQ5{)ty@KF_MD*iOrg5DzPOATz;WFa9fXjO`<(9!Yz0$vshNuq4{#L66bDD zWkG{SKWVZnr%C>$BIJ%QSWO9Hvd|-_@GYym_afo%xmwhw_`7qCOM~rQDA|hph;?|j zNuJn(MPiuuXHDZ+L{#OT>|(jNDcE;RVQ;HhsYS}2BdFpvHtK%gzDV9U?#xYAQC0cFkSv&xN z6OHC(#d85IIy6Eg;%-BK7=$YTwow>M-KRW13u;fB#_JL|#Yorn-?0u-bbgiUB)--3 z`rm|*e{iY#n^e*R-SirwQsqtjeHuo*nZi~6L>lKVH6|c8U>w2~!IqQEOPQxNWuur{as45F#Kp z3Y?6T2Nr$MRiX#PU=h$dzZAr+gh#-zCoPXCwlt(_W3ZLiO$$01m5ULzd7fQanI!}e zcn_mMIva0>cL$0n>Q6V?#4LL=^w}TfYZymnNSK|U+K=8%Z=ude+$ z_41PtA^vg_-FoAnBn)h=SbquB3k}(HNg58G>M7wSgQQyyb zWzD)`%9igYA0i9b=M0(n@G`ETWxUbX+vYzD3`g5134hbo8n6v*&my?DAP~u~lWcHK zUUivsT!n$$hQgiZ!G1hfv(GM0_kt4TlbqZe&S=Hnff&aWxUdt9pAR=iA}JGjzal2t zGwFe4v@g8OGMfG4#G#+iAy+YN(RO0lzqHM$*sh+1*;~Z0}^~NXE7R&F%xleJV zngtvi;^UW{9UAe7F?=r?T@MEPpxrY95PQ?iGne@xIRmye~GbI>(SFyzvjc+l> zqCB1>R!HD{$E3fG?)9iMQ|qUMJo|&A`#M1HneY$FiM6Rbl``hj{`%~Df~NM{mEf)} z8M6hC5{=jtE2#EeG2xQ$b<@=TdnwJJTTTzPei*I|fg0wQhng&Weivv@s2Pjj9Asqv z5g49Q$cIO2lt%nU=^KI;v8LsK!m>Q1%@~tmq$VUD7RLDCiMD2@Th|yX)skbYEYl)U z8*FKZQX*+cu~%l6dVUXI0SITXi_~+A49N%OD8NQb_U&V`YlEy9>35_4Kx}A2TK{RM z78Me-g1Or#oX7&I#t1;mMgq4^x^3L~4&~Yfa|`&iIel)Oyl(Yux3SpLRx}w#<;svA zY!VrHnUqBdR$STbH1M^l>TP+pRc1?PDsd~i*e>^EtK5mH{J%}r7g03Lm?S{oh>Lfx zq@600l)S_cORIhU;!dt$ze!s+V8qn+w(vmf9&7n(_9|v;1|mMKwL9jzs{0@*9#SZi(L-umD#WC-&7Km zo^2>-C4KA~k|}EiI~WQe6TxuOK9V$#6#W9tMUEBuaCc$^)V>8w0S1@)hZ&_lhv=z^ zh#~S^gMkhP={qIX16TMbjFsX}4XQUScNAjhm*} z`jr1flI+nssW$oFk}EV~Up+dO6g(uprIYEwdh_^t#vaO?I;ERIE|@S~KM)X3DP9P1YV<^Vd4j&RHdVTY7 zDr<6VG*r+Eqpx`yD~fN9YC|fh*W_H6litJ?Lpt$G+sMn=uE+_)#)2PlOs#aE@>_~E zAMV{!YxeOHnnBD3lq4wj4OJ5nPidUxk&WTV4Gq5#wc<>xdV6z3eLM9$?^%QpPb*B} zjev#j@7{SyLeWuBIJFp@K|_H55t^i7B&d{cHw5i?$tLFB8(E3z7tA4ppDry$y=Hpe zjx{Aol>|pmm+48Rw*%O#_?BX?)-4Q<%m_#;2ATpId5_p0e#htq4 zt4#~|I=b_pv4v8IVO5w+1$^wTXdPwrlbdpx#=}$6Cjr_^$vYm8F8nJpwNcUmd_KIa zFc=MvZ_u#vKBdjr;mMG@QL^jiZ;T%9Ucu6Jvu)wo#8rl{z;v4pkD(SRvrnkR;U zfV(eYM%lVeLn`UpS-+?9LTWxBoY@kuczKU1_Kz?R;#WXSx_c&An9aZ0*BR+wfEgL> zpv(ZesFV~k7oHE1VntFSaXIk+=nSHqVGy(&-1CEi^8qA^iUd$15s>iW12l?%H2KCH z$P^oE7r9ny@JBlgNlMiqx_fw1YNpB3V^j^WC>@QqvT!vSu$h{@3O8pKT6I#^Z7Q?^ zAli2FvxOlMB3S9!5cQ>$qFkMG`5Tq?8=rx5yPoG_k$4KRHg52W zm~K?l4`Ix+8KK%L0X+wujB}T6@pB@}xlVS!X@Nt2a|o{Ek9@jMSkgFs>4Cof3A654 zu_C%s1cJv)mM$4RQ2JD8O4$d3O_`T2RZhj3DgKR4cAV^EK4)HG2T>=tyvy+Etm z1HH*|guPt|T}kPs3g2OgaG9Mo;rcL7tA9U_v6Qk8?O8E04dd7|uPj*y-evF@Z4WCj zsgS$Z6%|j3sCzPWrOksFo9WOWz}rC<;8;8QAtoOiB%W9g5;!5WofP9eeS`W z5{_r2ketIAB|Oh?K^glKYS{k)2V;aC)B{#8SdfhKbJSwesorxs9=S15RS3@zZ3Nc; zd@m3m7NB$xHjwCHav9tcz7OiJn|(k4c5#aPVW(v(?Kf#f_+C}+8kGs?Ihlg)A; zrj&9$CYb&YxGq}BowUQAqEMtNYm#s>C!#F6^->#D3#u+eKxI+fM38L6g2B~e0qI*6 z15EzNZ5_n(?{sF+^_UaGKqN|*k-3sL>Q{gOSo3Np3e&aAA8Dw%VO>2n%r)X`(6&-h z_h*4m`e<%487imGZrBa~0eX(u1s`OZeL17!wYrq`Kn6dy0Km7I|0!CyIjU48`>{9F zDT+SwOd(@&y)3j5p=gihIJ4iGTOvFhZrmnu=qjZjT|Vv+vzwRC@6B`z+dd2oMDVRd^u=1>z5Mb-`cS;IXG&i6 zD0Njzt!gdul_Y=ur98G)hjtRUJ@ku!Rc3;<7l1~|S~Uml31mH|M3S%~atcIVAM>mJ4dTe2 zdazzF?)M<|-C^g?QKRVnlklTFFKi1{3F(+$RlUGX)iuzh;=T9b2^Tx~2xZ1|A&O1K zW6;c-w&|cQFzuCnUJiy^EmWWDkUp?hD(nLdVt_>+CG9q%i9WJn?N&=U{QQQ;2|S`h zy$m96kMg?A(j=+&8eI|xO|abuH7I+@)aYVNKYrAWZGH>B(HZb!oB#hXcf{@T+2-_v zt|)}`$j9bE#!VdEk?xHJXZEPG^giGCIi}~o2+dqS+yywV!5$6()C-R-eZ;_M`idMK zP|}j z!tn+id7o|nrO&+Ydnak{7lh_^COQ-JBe9+mr7C7KLBofCODG}{ zknh&4d{mUznqE5l_(Ab3rLuiY$G?rNk`)hj^m4 zF=NQDO2}ZgEnTjrSE^h|z|}8MgIKNzW23gl>8W}o!dOg7=y_0t|HLRn#$}V#Me$$a zL%E}5pcg4!!r~*un_){f+Xuo}>q?swVyF^}1V1_Chd`Elj7kPtM3we{V+1>z?n5cd zEE`ac?i8d8z%dMi$u{aZ&Fk3 zkO@^u24mC`sI?vB9BKXX0l2_xr>=ahlR<_VqK)DVN)y3;o}VmCMeczGNuDO-B7HAg z8#l(n;xLIPw(38Sqb?7do}lE_yF&(z?C4}cE4MDQUU3UBS?0g5ZJ$8aU4eP-a0vBO zDXCP>q-d&|dUlvoyWQ)-8&a6YKWNrpS|XCm@i=N)O40`dX-FkJv#itgt+-bfs$E(k z;=Szf!8gULuCBh>&?H(BzSR*xKea;l`^e?Oa`2d?u~p+Akbm;+aO6tG_1TFX-fVE^ zO8sr1f9}@(`Q(o7uoary6qMW`dTNdL&I0G`Tx}rmkd-%Ek|r4p>$Z- z96lr_AFZrO0E;EOeik8O_2Qwfsl5dnUOnz1)PakI4u_$sDDqb2=eZp1RFR>+J=V0T z+(DEJ3%%kz=I19(%gz%e-?I67M!b$2}!BrIR@Q{r_C$>S!R+f6u^i)a>i9=u&O>rll-DTn1R z6{I+fs$7^HVLgj6&!f9oz!00>-_(>vXM+qDaP=(;d~Dbxo{%Hrgu3RbI)XPO(H^kx zl-F2yf3InZ-4v}JjDJ|2m)VN>PG2Kecfc@H$w6k*t)eK0s=-_NtYR*4L`gsxrb2fU zF1r;M^cC2eHgGMbgPwx12FXe2OFYx8-$2IfC)b1AkV%@ZqDl6qOfW>Z92l&jLFP0p)S&QsTNFn$2GJ|p^f^iA?ps5C#nxM7@9*AzSF@FQjIEGY8FK7L0O9+ysccA15wrT zpjykw1^9YuobwuX2|C;}!#+pIXpY>#f29Y2#D?wdN9D7G|B{fO$`D5Bqg-z^kw3Co zOcl3ovX8yyQo2}l^`uxN)&z9|_T)RT%qC?JM_t&0*41v$O%nnMQiK@xi!6g3udEav`#a zC5MK~mjFW05Olg86ZYSeAsnNGc|2vO;&HeJ*LtPEe=53fNr|q5fuH!raQ(%r*t~YE zi|K+n1B<$6OeuH*%_`Q9dpMY$FOl#kl#~!gWCo`BCVU^rnqRP3yql8;biHz&;hp~w z{6hCEG@5kb7k`m5+-8_-Ki)v6pB}^X+~L(kLxsCU_xK~)nS6nNpwEOu%l1SP%xkqW z-CFxQ)OiP?Uu^x+Mj3zD{Z+_^w3^t0O%zkZj4apAB%%91vb54kXY&vEMT5qhh5Pbb zYMX$6RXBtuf=k{Y_~1Bf(y_IR&SACO4NRWZ{;}`*cd-D!W6!Zd)vGzQgU9}oN$^dv zte4P>c_kr2#ALPB9rRc{YV{v=fI8W*;UVkV@`h?da3nxI@mCQr6OpXw7824@*&{sJ z?T(RfDf8_@5?Rx2b>Cgv2~!fOJGi^*clcjNQk9wp8hffcUH{5pnttxKje~33&gOf} z^|g1mO03%XZ&vAIZpKsSlW;FpJ{8MzP>XxqB<;wws;}SSkp_MYO?VXy{G3Cp0mc^j zCnlU2XP1uvbP~wE5SLMgx){wGQ~X;&s>tKudw4L{pU0^)25vk<1n&KSN`kZ#k4u4= z_Wm-(C<2$fSeY&fjo5GZzgFobuE#@myp?Fx#Fgm%32X=^C_MldgxVF+qFQTWnyNkC zg~kV45-2dwafL121;JnK)+F@z)kzxCY1OaR1;gKLDJnTYSATIjPc#hdrNJxLOgGsh zQt7t!gDt3a%X;-{^izbRUv}Q^CO+iUudq4u=;w{e|h!Ih4;?U2hV9Jct zNf>cW5#YtZ;|Y|mC%(v6A&Kb!Q-3`dHwNC0VE96b47wUel3?^+=scw>uf~<`f>_7DCA|V@b}y z_^*l`Bp0$KnW^f07lJmy>Dx8TnIGpueFpemlYqI~EG}7p^uZ$Q~v=$@#;u)KfdzLm;#7WZa0>`qG zl}D7NPqmDN>))pL*Tevb5Qnk;+?7xUo-ZhxoAF~nQ~a%V+&*^FXi;AMVqFdmXJm%D zp3_jo{3WYZ%tSAMeo+3}Duu5i&~^$1Rl(ksq74y zcJ;4RZOwl$_m03`|C!w)QCZt`i6;jMPu9VhHjCtBVlEH=c>*lM83pJwAk=0U;{Z5R ze6F5GsJ^4DkGW9WQ3x`^5X*TOnRaqDA*rdd-=m1N9l~b8I#xq7AYNuBT!t1ni<(py zMe%4Jf8bInKsHVhIIIAPc&1ZC1U{l9SO=iGAQbUjMUAmM%?MXt1o$pho3lyy?1DSwv9@j=9J^}1y;0C!&7&qF zyixNImRc2MpE1(NK9H`_ctx0WCEK?Z=r4~^t+j--2#z!qwa62-L!Ks$&boGoQHO7R zTpDtYB_!dx2nwOTy-Bd}@@b%~3NqtZoZo+6&dxgmKkiLn!9@+)E1p-mFdQu9F@y>y zKaJX>@)f)tLxvZ3TE}2$00eP7I%v4u9-^uW$=&(1Y+#9pQ7IJCwy6-y3(fw8qWbpb z(3h`vkDo1WKigbBw%NR_)7k0A(~;5M|D8|XogTm1ZRUQqp!K+4W+*W)L$s|4GpMbI z#_|;6w^R<2IvoT3Axqxh9J2+23I#*Ug9FS1Z7t$61P{R~!$nvEBZ;j@0%<$GT5O9X zTM#X9i!sq8!-#p0<|aetr02@}Yn_DZoci5nk$`9X&V313}?Kvf5e@IU1C$7uG+aS911qE!)Q2>hdHesXnI!RwX`WzoRxp_ zZdMw#j3f^1UxSAb<7(->1Yj7!(Kn<7*GfTkObWxA9Yan)P|abZ;`bWBIb1K`8&z*j z>Ab?j1bP&JC@c$rA84hnxgb&)KQO*(=dS6jc#UD;AROdaKCos=xvsRiShq>dU@g0& zq*2cf(auJb|6a0+guBe@n-fioha+I9M^L*E5yVQ`4v8zyUvVeF1l6^_kOF5oiVQ!D zKJOkyisI9-%NzHaE0eVIfHT4cBCL&;adDzZaPjh_YM7gWI9hS#Rs+@y|61MK>lnoc z<<%8kgxc5ql@p+?9LBO5|C5~NY7Ro1)*rKyt*i6@wQb(-Y#w52_?!ku01srU8V^ZxMuaKC+@ z?|<-pKHtwPyWhN1OZf<1}?Gxa9PSJ0bH7SeM9~G zjhc4hy~4B$$qcf6{i>N$^Uqw8rXbte&;9<-VLYD{g8lmal|o}Wfozqb*R5+Br!@f< z+3Zzohxu6t^Y@u6S=RC;= zJ9clwb2N)9pL=+H`qzlA6CTAjVkZ^d?x-0!+^3VUCnTVKy0kZ8`kmbBTcc**`~)pY zd_E!kG~Q@DxS}hFLw%oVN=t>lBxdXb$z~6Tb`U}1Elb6(l8zm~eb$N_1gNn@Q?5Vh z$y}6{`L^=6Q8G?{;UTBFbGss74 ze@TR%_)JhXPg);qIjiRZUZkQ&F5OD&!|)_YcX9vGHUOjPfd@pUmRCDNHHR@Q@F^7w zrSnR#5ivkH>8d7we`OSDfV;5+@4<%~n+>3qhy*hs2dfd5j4;Jgxr4#$fFPw(Ij}(K z2vMZv&vFi05Zaqtg0zgNF|SNk>l!N*t@lVM*t5t_JiJnk!=@jRE5H=q%o(RFhA8?O zIc9nSM4lQ6dAIV2S8N!BCoA}e2l`S+sSFeXI^fMwc0=+Q&bm$+Ev&v{MztMBZMVSFIkN3tc=>zZuf>InScY zD%)Kw2!$j$Fq);T#)?bqZI`cS{!81XYoG_x{+T_L!YcN!eW!h9D7||g`F8QTciQkUO9hhH)+<4JENQWP)%;;Ib zrT`QF8vVNIaO2_p61kRiPx$rX=#p5Os?NQv@*)b{Y@|TnW-@elrf12e7x5kW!kJ%p z`z5I}C;70~{Ps6jO_avb1I%Oj;Y`#5I|6>ymRRRodq1}%G9%Kc{0#J_PQiJ6J!gYc zjC#T$eAn!2|Hr`JjDL*VEXKCUGa};E(w^>@2OAl=UE*e!sHL+{NvVub2g;L#TvEaw zigj-7wg$Ub+y{@(B7T)E#fp8i3KaLKwh!G?He79P6edjCiJ)CKzQ$rqrVvkxtOZP@ z!-oDgH1zP~118!_53*J4#Yrl*+1z<)2IM^x9toiW-Ps=5rBfK2jhgi$5`vi%O*x67 zir#dgaTXR$HHAumR(9=x9uI}Oeh7;$CQQxkMTpD^9zG>+(S>WvfZ7U*A(nK#84*K~7g7RC`99_a#J$#fsJc2`a!vKY*^ianRH~=}# z&zBqSk__g)hol767Id2P#wqJt?9p?}I=5KP-CtM&_D78(e83NEj4_xOZUBh4>SsZW zt^AKPTFoXs&*hnV-?VI8#BNqG{FG*6Fx0rif^6I%zz+hs)CtuZ$j316fb}wr)IlGQxMAZTE$irWX}YW3Z7H%f85gh{kFo!rH=C(-52~Ip zdriflkg0+taZSh<{jSNMS2ej1w9@y8`+MW!ylAsRndQB98hJkE%;=F&%_Y%+F~GW8M7RI?MI(PGdtT0Sbp?VmEL z){MZl$*!CKnT6;~c-oOV_kn|9>XW0!C?;1zRi$^!*Il-rnro8omlC+zP1LwRokizdV86z%6`p^y*`Xh92rwkFGAXdr^kzQy$Bh;(fwlu->&5l#f z-Fs?9Z1c1W>Qi{*4qJxE5v;$4&IQguINojh3tjSd(BGdmHq7$9%PikeGlPs>aXQvj z01tWXn2PIJ0(AoVl=wGQSESfLmj^BpZ9fpzzhDY_nhe7tP;RisWj)vNX7*RmWtoJs zHFwfVvAOwT@OENm!vYRHLy*z6X4e#43l~^2io-c>ZtTMx)ivm_A3Kc9W%hUfY#z6Z zufjTz5-~grj6Q#&DKeX(ZT^Kj)x<$A7g4iHdq&k%bW(bZQf?rcv;*@{rChLD=R{~-= zF(h0KD@m-bxjCTSUXP3mr*fi#Lo>%!WOHTRUVbrG=*0^roUph0ZmtV|X|l(5;5y_=MP8=9fEEQJj^vf=6-0 zPf)STDtX!0`%WEaZ8gn)XZACU9M52v-yR+{g336Ed5QLB&L*%}F<(|$)N4@Luy_t| mFc~#i#FM7^6Q%KrTS86n*`(r;H--B5xikSmcS>_*W%(})St7Ln From 105407438c1320d079726e2a6b3f11d161c4d5c3 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Fri, 12 Nov 2021 18:15:55 +0100 Subject: [PATCH 06/22] feat(commonjs): make namespace callable when requiring ESM with function default (#1038) --- packages/commonjs/README.md | 4 +- packages/commonjs/package.json | 2 +- packages/commonjs/src/dynamic-modules.js | 62 ++- .../commonjs/src/dynamic-require-paths.js | 46 -- packages/commonjs/src/generate-imports.js | 7 +- packages/commonjs/src/helpers.js | 11 +- packages/commonjs/src/index.js | 48 +- packages/commonjs/src/resolve-id.js | 73 +-- .../commonjs/src/resolve-require-sources.js | 18 +- packages/commonjs/src/transform-commonjs.js | 6 +- packages/commonjs/src/utils.js | 10 +- .../function/custom-options/_config.js | 7 - .../dynamic-require-resolve-reference/main.js | 2 +- .../_config.js | 4 + .../esm-constructor.js | 9 + .../esm-function.js | 5 + .../main.js | 19 + .../main.js | 8 + .../function/relative-external/_config.js | 7 + .../function/relative-external/external.js | 1 + .../function/relative-external/main.js | 3 + .../_config.js | 2 +- .../strict-requires-external/_config.js | 18 + .../function/strict-requires-external/main.js | 1 + .../strict-requires-external/other.js | 1 + .../strict-requires-mixed-esm/_config.js | 12 + .../strict-requires-mixed-esm/import.js | 1 + .../strict-requires-mixed-esm/main.js | 6 + .../strict-requires-mixed-esm/require.js | 1 + .../commonjs/test/snapshots/function.js.md | 463 +++++++++++++----- .../commonjs/test/snapshots/function.js.snap | Bin 19636 -> 19932 bytes packages/commonjs/test/snapshots/test.js.md | 10 +- packages/commonjs/test/snapshots/test.js.snap | Bin 757 -> 813 bytes pnpm-lock.yaml | 15 +- 34 files changed, 604 insertions(+), 278 deletions(-) delete mode 100644 packages/commonjs/src/dynamic-require-paths.js create mode 100644 packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/_config.js create mode 100644 packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/esm-constructor.js create mode 100644 packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/esm-function.js create mode 100644 packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/main.js create mode 100755 packages/commonjs/test/fixtures/function/relative-external/_config.js create mode 100755 packages/commonjs/test/fixtures/function/relative-external/external.js create mode 100755 packages/commonjs/test/fixtures/function/relative-external/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-external/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-external/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-external/other.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/import.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/require.js diff --git a/packages/commonjs/README.md b/packages/commonjs/README.md index 715f7e778..9f8724204 100644 --- a/packages/commonjs/README.md +++ b/packages/commonjs/README.md @@ -42,6 +42,8 @@ export default { Then call `rollup` either via the [CLI](https://www.rollupjs.org/guide/en/#command-line-reference) or the [API](https://www.rollupjs.org/guide/en/#javascript-api). +When used together with the node-resolve plugin + ## Options ### `strictRequires` @@ -378,7 +380,7 @@ export default { format: 'iife', name: 'MyModule' }, - plugins: [resolve(), commonjs()] + plugins: [commonjs(), resolve()] }; ``` diff --git a/packages/commonjs/package.json b/packages/commonjs/package.json index 865e1f98f..04afd15db 100644 --- a/packages/commonjs/package.json +++ b/packages/commonjs/package.json @@ -60,7 +60,7 @@ }, "devDependencies": { "@rollup/plugin-json": "^4.1.0", - "@rollup/plugin-node-resolve": "^8.4.0", + "@rollup/plugin-node-resolve": "^13.0.6", "locate-character": "^2.0.5", "require-relative": "^0.8.7", "rollup": "^2.67.3", diff --git a/packages/commonjs/src/dynamic-modules.js b/packages/commonjs/src/dynamic-modules.js index 02b9845f3..272fb1374 100644 --- a/packages/commonjs/src/dynamic-modules.js +++ b/packages/commonjs/src/dynamic-modules.js @@ -1,10 +1,63 @@ +import { existsSync, readFileSync, statSync } from 'fs'; +import { join, resolve } from 'path'; + +import glob from 'glob'; + import { getVirtualPathForDynamicRequirePath, normalizePathSlashes } from './utils'; +function getPackageEntryPoint(dirPath) { + let entryPoint = 'index.js'; + + try { + if (existsSync(join(dirPath, 'package.json'))) { + entryPoint = + JSON.parse(readFileSync(join(dirPath, 'package.json'), { encoding: 'utf8' })).main || + entryPoint; + } + } catch (ignored) { + // ignored + } + + return entryPoint; +} + +function isDirectory(path) { + try { + if (statSync(path).isDirectory()) return true; + } catch (ignored) { + // Nothing to do here + } + return false; +} + +export function getDynamicRequireModules(patterns) { + const dynamicRequireModules = new Map(); + for (const pattern of !patterns || Array.isArray(patterns) ? patterns || [] : [patterns]) { + const isNegated = pattern.startsWith('!'); + const modifyMap = (targetPath, resolvedPath) => + isNegated + ? dynamicRequireModules.delete(targetPath) + : dynamicRequireModules.set(targetPath, resolvedPath); + for (const path of glob.sync(isNegated ? pattern.substr(1) : pattern)) { + const resolvedPath = resolve(path); + const requirePath = normalizePathSlashes(resolvedPath); + if (isDirectory(resolvedPath)) { + const modulePath = resolve(join(resolvedPath, getPackageEntryPoint(path))); + modifyMap(requirePath, modulePath); + modifyMap(normalizePathSlashes(modulePath), modulePath); + } else { + modifyMap(requirePath, resolvedPath); + } + } + } + return 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.');`; -export function getDynamicRequireModules( +export function getDynamicModuleRegistry( isDynamicRequireModulesEnabled, - dynamicRequireModuleSet, + dynamicRequireModules, commonDir, ignoreDynamicRequires ) { @@ -13,8 +66,7 @@ export function getDynamicRequireModules( ${FAILED_REQUIRE_ERROR} }`; } - const dynamicModuleIds = [...dynamicRequireModuleSet]; - const dynamicModuleImports = dynamicModuleIds + const dynamicModuleImports = [...dynamicRequireModules.values()] .map( (id, index) => `import ${ @@ -22,7 +74,7 @@ export function getDynamicRequireModules( } from ${JSON.stringify(id)};` ) .join('\n'); - const dynamicModuleProps = dynamicModuleIds + const dynamicModuleProps = [...dynamicRequireModules.keys()] .map( (id, index) => `\t\t${JSON.stringify( diff --git a/packages/commonjs/src/dynamic-require-paths.js b/packages/commonjs/src/dynamic-require-paths.js deleted file mode 100644 index 849ab1a9e..000000000 --- a/packages/commonjs/src/dynamic-require-paths.js +++ /dev/null @@ -1,46 +0,0 @@ -import { existsSync, readFileSync, statSync } from 'fs'; -import { join, resolve } from 'path'; - -import glob from 'glob'; - -import { normalizePathSlashes } from './utils'; - -function getPackageEntryPoint(dirPath) { - let entryPoint = 'index.js'; - - try { - if (existsSync(join(dirPath, 'package.json'))) { - entryPoint = - JSON.parse(readFileSync(join(dirPath, 'package.json'), { encoding: 'utf8' })).main || - entryPoint; - } - } catch (ignored) { - // ignored - } - - return entryPoint; -} - -function isDirectory(path) { - try { - if (statSync(path).isDirectory()) return true; - } catch (ignored) { - // Nothing to do here - } - return false; -} - -export default function getDynamicRequireModuleSet(patterns) { - const dynamicRequireModuleSet = new Set(); - for (const pattern of !patterns || Array.isArray(patterns) ? patterns || [] : [patterns]) { - const isNegated = pattern.startsWith('!'); - const modifySet = Set.prototype[isNegated ? 'delete' : 'add'].bind(dynamicRequireModuleSet); - for (const path of glob.sync(isNegated ? pattern.substr(1) : pattern)) { - modifySet(normalizePathSlashes(resolve(path))); - if (isDirectory(path)) { - modifySet(normalizePathSlashes(resolve(join(path, getPackageEntryPoint(path))))); - } - } - } - return dynamicRequireModuleSet; -} diff --git a/packages/commonjs/src/generate-imports.js b/packages/commonjs/src/generate-imports.js index e90152d36..34f66e518 100644 --- a/packages/commonjs/src/generate-imports.js +++ b/packages/commonjs/src/generate-imports.js @@ -68,11 +68,11 @@ export function getRequireStringArg(node) { : node.arguments[0].quasis[0].value.cooked; } -export function hasDynamicModuleForPath(source, id, dynamicRequireModuleSet) { +export function hasDynamicModuleForPath(source, id, dynamicRequireModules) { if (!/^(?:\.{0,2}[/\\]|[A-Za-z]:[/\\])/.test(source)) { try { const resolvedPath = normalizePathSlashes(nodeResolveSync(source, { basedir: dirname(id) })); - if (dynamicRequireModuleSet.has(resolvedPath)) { + if (dynamicRequireModules.has(resolvedPath)) { return true; } } catch (ex) { @@ -85,7 +85,7 @@ export function hasDynamicModuleForPath(source, id, dynamicRequireModuleSet) { for (const attemptExt of ['', '.js', '.json']) { const resolvedPath = normalizePathSlashes(resolve(dirname(id), source + attemptExt)); - if (dynamicRequireModuleSet.has(resolvedPath)) { + if (dynamicRequireModules.has(resolvedPath)) { return true; } } @@ -119,6 +119,7 @@ export function getRequireHandlers() { const imports = []; imports.push(`import * as ${helpersName} from "${HELPERS_ID}";`); if (usesRequire) { + // TODO Lukas check where to import it from or change to usesDynamicRequire imports.push( `import { commonjsRequire as ${dynamicRequireName} } from "${DYNAMIC_MODULES_ID}";` ); diff --git a/packages/commonjs/src/helpers.js b/packages/commonjs/src/helpers.js index fe080ee0e..d2906ecf5 100644 --- a/packages/commonjs/src/helpers.js +++ b/packages/commonjs/src/helpers.js @@ -3,6 +3,7 @@ export const wrapId = (id, suffix) => `\0${id}${suffix}`; export const unwrapId = (wrappedId, suffix) => wrappedId.slice(1, -suffix.length); export const PROXY_SUFFIX = '?commonjs-proxy'; +export const WRAPPED_SUFFIX = '?commonjs-wrapped'; export const EXTERNAL_SUFFIX = '?commonjs-external'; export const EXPORTS_SUFFIX = '?commonjs-exports'; export const MODULE_SUFFIX = '?commonjs-module'; @@ -33,8 +34,14 @@ export function getDefaultExportFromNamespaceIfNotNamed (n) { } export function getAugmentedNamespace(n) { - if (n.__esModule) return n; - var a = Object.defineProperty({}, '__esModule', {value: true}); + var f = n.default; + if (typeof f == "function") { + var a = function () { + return f.apply(this, arguments); + }; + a.prototype = f.prototype; + } else a = {}; + Object.defineProperty(a, '__esModule', {value: true}); Object.keys(n).forEach(function (k) { var d = Object.getOwnPropertyDescriptor(n, k); Object.defineProperty(a, k, d.get ? d : { diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index 53be16678..fe73d0f8d 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -6,9 +6,8 @@ import getCommonDir from 'commondir'; import { peerDependencies } from '../package.json'; import analyzeTopLevelStatements from './analyze-top-level-statements'; -import { getDynamicRequireModules } from './dynamic-modules'; +import { getDynamicModuleRegistry, getDynamicRequireModules } from './dynamic-modules'; -import getDynamicRequireModuleSet from './dynamic-require-paths'; import { DYNAMIC_MODULES_ID, ES_IMPORT_SUFFIX, @@ -65,10 +64,11 @@ export default function commonjs(options = {}) { getWrappedIds, isRequiredId } = getResolveRequireSourcesAndGetMeta(extensions, detectCycles); - const dynamicRequireModuleSet = getDynamicRequireModuleSet(options.dynamicRequireTargets); - const isDynamicRequireModulesEnabled = dynamicRequireModuleSet.size > 0; + const dynamicRequireModules = getDynamicRequireModules(options.dynamicRequireTargets); + const isDynamicRequireModulesEnabled = dynamicRequireModules.size > 0; + // TODO Lukas do we need the CWD? const commonDir = isDynamicRequireModulesEnabled - ? getCommonDir(null, Array.from(dynamicRequireModuleSet).concat(process.cwd())) + ? getCommonDir(null, Array.from(dynamicRequireModules.keys()).concat(process.cwd())) : null; const esModulesWithDefaultExport = new Set(); @@ -115,7 +115,7 @@ export default function commonjs(options = {}) { } if ( - !dynamicRequireModuleSet.has(normalizePathSlashes(id)) && + !dynamicRequireModules.has(normalizePathSlashes(id)) && (!(hasCjsKeywords(code, ignoreGlobal) || isRequiredId(id)) || (isEsModule && !options.transformMixedEsModules)) ) { @@ -124,7 +124,7 @@ export default function commonjs(options = {}) { const needsRequireWrapper = !isEsModule && - (dynamicRequireModuleSet.has(normalizePathSlashes(id)) || strictRequiresFilter(id)); + (dynamicRequireModules.has(normalizePathSlashes(id)) || strictRequiresFilter(id)); return transformCommonjs( this.parse, @@ -137,7 +137,7 @@ export default function commonjs(options = {}) { getIgnoreTryCatchRequireStatementMode, sourceMap, isDynamicRequireModulesEnabled, - dynamicRequireModuleSet, + dynamicRequireModules, commonDir, ast, getDefaultIsModuleExports(id), @@ -150,18 +150,19 @@ export default function commonjs(options = {}) { return { name: 'commonjs', - options(options) { - // Always sort the node-resolve plugin after the commonjs plugin as otherwise CommonJS entries - // will not work with strictRequires: true - const { plugins } = options; - if (Array.isArray(plugins)) { - const cjsIndex = plugins.findIndex((plugin) => plugin.name === 'commonjs'); - const nodeResolveIndex = plugins.findIndex((plugin) => plugin.name === 'node-resolve'); - if (nodeResolveIndex >= 0 && nodeResolveIndex < cjsIndex) { - plugins.splice(cjsIndex + 1, 0, plugins[nodeResolveIndex]); - plugins.splice(nodeResolveIndex, 1); - } - } + options(rawOptions) { + // We inject the resolver in the beginning so that "catch-all-resolver" like node-resolver + // do not prevent our plugin from resolving entry points ot proxies. + const plugins = Array.isArray(rawOptions.plugins) + ? rawOptions.plugins + : rawOptions.plugins + ? [rawOptions.plugins] + : []; + plugins.unshift({ + name: 'commonjs--resolver', + resolveId + }); + return { ...rawOptions, plugins }; }, buildStart() { @@ -185,7 +186,6 @@ export default function commonjs(options = {}) { .join(',\n')}\n]` }); } else { - // TODO Lukas test this.warn({ code: 'WRAPPED_IDS', ids: wrappedIds, @@ -195,8 +195,6 @@ export default function commonjs(options = {}) { } }, - resolveId, - load(id) { if (id === HELPERS_ID) { return getHelpersModule(); @@ -232,9 +230,9 @@ export default function commonjs(options = {}) { } if (id === DYNAMIC_MODULES_ID) { - return getDynamicRequireModules( + return getDynamicModuleRegistry( isDynamicRequireModulesEnabled, - dynamicRequireModuleSet, + dynamicRequireModules, commonDir, ignoreDynamicRequires ); diff --git a/packages/commonjs/src/resolve-id.js b/packages/commonjs/src/resolve-id.js index d87309bc7..c7d3844a9 100644 --- a/packages/commonjs/src/resolve-id.js +++ b/packages/commonjs/src/resolve-id.js @@ -13,7 +13,9 @@ import { isWrappedId, MODULE_SUFFIX, PROXY_SUFFIX, - wrapId + unwrapId, + wrapId, + WRAPPED_SUFFIX } from './helpers'; function getCandidatesForExtension(resolved, extension) { @@ -48,58 +50,65 @@ export function resolveExtensions(importee, importer, extensions) { export default function getResolveId(extensions) { return async function resolveId(importee, importer, resolveOptions) { + if (isWrappedId(importee, WRAPPED_SUFFIX)) { + return unwrapId(importee, WRAPPED_SUFFIX); + } + if ( isWrappedId(importee, MODULE_SUFFIX) || isWrappedId(importee, EXPORTS_SUFFIX) || isWrappedId(importee, PROXY_SUFFIX) || isWrappedId(importee, ES_IMPORT_SUFFIX) || - isWrappedId(importee, EXTERNAL_SUFFIX) + isWrappedId(importee, EXTERNAL_SUFFIX) || + importee.startsWith(HELPERS_ID) || + importee === DYNAMIC_MODULES_ID ) { return importee; } - // Except for exports, proxies are only importing resolved ids, - // no need to resolve again - if ( - importer && - (importer === DYNAMIC_MODULES_ID || + if (importer) { + if ( + importer === DYNAMIC_MODULES_ID || + // Except for exports, proxies are only importing resolved ids, no need to resolve again isWrappedId(importer, PROXY_SUFFIX) || - isWrappedId(importer, ES_IMPORT_SUFFIX)) - ) { - return importee; + isWrappedId(importer, ES_IMPORT_SUFFIX) + ) { + return importee; + } + if (isWrappedId(importer, EXTERNAL_SUFFIX)) { + // We need to return null for unresolved imports so that the proper warning is shown + if (!(await this.resolve(importee, importer, { skipSelf: true }))) { + return null; + } + // For other external imports, we need to make sure they are handled as external + return { id: importee, external: true }; + } } - if (importee.startsWith(HELPERS_ID) || importee === DYNAMIC_MODULES_ID) { - return importee; + if (importee.startsWith('\0')) { + return null; } - if (importee.startsWith('\0')) { + // If this is an entry point or ESM import, we need to figure out if the importee is wrapped and + // if that is the case, we need to add a proxy. + const customOptions = resolveOptions.custom; + + // If this is a require, we do not need a proxy + if (customOptions && customOptions['node-resolve'] && customOptions['node-resolve'].isRequire) { return null; } const resolved = (await this.resolve(importee, importer, Object.assign({ skipSelf: true }, resolveOptions))) || resolveExtensions(importee, importer, extensions); - let isCommonJsImporter = false; - if (importer) { - const moduleInfo = this.getModuleInfo(importer); - if (moduleInfo) { - const importerCommonJsMeta = moduleInfo.meta.commonjs; - if ( - importerCommonJsMeta && - (importerCommonJsMeta.isCommonJS || importerCommonJsMeta.isMixedModule) - ) { - isCommonJsImporter = true; - } - } + if (!resolved || resolved.external) { + return resolved; } - if (resolved && !isCommonJsImporter) { - const { - meta: { commonjs: commonjsMeta } - } = await this.load(resolved); - if (commonjsMeta && commonjsMeta.isCommonJS === IS_WRAPPED_COMMONJS) { - return wrapId(resolved.id, ES_IMPORT_SUFFIX); - } + const { + meta: { commonjs: commonjsMeta } + } = await this.load(resolved); + if (commonjsMeta && commonjsMeta.isCommonJS === IS_WRAPPED_COMMONJS) { + return wrapId(resolved.id, ES_IMPORT_SUFFIX); } return resolved; }; diff --git a/packages/commonjs/src/resolve-require-sources.js b/packages/commonjs/src/resolve-require-sources.js index 08b0de297..78f0af4d0 100644 --- a/packages/commonjs/src/resolve-require-sources.js +++ b/packages/commonjs/src/resolve-require-sources.js @@ -1,4 +1,10 @@ -import { EXTERNAL_SUFFIX, IS_WRAPPED_COMMONJS, PROXY_SUFFIX, wrapId } from './helpers'; +import { + EXTERNAL_SUFFIX, + IS_WRAPPED_COMMONJS, + PROXY_SUFFIX, + wrapId, + WRAPPED_SUFFIX +} from './helpers'; import { resolveExtensions } from './resolve-id'; export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { @@ -24,7 +30,6 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { } const resolved = (await rollupContext.resolve(source, id, { - skipSelf: true, custom: { 'node-resolve': { isRequire: true } } @@ -69,10 +74,11 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { const isCommonJS = knownCjsModuleTypes[dependencyId]; return { source: sources[index], - id: - allowProxy && isCommonJS !== IS_WRAPPED_COMMONJS - ? wrapId(dependencyId, PROXY_SUFFIX) - : dependencyId, + id: allowProxy + ? isCommonJS === IS_WRAPPED_COMMONJS + ? wrapId(dependencyId, WRAPPED_SUFFIX) + : wrapId(dependencyId, PROXY_SUFFIX) + : dependencyId, isCommonJS }; }), diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index c6cfbdc1a..f0c43c362 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -46,7 +46,7 @@ export default async function transformCommonjs( getIgnoreTryCatchRequireStatementMode, sourceMap, isDynamicRequireModulesEnabled, - dynamicRequireModuleSet, + dynamicRequireModules, commonDir, astCache, defaultIsModuleExports, @@ -195,7 +195,7 @@ export default async function transformCommonjs( node.callee.object && node.callee.object.name === 'require' && node.callee.property.name === 'resolve' && - hasDynamicModuleForPath(id, '/', dynamicRequireModuleSet) + hasDynamicModuleForPath(id, '/', dynamicRequireModules) ) { // TODO Lukas reimplement? uses.require = true; @@ -288,7 +288,7 @@ export default async function transformCommonjs( uses.require = true; if (isNodeRequirePropertyAccess(parent)) { // TODO Lukas reimplement? - if (hasDynamicModuleForPath(id, '/', dynamicRequireModuleSet)) { + if (hasDynamicModuleForPath(id, '/', dynamicRequireModules)) { if (parent.property.name === 'cache') { magicString.overwrite(node.start, node.end, dynamicRequireName, { storeName: true diff --git a/packages/commonjs/src/utils.js b/packages/commonjs/src/utils.js index d66765c93..baee15948 100644 --- a/packages/commonjs/src/utils.js +++ b/packages/commonjs/src/utils.js @@ -34,14 +34,8 @@ export function normalizePathSlashes(path) { return path.replace(/\\/g, '/'); } -// TODO Lukas get rid of this? -const VIRTUAL_PATH_BASE = '/$$rollup_base$$'; -export const getVirtualPathForDynamicRequirePath = (path, commonDir) => { - const normalizedPath = normalizePathSlashes(path); - return normalizedPath.startsWith(commonDir) - ? VIRTUAL_PATH_BASE + normalizedPath.slice(commonDir.length) - : normalizedPath; -}; +export const getVirtualPathForDynamicRequirePath = (path, commonDir) => + normalizePathSlashes(path).slice(commonDir.length); export function capitalize(name) { return name[0].toUpperCase() + name.slice(1); diff --git a/packages/commonjs/test/fixtures/function/custom-options/_config.js b/packages/commonjs/test/fixtures/function/custom-options/_config.js index 522f2c94a..ebbb4a496 100644 --- a/packages/commonjs/test/fixtures/function/custom-options/_config.js +++ b/packages/commonjs/test/fixtures/function/custom-options/_config.js @@ -18,13 +18,6 @@ module.exports = { buildEnd() { assert.deepStrictEqual(resolveIdArgs, [ ['other.js', 'main.js', { custom: { test: 42 }, isEntry: true }], - [ - 'other.js', - 'main.js', - // This is the important one - { custom: { test: 42 }, isEntry: true } - ], - ['main.js', void 0, { custom: {}, isEntry: true }], ['main.js', void 0, { custom: {}, isEntry: true }] ]); }, 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 5dcdc0b90..a30e03d98 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,4 +1,4 @@ t.is( require('custom-module2')(), - '/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module' + '/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module' ); diff --git a/packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/_config.js b/packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/_config.js new file mode 100644 index 000000000..7891cab61 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/_config.js @@ -0,0 +1,4 @@ +module.exports = { + description: + 'allows accessing function default exports as require return value even when there are named exports' +}; diff --git a/packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/esm-constructor.js b/packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/esm-constructor.js new file mode 100644 index 000000000..da6746c02 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/esm-constructor.js @@ -0,0 +1,9 @@ +export default function Foo(...args) { + this.foo = args; +} + +Foo.prototype.update = function () { + this.foo = 'updated'; +}; + +export const bar = 'bar'; diff --git a/packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/esm-function.js b/packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/esm-function.js new file mode 100644 index 000000000..b9b50f89f --- /dev/null +++ b/packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/esm-function.js @@ -0,0 +1,5 @@ +export default function foo(...args) { + return args; +} + +export const bar = 'bar'; diff --git a/packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/main.js b/packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/main.js new file mode 100644 index 000000000..fc760a469 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/esm-mixed-exports-function-default/main.js @@ -0,0 +1,19 @@ +const foo = require('./esm-function.js'); +const Foo = require('./esm-constructor.js'); + +t.is(foo.bar, 'bar'); +t.deepEqual(foo.default('first'), ['first']); +t.deepEqual(foo('second'), ['second']); + +t.is(Foo.bar, 'bar'); + +// eslint-disable-next-line new-cap +const newDefault = new Foo.default('third'); +t.deepEqual(newDefault.foo, ['third']); +newDefault.update(); +t.is(newDefault.foo, 'updated'); + +const newFoo = new Foo('fourth'); +t.deepEqual(newFoo.foo, ['fourth']); +newFoo.update(); +t.is(newFoo.foo, 'updated'); diff --git a/packages/commonjs/test/fixtures/function/import-esm-require-returns-default-false/main.js b/packages/commonjs/test/fixtures/function/import-esm-require-returns-default-false/main.js index 658db2cdd..67b995725 100644 --- a/packages/commonjs/test/fixtures/function/import-esm-require-returns-default-false/main.js +++ b/packages/commonjs/test/fixtures/function/import-esm-require-returns-default-false/main.js @@ -14,3 +14,11 @@ t.deepEqual(noExports, {}, 'no exports'); t.deepEqual(externalNamed, { foo: 'foo' }, 'external named'); t.deepEqual(externalMixed, { foo: 'foo', default: 'bar' }, 'external mixed'); t.deepEqual(externalDefault, { default: 'bar' }, 'external default'); + +/* eslint-disable no-prototype-builtins */ +t.is(namedExports.hasOwnProperty('foo'), true); +t.is(mixedExports.hasOwnProperty('foo'), true); +t.is(defaultExport.hasOwnProperty('foo'), false); +t.is(externalNamed.hasOwnProperty('foo'), true); +t.is(externalMixed.hasOwnProperty('foo'), true); +t.is(externalDefault.hasOwnProperty('foo'), false); diff --git a/packages/commonjs/test/fixtures/function/relative-external/_config.js b/packages/commonjs/test/fixtures/function/relative-external/_config.js new file mode 100755 index 000000000..620b6e4d4 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/relative-external/_config.js @@ -0,0 +1,7 @@ +module.exports = { + description: 'allows treating relative requires as external', + options: { + // This import needs to be relative to /test/helpers/util.js + external: ['../fixtures/function/relative-external/external.js'] + } +}; diff --git a/packages/commonjs/test/fixtures/function/relative-external/external.js b/packages/commonjs/test/fixtures/function/relative-external/external.js new file mode 100755 index 000000000..94ecacb72 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/relative-external/external.js @@ -0,0 +1 @@ +exports.foo = 'foo'; diff --git a/packages/commonjs/test/fixtures/function/relative-external/main.js b/packages/commonjs/test/fixtures/function/relative-external/main.js new file mode 100755 index 000000000..e495f65f1 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/relative-external/main.js @@ -0,0 +1,3 @@ +const { foo } = require('../fixtures/function/relative-external/external.js'); + +t.is(foo, 'foo'); diff --git a/packages/commonjs/test/fixtures/function/strict-requires-entry-node-resolve/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-entry-node-resolve/_config.js index d5ae8bbb1..327d47b1a 100644 --- a/packages/commonjs/test/fixtures/function/strict-requires-entry-node-resolve/_config.js +++ b/packages/commonjs/test/fixtures/function/strict-requires-entry-node-resolve/_config.js @@ -15,7 +15,7 @@ module.exports = { buildStart({ plugins }) { assert.deepStrictEqual( plugins.map((plugin) => plugin.name), - ['before-node', 'after-node', 'commonjs', 'node-resolve'] + ['commonjs--resolver', 'before-node', 'node-resolve', 'after-node', 'commonjs'] ); } }, diff --git a/packages/commonjs/test/fixtures/function/strict-requires-external/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-external/_config.js new file mode 100644 index 000000000..d16da2049 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-external/_config.js @@ -0,0 +1,18 @@ +module.exports = { + description: 'still does not wrap external dependencies with strict require semantic', + pluginOptions: { + strictRequires: true + }, + options: { + plugins: [ + { + resolveId(source) { + if (source === 'external') { + return { id: 'external', external: true }; + } + return null; + } + } + ] + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-requires-external/main.js b/packages/commonjs/test/fixtures/function/strict-requires-external/main.js new file mode 100644 index 000000000..a657096b0 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-external/main.js @@ -0,0 +1 @@ +t.is(require('external').message, 'it works'); diff --git a/packages/commonjs/test/fixtures/function/strict-requires-external/other.js b/packages/commonjs/test/fixtures/function/strict-requires-external/other.js new file mode 100644 index 000000000..fbe0d2a97 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-external/other.js @@ -0,0 +1 @@ +exports.foo = require('./main.js').foo; diff --git a/packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/_config.js new file mode 100644 index 000000000..033c7379f --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/_config.js @@ -0,0 +1,12 @@ +const { nodeResolve } = require('@rollup/plugin-node-resolve'); + +module.exports = { + description: 'supports strictRequires with mixed ESM', + pluginOptions: { + strictRequires: true, + transformMixedEsModules: true + }, + options: { + plugins: [nodeResolve()] + } +}; diff --git a/packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/import.js b/packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/import.js new file mode 100644 index 000000000..94ecacb72 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/import.js @@ -0,0 +1 @@ +exports.foo = 'foo'; diff --git a/packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/main.js b/packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/main.js new file mode 100644 index 000000000..89c777a42 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/main.js @@ -0,0 +1,6 @@ +import esm from './import.js'; + +const cjs = require('./require.js'); + +t.is(esm.foo, 'foo'); +t.is(cjs.foo, 'foo'); diff --git a/packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/require.js b/packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/require.js new file mode 100644 index 000000000..94ecacb72 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-mixed-esm/require.js @@ -0,0 +1 @@ +exports.foo = 'foo'; diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index 260d58e48..e09892341 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -370,7 +370,7 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require/submodule.js": requireSubmodule␊ + "/fixtures/function/dynamic-require/submodule.js": requireSubmodule␊ });␊ }␊ ␊ @@ -483,7 +483,7 @@ Generated by [AVA](https://avajs.dev). let message;␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`, "/$$rollup_base$$/fixtures/function/dynamic-require");␊ + return commonjsRequire(`./${withName}`, "/fixtures/function/dynamic-require");␊ }␊ ␊ try {␊ @@ -540,9 +540,9 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-absolute-import/sub/node_modules/module/direct.js": requireDirect,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-absolute-import/sub/node_modules/module/nested/nested.js": requireNested,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-absolute-import/node_modules/parent-module/parent.js": requireParent␊ + "/fixtures/function/dynamic-require-absolute-import/sub/node_modules/module/direct.js": requireDirect,␊ + "/fixtures/function/dynamic-require-absolute-import/sub/node_modules/module/nested/nested.js": requireNested,␊ + "/fixtures/function/dynamic-require-absolute-import/node_modules/parent-module/parent.js": requireParent␊ });␊ }␊ ␊ @@ -655,7 +655,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(name) {␊ - return commonjsRequire(name, "/$$rollup_base$$/fixtures/function/dynamic-require-absolute-import/sub");␊ + return commonjsRequire(name, "/fixtures/function/dynamic-require-absolute-import/sub");␊ }␊ ␊ submodule.moduleDirect = takeModule('module/direct');␊ @@ -705,8 +705,8 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-code-splitting/target1.js": requireTarget1,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-code-splitting/target2.js": requireTarget2␊ + "/fixtures/function/dynamic-require-code-splitting/target1.js": requireTarget1,␊ + "/fixtures/function/dynamic-require-code-splitting/target2.js": requireTarget2␊ });␊ }␊ ␊ @@ -818,7 +818,7 @@ Generated by [AVA](https://avajs.dev). ␊ for (const index of [1, 2]) {␊ try {␊ - message = commonjsRequire(`./target${index}.js`, "/$$rollup_base$$/fixtures/function/dynamic-require-code-splitting");␊ + message = commonjsRequire(`./target${index}.js`, "/fixtures/function/dynamic-require-code-splitting");␊ } catch (err) {␊ ({ message } = err);␊ }␊ @@ -837,7 +837,7 @@ Generated by [AVA](https://avajs.dev). ␊ for (const index of [1, 2]) {␊ try {␊ - message = lib2.commonjsRequire(`./target${index}.js`, "/$$rollup_base$$/fixtures/function/dynamic-require-code-splitting");␊ + message = lib2.commonjsRequire(`./target${index}.js`, "/fixtures/function/dynamic-require-code-splitting");␊ } catch (err) {␊ ({ message } = err);␊ }␊ @@ -899,7 +899,7 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-es-entry/submodule.js": requireSubmodule␊ + "/fixtures/function/dynamic-require-es-entry/submodule.js": requireSubmodule␊ });␊ }␊ ␊ @@ -1008,7 +1008,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`, "/$$rollup_base$$/fixtures/function/dynamic-require-es-entry");␊ + return commonjsRequire(`./${withName}`, "/fixtures/function/dynamic-require-es-entry");␊ }␊ ␊ var importer = takeModule('submodule.js');␊ @@ -1072,7 +1072,7 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-extensions/submodule.js": requireSubmodule␊ + "/fixtures/function/dynamic-require-extensions/submodule.js": requireSubmodule␊ });␊ }␊ ␊ @@ -1183,7 +1183,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`, "/$$rollup_base$$/fixtures/function/dynamic-require-extensions");␊ + return commonjsRequire(`./${withName}`, "/fixtures/function/dynamic-require-extensions");␊ }␊ ␊ const withExtension = takeModule('submodule.js');␊ @@ -1286,9 +1286,9 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-globs/submodule1.js": requireSubmodule1,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-globs/submodule2.js": requireSubmodule2,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-globs/extramodule1.js": requireExtramodule1␊ + "/fixtures/function/dynamic-require-globs/submodule1.js": requireSubmodule1,␊ + "/fixtures/function/dynamic-require-globs/submodule2.js": requireSubmodule2,␊ + "/fixtures/function/dynamic-require-globs/extramodule1.js": requireExtramodule1␊ });␊ }␊ ␊ @@ -1399,7 +1399,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`, "/$$rollup_base$$/fixtures/function/dynamic-require-globs");␊ + return commonjsRequire(`./${withName}`, "/fixtures/function/dynamic-require-globs");␊ }␊ ␊ t.is(takeModule('submodule1.js'), 'submodule1');␊ @@ -1445,10 +1445,10 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-instances/direct": requireDirect,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-instances/direct/index.js": requireDirect,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-instances/package": requireMain,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-instances/package/main.js": requireMain␊ + "/fixtures/function/dynamic-require-instances/direct": requireDirect,␊ + "/fixtures/function/dynamic-require-instances/direct/index.js": requireDirect,␊ + "/fixtures/function/dynamic-require-instances/package": requireMain,␊ + "/fixtures/function/dynamic-require-instances/package/main.js": requireMain␊ });␊ }␊ ␊ @@ -1559,7 +1559,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(withName, "/$$rollup_base$$/fixtures/function/dynamic-require-instances");␊ + return commonjsRequire(withName, "/fixtures/function/dynamic-require-instances");␊ }␊ ␊ takeModule('./direct').value = 'direct-instance';␊ @@ -1590,7 +1590,7 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-json/dynamic.json": function () { return json0; }␊ + "/fixtures/function/dynamic-require-json/dynamic.json": function () { return json0; }␊ });␊ }␊ ␊ @@ -1701,7 +1701,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`, "/$$rollup_base$$/fixtures/function/dynamic-require-json");␊ + return commonjsRequire(`./${withName}`, "/fixtures/function/dynamic-require-json");␊ }␊ ␊ t.deepEqual(takeModule('dynamic.json'), { value: 'present' });␊ @@ -1780,12 +1780,12 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-package": requireEntry$2,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-package/entry.js": requireEntry$2,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-package/sub": requireEntry$1,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-package/sub/entry.js": requireEntry$1,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-package/node_modules/custom-module": requireEntry,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-package/node_modules/custom-module/entry.js": requireEntry␊ + "/fixtures/function/dynamic-require-package": requireEntry$2,␊ + "/fixtures/function/dynamic-require-package/entry.js": requireEntry$2,␊ + "/fixtures/function/dynamic-require-package/sub": requireEntry$1,␊ + "/fixtures/function/dynamic-require-package/sub/entry.js": requireEntry$1,␊ + "/fixtures/function/dynamic-require-package/node_modules/custom-module": requireEntry,␊ + "/fixtures/function/dynamic-require-package/node_modules/custom-module/entry.js": requireEntry␊ });␊ }␊ ␊ @@ -1896,7 +1896,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule$1(name) {␊ - return commonjsRequire(name, "/$$rollup_base$$/fixtures/function/dynamic-require-package/sub");␊ + return commonjsRequire(name, "/fixtures/function/dynamic-require-package/sub");␊ }␊ ␊ var sub = {␊ @@ -1907,7 +1907,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(name) {␊ - return commonjsRequire(name, "/$$rollup_base$$/fixtures/function/dynamic-require-package");␊ + return commonjsRequire(name, "/fixtures/function/dynamic-require-package");␊ }␊ ␊ t.is(takeModule('.'), 'same-directory');␊ @@ -1979,8 +1979,8 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-relative-paths/sub/submodule.js": requireSubmodule,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-relative-paths/sub/subsub/subsubmodule.js": requireSubsubmodule␊ + "/fixtures/function/dynamic-require-relative-paths/sub/submodule.js": requireSubmodule,␊ + "/fixtures/function/dynamic-require-relative-paths/sub/subsub/subsubmodule.js": requireSubsubmodule␊ });␊ }␊ ␊ @@ -2091,7 +2091,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModuleWithDelimiter(name, delimiter) {␊ - return commonjsRequire(`.${delimiter}${name.replace(/=/g, delimiter)}`, "/$$rollup_base$$/fixtures/function/dynamic-require-relative-paths");␊ + return commonjsRequire(`.${delimiter}${name.replace(/=/g, delimiter)}`, "/fixtures/function/dynamic-require-relative-paths");␊ }␊ ␊ t.is(takeModuleWithDelimiter('sub=submodule.js', '/'), 'submodule');␊ @@ -2144,12 +2144,12 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index": requireDynamicRequireResolveIndex,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/index.js": requireDynamicRequireResolveIndex,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/sub": requireSub,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/sub/index.js": requireSub,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/node_modules/custom-module": requireCustomModule,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/node_modules/custom-module/index.js": requireCustomModule␊ + "/fixtures/function/dynamic-require-resolve-index": requireDynamicRequireResolveIndex,␊ + "/fixtures/function/dynamic-require-resolve-index/index.js": requireDynamicRequireResolveIndex,␊ + "/fixtures/function/dynamic-require-resolve-index/sub": requireSub,␊ + "/fixtures/function/dynamic-require-resolve-index/sub/index.js": requireSub,␊ + "/fixtures/function/dynamic-require-resolve-index/node_modules/custom-module": requireCustomModule,␊ + "/fixtures/function/dynamic-require-resolve-index/node_modules/custom-module/index.js": requireCustomModule␊ });␊ }␊ ␊ @@ -2260,7 +2260,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule$1(name) {␊ - return commonjsRequire(name, "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index/sub");␊ + return commonjsRequire(name, "/fixtures/function/dynamic-require-resolve-index/sub");␊ }␊ ␊ var sub = {␊ @@ -2271,7 +2271,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(name) {␊ - return commonjsRequire(name, "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-index");␊ + return commonjsRequire(name, "/fixtures/function/dynamic-require-resolve-index");␊ }␊ ␊ t.is(takeModule('.'), 'same-directory');␊ @@ -2313,7 +2313,7 @@ Generated by [AVA](https://avajs.dev). if (hasRequiredCustomModule2) return customModule2;␊ hasRequiredCustomModule2 = 1;␊ customModule2 = () => {␊ - return commonjsRequire.resolve('custom-module',"/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2");␊ + return commonjsRequire.resolve('custom-module',"/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2");␊ };␊ return customModule2;␊ }␊ @@ -2322,10 +2322,10 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module": requireCustomModule,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module/index.js": requireCustomModule,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2": requireCustomModule2,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2/index.js": requireCustomModule2␊ + "/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module": requireCustomModule,␊ + "/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module/index.js": requireCustomModule,␊ + "/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2": requireCustomModule2,␊ + "/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2/index.js": requireCustomModule2␊ });␊ }␊ ␊ @@ -2435,7 +2435,7 @@ Generated by [AVA](https://avajs.dev). ␊ t.is(␊ requireCustomModule2()(),␊ - '/$$rollup_base$$/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module'␊ + '/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module'␊ );␊ ␊ module.exports = main;␊ @@ -2556,13 +2556,13 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access": requireDynamicRequireSlashAccess,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/index.js": requireDynamicRequireSlashAccess,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/sub": requireSub$1,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/sub/index.js": requireSub$1,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/node_modules/custom-module": requireCustomModule,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/node_modules/custom-module/index.js": requireCustomModule,␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/node_modules/custom-module2/sub.js": requireSub␊ + "/fixtures/function/dynamic-require-slash-access": requireDynamicRequireSlashAccess,␊ + "/fixtures/function/dynamic-require-slash-access/index.js": requireDynamicRequireSlashAccess,␊ + "/fixtures/function/dynamic-require-slash-access/sub": requireSub$1,␊ + "/fixtures/function/dynamic-require-slash-access/sub/index.js": requireSub$1,␊ + "/fixtures/function/dynamic-require-slash-access/node_modules/custom-module": requireCustomModule,␊ + "/fixtures/function/dynamic-require-slash-access/node_modules/custom-module/index.js": requireCustomModule,␊ + "/fixtures/function/dynamic-require-slash-access/node_modules/custom-module2/sub.js": requireSub␊ });␊ }␊ ␊ @@ -2673,7 +2673,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule$1(name) {␊ - return commonjsRequire(name, "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access/sub");␊ + return commonjsRequire(name, "/fixtures/function/dynamic-require-slash-access/sub");␊ }␊ ␊ var sub = {␊ @@ -2684,7 +2684,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(name) {␊ - return commonjsRequire(name, "/$$rollup_base$$/fixtures/function/dynamic-require-slash-access");␊ + return commonjsRequire(name, "/fixtures/function/dynamic-require-slash-access");␊ }␊ ␊ t.is(takeModule('.'), 'same-directory', '.');␊ @@ -2724,7 +2724,7 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-targets-fallback/dep1.js": requireDep1␊ + "/fixtures/function/dynamic-require-targets-fallback/dep1.js": requireDep1␊ });␊ }␊ ␊ @@ -2835,7 +2835,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(withName, "/$$rollup_base$$/fixtures/function/dynamic-require-targets-fallback");␊ + return commonjsRequire(withName, "/fixtures/function/dynamic-require-targets-fallback");␊ }␊ ␊ t.is(takeModule('./dep1.js'), 'dep');␊ @@ -2867,7 +2867,7 @@ Generated by [AVA](https://avajs.dev). ␊ function getDynamicModules() {␊ return dynamicModules || (dynamicModules = {␊ - "/$$rollup_base$$/fixtures/function/dynamic-require-targets-no-fallback/dep1.js": requireDep1␊ + "/fixtures/function/dynamic-require-targets-no-fallback/dep1.js": requireDep1␊ });␊ }␊ ␊ @@ -2978,7 +2978,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(withName, "/$$rollup_base$$/fixtures/function/dynamic-require-targets-no-fallback");␊ + return commonjsRequire(withName, "/fixtures/function/dynamic-require-targets-no-fallback");␊ }␊ ␊ t.is(takeModule('./dep1.js'), 'dep');␊ @@ -3099,8 +3099,14 @@ Generated by [AVA](https://avajs.dev). var externalEsmDefault__namespace = /*#__PURE__*/_interopNamespace(externalEsmDefault);␊ ␊ function getAugmentedNamespace(n) {␊ - if (n.__esModule) return n;␊ - var a = Object.defineProperty({}, '__esModule', {value: true});␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ Object.keys(n).forEach(function (k) {␊ var d = Object.getOwnPropertyDescriptor(n, k);␊ Object.defineProperty(a, k, d.get ? d : {␊ @@ -3173,8 +3179,14 @@ Generated by [AVA](https://avajs.dev). var externalEsmDefault__namespace = /*#__PURE__*/_interopNamespace(externalEsmDefault);␊ ␊ function getAugmentedNamespace(n) {␊ - if (n.__esModule) return n;␊ - var a = Object.defineProperty({}, '__esModule', {value: true});␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ Object.keys(n).forEach(function (k) {␊ var d = Object.getOwnPropertyDescriptor(n, k);␊ Object.defineProperty(a, k, d.get ? d : {␊ @@ -3241,8 +3253,14 @@ Generated by [AVA](https://avajs.dev). var externalEsmDefault__namespace = /*#__PURE__*/_interopNamespace(externalEsmDefault);␊ ␊ function getAugmentedNamespace(n) {␊ - if (n.__esModule) return n;␊ - var a = Object.defineProperty({}, '__esModule', {value: true});␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ Object.keys(n).forEach(function (k) {␊ var d = Object.getOwnPropertyDescriptor(n, k);␊ Object.defineProperty(a, k, d.get ? d : {␊ @@ -3314,6 +3332,92 @@ Generated by [AVA](https://avajs.dev). `, } +## esm-mixed-exports-function-default + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + function getAugmentedNamespace(n) {␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ + Object.keys(n).forEach(function (k) {␊ + var d = Object.getOwnPropertyDescriptor(n, k);␊ + Object.defineProperty(a, k, d.get ? d : {␊ + enumerable: true,␊ + get: function () {␊ + return n[k];␊ + }␊ + });␊ + });␊ + return a;␊ + }␊ + ␊ + var main = {};␊ + ␊ + function foo$1(...args) {␊ + return args;␊ + }␊ + ␊ + const bar$1 = 'bar';␊ + ␊ + var esmFunction = /*#__PURE__*/Object.freeze({␊ + __proto__: null,␊ + 'default': foo$1,␊ + bar: bar$1␊ + });␊ + ␊ + var require$$0 = /*@__PURE__*/getAugmentedNamespace(esmFunction);␊ + ␊ + function Foo$1(...args) {␊ + this.foo = args;␊ + }␊ + ␊ + Foo$1.prototype.update = function () {␊ + this.foo = 'updated';␊ + };␊ + ␊ + const bar = 'bar';␊ + ␊ + var esmConstructor = /*#__PURE__*/Object.freeze({␊ + __proto__: null,␊ + 'default': Foo$1,␊ + bar: bar␊ + });␊ + ␊ + var require$$1 = /*@__PURE__*/getAugmentedNamespace(esmConstructor);␊ + ␊ + const foo = require$$0;␊ + const Foo = require$$1;␊ + ␊ + t.is(foo.bar, 'bar');␊ + t.deepEqual(foo.default('first'), ['first']);␊ + t.deepEqual(foo('second'), ['second']);␊ + ␊ + t.is(Foo.bar, 'bar');␊ + ␊ + // eslint-disable-next-line new-cap␊ + const newDefault = new Foo.default('third');␊ + t.deepEqual(newDefault.foo, ['third']);␊ + newDefault.update();␊ + t.is(newDefault.foo, 'updated');␊ + ␊ + const newFoo = new Foo('fourth');␊ + t.deepEqual(newFoo.foo, ['fourth']);␊ + newFoo.update();␊ + t.is(newFoo.foo, 'updated');␊ + ␊ + module.exports = main;␊ + `, + } + ## export-default-from > Snapshot 1 @@ -3425,8 +3529,14 @@ Generated by [AVA](https://avajs.dev). 'main.js': `'use strict';␊ ␊ function getAugmentedNamespace(n) {␊ - if (n.__esModule) return n;␊ - var a = Object.defineProperty({}, '__esModule', {value: true});␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ Object.keys(n).forEach(function (k) {␊ var d = Object.getOwnPropertyDescriptor(n, k);␊ Object.defineProperty(a, k, d.get ? d : {␊ @@ -3645,8 +3755,14 @@ Generated by [AVA](https://avajs.dev). var externalEsmDefault__namespace = /*#__PURE__*/_interopNamespace(externalEsmDefault);␊ ␊ function getAugmentedNamespace(n) {␊ - if (n.__esModule) return n;␊ - var a = Object.defineProperty({}, '__esModule', {value: true});␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ Object.keys(n).forEach(function (k) {␊ var d = Object.getOwnPropertyDescriptor(n, k);␊ Object.defineProperty(a, k, d.get ? d : {␊ @@ -3715,6 +3831,14 @@ Generated by [AVA](https://avajs.dev). t.deepEqual(externalMixed, { foo: 'foo', default: 'bar' }, 'external mixed');␊ t.deepEqual(externalDefault, { default: 'bar' }, 'external default');␊ ␊ + /* eslint-disable no-prototype-builtins */␊ + t.is(namedExports.hasOwnProperty('foo'), true);␊ + t.is(mixedExports.hasOwnProperty('foo'), true);␊ + t.is(defaultExport.hasOwnProperty('foo'), false);␊ + t.is(externalNamed.hasOwnProperty('foo'), true);␊ + t.is(externalMixed.hasOwnProperty('foo'), true);␊ + t.is(externalDefault.hasOwnProperty('foo'), false);␊ + ␊ module.exports = main;␊ `, } @@ -3727,8 +3851,14 @@ Generated by [AVA](https://avajs.dev). 'main.js': `'use strict';␊ ␊ function getAugmentedNamespace(n) {␊ - if (n.__esModule) return n;␊ - var a = Object.defineProperty({}, '__esModule', {value: true});␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ Object.keys(n).forEach(function (k) {␊ var d = Object.getOwnPropertyDescriptor(n, k);␊ Object.defineProperty(a, k, d.get ? d : {␊ @@ -3908,8 +4038,14 @@ Generated by [AVA](https://avajs.dev). }␊ ␊ function getAugmentedNamespace(n) {␊ - if (n.__esModule) return n;␊ - var a = Object.defineProperty({}, '__esModule', {value: true});␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ Object.keys(n).forEach(function (k) {␊ var d = Object.getOwnPropertyDescriptor(n, k);␊ Object.defineProperty(a, k, d.get ? d : {␊ @@ -4174,8 +4310,14 @@ Generated by [AVA](https://avajs.dev). var externalEsmDefault__namespace = /*#__PURE__*/_interopNamespace(externalEsmDefault);␊ ␊ function getAugmentedNamespace(n) {␊ - if (n.__esModule) return n;␊ - var a = Object.defineProperty({}, '__esModule', {value: true});␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ Object.keys(n).forEach(function (k) {␊ var d = Object.getOwnPropertyDescriptor(n, k);␊ Object.defineProperty(a, k, d.get ? d : {␊ @@ -4256,8 +4398,14 @@ Generated by [AVA](https://avajs.dev). 'main.js': `'use strict';␊ ␊ function getAugmentedNamespace(n) {␊ - if (n.__esModule) return n;␊ - var a = Object.defineProperty({}, '__esModule', {value: true});␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ Object.keys(n).forEach(function (k) {␊ var d = Object.getOwnPropertyDescriptor(n, k);␊ Object.defineProperty(a, k, d.get ? d : {␊ @@ -5120,6 +5268,29 @@ Generated by [AVA](https://avajs.dev). `, } +## relative-external + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var require$$0 = require('../fixtures/function/relative-external/external.js');␊ + ␊ + function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }␊ + ␊ + var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0);␊ + ␊ + var main = {};␊ + ␊ + const { foo } = require$$0__default["default"];␊ + ␊ + t.is(foo, 'foo');␊ + ␊ + module.exports = main;␊ + `, + } + ## require-esm-with-named-namespace > Snapshot 1 @@ -5266,8 +5437,14 @@ Generated by [AVA](https://avajs.dev). 'main.js': `'use strict';␊ ␊ function getAugmentedNamespace(n) {␊ - if (n.__esModule) return n;␊ - var a = Object.defineProperty({}, '__esModule', {value: true});␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ Object.keys(n).forEach(function (k) {␊ var d = Object.getOwnPropertyDescriptor(n, k);␊ Object.defineProperty(a, k, d.get ? d : {␊ @@ -5305,8 +5482,14 @@ Generated by [AVA](https://avajs.dev). 'main.js': `'use strict';␊ ␊ function getAugmentedNamespace(n) {␊ - if (n.__esModule) return n;␊ - var a = Object.defineProperty({}, '__esModule', {value: true});␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ Object.keys(n).forEach(function (k) {␊ var d = Object.getOwnPropertyDescriptor(n, k);␊ Object.defineProperty(a, k, d.get ? d : {␊ @@ -5624,7 +5807,7 @@ Generated by [AVA](https://avajs.dev). `, } -## strict-requires-entry +## strict-requires-entry-node-resolve > Snapshot 1 @@ -5832,6 +6015,36 @@ Generated by [AVA](https://avajs.dev). `, } +## strict-requires-external + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var require$$0 = require('external');␊ + ␊ + function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }␊ + ␊ + var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0);␊ + ␊ + var main = {};␊ + ␊ + var hasRequiredMain;␊ + ␊ + function requireMain () {␊ + if (hasRequiredMain) return main;␊ + hasRequiredMain = 1;␊ + t.is(require$$0__default["default"].message, 'it works');␊ + return main;␊ + }␊ + ␊ + var mainExports = requireMain();␊ + ␊ + module.exports = mainExports;␊ + `, + } + ## strict-requires-file-without-module-type > Snapshot 1 @@ -5883,37 +6096,41 @@ Generated by [AVA](https://avajs.dev). `, } -## strict-requires-magic-string +## strict-requires-mixed-esm > Snapshot 1 { 'main.js': `'use strict';␊ ␊ - Object.defineProperty(exports, '__esModule', { value: true });␊ + var require$1 = {};␊ ␊ - var main = {};␊ + var hasRequiredRequire;␊ ␊ - var hasRequiredMain;␊ + function requireRequire () {␊ + if (hasRequiredRequire) return require$1;␊ + hasRequiredRequire = 1;␊ + require$1.foo = 'foo';␊ + return require$1;␊ + }␊ ␊ - function requireMain () {␊ - if (hasRequiredMain) return main;␊ - hasRequiredMain = 1;␊ - console.log('hey');␊ - // magic-string@0.25.7␊ - const m = new MagicString('0123456789');␊ - console.log(␊ - m.prependRight(0, 'W').prependLeft(3, 'AB').appendRight(9, 'XY').remove(6, 8).toString()␊ - );␊ - const bundle = new MagicString.Bundle();␊ - bundle.addSource({ filename: 'foo.txt', content: m });␊ - const map = bundle.generateMap({ file: 'bundle.txt', includeContent: true, hires: true });␊ - console.log(JSON.stringify(map));␊ - main.foo = 'foo';␊ - return main;␊ + var _import = {};␊ + ␊ + var hasRequired_import;␊ + ␊ + function require_import () {␊ + if (hasRequired_import) return _import;␊ + hasRequired_import = 1;␊ + _import.foo = 'foo';␊ + return _import;␊ }␊ ␊ - exports.__require = requireMain;␊ + var _importExports = require_import();␊ + ␊ + const cjs = requireRequire();␊ + ␊ + t.is(_importExports.foo, 'foo');␊ + t.is(cjs.foo, 'foo');␊ `, } @@ -6096,8 +6313,14 @@ Generated by [AVA](https://avajs.dev). 'main.js': `'use strict';␊ ␊ function getAugmentedNamespace(n) {␊ - if (n.__esModule) return n;␊ - var a = Object.defineProperty({}, '__esModule', {value: true});␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ Object.keys(n).forEach(function (k) {␊ var d = Object.getOwnPropertyDescriptor(n, k);␊ Object.defineProperty(a, k, d.get ? d : {␊ @@ -6807,27 +7030,3 @@ Generated by [AVA](https://avajs.dev). module.exports = main;␊ `, } - -## strict-requires-entry-node-resolve - -> Snapshot 1 - - { - 'main.js': `'use strict';␊ - ␊ - var main = {};␊ - ␊ - var hasRequiredMain;␊ - ␊ - function requireMain () {␊ - if (hasRequiredMain) return main;␊ - hasRequiredMain = 1;␊ - main.foo = 'foo';␊ - return main;␊ - }␊ - ␊ - var mainExports = requireMain();␊ - ␊ - module.exports = mainExports;␊ - `, - } diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index 4ec48d232698616a4f850a2f6ddcf378ff8b05e9..732515802d01b322faf9285733d88faaabc3f8eb 100644 GIT binary patch literal 19932 zcmZ6SQ?%&NvZj}9+qP}nwr$(CZQHhO8+$L?M(=a`bU)lYRsLXPpzg%3>}WovrcBS+wbi#-}ZXiZwqF*1)gv^K7V;Co3ps- zd&q68LAz~l77zLZ4}_n7(b{uccKi4He;g0b^E|hB+Iu5B)!?$!>Yv4owRsB9cYR$g z+wb1L*N*)=u%jzD^~!$DQGYqWT$b~37Cha~_n`?N^kc{_d&zI{XW;x}(|niVXQ3`r zdoSUU;LLWI#rB}Uvy+wDt;^~-#axcVrdqZA-<@K51*Oh@%Dwt7_L}!?+kKwq>&;;P zT`=X#GRtlBC$s$H#rcZ>aOXN8R#}-Il~>Iw(CP-~BXs*zGpY`F?xQd_n!&Q5|ss~B&RQ%n$vxshGhLQGCp_j*F6!Qk}b2?S}gm^-QV8w=FRK7{~+Bi zp{{!&xU`>Vo$UWTc}=h7e0`X}MyKO^F75BV5nO=w15{X04{inS7+JkoE67q zFmT}h^STGOe7fs@q=pC5Ym-+NyLHiaI1i`U;X50&Jm>RU8Z0m`c!oJ{rFB&Dn9u!w zeG2Y>H}N&t9^>=D4Ijkkn^Pt#|9f{j{1^WBNS<}Sl+XL;-JJ)*OImFCqHpW7G5S@f z)#H*dzJ}B991p@p>C@_F6d-}A*iovo&_`#WoHOB?=);OvS{7TbBlw!7Ey;BT;d zxAQA?zQ^B4dtQjHS0dT%+W}=h%eU|S@!Xducy=E~(|0TQpt#$`mardbd4IE&quP9) z1?_Hwv0h?ch>vTdgohz({hvSCyyGBb{8yO1#>TPWg5Y$3?{t}Ixo?C0H+r96@?7+B z`0QiB1*gAIPm0-nw-1}$w$AUt+jSX?2SJi}AhG$ymdRpr7!Mz-{XYl0Th#XNJ$A2x zcp$d?>dR!GH{6Dc18stzENt{Td?dgR0%!Vu#g@u^xCk>n9M9LfV*P6`518(J|K^G` z-AYUTEsyV-a(zq&*UL$B&@bQL^@4W7r{(=1Pj()r&q?$)|GVXlM_1(=KfBC-F6n_P z#c7_~Zv64r-r+dOL#Oj~={po$Fs}onB>(L@j>UE7G^jslXO~^8?;H&-sO?{G(d-_D zTZ8L<%gAfhugiF!V#E8FXb#;HoW548_cgp#E{UVvI{gQv(E;}eTvl-jj`8=xr1>&i z3|5bw<##&ow-UewfBn!8{;c9|`*XZJHPh*L|GNKrlW;8r7i{m;T88hwKToRjc0SZv z2le|M*V`^*{l_2PEVs95`##o(R+qOpYH(eyyEg2#e{*P#oaH)VJZb#-S6}{(<1^e%@-Ur8K}{uj~HD zb$LJ{WI@y3Vv8}Hb%)dPBc;5o=FQFWQZ8KNpVdSBEVbw8>9`GLd@8ICGY75qdaol? z|3>C>YT0NX=lx-StnWeU!3(#(<43>w)gQrye*aoa+wI?*)6YFDAIB}{S#zG{kI7v; zm|d)=>rr>Vr-QiSTfeJ>{Tl7Auc-NdV;K$u{@Pmn_rAiq{_Abg{I}~dRd|h*@hPql zkJj;bCk*qK>tkwRG+(Fbr81vpbisZ=EC0=7Q9m8e?|WhQ*4O5FTK1LI`0TH@cME8G z2psI!<%Bid$5n**Wf;CQRu~;{amU|{w_)@au+v-J5N&|x3p-YqNjX<*yc zc+q>SpL@sTpXwJFAA=ALMo;=r^Sa=-Jl0F2EiRh=Wt+r4TvN>U)!lq+k6Us>(3YQZ?=n1 z++cR?sU+U(Z$~x3{oj5>r~N-)&h6j(2Nrw>aro;FZwS{t%iQ?&_U|rvUn zEHZETc`wtx^&@vtZMj`fE}Y{A7QzS2U#9qTJr*Hze=D(^zdzfr_-^wtyp9y{XixLM z-|xsjWIsQFw_)+TFJ_S$SfIA*FON|F7L)h6{fw5=+CAWZRO=g`IUm%YE*Ltm<1qaR zw*+qgIZj-k(TgoKZ}Vsw&2RsH>5F78|8Y4{M*i8McR>#0gYt5iY+2Xyy-m~4@%mk! z-|-jvus=0A!&k<;F5%zx_J4gs_hYr%3;~Sh%W9_%GaJnFf0&9BoQ~T%Y5iNS=ebuZ zZPy1OT-_}&MV(%&(>U*!zjGb`e8qlD-^}>Ld)MA_n8AFz`LQHDujTf4%bWiFJP^YR zb|YFo+jssYov+dBJ=j*uz0d z^ULUUM!wJIrg4pvdVLgs6H2(91G|LA-{4r(yVrZ`z7hzMh-o z;qB)1$Nlv}*sgB#`#5+RqwBMl;JCJ)Z@>JdGw@R;XT$U4y}E8_;e+3+9FYesv! z#*?UR7ZD$)#cLdw;VJ*%_Sdb~a+SMyp4j~dZ7ct{$ zZ_0GIs9SDqA^rDi(T?l>`xf2*>AuEdRh_-o=X3g>yTiE$Djc8PkMn*`E6v~h+kfx8 z`8mA(VZO(836AS}$^6_^E<3DmcV33^$!?v1!{)%L4{Y^+Z3o^y=iUzM)%RU>=O3!) zM;F4(2c}$3P50@un|>eQ*Y{lR-}iBNv4s60=ltCLwlVt2KlAOI(Ai}7$UE1~F+OIn z7W`iGvSfW9<(}8pd%O4H)oiU1njsxjSZ`f7MTMP7&H`CIA3`aT#XEO~79i{IO26$G<;MZ$rcOSrCN%A1Ec>k5U-#S@Uy|{BK)|ll9y3 zqYJ@{1OnSfK>s>ZLAc=7gM1;l+!Yooz_L&fMtz}ki^@nQbi zZv3YERbQpQ?R2tuYoPy!rTcTLTbJ8o_?SQ6lDgjd4a2SCKUBbSxd>Y=)~PRJcJ21< z^CO+7Kj&AyU&Z|1Xe*#X^c%HO-k)>rMn9GIyPS^^tL@(3-75dE9@;8ty`1qOn*Uwm#aEZ`?}8JwZIp0@PQ>m3#x=l7O=vcm)m@h*tduKctT*4 zM7ZE?lG0{>i31d`b=s<=;NhIU$HXh`qehdw}*Y)#(%CRDJ(dd;v zFSm)X>(2|wt77=91@~X`0)u&j;jHuwSWJ5ITwS_t+m?H_Ee-@OGD94wTpyhO+rzlp zY$8sR2t_xUysgq^)mL9zXzr9LB0aUPsnbK5K0^@4FQ-2T?Y9;`6JyJiI2O7WVOz^# zd1^E1;!J}vjrrS!gei=#sI8kjO|zD+a>*6=?yFlVLX{m&nk>d+@^lm<19fyJG2WdN zM!%r3Tirh5M0?%EznCUv9^(OU3?_QGpI~P1$~p#*&6|5JLkEo!;MD%s|!vndtYd?z?Ai-HTGevUGS`^4N zHUK2}`@z&07wjw$rb30Q8KdDWb@J&!N8F|(Zo>(8a@zg`m;ndQn#3VZUC;K)+N= z5vc;hX@$iRrSp!(5N{@JYL^<3u3Lz0M*Zt+*n-7jFe&M-V&Ysa0rBE~<}_>gi*uPG zTEH|>9vm`qCX1&5LU0Uea&*l5O#t{9BxY_P`P(y@tt5*PXW;?{mmLn?)l?ax4;K$A zuv;F!bszqcRqgB9R`aD@uc@=OaucTWn0mpc|&OB>&3$Z0UXJgC(S+tchwzQ~ZT7#wlAS7-@v{j{&dTx24Do{ z!m6v|lX^ET9ID^)mhX&0xmkyRu8FWos?VUOR8?9`>3IXB<0gexeEqzi<_dr^a zhU`P|TFZK*3&|p2DXKv-tfYEWft16L7a_W~1ln{~1pW~-kVrugM}j>90$~NZw=r}B zRe=84N9C|0gjaze4ZdtFfy5{}9!$F9$fa{Zm&~kU*cbt9A~boEUmXEQd@!0M^gt`o z8rOJ>uu8dn0C@$yp)ZXyV#7N+WW|2Wdaa*BD^bWG=yAc#ij9LK zD^uraa;%Ls*&-y@IK0@CP>;I@B$Zwf1y#-6Pyt>z%0MX*936BAKz$-mv=x|KAD9aV zgb~Al^@404Ais^6D2734=*? zRtycE6CVc``e>4Fh$_n;f>E-iumF-tbT-18Kt{TpA4j;vpO-@VAO>^+Yw@ey6_(Eh z;W8H1*a}o@5)w@?42#{evN;*9bUQ06fm6MOhKdNV8KAdG4r>F}iW}IAM+oc3L)OZy znGyzd@sHL-QYE)Ynxr7h-34>wR+dCCrAU-q{@2MN-|V`<6=?U^g(R6Z{JK^dgBGvG zsyS@23w9g6TBQvw(?a~=3oI!o@A*hKBX9DrdumcTly7{s9ENp+xYh!>k1QDK6+F`g z5uT!zaR4}^TuBXTXRz@gujU5&u_r_?XX34J!!k98QZXcZb1Ix06XF^qGT*6CeyorY z;EswZN=v(KrPXbbP8QN_#%LIVwR@R+6BBNsj_rw$q2sK~v&rOY;4&&FSub5ZnT zp6xOxV-ON7hC!|AmL=5|RFzzE zr*W)gVpOw;VAn*~Lq3ZR*kZU*VbO4LiXNw{lXArSt{!V6J%V=J;k_)t{>S+uZD5+)VT-yUGor?qx3btagwl-8&CN3K*Ig1DEom05L zeu@)Dpt9z{a6%pdlbD(c!5C3N3@r{bJnXUsst@2pjL!Qf z5-(aA`4ZMO26?5GndXx*?`Fvv>Y)-D<`z7UHDN@LIFi(lHA7G*nps(%X)_t|nIk<^ zB11gF!ZV*n3T=^NT{{*Hc!CiFx}Tj)0=6}~YKxXkE5#XP=Q`bhs4CJBzy~>-(BnMr zSJwpQRtpu49zIO{eV?K?hQ2*C#h{r+f>K;7hEeR*2r5aT03!gO+7--ck*)#SYBbrh zEu{uvUYo4&gwKjDVb`nQ621urfC|G!ye#tvX{Pio6i^m3!-Tws+7ifY zQwyQ4NZibYT@X*Wn1LOCP$b&=nP&ExRUXy%PX36Q6Iv1pQPMOBSy(L+ayPpHaSSQz zu97b!*XXYZYSdjG1X&M2*Ky(kf|q3hqWl9h#BjjJot@1QU1=-vvz=$*L8yW9E-*go zTJwbNC3P1^zS+r1nKPXo{-IWdP5K>-jMB728Wdx2y;@V)nvn*eb@@4$oV;!^I#p zCy#YVW=Ha^l}IEYlGx>NMWtbm?+Q^UbFH|RFymYWDDc|tpfWgA>(RqsBSRPdP*VY> zlX|fMM8^BbM7#yp=dUQu6EybLgpJU2meL1_tQ@IiC6z3b=>(~?k`xlnV~L()S*WQb zn^YXe(yVkuVIo+64ji!SJk-*900El2gE!D>3bZl@CNSb{##AINdP3koKmh>PU^+>Z zb_Ct}va=K_V}NFu7l~7hq!85QTGmkFIGHsyZ4k3KMu&BC9yI0@Arm@g_+mj_n9lfP z-ia$Z$p%Vg&{fpy^`m7{v}G3c5r1F)bR?N-n_VuC`c^^2JA}jZtQJv8qdR6uWW0WA zA!pjaQF)&x)<4#6`01|!9FH<$z4PUtCzMZxs-E(8V(k{DX^^LGV(gYdKyCrbA7=vZ zW;ISA&d_)a=7}#52t-Xff1yaI0Okxg+s0- zVRk84Ax_;g;>mgsD)&5e&q@S>!k}OzwdIuOT$SyV+LIa0I+ceQJi8*5HDr_2WvEM$ zy^4=yHb{Gi+VqyGCDXg&%nK9h>a9+CUQFYj(_WM2T$e-ejyfCrE9MH>tAoZpsZOt@ z3%e;^mm)7unHCbuZPr1ke!{psTi5x`uGZJ~`^kC`jYY?onJwYcJU*>$ViH5gp>y@o zH2_nYdzj$W3{1_yCNucV0f7UscfEj%Yri=2VZc%zYqlK_E&`6H;r+pyT^y{MU^=>K zOF`8AWvbb=FYdTP9*fgO58gUp-wDKzQ?eVauTd;$CYQHE8{g^uL547aCiBM@h)J>eQ39OpN196u~b{YhSFJ@DnuK?&Y>kL!bL#e1TkgFM9Mh&TZRBHz8nQO?gUQ=0SqvsvHdVIk1XQHt z$wn>`h-BNVZU?65Qp-ULiSs@ilLkhWsx-3XQmPbH^&|px&ebiOwciVEI~BuwqoeCl z?3N_m>RJ7Wy3uk8Ww-UbbfQxUySB@gsdOvw926T@C84yTA?t?}Sx|9ULNwe&llK?e z{@nLht%5tzI-j&3y(pSOT4bH*?W<#VA-h}2@eQDp6qo(!Mue%-yi3W8x`UPgxNysj z7?MtBbE{5=2-2$DqZQfh?ydqgMfkTisbktG?E0vU`2MvWNdKALS zl4f>in%P=&hmn(C8BW4L5+G6mM2biVGp*H4bl4fpx8ZnF{>6f1s?9izJo9-GB?q*B zhIY83vt*b0Bc9hn>_2;BmJ0}nWkNgiH0L98Yn&s+B3o-9FMneas-LuZlHH0mN^ zrk_eh2Nyw#Xn83$#?;1ai6p6}Nv?!*bu5x(wMEt>r3Z?Isodc&8S?B2N#@8Zpe!nV zDTYNEK7OX%kA8AiT^W(us$_j`t ztihC?w6q2+(uY>nR?hvx3%65-nYPn_lh`@y}Ut>$1YmNh;>GXdA%#91|(wTbb$YaBzrkPt7KO!0xjNcCL zLsYY2&P%GhxAVsLXH!=zO|NTnAd2;c=wxUwx?SwgQ6W${!Z8C%d@HxPr zAYogC*(rRwv;$?5utcQTR%S(L5^q)s2p@nsC${LxBr?PAWXmK|%H9g6NTgZT2`S6F zqnZuy*jGzEqD{z^^;0p|)H_TIOSA1K8;a~?Jtoj?Xl#f^vD166D9khN7M!yJ?SaRt zowX;ikYvMoVyXEqP!)NUYydyDpy~*|2mKXWn!xNbmO|}qq;oM?77&elF53!3hJ{k! zfa+hmYdLA=3;!}s26W;$z2RK~1uM*Kf`)6h z9dAHnFUYnQUzg8ODWR1Y=9m4H?pMOqyi&)vjU3DN6i2f@TIa1JhF(t$HHg*Y!$&oB zmQoz}3@NX~IEC3MA)F(oc~o`7Q8cKPtChbOeGf}mw`q&JI$v!0j&hG^9{lpiNV84} z9*X11P(C&K@_=bf6S@58>{j{VNS}&bj)y-S^BZlsUomcrzXowU`crn{lPa+IzSF8d zF#s4(YkC(>=h+b$FIoW40jX8?c+THWO(4;tV>M0ROhr+h1e&XW7B2rJ!A}vj4>Hud z2BifID}$u`sJ2LU77$QWW3tkhrYOov2$RBM*E6T-GC}vAp>H)=tg{fA%$J1j(}smf zyqYu*?(L#cu-KM5n*o6x4F79XW$Kl3+C5x(`C%kgB`dH#8if4mgpR3-e#`+TsA!5> zp}*p~cFT3?p8MQA_n~Y4UDxcluG!D|`~Sns8hp;;4V|24;@(2cQiTqPH(_e%m4&#vjAw;0sz1*)J9d3dfKQ2 z)Zz-J>TBhY8H`ZV6D2MgOSF&>?nBe~4tB)d_kdC-xhX@|OM?U*J5WCkOJiVwj;MZ}yJ@vHZ*IC}B&l9|RUuSsj<4tPT zb4x6Hvd%s(=C2T2-pYdPL{~*pX8{isb1XP?pADF;91|Or4hWj!Sf9%d>_ky6FN?jKS9g=`h$#Vb$_6t{hq23J zJwlWFXgKiDltNB1c*WkAg6uffoCh4b$&bBY(yg9%gY%Pa__#dvNU0P?O}qnU|ND6X z4y|4#*&3}fPMsuQS(_(mv#wS$#q2DR<1CTTED=@K$cH#lCdO{POd=93VF~9+w!{)n zm}TJ@fmQ2ZIV;l$0{q`>cqZC~orouuyNr}t*6@S^ZbtE9W!qR0x+=0$jrZWm`&e=? zgA*j3)wt>{M^)}Rt8vxqjw)RB*1uJ5|4+=Wv?@266FK4@X*}G@B1LI_)i8IASfm}J zgKBhmE;FQTOz11%Hq276WrmXHCvk~`-R@?$|G6`#~cB4)ATi}X;CGp zusgD--ORD?&JjnDB%VG$E=e2AX0&DZxj|$EdYU9-7b6Z@l9P$fs)kPwXn$sk3B0w< zf9?QeVOs{kI!k1R3kvMZ`qzmz$uf}eDl*c&AfkfJ&^UKwP&fyaG#>d}9CZ%u*&$1X6sJpp zdN-ya!qC9%dJXs4onEO#6URSOKHmnuC1$(fnLs0oVznl*1>cU2D2EFwc@Z63B-q^w zi9ceiNmc>9WXVr*O`6a!H|bF$8RB>^HOoFm&ursRBzEZUG-{zaNIDM;t7I4DD!PQf zdN&r_#I06^z5k)``C|Y-jfTzy#ctv=BV$cAs-a@AIdaiLl%>dBYiaeWQMGi35ms7g z;fv|uA?pr+HbBeEll2BXtsGEyS85!U9X((5Fj8!weH=k<&-|p-?Ic8{r(~b?4&_3j zE-=W)>X^D~MTUN(S*S;$W34AtWjB#eOf#}ZwP0xWBIH|EMSRX?l&yY*!lRQYy=Y3s z;u>Dbpy^)eq2iv_B!F%2Dwx~O+592g?vh)?t#W*yyIB3HI`c?(@}NGqx0&j7f%f-O zN^r2Un!0-^`o*P`?5M`T@GD)*F>(jbjb4BHk!WchAoB4 z%jI=i{I$Tk4c|jSr>ay#EYAzGIVH8OlQXEdRN`AaWuSg1PIRu_OB6ABu4KA1%r~xk68svZ% zObt5Fuh3tExYz(rv|_=!R!$GygoiP}OHTt(^$_~DS#w=0`=rcyqUHd>vQ@n0F&yQ# zu@)&gS@{ldtVt6rsAc9bd6%BS)TVn3<}9~xt7hSK5r<^OtPZlEy2t`+qO&ZBuKyJp zn9712Hj5ekUDGfO7PO+u(2Su#c0b<O}0H}9+!Q+mq83w~KJLIW6WUKbXoOUv63sNEnb-DFlXAL)kT1y zRlc&?D{wO60#Q@AL2Cl$#ZVV#`9uu`nGw;nM0o_WCp={Z zb3dB-;Mta;#n4JKdSjqrhx>QlQc#qWkk+Y%;LzZ~Aj;EpSR_>noqq(kUUEoDj!xEM z1BG(O-MY1Axr&0g;d!v1)*9OJC!Px`K4rjmTJ3QS6Tfe@!R17C7UB4ts$BfPMVbi+aMTr6@ zP92+_l!lqLX{M4Yg>2e}>s+ctx(OUxN1ZympDMKnfdrS6eUyoZ=1-YeBstYQEX1V6 zB6)elfJ?hz0MFt8(Vvcf$qi=f98oajER)OJrff3Hu*sY$oGac&^6;}2l6rI<=0p=# zDfWb-TH&q+Is`X6=c#*`S$2^0c9K!*g7OvTHda3gS(+eK4x{SlhGxX)d|Ry-D$KxLI|i9=&LiwXO~p~;sxDS!o$m)Fs*h#Av(_mo6CjDj=2hb0Uc znx_sfA0T-mn2z)^MKMwmNI(#bL1>cI3Cx7mi_`3q^%y^osEctdNmOcM2&`TUj-0(XtcAAg|WegsxNounI&jzV1F!U0}8K!39=F7g*i@4nK$)9d=uW zWEZKY8I-reH$??GQu>H3AR?Y?DUueKhu$VsOuec-gD*g-eTuv=QphsLjBzMt`i4i1 zQIHK8?qs~AkC`S@-c@4klS-?gzyPAxD;`w*AK5D$ZR2}x`LlEGolU@SIW%ou<3*yP{MNL)kPV01oLi;%SoA?fK7 zTTK}7k&{*y1a6BgLYAWpQ`co$EzFY=EDRIn)gGse8Olb9dfCoOkZ6e})V9fyb|Xyq zj#BWX1`-E)joWZ(<%Tn%L#!8nN7I*lb$~F~gDR>_sG#(u$;fp?LK_W{PQ_LA(~Byg z^>e5voIyS72R359A&GbAY768-6S;$Z8fRyT`MVzDh)&15aSI9J;TWFY)KMa@w<%|GpLpT7z zAB8Hg=#t(Wd9MDU%d(m3k}=XlB}#Q#+&|2)Ok)dFo5Y70=a5X7Y+4`s645dSeWa0{ z<&id#5zh!dec&bOr!kgEDkzLy&+OPI$E7MG6U#z z4#8PcIb$8AB|T`U!=~h)yF>dSO1RU1F77p&HB`GD541(SdQm)~lE8|1M1==Zw2Bdw z8)=n;9_EqY3we6bq-fMG&#g~F&V0pT}_4PW;ReGyO|Ev$!w%TcK=so zSI%s>bE%67`qP&ZNkykB!eo`@;kMw4zklbcS>n(h{8w#mv~E92XGm0bCWc;R1}SE~ zrpxm=5wePaWfT;FyhaC_g#l4Kq4YqDjiFH}A#yEKBb7nR^0hp_;!5XOa2k@xj7W^; z4=jWlG`j&*Hf0Bv9%W_(D}s5@GI4!EY_=jAK1V`KZ$xZCdNCj`Ij04`LU!2+MweHM z8zR5N2pb3bw5uQ+Boy<#=pDgm{aMBxjf)zoiM*D57yXcKI1<+Efv{kJlIDxQ8M-&b z!`|?hvlzA}M1cwxOri+d)%8Jyaow$HrUSI>R{)HC2H5)qf7 zLI(@>@rWnz9uI0KZl_;EM@j@2m9iVNqIywwq?apSsX2sqyv+=%2H>fgkaFe^g^az) z8-*$)y5(9EF6U^2$u$21+LrrYMWSY^%=BP{*`T!2oSe z`)R5U=!`kHnL;4b$DNKs5q5+wr^jnk!8FWZ&YGF5&5+Tdqf`%X z7Qlxtp?A`Vr}CIFXK4k`1W;YG)RV+RRJ~fa4U2042MM{GCK=sJVM@lB1xsT*0O|@4 z_V%AwrT6O`7v|CB45nR7YfTJm=Bv&!6m}v}AE23LjVjQB12S6GdAemqUUuq40!y`I zgsYIG$(5u@f+T0vo4To8)y{4zclG0&svX_b?rJCZ|BCiyRIjom1{B?03+m!VBl1PO z@bpA@K@+)|rjL~PsFLl>S^O5Wa`>c>?d<+~K9Qnc_$MAD1wb-V>a1~+(teTBH4n4V zdV+$|Qm9D6wQIr3KFkZgn`bUu=bbeDMBy=@I)qKvg~;ejo`2mc9nj$})q_m*kxr1< z7P~B(Xd=#F%YrGT#PZ7tsI1FDPY~Oxq1;Jq=as*B9)tyAie5UA27jdmhhV%Nj2Q)!f`3ik9#?0A3yb>E?(l zTO<})-q62A95&6U+tTRJkc>_yce2^Q@do{u=!b{l_`C?p{oXVP5d{BoCr%EX7%~BX z%B=wi!|-V_zpvqn_yE{aG0o0^{V2 zCx@Y+Ap%91;x<+rU%9%DDN>LZdsDRt0p}wdWAb=0K;{5-Ln#kn#LSu$b(Xw^G!ULw zM#Z;)K-q>grXT{*B+7@B`BNY|?+SFNgRr?^R3JOnw|RxWVkrsg!c-V}6V*n(jb6r) zR-kb^H%*YACaLzMJBIIy5Y!V*9J5UMB293N zc#)~Zjy+Vj#S^tO)-olL26byaXb7F+6_*iAltQ;I@@D;-aT8U&&KWiLLc( z(p3`;HM+%K)+2!70dsQNV>eOmer1HWH*(@1|weVz& zMP_owRw-qRoe8E+zN)4yh?Q>>Yzx{qQkd=3LZ_0<5STF=kn_zjp!F=N@gxUb#?HD7 z9d(&HYO;0IWwK6nZ?Z|C5-ne>o`+<#nmow-RDxqcV&P&PWhw>U5O zLYETsK<`pf1?e$|V=K1N_eX9cj-E(-_YiN1!Ev`Di7mzXCwySO@u2>|ZObjwVCWYG z{>pH$c1%iQU@~Q%6d4xr&b}_Igra&U3ncAtuGvzDXkSoCMQrs15i(q}qh2)9(;7%B=eU4HrO8NQ1TPp5C5PQN@Ie)+n5^7Z-T%hSo{$D{v|k6#~K z`uuVay6@qLvtwHefiY}2{{VnoYaV!T(*udk`q&_4Pt%CybIlUt{Jk^%v%%0AvqB@t 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 diff --git a/packages/commonjs/test/snapshots/test.js.md b/packages/commonjs/test/snapshots/test.js.md index a86b22dab..86e1a2048 100644 --- a/packages/commonjs/test/snapshots/test.js.md +++ b/packages/commonjs/test/snapshots/test.js.md @@ -24,8 +24,14 @@ Generated by [AVA](https://avajs.dev). `'use strict';␊ ␊ function getAugmentedNamespace(n) {␊ - if (n.__esModule) return n;␊ - var a = Object.defineProperty({}, '__esModule', {value: true});␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ Object.keys(n).forEach(function (k) {␊ var d = Object.getOwnPropertyDescriptor(n, k);␊ Object.defineProperty(a, k, d.get ? d : {␊ diff --git a/packages/commonjs/test/snapshots/test.js.snap b/packages/commonjs/test/snapshots/test.js.snap index 4ae913ba519108606626637e674eb70e138a7477..d685942af1e2eeb399872b59de8d160b69b56c71 100644 GIT binary patch literal 813 zcmV+|1Je9KRzV%HI00000000A( zR6B1IK@dLYA>`|*d1w?O`E2ZS(%K3kQbH&Qi2_vC>9n@z?2XTRW^XTGB3DSM=pv{< zqM%5JfC2;^KL82-01^#|U%~9%`4I;YSn@t*_nU9#+nE!FVayq~A6{E|Tc)!QSc)ZTaW1f zY5kVVpOkOBUS07ozTl5DvDKM3j9KGM>^U=UoSiw&x+>Lss_@3T4yuBGFJh5D>N_&+~CjO4hfS9`kTu0(gN0%SQ#A9L09qN6}JkD8X`- ztXE)(rcx=n4$ufhs9=w7Z!y)jJwFJf6)zk=Om@w4# z9Eb3=;bv&&j-vqsbC9Gr8MC`g2%WDzX(ij_mSji;tSykREb`TYlj5qwqrW+Dm#gOF zvt@AV)spOky3Swg!77le=Zdtd)2fj(2UAZ&C$?=9AU^5F4{E28j3PThS(~EN-Xz|Q zxWvW9CBlqSJ4rRZ^KV2mA7-YQM#a)XwHCFyC=@ntvMz=_)<8=nC7>xi@+j;yj;fjE z9$2d1!@$!=6yng;g2rUC8p8-PVz3f>R-%fe0MBNdrWwCb6aW zNv`dCV#u?OVMFqsqP7r4=)^hvF`!Nnni>zQL+R) zNAqL{S};u+59ukZ>W)fEH%?g>QM?$I5Qbf{l?#_#cjwOThU*r}X~>>Le1I0Qxo#}F r>sCNSzE4r5^2L)m`Y4^K)pFtL*yZobin#OtU&+4!O?VhP%LM=c%=(JY literal 757 zcmV>RzVbP?2n4uc=Vv;~$F%00000000A( zR6B1IK@dJWLFlfd=AluDebL;SBMq3M6!+87s*JrlwUHnwtZC^Tye`d7x2)|#} z@A~X{>Gr$TT6E<#dzR7GlSRW=FwX1DnRCX4>~SWSCKM7WSRiv%%i3=2(?GgS8Zu6I zMBJr99@z9zHx@E+Am{ru*@~NKL~{=Gp+};WRzQlB!XS_FJtCk(7>6442Y4?PfF=>+ zve;w^X+#tXCCds^9!M5*NLpzaMs!UGa$pm+=Amx^gs}iSq7oP;(snnZd{4HZ2<0kT zufqy%#p3WeKoIjp!aly&$b82=#r> z!}$96GBz{MQvm~OFf4DDvtPytRj)g1MceEZ+c0WieF+;&(nv0OqqyqW^|u6mxoXXh zEkoy~Hmp8wsQOhuNCk3@oP(zZo`Re;m>UgxT-U__?dj-&x+5kNW~U(QbC4>Vpbt_e z=<@Ok#!N~(4K;o9Z$Q~vb`EJGmOU!h(!CDlk~Z&<4o$iwpf*<$Fj)vTcc<#iBd|;b z2TX4&It07cDtxa#{m_jfmZzfc-c4h5x;sf}p9-xaZpeZK-c njUq?&TenYd*5q&Dlv+xK8`G3$4;HcW|F5Or=+V0uO$7h|pY&kK diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7da67e89e..03de06bd0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -174,7 +174,7 @@ importers: packages/commonjs: specifiers: '@rollup/plugin-json': ^4.1.0 - '@rollup/plugin-node-resolve': ^8.4.0 + '@rollup/plugin-node-resolve': ^13.0.6 '@rollup/pluginutils': ^3.1.0 commondir: ^1.0.1 estree-walker: ^2.0.1 @@ -199,7 +199,7 @@ importers: resolve: 1.18.1 devDependencies: '@rollup/plugin-json': 4.1.0_rollup@2.67.3 - '@rollup/plugin-node-resolve': 8.4.0_rollup@2.67.3 + '@rollup/plugin-node-resolve': 13.0.6_rollup@2.67.3 locate-character: 2.0.5 require-relative: 0.8.7 rollup: 2.67.3 @@ -2484,6 +2484,10 @@ packages: /@types/node/14.14.3: resolution: {integrity: sha512-33/L34xS7HVUx23e0wOT2V1qPF1IrHgQccdJVm9uXGTB9vFBrrzBtkQymT8VskeKOxjz55MSqMv0xuLq+u98WQ==} + dev: true + + /@types/node/16.11.7: + resolution: {integrity: sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==} /@types/node/16.3.2: resolution: {integrity: sha512-jJs9ErFLP403I+hMLGnqDRWT0RYKSvArxuBVh2veudHV7ifEC1WAmjJADacZ7mRbA2nWgHtn8xyECMAot0SkAw==} @@ -2512,7 +2516,7 @@ packages: /@types/resolve/1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 14.14.3 + '@types/node': 16.11.7 /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} @@ -3211,6 +3215,11 @@ packages: resolution: {integrity: sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==} engines: {node: '>=6'} + /builtin-modules/3.2.0: + resolution: {integrity: sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==} + engines: {node: '>=6'} + dev: true + /cacheable-lookup/5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} From 44246866d60536751851d29aeb1c26dfe3964d51 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Fri, 19 Nov 2021 06:38:57 +0100 Subject: [PATCH 07/22] feat(commonjs): limit ignoreTryCatch to external requires (#1038) --- packages/commonjs/README.md | 10 ++- packages/commonjs/src/generate-imports.js | 80 ++++++++++++++---- packages/commonjs/src/index.js | 2 +- packages/commonjs/src/transform-commonjs.js | 62 +++----------- .../fixtures/form/try-catch-remove/_config.js | 5 -- .../fixtures/form/try-catch-remove/output.js | 12 --- .../function/try-catch-internal/_config.js | 7 ++ .../function/try-catch-internal/dep.js | 1 + .../function/try-catch-internal/main.js | 7 ++ .../function/try-catch-remove/_config.js | 5 ++ .../try-catch-remove/main.js} | 2 +- .../commonjs/test/snapshots/function.js.md | 38 +++++++++ .../commonjs/test/snapshots/function.js.snap | Bin 19932 -> 20032 bytes 13 files changed, 139 insertions(+), 92 deletions(-) delete mode 100644 packages/commonjs/test/fixtures/form/try-catch-remove/_config.js delete mode 100644 packages/commonjs/test/fixtures/form/try-catch-remove/output.js create mode 100644 packages/commonjs/test/fixtures/function/try-catch-internal/_config.js create mode 100644 packages/commonjs/test/fixtures/function/try-catch-internal/dep.js create mode 100644 packages/commonjs/test/fixtures/function/try-catch-internal/main.js create mode 100644 packages/commonjs/test/fixtures/function/try-catch-remove/_config.js rename packages/commonjs/test/fixtures/{form/try-catch-remove/input.js => function/try-catch-remove/main.js} (56%) diff --git a/packages/commonjs/README.md b/packages/commonjs/README.md index 9f8724204..127b7e688 100644 --- a/packages/commonjs/README.md +++ b/packages/commonjs/README.md @@ -144,15 +144,17 @@ Sometimes you have to leave require statements unconverted. Pass an array contai Type: `boolean | 'remove' | string[] | ((id: string) => boolean)`
Default: `true` -In most cases, where `require` calls are inside a `try-catch` clause, they should be left unconverted as it requires an optional dependency that may or may not be installed beside the rolled up package. +In most cases, where `require` calls to external dependencies are inside a `try-catch` clause, they should be left unconverted as it requires an optional dependency that may or may not be installed beside the rolled up package. Due to the conversion of `require` to a static `import` - the call is hoisted to the top of the file, outside of the `try-catch` clause. -- `true`: All `require` calls inside a `try` will be left unconverted. -- `false`: All `require` calls inside a `try` will be converted as if the `try-catch` clause is not there. -- `remove`: Remove all `require` calls from inside any `try` block. +- `true`: All external `require` calls inside a `try` will be left unconverted. +- `false`: All external `require` calls inside a `try` will be converted as if the `try-catch` clause is not there. +- `remove`: Remove all external `require` calls from inside any `try` block. - `string[]`: Pass an array containing the IDs to left unconverted. - `((id: string) => boolean|'remove')`: Pass a function that control individual IDs. +Note that non-external requires will not be ignored by this option. + ### `ignoreDynamicRequires` Type: `boolean` diff --git a/packages/commonjs/src/generate-imports.js b/packages/commonjs/src/generate-imports.js index 34f66e518..7aa0c33a7 100644 --- a/packages/commonjs/src/generate-imports.js +++ b/packages/commonjs/src/generate-imports.js @@ -5,8 +5,10 @@ import { sync as nodeResolveSync } from 'resolve'; import { DYNAMIC_MODULES_ID, EXPORTS_SUFFIX, + EXTERNAL_SUFFIX, HELPERS_ID, IS_WRAPPED_COMMONJS, + isWrappedId, MODULE_SUFFIX, wrapId } from './helpers'; @@ -96,14 +98,27 @@ export function hasDynamicModuleForPath(source, id, dynamicRequireModules) { export function getRequireHandlers() { const requireExpressions = []; - function addRequireStatement(sourceId, node, scope, usesReturnValue, toBeRemoved) { - requireExpressions.push({ sourceId, node, scope, usesReturnValue, toBeRemoved }); + function addRequireStatement( + sourceId, + node, + scope, + usesReturnValue, + isInsideTryBlock, + toBeRemoved + ) { + requireExpressions.push({ + sourceId, + node, + scope, + usesReturnValue, + isInsideTryBlock, + toBeRemoved + }); } async function rewriteRequireExpressionsAndGetImportBlock( magicString, topLevelDeclarations, - topLevelRequireDeclarators, reassignedNames, helpersName, dynamicRequireName, @@ -114,7 +129,8 @@ export function getRequireHandlers() { resolveRequireSourcesAndGetMeta, needsRequireWrapper, isEsModule, - usesRequire + usesRequire, + getIgnoreTryCatchRequireStatementMode ) { const imports = []; imports.push(`import * as ${helpersName} from "${HELPERS_ID}";`); @@ -141,7 +157,13 @@ export function getRequireHandlers() { needsRequireWrapper ? IS_WRAPPED_COMMONJS : !isEsModule, Object.keys(requiresBySource) ); - processRequireExpressions(imports, requireTargets, requiresBySource, magicString); + processRequireExpressions( + imports, + requireTargets, + requiresBySource, + getIgnoreTryCatchRequireStatementMode, + magicString + ); return { importBlock: imports.length ? `${imports.join('\n')}\n\n` : '', usesRequireWrapper @@ -156,37 +178,59 @@ export function getRequireHandlers() { function collectSources(requireExpressions) { const requiresBySource = Object.create(null); - for (const { sourceId, node, scope, usesReturnValue, toBeRemoved } of requireExpressions) { + for (const requireExpression of requireExpressions) { + const { sourceId } = requireExpression; if (!requiresBySource[sourceId]) { requiresBySource[sourceId] = []; } const requires = requiresBySource[sourceId]; - requires.push({ node, scope, usesReturnValue, toBeRemoved }); + requires.push(requireExpression); } return requiresBySource; } -function processRequireExpressions(imports, requireTargets, requiresBySource, magicString) { +function processRequireExpressions( + imports, + requireTargets, + requiresBySource, + getIgnoreTryCatchRequireStatementMode, + magicString +) { const generateRequireName = getGenerateRequireName(); - for (const { source, id: resolveId, isCommonJS } of requireTargets) { + for (const { source, id: resolvedId, isCommonJS } of requireTargets) { const requires = requiresBySource[source]; const name = generateRequireName(requires); - if (isCommonJS === IS_WRAPPED_COMMONJS) { - for (const { node } of requires) { - magicString.overwrite(node.start, node.end, `${name}()`); - } - imports.push(`import { __require as ${name} } from ${JSON.stringify(resolveId)};`); - } else { - let usesRequired = false; - for (const { node, usesReturnValue, toBeRemoved } of requires) { + let usesRequired = false; + let needsImport = false; + for (const { node, usesReturnValue, toBeRemoved, isInsideTryBlock } of requires) { + const { canConvertRequire, shouldRemoveRequire } = + isInsideTryBlock && isWrappedId(resolvedId, EXTERNAL_SUFFIX) + ? getIgnoreTryCatchRequireStatementMode(source) + : { canConvertRequire: true, shouldRemoveRequire: false }; + if (shouldRemoveRequire) { if (usesReturnValue) { + magicString.overwrite(node.start, node.end, 'undefined'); + } else { + magicString.remove(toBeRemoved.start, toBeRemoved.end); + } + } else if (canConvertRequire) { + needsImport = true; + if (isCommonJS === IS_WRAPPED_COMMONJS) { + magicString.overwrite(node.start, node.end, `${name}()`); + } else if (usesReturnValue) { usesRequired = true; magicString.overwrite(node.start, node.end, name); } else { magicString.remove(toBeRemoved.start, toBeRemoved.end); } } - imports.push(`import ${usesRequired ? `${name} from ` : ''}${JSON.stringify(resolveId)};`); + } + if (needsImport) { + if (isCommonJS === IS_WRAPPED_COMMONJS) { + imports.push(`import { __require as ${name} } from ${JSON.stringify(resolvedId)};`); + } else { + imports.push(`import ${usesRequired ? `${name} from ` : ''}${JSON.stringify(resolvedId)};`); + } } } } diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index fe73d0f8d..45eb23c98 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -93,7 +93,7 @@ export default function commonjs(options = {}) { return { canConvertRequire: mode !== 'remove' && mode !== true, - shouldRemoveRequireStatement: mode === 'remove' + shouldRemoveRequire: mode === 'remove' }; }; diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index f0c43c362..7b53b5ab8 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -8,8 +8,8 @@ import MagicString from 'magic-string'; import { getKeypath, - isDefineCompiledEsm, hasDefineEsmProperty, + isDefineCompiledEsm, isFalsy, isReference, isShorthandProperty, @@ -75,7 +75,6 @@ export default async function transformCommonjs( // TODO technically wrong since globals isn't populated yet, but ¯\_(ツ)_/¯ const helpersName = deconflict([scope], globals, 'commonjsHelpers'); const dynamicRequireName = deconflict([scope], globals, 'commonjsRequire'); - let hasRemovedRequire = false; const { addRequireStatement, rewriteRequireExpressionsAndGetImportBlock } = getRequireHandlers(); @@ -84,7 +83,6 @@ export default async function transformCommonjs( // where `foo` is later reassigned. (This happens in the wild. CommonJS, sigh) const reassignedNames = new Set(); const topLevelDeclarations = []; - const topLevelRequireDeclarators = new Set(); const skippedNodes = new Set(); const moduleAccessScopes = new Set([scope]); const exportsAccessScopes = new Set([scope]); @@ -223,51 +221,14 @@ export default async function transformCommonjs( if (!isIgnoredRequireStatement(node, ignoreRequire)) { const usesReturnValue = parent.type !== 'ExpressionStatement'; - - let canConvertRequire = true; - let shouldRemoveRequireStatement = false; - - if (currentTryBlockEnd !== null) { - const ignoreTryCatchRequire = getIgnoreTryCatchRequireStatementMode( - node.arguments[0].value - ); - ({ canConvertRequire, shouldRemoveRequireStatement } = ignoreTryCatchRequire); - if (shouldRemoveRequireStatement) { - hasRemovedRequire = true; - } - } - - const sourceId = getRequireStringArg(node); - if (shouldRemoveRequireStatement) { - if (usesReturnValue) { - magicString.overwrite(node.start, node.end, `undefined`); - } else { - magicString.remove(parent.start, parent.end); - } - return; - } - - if (canConvertRequire) { - addRequireStatement( - sourceId, - node, - scope, - usesReturnValue, - parent.type === 'ExpressionStatement' ? parent : node - ); - } - - if (usesReturnValue) { - if ( - parent.type === 'VariableDeclarator' && - !scope.parent && - parent.id.type === 'Identifier' - ) { - // This will allow us to reuse this variable name as the imported variable if it is not reassigned - // and does not conflict with variables in other places where this is imported - topLevelRequireDeclarators.add(parent); - } - } + addRequireStatement( + getRequireStringArg(node), + node, + scope, + usesReturnValue, + currentTryBlockEnd !== null, + parent.type === 'ExpressionStatement' ? parent : node + ); } return; } @@ -423,7 +384,6 @@ export default async function transformCommonjs( uses.module || uses.exports || uses.require || - hasRemovedRequire || topLevelDefineCompiledEsmExpressions.length > 0 ) && (ignoreGlobal || !uses.global) @@ -453,7 +413,6 @@ export default async function transformCommonjs( const { importBlock, usesRequireWrapper } = await rewriteRequireExpressionsAndGetImportBlock( magicString, topLevelDeclarations, - topLevelRequireDeclarators, reassignedNames, helpersName, dynamicRequireName, @@ -464,7 +423,8 @@ export default async function transformCommonjs( resolveRequireSourcesAndGetMeta, needsRequireWrapper, isEsModule, - uses.require + uses.require, + getIgnoreTryCatchRequireStatementMode ); const exportBlock = isEsModule ? '' diff --git a/packages/commonjs/test/fixtures/form/try-catch-remove/_config.js b/packages/commonjs/test/fixtures/form/try-catch-remove/_config.js deleted file mode 100644 index de5563f0d..000000000 --- a/packages/commonjs/test/fixtures/form/try-catch-remove/_config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - options: { - ignoreTryCatch: (id) => id === 'uninstalled-external-module' ? 'remove' : false - } -}; diff --git a/packages/commonjs/test/fixtures/form/try-catch-remove/output.js b/packages/commonjs/test/fixtures/form/try-catch-remove/output.js deleted file mode 100644 index e18f11df0..000000000 --- a/packages/commonjs/test/fixtures/form/try-catch-remove/output.js +++ /dev/null @@ -1,12 +0,0 @@ -/* eslint-disable global-require */ -import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; -import { __exports as input } from "\u0000fixtures/form/try-catch-remove/input.js?commonjs-exports" - -try { - -} catch (ignored) { - /* ignore */ -} - -export { input as __moduleExports, input as default }; diff --git a/packages/commonjs/test/fixtures/function/try-catch-internal/_config.js b/packages/commonjs/test/fixtures/function/try-catch-internal/_config.js new file mode 100644 index 000000000..fec6f7626 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/try-catch-internal/_config.js @@ -0,0 +1,7 @@ +module.exports = { + description: + 'inlines internal require statements in try-catch blocks even when try-catch is ignored', + pluginOptions: { + ignoreTryCatch: true + } +}; diff --git a/packages/commonjs/test/fixtures/function/try-catch-internal/dep.js b/packages/commonjs/test/fixtures/function/try-catch-internal/dep.js new file mode 100644 index 000000000..94ecacb72 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/try-catch-internal/dep.js @@ -0,0 +1 @@ +exports.foo = 'foo'; diff --git a/packages/commonjs/test/fixtures/function/try-catch-internal/main.js b/packages/commonjs/test/fixtures/function/try-catch-internal/main.js new file mode 100644 index 000000000..df773bb29 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/try-catch-internal/main.js @@ -0,0 +1,7 @@ +/* eslint-disable global-require */ + +try { + t.is(require('./dep.js').foo, 'foo'); +} catch (err) { + throw new Error(`Could not require: ${err}`); +} diff --git a/packages/commonjs/test/fixtures/function/try-catch-remove/_config.js b/packages/commonjs/test/fixtures/function/try-catch-remove/_config.js new file mode 100644 index 000000000..c7d4363f4 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/try-catch-remove/_config.js @@ -0,0 +1,5 @@ +module.exports = { + pluginOptions: { + ignoreTryCatch: (id) => (id === 'uninstalled-external-module' ? 'remove' : false) + } +}; diff --git a/packages/commonjs/test/fixtures/form/try-catch-remove/input.js b/packages/commonjs/test/fixtures/function/try-catch-remove/main.js similarity index 56% rename from packages/commonjs/test/fixtures/form/try-catch-remove/input.js rename to packages/commonjs/test/fixtures/function/try-catch-remove/main.js index 1aae6b291..fa5fa693e 100644 --- a/packages/commonjs/test/fixtures/form/try-catch-remove/input.js +++ b/packages/commonjs/test/fixtures/function/try-catch-remove/main.js @@ -3,5 +3,5 @@ try { require('uninstalled-external-module'); } catch (ignored) { - /* ignore */ + throw new Error('This should no longer be reached as the require is removed.'); } diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index e09892341..68e51acb0 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -7030,3 +7030,41 @@ Generated by [AVA](https://avajs.dev). module.exports = main;␊ `, } + +## try-catch-internal + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var dep = {};␊ + ␊ + dep.foo = 'foo';␊ + ␊ + /* eslint-disable global-require */␊ + ␊ + try {␊ + t.is(dep.foo, 'foo');␊ + } catch (err) {␊ + throw new Error(`Could not require: ${err}`);␊ + }␊ + ␊ + module.exports = main;␊ + `, + } + +## try-catch-remove + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + module.exports = main;␊ + `, + } diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index 732515802d01b322faf9285733d88faaabc3f8eb..568120c83d385a08c1d41b26413a707caa8646e4 100644 GIT binary patch delta 19737 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 delta 19571 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 Date: Sat, 20 Nov 2021 07:16:47 +0100 Subject: [PATCH 08/22] feat(commonjs): auto-detect conditional requires (#1038) --- packages/commonjs/src/generate-imports.js | 10 +- packages/commonjs/src/index.js | 7 +- .../commonjs/src/resolve-require-sources.js | 44 +++- packages/commonjs/src/transform-commonjs.js | 61 ++++- packages/commonjs/src/utils.js | 8 +- .../conditional-require-chain/_config.js | 3 + .../function/conditional-require-chain/dep.js | 1 + .../conditional-require-chain/main.js | 6 + .../conditional-require-chain/throws.js | 1 + .../function/skips-dead-branches/main.js | 7 +- .../_config.js | 3 + .../hoisted.js | 1 + .../main.js | 44 ++++ .../throws.js | 1 + .../main.js | 4 +- packages/commonjs/test/form.js | 17 +- .../commonjs/test/snapshots/function.js.md | 211 +++++++++++++++--- .../commonjs/test/snapshots/function.js.snap | Bin 20032 -> 20622 bytes 18 files changed, 364 insertions(+), 65 deletions(-) create mode 100644 packages/commonjs/test/fixtures/function/conditional-require-chain/_config.js create mode 100644 packages/commonjs/test/fixtures/function/conditional-require-chain/dep.js create mode 100644 packages/commonjs/test/fixtures/function/conditional-require-chain/main.js create mode 100644 packages/commonjs/test/fixtures/function/conditional-require-chain/throws.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/_config.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/hoisted.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/main.js create mode 100644 packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/throws.js diff --git a/packages/commonjs/src/generate-imports.js b/packages/commonjs/src/generate-imports.js index 7aa0c33a7..d624ab25c 100644 --- a/packages/commonjs/src/generate-imports.js +++ b/packages/commonjs/src/generate-imports.js @@ -104,6 +104,7 @@ export function getRequireHandlers() { scope, usesReturnValue, isInsideTryBlock, + isInsideConditional, toBeRemoved ) { requireExpressions.push({ @@ -112,6 +113,7 @@ export function getRequireHandlers() { scope, usesReturnValue, isInsideTryBlock, + isInsideConditional, toBeRemoved }); } @@ -135,7 +137,6 @@ export function getRequireHandlers() { const imports = []; imports.push(`import * as ${helpersName} from "${HELPERS_ID}";`); if (usesRequire) { - // TODO Lukas check where to import it from or change to usesDynamicRequire imports.push( `import { commonjsRequire as ${dynamicRequireName} } from "${DYNAMIC_MODULES_ID}";` ); @@ -155,7 +156,12 @@ export function getRequireHandlers() { const { requireTargets, usesRequireWrapper } = await resolveRequireSourcesAndGetMeta( id, needsRequireWrapper ? IS_WRAPPED_COMMONJS : !isEsModule, - Object.keys(requiresBySource) + Object.keys(requiresBySource).map((source) => { + return { + source, + isConditional: requiresBySource[source].every((require) => require.isInsideConditional) + }; + }) ); processRequireExpressions( imports, diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index 45eb23c98..88c362987 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -38,7 +38,7 @@ export default function commonjs(options = {}) { } = options; const extensions = options.extensions || ['.js']; const filter = createFilter(options.include, options.exclude); - const { strictRequiresFilter, detectCycles } = getStrictRequiresFilter(options); + const { strictRequiresFilter, detectCyclesAndConditional } = getStrictRequiresFilter(options); const getRequireReturnsDefault = typeof requireReturnsDefaultOption === 'function' @@ -63,10 +63,11 @@ export default function commonjs(options = {}) { resolveRequireSourcesAndGetMeta, getWrappedIds, isRequiredId - } = getResolveRequireSourcesAndGetMeta(extensions, detectCycles); + } = getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndConditional); const dynamicRequireModules = getDynamicRequireModules(options.dynamicRequireTargets); const isDynamicRequireModulesEnabled = dynamicRequireModules.size > 0; - // TODO Lukas do we need the CWD? + // TODO Lukas replace with new dynamicRequireRoot to replace CWD + // TODO Lukas throw if require from outside commondir const commonDir = isDynamicRequireModulesEnabled ? getCommonDir(null, Array.from(dynamicRequireModules.keys()).concat(process.cwd())) : null; diff --git a/packages/commonjs/src/resolve-require-sources.js b/packages/commonjs/src/resolve-require-sources.js index 78f0af4d0..9483d2cd1 100644 --- a/packages/commonjs/src/resolve-require-sources.js +++ b/packages/commonjs/src/resolve-require-sources.js @@ -7,9 +7,10 @@ import { } from './helpers'; import { resolveExtensions } from './resolve-id'; -export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { +export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndConditional) { const knownCjsModuleTypes = Object.create(null); const requiredIds = Object.create(null); + const unconditionallyRequiredIds = Object.create(null); const dependentModules = Object.create(null); const getDependentModules = (id) => dependentModules[id] || (dependentModules[id] = Object.create(null)); @@ -20,20 +21,31 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { (id) => knownCjsModuleTypes[id] === IS_WRAPPED_COMMONJS ), isRequiredId: (id) => requiredIds[id], - resolveRequireSourcesAndGetMeta: (rollupContext) => async (id, isParentCommonJS, sources) => { - knownCjsModuleTypes[id] = isParentCommonJS; + resolveRequireSourcesAndGetMeta: (rollupContext) => async ( + parentId, + isParentCommonJS, + sources + ) => { + knownCjsModuleTypes[parentId] = knownCjsModuleTypes[parentId] || isParentCommonJS; + if ( + knownCjsModuleTypes[parentId] && + requiredIds[parentId] && + !unconditionallyRequiredIds[parentId] + ) { + knownCjsModuleTypes[parentId] = IS_WRAPPED_COMMONJS; + } const requireTargets = await Promise.all( - sources.map(async (source) => { + sources.map(async ({ source, isConditional }) => { // Never analyze or proxy internal modules if (source.startsWith('\0')) { return { id: source, allowProxy: false }; } const resolved = - (await rollupContext.resolve(source, id, { + (await rollupContext.resolve(source, parentId, { custom: { 'node-resolve': { isRequire: true } } - })) || resolveExtensions(source, id, extensions); + })) || resolveExtensions(source, parentId, extensions); if (!resolved) { return { id: wrapId(source, EXTERNAL_SUFFIX), allowProxy: false }; } @@ -42,17 +54,25 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { return { id: wrapId(childId, EXTERNAL_SUFFIX), allowProxy: false }; } requiredIds[childId] = true; - const parentDependentModules = getDependentModules(id); + if ( + !( + detectCyclesAndConditional && + (isConditional || knownCjsModuleTypes[parentId] === IS_WRAPPED_COMMONJS) + ) + ) { + unconditionallyRequiredIds[childId] = true; + } + const parentDependentModules = getDependentModules(parentId); const childDependentModules = getDependentModules(childId); - childDependentModules[id] = true; + childDependentModules[parentId] = true; for (const dependentId of Object.keys(parentDependentModules)) { childDependentModules[dependentId] = true; } if (parentDependentModules[childId]) { // If we depend on one of our dependencies, we have a cycle. Then all modules that // we depend on that also depend on the same module are part of a cycle as well. - if (detectCycles && isParentCommonJS) { - knownCjsModuleTypes[id] = IS_WRAPPED_COMMONJS; + if (detectCyclesAndConditional && isParentCommonJS) { + knownCjsModuleTypes[parentId] = IS_WRAPPED_COMMONJS; knownCjsModuleTypes[childId] = IS_WRAPPED_COMMONJS; for (const dependentId of Object.keys(parentDependentModules)) { if (getDependentModules(dependentId)[childId]) { @@ -73,7 +93,7 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { requireTargets: requireTargets.map(({ id: dependencyId, allowProxy }, index) => { const isCommonJS = knownCjsModuleTypes[dependencyId]; return { - source: sources[index], + source: sources[index].source, id: allowProxy ? isCommonJS === IS_WRAPPED_COMMONJS ? wrapId(dependencyId, WRAPPED_SUFFIX) @@ -82,7 +102,7 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCycles) { isCommonJS }; }), - usesRequireWrapper: knownCjsModuleTypes[id] === IS_WRAPPED_COMMONJS + usesRequireWrapper: knownCjsModuleTypes[parentId] === IS_WRAPPED_COMMONJS }; } }; diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index 7b53b5ab8..5468878ec 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -71,7 +71,13 @@ export default async function transformCommonjs( let shouldWrap = false; const globals = new Set(); + // A conditionalNode is a node for which execution is not guaranteed. If such a node is a require + // or contains nested requires, those should be handled as function calls unless there is an + // 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'); @@ -102,6 +108,12 @@ export default async function transformCommonjs( if (currentTryBlockEnd !== null && node.start > currentTryBlockEnd) { currentTryBlockEnd = null; } + if (currentConditionalNodeEnd !== null && node.start > currentConditionalNodeEnd) { + currentConditionalNodeEnd = null; + } + if (currentConditionalNodeEnd === null && conditionalNodes.has(node)) { + currentConditionalNodeEnd = node.end; + } programDepth += 1; if (node.scope) ({ scope } = node); @@ -113,11 +125,6 @@ export default async function transformCommonjs( // eslint-disable-next-line default-case switch (node.type) { - case 'TryStatement': - if (currentTryBlockEnd === null) { - currentTryBlockEnd = node.block.end; - } - return; case 'AssignmentExpression': if (node.left.type === 'MemberExpression') { const flattened = getKeypath(node.left); @@ -227,6 +234,7 @@ export default async function transformCommonjs( scope, usesReturnValue, currentTryBlockEnd !== null, + currentConditionalNodeEnd !== null, parent.type === 'ExpressionStatement' ? parent : node ); } @@ -237,8 +245,26 @@ export default async function transformCommonjs( // skip dead branches if (isFalsy(node.test)) { skippedNodes.add(node.consequent); - } else if (node.alternate && isTruthy(node.test)) { - skippedNodes.add(node.alternate); + } else if (isTruthy(node.test)) { + if (node.alternate) { + skippedNodes.add(node.alternate); + } + } else { + conditionalNodes.add(node.consequent); + if (node.alternate) { + conditionalNodes.add(node.alternate); + } + } + return; + case 'ArrowFunctionExpression': + case 'FunctionDeclaration': + case 'FunctionExpression': + // requires in functions should be conditional unless it is an IIFE + if ( + currentConditionalNodeEnd === null && + !(parent.type === 'CallExpression' && parent.callee === node) + ) { + currentConditionalNodeEnd = node.end; } return; case 'Identifier': { @@ -301,6 +327,22 @@ export default async function transformCommonjs( return; } } + case 'LogicalExpression': + // skip dead branches + if (node.operator === '&&') { + if (isFalsy(node.left)) { + skippedNodes.add(node.right); + } else if (!isTruthy(node.left)) { + conditionalNodes.add(node.right); + } + } else if (node.operator === '||') { + if (isTruthy(node.left)) { + skippedNodes.add(node.right); + } else if (!isFalsy(node.left)) { + conditionalNodes.add(node.right); + } + } + return; case 'MemberExpression': if (!isDynamicRequireModulesEnabled && isModuleRequire(node, scope)) { uses.require = true; @@ -328,6 +370,11 @@ export default async function transformCommonjs( } } return; + case 'TryStatement': + if (currentTryBlockEnd === null) { + currentTryBlockEnd = node.block.end; + } + return; case 'UnaryExpression': // rewrite `typeof module`, `typeof module.exports` and `typeof exports` (https://github.com/rollup/rollup-plugin-commonjs/issues/151) if (node.operator === 'typeof') { diff --git a/packages/commonjs/src/utils.js b/packages/commonjs/src/utils.js index baee15948..35c727a97 100644 --- a/packages/commonjs/src/utils.js +++ b/packages/commonjs/src/utils.js @@ -44,20 +44,20 @@ export function capitalize(name) { export function getStrictRequiresFilter({ strictRequires }) { switch (strictRequires) { case true: - return { strictRequiresFilter: () => true, detectCycles: false }; + return { strictRequiresFilter: () => true, detectCyclesAndConditional: false }; // eslint-disable-next-line no-undefined case undefined: case 'auto': case 'debug': case null: - return { strictRequiresFilter: () => false, detectCycles: true }; + return { strictRequiresFilter: () => false, detectCyclesAndConditional: true }; case false: - return { strictRequiresFilter: () => false, detectCycles: false }; + return { strictRequiresFilter: () => false, detectCyclesAndConditional: false }; default: if (typeof strictRequires === 'string' || Array.isArray(strictRequires)) { return { strictRequiresFilter: createFilter(strictRequires), - detectCycles: false + detectCyclesAndConditional: false }; } throw new Error('Unexpected value for "strictRequires" option.'); diff --git a/packages/commonjs/test/fixtures/function/conditional-require-chain/_config.js b/packages/commonjs/test/fixtures/function/conditional-require-chain/_config.js new file mode 100644 index 000000000..e0666eccc --- /dev/null +++ b/packages/commonjs/test/fixtures/function/conditional-require-chain/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'makes requires in conditionally required modules conditional as well' +}; diff --git a/packages/commonjs/test/fixtures/function/conditional-require-chain/dep.js b/packages/commonjs/test/fixtures/function/conditional-require-chain/dep.js new file mode 100644 index 000000000..3b1998d8e --- /dev/null +++ b/packages/commonjs/test/fixtures/function/conditional-require-chain/dep.js @@ -0,0 +1 @@ +require('./throws.js'); diff --git a/packages/commonjs/test/fixtures/function/conditional-require-chain/main.js b/packages/commonjs/test/fixtures/function/conditional-require-chain/main.js new file mode 100644 index 000000000..1aa85f1c1 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/conditional-require-chain/main.js @@ -0,0 +1,6 @@ +global.false = false; + +if (global.false) { + // eslint-disable-next-line global-require + require('./dep.js'); +} diff --git a/packages/commonjs/test/fixtures/function/conditional-require-chain/throws.js b/packages/commonjs/test/fixtures/function/conditional-require-chain/throws.js new file mode 100644 index 000000000..eb8668af4 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/conditional-require-chain/throws.js @@ -0,0 +1 @@ +throw new Error('This should not be executed'); diff --git a/packages/commonjs/test/fixtures/function/skips-dead-branches/main.js b/packages/commonjs/test/fixtures/function/skips-dead-branches/main.js index 0066d0550..03d934380 100644 --- a/packages/commonjs/test/fixtures/function/skips-dead-branches/main.js +++ b/packages/commonjs/test/fixtures/function/skips-dead-branches/main.js @@ -3,4 +3,9 @@ if ('development' === 'production') { require('./a.js'); } -module.exports = true ? require('./b.js') : require('./c.js'); +exports.conditionalTrue = true ? require('./b.js') : require('./c.js'); +exports.conditionalFalse = false ? require('./c.js') : require('./b.js'); +exports.logicalAnd1 = true && require('./b.js'); +exports.logicalAnd2 = false && require('./c.js'); +exports.logicalOr1 = true || require('./c.js'); +exports.logicalOr2 = false || require('./b.js'); diff --git a/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/_config.js b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/_config.js new file mode 100644 index 000000000..d926d0b82 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'automatically detects requires nested in conditionals' +}; diff --git a/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/hoisted.js b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/hoisted.js new file mode 100644 index 000000000..705851f9f --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/hoisted.js @@ -0,0 +1 @@ +module.exports = 'this should be top-level'; diff --git a/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/main.js b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/main.js new file mode 100644 index 000000000..b7fc6ea58 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/main.js @@ -0,0 +1,44 @@ +/* eslint-disable global-require */ +global.false = false; +global.true = true; + +if (global.false) { + require('./throws.js'); +} + +if (global.true) { + /* do nothing */ +} else { + require('./throws.js'); +} + +const conditionalFalse = global.false ? require('./throws.js') : null; +const conditionalTrue = global.true ? null : require('./throws.js'); + +const logicalAnd = global.false && require('./throws.js'); +const logicalOr = global.true || require('./throws.js'); + +function requireFunctionDeclaration() { + require('./throws.js'); +} + +const requireFunctionExpression = function () { + require('./throws.js'); +}; + +const requireArrowFunction = () => require('./throws.js'); + +if (global.false) { + requireFunctionDeclaration(); + requireFunctionExpression(); + requireArrowFunction(); +} + +// These should not cause wrapping +t.is( + (function () { + return require('./hoisted.js'); + })(), + 'this should be top-level' +); +t.is((() => require('./hoisted.js'))(), 'this should be top-level'); diff --git a/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/throws.js b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/throws.js new file mode 100644 index 000000000..d11e026e6 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/strict-requires-detect-conditionals/throws.js @@ -0,0 +1 @@ +throw new Error('This should never be executed or imported'); diff --git a/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/main.js b/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/main.js index c10a2ca10..8e5f0208b 100644 --- a/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/main.js +++ b/packages/commonjs/test/fixtures/function/strict-requires-file-without-module-type/main.js @@ -1,2 +1,4 @@ +global.null = 0; + // eslint-disable-next-line global-require -t.is(0 && require('./error.js'), 0); +t.is(global.null && require('./error.js'), 0); diff --git a/packages/commonjs/test/form.js b/packages/commonjs/test/form.js index 3dcc25740..270d27ccf 100644 --- a/packages/commonjs/test/form.js +++ b/packages/commonjs/test/form.js @@ -11,6 +11,13 @@ import { commonjs } from './helpers/util'; process.chdir(__dirname); const transformContext = { + error: (base, props) => { + let error = base; + if (!(base instanceof Error)) error = Object.assign(new Error(base.message), base); + if (props) Object.assign(error, props); + throw error; + }, + load: ({ id }) => Promise.resolve({ id, meta: {} }), parse: (input, options) => acorn.parse(input, { ecmaVersion: 9, @@ -20,8 +27,7 @@ const transformContext = { resolve: (source, importer) => Promise.resolve({ id: `${path.resolve(path.dirname(importer), source)}${path.extname(source) ? '' : '.js'}` - }), - load: ({ id }) => Promise.resolve({ id, meta: {} }) + }) }; // Do not run on Windows as we have full path names in the output @@ -59,13 +65,6 @@ if (path.sep === '/') { : [] }; }; - transformContext.error = (base, props) => { - let error = base; - if (!(base instanceof Error)) error = Object.assign(new Error(base.message), base); - if (props) Object.assign(error, props); - throw error; - }; - const input = fs.readFileSync(id, 'utf-8'); let outputFile = `fixtures/form/${dir}/${outputName}`; diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index 68e51acb0..42d68b8eb 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -4484,16 +4484,32 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ - var multiply = function (a, b) {␊ - return a * b;␊ - };␊ + var multiply;␊ + var hasRequiredMultiply;␊ + ␊ + function requireMultiply () {␊ + if (hasRequiredMultiply) return multiply;␊ + hasRequiredMultiply = 1;␊ + multiply = function (a, b) {␊ + return a * b;␊ + };␊ + return multiply;␊ + }␊ + ␊ + var foo;␊ + var hasRequiredFoo;␊ ␊ - var foo = 1;␊ + function requireFoo () {␊ + if (hasRequiredFoo) return foo;␊ + hasRequiredFoo = 1;␊ + foo = 1;␊ + return foo;␊ + }␊ ␊ /* eslint-disable global-require */␊ ␊ var main = function () {␊ - return multiply(2, foo);␊ + return requireMultiply()(2, requireFoo());␊ };␊ ␊ module.exports = main;␊ @@ -5598,16 +5614,31 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ + Object.defineProperty(exports, '__esModule', { value: true });␊ + ␊ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ ␊ + var main = {};␊ + ␊ commonjsGlobal.b = 2;␊ var b = 'b';␊ ␊ /* eslint-disable */␊ ␊ - var main = b ;␊ + var conditionalTrue = main.conditionalTrue = b ;␊ + var conditionalFalse = main.conditionalFalse = b;␊ + var logicalAnd1 = main.logicalAnd1 = b;␊ + var logicalAnd2 = main.logicalAnd2 = false ;␊ + var logicalOr1 = main.logicalOr1 = true ;␊ + var logicalOr2 = main.logicalOr2 = b;␊ ␊ - module.exports = main;␊ + exports.conditionalFalse = conditionalFalse;␊ + exports.conditionalTrue = conditionalTrue;␊ + exports["default"] = main;␊ + exports.logicalAnd1 = logicalAnd1;␊ + exports.logicalAnd2 = logicalAnd2;␊ + exports.logicalOr1 = logicalOr1;␊ + exports.logicalOr2 = logicalOr2;␊ `, } @@ -5807,6 +5838,77 @@ Generated by [AVA](https://avajs.dev). `, } +## strict-requires-detect-conditionals + +> 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 throws = {};␊ + ␊ + var hasRequiredThrows;␊ + ␊ + function requireThrows () {␊ + if (hasRequiredThrows) return throws;␊ + hasRequiredThrows = 1;␊ + throw new Error('This should never be executed or imported');␊ + }␊ + ␊ + var hoisted = 'this should be top-level';␊ + ␊ + /* eslint-disable global-require */␊ + ␊ + commonjsGlobal.false = false;␊ + commonjsGlobal.true = true;␊ + ␊ + if (commonjsGlobal.false) {␊ + requireThrows();␊ + }␊ + ␊ + if (commonjsGlobal.true) ; else {␊ + requireThrows();␊ + }␊ + ␊ + commonjsGlobal.false ? requireThrows() : null;␊ + commonjsGlobal.true ? null : requireThrows();␊ + ␊ + commonjsGlobal.false && requireThrows();␊ + commonjsGlobal.true || requireThrows();␊ + ␊ + function requireFunctionDeclaration() {␊ + requireThrows();␊ + }␊ + ␊ + const requireFunctionExpression = function () {␊ + requireThrows();␊ + };␊ + ␊ + const requireArrowFunction = () => requireThrows();␊ + ␊ + if (commonjsGlobal.false) {␊ + requireFunctionDeclaration();␊ + requireFunctionExpression();␊ + requireArrowFunction();␊ + }␊ + ␊ + // These should not cause wrapping␊ + t.is(␊ + (function () {␊ + return hoisted;␊ + })(),␊ + 'this should be top-level'␊ + );␊ + t.is((() => hoisted)(), 'this should be top-level');␊ + ␊ + module.exports = main;␊ + `, + } + ## strict-requires-entry-node-resolve > Snapshot 1 @@ -6052,15 +6154,29 @@ Generated by [AVA](https://avajs.dev). { '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 error = {};␊ + ␊ + var hasRequiredError;␊ + ␊ + function requireError () {␊ + if (hasRequiredError) return error;␊ + hasRequiredError = 1;␊ + throw new Error('FAIL');␊ + }␊ + ␊ var hasRequiredMain;␊ ␊ function requireMain () {␊ if (hasRequiredMain) return main;␊ hasRequiredMain = 1;␊ + commonjsGlobal.null = 0;␊ + ␊ // eslint-disable-next-line global-require␊ - t.is(0 , 0);␊ + t.is(commonjsGlobal.null && requireError(), 0);␊ return main;␊ }␊ ␊ @@ -6962,6 +7078,44 @@ Generated by [AVA](https://avajs.dev). `, } +## try-catch-internal + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var dep = {};␊ + ␊ + dep.foo = 'foo';␊ + ␊ + /* eslint-disable global-require */␊ + ␊ + try {␊ + t.is(dep.foo, 'foo');␊ + } catch (err) {␊ + throw new Error(`Could not require: ${err}`);␊ + }␊ + ␊ + module.exports = main;␊ + `, + } + +## try-catch-remove + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + module.exports = main;␊ + `, + } + ## typeof-module-require > Snapshot 1 @@ -7031,39 +7185,44 @@ Generated by [AVA](https://avajs.dev). `, } -## try-catch-internal +## 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 = {};␊ ␊ - dep.foo = 'foo';␊ + var throws = {};␊ ␊ - /* eslint-disable global-require */␊ + var hasRequiredThrows;␊ ␊ - try {␊ - t.is(dep.foo, 'foo');␊ - } catch (err) {␊ - throw new Error(`Could not require: ${err}`);␊ + function requireThrows () {␊ + if (hasRequiredThrows) return throws;␊ + hasRequiredThrows = 1;␊ + throw new Error('This should not be executed');␊ }␊ ␊ - module.exports = main;␊ - `, - } - -## try-catch-remove - -> Snapshot 1 - - { - 'main.js': `'use strict';␊ + var hasRequiredDep;␊ ␊ - var main = {};␊ + 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 568120c83d385a08c1d41b26413a707caa8646e4..f09c75457080c1951f53bd791fedb6baa72e3c78 100644 GIT binary patch literal 20622 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 literal 20032 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

^ZK?ze7n@Ip_2}w9TFBAqV+3Nrf!PrmBQ_{C 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 Tg>jnlbl?92W=xLJh;;%05~rm+ From 42e719638a8aabc85dbda9cad541c73f417c6948 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Sun, 21 Nov 2021 07:46:57 +0100 Subject: [PATCH 09/22] 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; } /** From 06a74aee282a420a8bf5c9e0575c1f5e1f78af15 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Mon, 22 Nov 2021 06:53:47 +0100 Subject: [PATCH 10/22] feat(commonjs): throw for dynamic requires from outside the configured root (#1038) --- packages/commonjs/src/index.js | 18 ++++++++++-- packages/commonjs/src/transform-commonjs.js | 4 ++- .../form/dynamic-template-literal/input.js | 3 -- .../form/dynamic-template-literal/output.js | 9 ------ .../dynamic-require-outside-root/main.js | 6 ++++ .../nested/target.js | 1 + packages/commonjs/test/test.js | 28 +++++++++++++++++++ 7 files changed, 54 insertions(+), 15 deletions(-) delete mode 100644 packages/commonjs/test/fixtures/form/dynamic-template-literal/input.js delete mode 100644 packages/commonjs/test/fixtures/form/dynamic-template-literal/output.js create mode 100644 packages/commonjs/test/fixtures/samples/dynamic-require-outside-root/main.js create mode 100644 packages/commonjs/test/fixtures/samples/dynamic-require-outside-root/nested/target.js diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index 6079ced8b..cf68d552b 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -1,4 +1,4 @@ -import { extname, relative, resolve } from 'path'; +import { extname, relative, resolve, dirname } from 'path'; import { createFilter } from '@rollup/pluginutils'; @@ -129,6 +129,19 @@ export default function commonjs(options = {}) { !isEsModule && (dynamicRequireModules.has(normalizePathSlashes(id)) || strictRequiresFilter(id)); + const checkDynamicRequire = () => { + if (id.indexOf(dynamicRequireRoot) !== 0) { + this.error({ + code: 'DYNAMIC_REQUIRE_OUTSIDE_ROOT', + id, + dynamicRequireRoot, + message: `"${id}" contains dynamic require statements but it is not within the current dynamicRequireRoot "${dynamicRequireRoot}". You should set dynamicRequireRoot to "${dirname( + id + )}" or one of its parent directories.` + }); + } + }; + return transformCommonjs( this.parse, code, @@ -146,7 +159,8 @@ export default function commonjs(options = {}) { getDefaultIsModuleExports(id), needsRequireWrapper, resolveRequireSourcesAndGetMeta(this), - isRequiredId(id) + isRequiredId(id), + checkDynamicRequire ); } diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index 5468878ec..509685256 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -52,7 +52,8 @@ export default async function transformCommonjs( defaultIsModuleExports, needsRequireWrapper, resolveRequireSourcesAndGetMeta, - isRequired + isRequired, + checkDynamicRequire ) { const ast = astCache || tryParse(parse, code, id); const magicString = new MagicString(code); @@ -295,6 +296,7 @@ export default async function transformCommonjs( ); } if (!ignoreDynamicRequires) { + checkDynamicRequire(); if (isShorthandProperty(parent)) { magicString.appendRight(node.end, `: ${dynamicRequireName}`); } else { diff --git a/packages/commonjs/test/fixtures/form/dynamic-template-literal/input.js b/packages/commonjs/test/fixtures/form/dynamic-template-literal/input.js deleted file mode 100644 index 12767b60b..000000000 --- a/packages/commonjs/test/fixtures/form/dynamic-template-literal/input.js +++ /dev/null @@ -1,3 +0,0 @@ -var pe = 'pe'; -var foo = require(`ta${pe}`); -console.log(foo); diff --git a/packages/commonjs/test/fixtures/form/dynamic-template-literal/output.js b/packages/commonjs/test/fixtures/form/dynamic-template-literal/output.js deleted file mode 100644 index 2b301a21b..000000000 --- a/packages/commonjs/test/fixtures/form/dynamic-template-literal/output.js +++ /dev/null @@ -1,9 +0,0 @@ -import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; -import { __exports as input } from "\u0000fixtures/form/dynamic-template-literal/input.js?commonjs-exports" - -var pe = 'pe'; -var foo = commonjsRequire(`ta${pe}`); -console.log(foo); - -export { input as __moduleExports, input as default }; diff --git a/packages/commonjs/test/fixtures/samples/dynamic-require-outside-root/main.js b/packages/commonjs/test/fixtures/samples/dynamic-require-outside-root/main.js new file mode 100644 index 000000000..18306355f --- /dev/null +++ b/packages/commonjs/test/fixtures/samples/dynamic-require-outside-root/main.js @@ -0,0 +1,6 @@ +function takeModule(path) { + // eslint-disable-next-line global-require,import/no-dynamic-require + return require(path); +} + +takeModule('./nested/target.js'); diff --git a/packages/commonjs/test/fixtures/samples/dynamic-require-outside-root/nested/target.js b/packages/commonjs/test/fixtures/samples/dynamic-require-outside-root/nested/target.js new file mode 100644 index 000000000..5fe5c46eb --- /dev/null +++ b/packages/commonjs/test/fixtures/samples/dynamic-require-outside-root/nested/target.js @@ -0,0 +1 @@ +module.exports = 'target'; diff --git a/packages/commonjs/test/test.js b/packages/commonjs/test/test.js index 7a6405a33..f528e1213 100644 --- a/packages/commonjs/test/test.js +++ b/packages/commonjs/test/test.js @@ -684,3 +684,31 @@ if (os.platform() === 'win32') { t.regex(code, /var foo(\$\d+)? = {}/); }); } + +test('throws when there is a dynamic require from outside dynamicRequireRoot', async (t) => { + let error = null; + try { + await rollup({ + input: 'fixtures/samples/dynamic-require-outside-root/main.js', + plugins: [ + commonjs({ + dynamicRequireRoot: 'fixtures/samples/dynamic-require-outside-root/nested', + dynamicRequireTargets: ['fixtures/samples/dynamic-require-outside-root/nested/target.js'] + }) + ] + }); + } catch (err) { + error = err; + } + + const cwd = process.cwd(); + const id = path.join(cwd, 'fixtures/samples/dynamic-require-outside-root/main.js'); + const dynamicRequireRoot = path.join(cwd, 'fixtures/samples/dynamic-require-outside-root/nested'); + const minimalDynamicRequireRoot = path.join(cwd, 'fixtures/samples/dynamic-require-outside-root'); + t.like(error, { + 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.`, + pluginCode: 'DYNAMIC_REQUIRE_OUTSIDE_ROOT', + id, + dynamicRequireRoot + }); +}); From 3cdad21298ae7083f1cfd57d975145dbf5d52a64 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Mon, 22 Nov 2021 07:08:01 +0100 Subject: [PATCH 11/22] 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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 Date: Wed, 24 Nov 2021 06:35:45 +0100 Subject: [PATCH 12/22] feat(commonjs): expose plugin version (#1038) --- packages/commonjs/README.md | 4 ++-- packages/commonjs/src/index.js | 4 +++- packages/commonjs/test/test.js | 5 +++++ 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/packages/commonjs/README.md b/packages/commonjs/README.md index a835f8e48..c126e4ac2 100644 --- a/packages/commonjs/README.md +++ b/packages/commonjs/README.md @@ -51,9 +51,9 @@ When used together with the node-resolve plugin Type: `"auto" | boolean | "debug" | string[]`
Default: `"auto"` -By default, this plugin will try to hoist `require` statements as imports to the top of each file. While this works well for many code bases and allows for very efficient ESM output, it does not perfectly capture CommonJS semantics as the order of side effects like log statements may change. But it is especially problematic when there are circular `require` calls between CommonJS modules as those often rely on the lazy execution of nested `require` calls. +By default, this plugin will try to hoist `require` statements as imports to the top of each file. While this works well for many code bases and allows for very efficient ESM output, it does not perfectly capture CommonJS semantics as the initialisation order of required modules will be different. The resultant side effects can include log statements being emitted in a different order, and some code that is dependent on the initialisation order of polyfills in require statements may not work. But it is especially problematic when there are circular `require` calls between CommonJS modules as those often rely on the lazy execution of nested `require` calls. -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. +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. This is the safest setting and should be used if the generated code does not work correctly with `"auto"`. Note that `strictRequires: true` can have a small impact on the size and performance of generated code, but less so if the code is minified. 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"`. diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index 337f41830..1d0fdcc59 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -2,7 +2,7 @@ import { extname, relative, resolve, dirname } from 'path'; import { createFilter } from '@rollup/pluginutils'; -import { peerDependencies } from '../package.json'; +import { peerDependencies, version } from '../package.json'; import analyzeTopLevelStatements from './analyze-top-level-statements'; import { getDynamicModuleRegistry, getDynamicRequireModules } from './dynamic-modules'; @@ -166,6 +166,8 @@ export default function commonjs(options = {}) { return { name: 'commonjs', + version, + options(rawOptions) { // We inject the resolver in the beginning so that "catch-all-resolver" like node-resolver // do not prevent our plugin from resolving entry points ot proxies. diff --git a/packages/commonjs/test/test.js b/packages/commonjs/test/test.js index f528e1213..ea0afb695 100644 --- a/packages/commonjs/test/test.js +++ b/packages/commonjs/test/test.js @@ -23,6 +23,11 @@ test('Rollup peer dependency has correct format', (t) => { t.regex(peerDependencies.rollup, /^\^\d+\.\d+\.\d+(\|\|\^\d+\.\d+\.\d+)*$/); }); +test('exposes plugin version', (t) => { + const plugin = commonjs(); + t.regex(plugin.version, /^\d+\.\d+\.\d+/); +}); + // most of these should be moved over to function... test('generates a sourcemap', async (t) => { const bundle = await rollup({ From a66d253eadba8f6fe8f1f5b90110de01bbe93a1b Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Thu, 2 Dec 2021 09:25:44 +0100 Subject: [PATCH 13/22] fix(commonjs): do not transform "typeof exports" for mixed modules (#1038) resolves #1014 --- packages/commonjs/src/index.js | 21 +++-- packages/commonjs/src/resolve-id.js | 10 ++- .../commonjs/src/resolve-require-sources.js | 78 ++++++++++-------- packages/commonjs/src/transform-commonjs.js | 12 +-- .../function/load-cycle-parallel/_config.js | 3 + .../function/load-cycle-parallel/a.js | 1 + .../function/load-cycle-parallel/b.js | 1 + .../function/load-cycle-parallel/c.js | 1 + .../function/load-cycle-parallel/main.js | 3 + .../mixed-module-typeof-exports/_config.js | 4 + .../mixed-module-typeof-exports/foo.js | 1 + .../mixed-module-typeof-exports/main.js | 7 ++ .../commonjs/test/snapshots/function.js.md | 17 +++- .../commonjs/test/snapshots/function.js.snap | Bin 20650 -> 20734 bytes packages/commonjs/test/snapshots/test.js.md | 15 ++++ packages/commonjs/test/snapshots/test.js.snap | Bin 813 -> 938 bytes packages/commonjs/test/test.js | 18 +++- 17 files changed, 139 insertions(+), 53 deletions(-) create mode 100644 packages/commonjs/test/fixtures/function/load-cycle-parallel/_config.js create mode 100644 packages/commonjs/test/fixtures/function/load-cycle-parallel/a.js create mode 100644 packages/commonjs/test/fixtures/function/load-cycle-parallel/b.js create mode 100644 packages/commonjs/test/fixtures/function/load-cycle-parallel/c.js create mode 100644 packages/commonjs/test/fixtures/function/load-cycle-parallel/main.js create mode 100644 packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/_config.js create mode 100644 packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/foo.js create mode 100644 packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/main.js diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index 1d0fdcc59..627f98eb6 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -128,16 +128,19 @@ export default function commonjs(options = {}) { !isEsModule && (dynamicRequireModules.has(normalizePathSlashes(id)) || strictRequiresFilter(id)); - const checkDynamicRequire = () => { + const checkDynamicRequire = (position) => { if (id.indexOf(dynamicRequireRoot) !== 0) { - this.error({ - code: 'DYNAMIC_REQUIRE_OUTSIDE_ROOT', - id, - dynamicRequireRoot, - message: `"${id}" contains dynamic require statements but it is not within the current dynamicRequireRoot "${dynamicRequireRoot}". You should set dynamicRequireRoot to "${dirname( - id - )}" or one of its parent directories.` - }); + this.error( + { + code: 'DYNAMIC_REQUIRE_OUTSIDE_ROOT', + id, + dynamicRequireRoot, + message: `"${id}" contains dynamic require statements but it is not within the current dynamicRequireRoot "${dynamicRequireRoot}". You should set dynamicRequireRoot to "${dirname( + id + )}" or one of its parent directories.` + }, + position + ); } }; diff --git a/packages/commonjs/src/resolve-id.js b/packages/commonjs/src/resolve-id.js index c7d3844a9..74d209e5b 100644 --- a/packages/commonjs/src/resolve-id.js +++ b/packages/commonjs/src/resolve-id.js @@ -50,6 +50,14 @@ export function resolveExtensions(importee, importer, extensions) { export default function getResolveId(extensions) { return async function resolveId(importee, importer, resolveOptions) { + // We assume that all requires are pre-resolved + if ( + resolveOptions.custom && + resolveOptions.custom['node-resolve'] && + resolveOptions.custom['node-resolve'].isRequire + ) { + return null; + } if (isWrappedId(importee, WRAPPED_SUFFIX)) { return unwrapId(importee, WRAPPED_SUFFIX); } @@ -69,7 +77,7 @@ export default function getResolveId(extensions) { if (importer) { if ( importer === DYNAMIC_MODULES_ID || - // Except for exports, proxies are only importing resolved ids, no need to resolve again + // Proxies are only importing resolved ids, no need to resolve again isWrappedId(importer, PROXY_SUFFIX) || isWrappedId(importer, ES_IMPORT_SUFFIX) ) { diff --git a/packages/commonjs/src/resolve-require-sources.js b/packages/commonjs/src/resolve-require-sources.js index 9483d2cd1..76fae132e 100644 --- a/packages/commonjs/src/resolve-require-sources.js +++ b/packages/commonjs/src/resolve-require-sources.js @@ -11,9 +11,39 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndCo const knownCjsModuleTypes = Object.create(null); const requiredIds = Object.create(null); const unconditionallyRequiredIds = Object.create(null); - const dependentModules = Object.create(null); - const getDependentModules = (id) => - dependentModules[id] || (dependentModules[id] = Object.create(null)); + const dependencies = Object.create(null); + const getDependencies = (id) => dependencies[id] || (dependencies[id] = new Set()); + + const isCyclic = (id) => { + const dependenciesToCheck = new Set(getDependencies(id)); + for (const dependency of dependenciesToCheck) { + if (dependency === id) { + return true; + } + for (const childDependency of getDependencies(dependency)) { + dependenciesToCheck.add(childDependency); + } + } + return false; + }; + + const fullyAnalyzedModules = Object.create(null); + + const getTypeForFullyAnalyzedModule = (id) => { + const knownType = knownCjsModuleTypes[id]; + if ( + knownType === IS_WRAPPED_COMMONJS || + !detectCyclesAndConditional || + fullyAnalyzedModules[id] + ) { + return knownType; + } + fullyAnalyzedModules[id] = true; + if (isCyclic(id)) { + return (knownCjsModuleTypes[id] = IS_WRAPPED_COMMONJS); + } + return knownType; + }; return { getWrappedIds: () => @@ -26,8 +56,9 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndCo isParentCommonJS, sources ) => { - knownCjsModuleTypes[parentId] = knownCjsModuleTypes[parentId] || isParentCommonJS; + knownCjsModuleTypes[parentId] = isParentCommonJS; if ( + detectCyclesAndConditional && knownCjsModuleTypes[parentId] && requiredIds[parentId] && !unconditionallyRequiredIds[parentId] @@ -42,9 +73,7 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndCo } const resolved = (await rollupContext.resolve(source, parentId, { - custom: { - 'node-resolve': { isRequire: true } - } + custom: { 'node-resolve': { isRequire: true } } })) || resolveExtensions(source, parentId, extensions); if (!resolved) { return { id: wrapId(source, EXTERNAL_SUFFIX), allowProxy: false }; @@ -54,44 +83,25 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndCo return { id: wrapId(childId, EXTERNAL_SUFFIX), allowProxy: false }; } requiredIds[childId] = true; - if ( - !( - detectCyclesAndConditional && - (isConditional || knownCjsModuleTypes[parentId] === IS_WRAPPED_COMMONJS) - ) - ) { + if (!(isConditional || knownCjsModuleTypes[parentId] === IS_WRAPPED_COMMONJS)) { unconditionallyRequiredIds[childId] = true; } - const parentDependentModules = getDependentModules(parentId); - const childDependentModules = getDependentModules(childId); - childDependentModules[parentId] = true; - for (const dependentId of Object.keys(parentDependentModules)) { - childDependentModules[dependentId] = true; - } - if (parentDependentModules[childId]) { - // If we depend on one of our dependencies, we have a cycle. Then all modules that - // we depend on that also depend on the same module are part of a cycle as well. - if (detectCyclesAndConditional && isParentCommonJS) { - knownCjsModuleTypes[parentId] = IS_WRAPPED_COMMONJS; - knownCjsModuleTypes[childId] = IS_WRAPPED_COMMONJS; - for (const dependentId of Object.keys(parentDependentModules)) { - if (getDependentModules(dependentId)[childId]) { - knownCjsModuleTypes[dependentId] = IS_WRAPPED_COMMONJS; - } - } - } - } else { + + getDependencies(parentId).add(childId); + if (!isCyclic(childId)) { // This makes sure the current transform handler waits for all direct dependencies to be // loaded and transformed and therefore for all transitive CommonJS dependencies to be // loaded as well so that all cycles have been found and knownCjsModuleTypes is reliable. await rollupContext.load(resolved); + } else if (detectCyclesAndConditional && knownCjsModuleTypes[parentId]) { + knownCjsModuleTypes[parentId] = IS_WRAPPED_COMMONJS; } return { id: childId, allowProxy: true }; }) ); return { requireTargets: requireTargets.map(({ id: dependencyId, allowProxy }, index) => { - const isCommonJS = knownCjsModuleTypes[dependencyId]; + const isCommonJS = getTypeForFullyAnalyzedModule(dependencyId); return { source: sources[index].source, id: allowProxy @@ -102,7 +112,7 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndCo isCommonJS }; }), - usesRequireWrapper: knownCjsModuleTypes[parentId] === IS_WRAPPED_COMMONJS + usesRequireWrapper: getTypeForFullyAnalyzedModule(parentId) === IS_WRAPPED_COMMONJS }; } }; diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index e4147d4cd..3fb8602cd 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -198,7 +198,7 @@ export default async function transformCommonjs( isRequire(node.callee.object, scope) && node.callee.property.name === 'resolve' ) { - checkDynamicRequire(); + checkDynamicRequire(node.start); uses.require = true; const requireNode = node.callee.object; magicString.appendLeft( @@ -220,6 +220,7 @@ export default async function transformCommonjs( if (hasDynamicArguments(node)) { if (isDynamicRequireModulesEnabled) { + checkDynamicRequire(node.start); magicString.appendLeft( node.end - 1, `, ${JSON.stringify( @@ -228,7 +229,6 @@ export default async function transformCommonjs( ); } if (!ignoreDynamicRequires) { - checkDynamicRequire(); replacedDynamicRequires.push(node.callee); } return; @@ -286,7 +286,6 @@ export default async function transformCommonjs( return; } if (!ignoreDynamicRequires) { - checkDynamicRequire(); if (isShorthandProperty(parent)) { magicString.prependRight(node.start, 'require: '); } @@ -370,9 +369,10 @@ export default async function transformCommonjs( if (scope.contains(flattened.name)) return; if ( - flattened.keypath === 'module.exports' || - flattened.keypath === 'module' || - flattened.keypath === 'exports' + !isEsModule && + (flattened.keypath === 'module.exports' || + flattened.keypath === 'module' || + flattened.keypath === 'exports') ) { magicString.overwrite(node.start, node.end, `'object'`, { storeName: false diff --git a/packages/commonjs/test/fixtures/function/load-cycle-parallel/_config.js b/packages/commonjs/test/fixtures/function/load-cycle-parallel/_config.js new file mode 100644 index 000000000..73cd1001e --- /dev/null +++ b/packages/commonjs/test/fixtures/function/load-cycle-parallel/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'handles loading all modules of a cycle in parallel' +}; diff --git a/packages/commonjs/test/fixtures/function/load-cycle-parallel/a.js b/packages/commonjs/test/fixtures/function/load-cycle-parallel/a.js new file mode 100644 index 000000000..ed897bbc6 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/load-cycle-parallel/a.js @@ -0,0 +1 @@ +require('./b.js'); diff --git a/packages/commonjs/test/fixtures/function/load-cycle-parallel/b.js b/packages/commonjs/test/fixtures/function/load-cycle-parallel/b.js new file mode 100644 index 000000000..60204ed1e --- /dev/null +++ b/packages/commonjs/test/fixtures/function/load-cycle-parallel/b.js @@ -0,0 +1 @@ +require('./c.js'); diff --git a/packages/commonjs/test/fixtures/function/load-cycle-parallel/c.js b/packages/commonjs/test/fixtures/function/load-cycle-parallel/c.js new file mode 100644 index 000000000..d87ec6cce --- /dev/null +++ b/packages/commonjs/test/fixtures/function/load-cycle-parallel/c.js @@ -0,0 +1 @@ +require('./a.js'); diff --git a/packages/commonjs/test/fixtures/function/load-cycle-parallel/main.js b/packages/commonjs/test/fixtures/function/load-cycle-parallel/main.js new file mode 100644 index 000000000..c6d056017 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/load-cycle-parallel/main.js @@ -0,0 +1,3 @@ +require('./a.js'); +require('./b.js'); +require('./c.js'); diff --git a/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/_config.js b/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/_config.js new file mode 100644 index 000000000..3d25d8d4d --- /dev/null +++ b/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/_config.js @@ -0,0 +1,4 @@ +module.exports = { + description: 'replaces "typeof exports" with "undefined" in mixed modules', + pluginOptions: { transformMixedEsModules: true } +}; diff --git a/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/foo.js b/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/foo.js new file mode 100644 index 000000000..ce0fffb75 --- /dev/null +++ b/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/foo.js @@ -0,0 +1 @@ +module.exports = 21; diff --git a/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/main.js b/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/main.js new file mode 100644 index 000000000..b1f34e2a2 --- /dev/null +++ b/packages/commonjs/test/fixtures/samples/mixed-module-typeof-exports/main.js @@ -0,0 +1,7 @@ +const foo = require('./foo'); + +if (typeof exports !== 'undefined') { + throw new Error('There should be no global exports in an ES module'); +} + +export { foo as default }; diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index b30e1811d..70584b812 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -3050,8 +3050,10 @@ Generated by [AVA](https://avajs.dev). root = window;␊ } else if (typeof global !== 'undefined') {␊ root = global;␊ - } else {␊ + } else if (typeof module !== 'undefined') {␊ root = module;␊ + } else {␊ + root = Function('return this')(); // eslint-disable-line no-new-func␊ }␊ ␊ root.pollution = 'foo';␊ @@ -4725,6 +4727,19 @@ Generated by [AVA](https://avajs.dev). `, } +## load-cycle-parallel + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + module.exports = main;␊ + `, + } + ## module-meta-properties > Snapshot 1 diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index a4ae4968c02399853df76dce48e40539a0845d94..9a637b0f78efbc20252f51b2fa9f6550e0ac45c6 100644 GIT binary patch delta 20574 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 I5p#(G0B+9TCIA2c delta 20555 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

-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 Snapshot 1 + + `var foo$1 = 21;␊ + ␊ + const foo = foo$1;␊ + ␊ + if (typeof exports !== 'undefined') {␊ + throw new Error('There should be no global exports in an ES module');␊ + }␊ + ␊ + export { foo as default };␊ + ` diff --git a/packages/commonjs/test/snapshots/test.js.snap b/packages/commonjs/test/snapshots/test.js.snap index d685942af1e2eeb399872b59de8d160b69b56c71..68529726427894ada7fa0377b4fea98960699f33 100644 GIT binary patch literal 938 zcmV;b16BM%RzVogn_g;Hsk_CV>XTMj5h)+ByTym4mI@p!jkK%X)DCgWJEH`{>cb z_dk6xc=X+cia{T1%b$;bj&}Pm{n)uNdHFN(cg3Iwo0j$K?tveD(R}CIOWpXDZ=%mD z20j10Wo=q#P0q?0>xGSb6(>y)5+$RdayqtseQ=0F)rhKR( z!66x^VHo3ODcRg*`dxz)8z2-C+!z%^6v*ISjC`cVumi0Qp>M)P`t0oF#{q_dCkhVf z^fji&UKk4@U9*&o2V&~hpbl;XuS2UwJhe;D#O+1>MxLQ}*zc2nuiTVy)bDGD%+B)i zRyq4E^3e5qt0-ZsTauv=u(w6RvNTp({lc$Pn*J?--|E<_ZL8o~*YfJcK-aJJU~O;) zPJ>nhS`8gLTWbwjJkKKsW0{(UdIggOvs07uz|#Jq5Zk)sH(HCV1QB2ighe5^YCb~| zLK*JWZWo-C=OYz3dB@aPieun-40}>itDKu-lvL7Kq;UWP1TJ6{ivf!lafmtNuy+7C zU5DD3mCDj6Y91_sLSV?&BZ(pPe7Ogog)$+`L6zZpqwM>g)AECOO zj;6>J2Jf;dCNnlfm*;{QbtxkE3LYK1x*{f-h+-LPOZ!x-+J|ZJ%M5OgS0$=catJ*( zo5gcijiW?Q^C;EH6B4dk&Gd_TGbxnNIdqui&I~+YOog!GR|a_c-N2r>6;>_L(#{{*IFJw#?vju0kO!kYEh ze1HGF8+*QAZx)n8iTEM9l+E{z=)T_up2jh;DÍvU3rn$>3gt!2okj}_&v{r^e+ M2hUKdAEgEW03LwJqyPW_ literal 813 zcmV+|1Je9KRzV%HI00000000A( zR6B1IK@dLYA>`|*d1w?O`E2ZS(%K3kQbH&Qi2_vC>9n@z?2XTRW^XTGB3DSM=pv{< zqM%5JfC2;^KL82-01^#|U%~9%`4I;YSn@t*_nU9#+nE!FVayq~A6{E|Tc)!QSc)ZTaW1f zY5kVVpOkOBUS07ozTl5DvDKM3j9KGM>^U=UoSiw&x+>Lss_@3T4yuBGFJh5D>N_&+~CjO4hfS9`kTu0(gN0%SQ#A9L09qN6}JkD8X`- ztXE)(rcx=n4$ufhs9=w7Z!y)jJwFJf6)zk=Om@w4# z9Eb3=;bv&&j-vqsbC9Gr8MC`g2%WDzX(ij_mSji;tSykREb`TYlj5qwqrW+Dm#gOF zvt@AV)spOky3Swg!77le=Zdtd)2fj(2UAZ&C$?=9AU^5F4{E28j3PThS(~EN-Xz|Q zxWvW9CBlqSJ4rRZ^KV2mA7-YQM#a)XwHCFyC=@ntvMz=_)<8=nC7>xi@+j;yj;fjE z9$2d1!@$!=6yng;g2rUC8p8-PVz3f>R-%fe0MBNdrWwCb6aW zNv`dCV#u?OVMFqsqP7r4=)^hvF`!Nnni>zQL+R) zNAqL{S};u+59ukZ>W)fEH%?g>QM?$I5Qbf{l?#_#cjwOThU*r}X~>>Le1I0Qxo#}F r>sCNSzE4r5^2L)m`Y4^K)pFtL*yZobin#OtU&+4!O?VhP%LM=c%=(JY diff --git a/packages/commonjs/test/test.js b/packages/commonjs/test/test.js index ea0afb695..097f1a6df 100644 --- a/packages/commonjs/test/test.js +++ b/packages/commonjs/test/test.js @@ -331,8 +331,8 @@ test('typeof transforms: sinon', async (t) => { } = await bundle.generate({ format: 'es' }); t.is(code.indexOf('typeof require'), -1, code); - // t.not( code.indexOf( 'typeof module' ), -1, code ); // #151 breaks this test - // t.not( code.indexOf( 'typeof define' ), -1, code ); // #144 breaks this test + t.is(code.indexOf('typeof module'), -1, code); + t.is(code.indexOf('typeof define'), -1, code); }); test('deconflicts helper name', async (t) => { @@ -717,3 +717,17 @@ test('throws when there is a dynamic require from outside dynamicRequireRoot', a dynamicRequireRoot }); }); + +test('does not transform typeof exports for mixed modules', async (t) => { + const bundle = await rollup({ + input: 'fixtures/samples/mixed-module-typeof-exports/main.js', + plugins: [commonjs({ transformMixedEsModules: true })] + }); + + const { + output: [{ code }] + } = await bundle.generate({ format: 'es' }); + + t.is(code.includes('typeof exports'), true, '"typeof exports" not found in the code'); + t.snapshot(code); +}); From 29074f4e98abf10ec47085b0b3381246118e8a5d Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Tue, 14 Dec 2021 06:30:47 +0100 Subject: [PATCH 14/22] fix(commonjs): inject module name into dynamic require function (#1038) --- packages/commonjs/src/dynamic-modules.js | 35 +- packages/commonjs/src/generate-imports.js | 9 +- packages/commonjs/src/transform-commonjs.js | 38 +- .../form/constant-template-literal/output.js | 1 - .../form/ignore-ids-function/output.js | 1 - .../test/fixtures/form/ignore-ids/output.js | 1 - .../multi-entry-module-exports/output1.js | 1 - .../multiple-var-declarations-b/output.js | 1 - .../multiple-var-declarations-c/output.js | 1 - .../form/multiple-var-declarations/output.js | 1 - .../fixtures/form/no-exports-entry/output.js | 1 - .../form/node-require-methods/output.js | 1 - .../fixtures/form/require-collision/output.js | 1 - .../unambiguous-with-default-export/output.js | 1 - .../form/unambiguous-with-import/output.js | 1 - .../unambiguous-with-named-export/output.js | 1 - .../dynamic-require-alias-hack/_config.js | 7 + .../dynamic-require-alias-hack/main.js | 9 + .../dynamic-require-alias-hack/stub.js | 3 + .../commonjs/test/snapshots/function.js.md | 736 +++++++++++------- .../commonjs/test/snapshots/function.js.snap | Bin 20734 -> 21233 bytes 21 files changed, 499 insertions(+), 351 deletions(-) create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-alias-hack/_config.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-alias-hack/main.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-alias-hack/stub.js diff --git a/packages/commonjs/src/dynamic-modules.js b/packages/commonjs/src/dynamic-modules.js index 82f34c78e..c00c21511 100644 --- a/packages/commonjs/src/dynamic-modules.js +++ b/packages/commonjs/src/dynamic-modules.js @@ -63,6 +63,9 @@ export function getDynamicRequireModules(patterns, dynamicRequireRoot) { 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.');`; +export const COMMONJS_REQUIRE_EXPORT = 'commonjsRequire'; +export const CREATE_COMMONJS_REQUIRE_EXPORT = 'createCommonjsRequire'; + export function getDynamicModuleRegistry( isDynamicRequireModulesEnabled, dynamicRequireModules, @@ -70,7 +73,7 @@ export function getDynamicModuleRegistry( ignoreDynamicRequires ) { if (!isDynamicRequireModulesEnabled) { - return `export function commonjsRequire(path) { + return `export function ${COMMONJS_REQUIRE_EXPORT}(path) { ${FAILED_REQUIRE_ERROR} }`; } @@ -100,25 +103,25 @@ ${dynamicModuleProps} }); } -export function commonjsRequire(path, originalModuleDir) { - var resolvedPath = commonjsResolveImpl(path, originalModuleDir); - if (resolvedPath !== null) { - return getDynamicModules()[resolvedPath](); +export function ${CREATE_COMMONJS_REQUIRE_EXPORT}(originalModuleDir) { + function handleRequire(path) { + var resolvedPath = commonjsResolve(path, originalModuleDir); + if (resolvedPath !== null) { + return getDynamicModules()[resolvedPath](); + } + ${ignoreDynamicRequires ? 'return require(path);' : FAILED_REQUIRE_ERROR} } - ${ignoreDynamicRequires ? 'return require(path);' : FAILED_REQUIRE_ERROR} -} - -function commonjsResolve (path, originalModuleDir) { - const resolvedPath = commonjsResolveImpl(path, originalModuleDir); - if (resolvedPath !== null) { - return resolvedPath; + handleRequire.resolve = function (path) { + var resolvedPath = commonjsResolve(path, originalModuleDir); + if (resolvedPath !== null) { + return resolvedPath; + } + return require.resolve(path); } - return require.resolve(path); + return handleRequire; } -commonjsRequire.resolve = commonjsResolve; - -function commonjsResolveImpl (path, originalModuleDir) { +function commonjsResolve (path, originalModuleDir) { var shouldTryNodeModules = isPossibleNodeModulesPath(path); path = normalize(path); var relPath; diff --git a/packages/commonjs/src/generate-imports.js b/packages/commonjs/src/generate-imports.js index 7fb85393d..9c3aaa02e 100644 --- a/packages/commonjs/src/generate-imports.js +++ b/packages/commonjs/src/generate-imports.js @@ -1,3 +1,4 @@ +import { COMMONJS_REQUIRE_EXPORT, CREATE_COMMONJS_REQUIRE_EXPORT } from './dynamic-modules'; import { DYNAMIC_MODULES_ID, EXPORTS_SUFFIX, @@ -92,14 +93,16 @@ export function getRequireHandlers() { resolveRequireSourcesAndGetMeta, needsRequireWrapper, isEsModule, - usesRequire, + isDynamicRequireModulesEnabled, getIgnoreTryCatchRequireStatementMode ) { const imports = []; imports.push(`import * as ${helpersName} from "${HELPERS_ID}";`); - if (usesRequire) { + if (dynamicRequireName) { imports.push( - `import { commonjsRequire as ${dynamicRequireName} } from "${DYNAMIC_MODULES_ID}";` + `import { ${ + isDynamicRequireModulesEnabled ? CREATE_COMMONJS_REQUIRE_EXPORT : COMMONJS_REQUIRE_EXPORT + } as ${dynamicRequireName} } from "${DYNAMIC_MODULES_ID}";` ); } if (exportMode === 'module') { diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index 3fb8602cd..851115b47 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -16,6 +16,7 @@ import { isTruthy, KEY_COMPILED_ESM } from './ast-utils'; +import { COMMONJS_REQUIRE_EXPORT, CREATE_COMMONJS_REQUIRE_EXPORT } from './dynamic-modules'; import { rewriteExportsAndGetExportsBlock, wrapCode } from './generate-exports'; import { getRequireHandlers, @@ -201,12 +202,6 @@ export default async function transformCommonjs( checkDynamicRequire(node.start); uses.require = true; const requireNode = node.callee.object; - magicString.appendLeft( - node.end - 1, - `,${JSON.stringify( - dirname(id) === '.' ? null /* default behavior */ : virtualDynamicRequirePath - )}` - ); replacedDynamicRequires.push(requireNode); return; } @@ -221,12 +216,6 @@ export default async function transformCommonjs( if (hasDynamicArguments(node)) { if (isDynamicRequireModulesEnabled) { checkDynamicRequire(node.start); - magicString.appendLeft( - node.end - 1, - `, ${JSON.stringify( - dirname(id) === '.' ? null /* default behavior */ : virtualDynamicRequirePath - )}` - ); } if (!ignoreDynamicRequires) { replacedDynamicRequires.push(node.callee); @@ -400,7 +389,13 @@ export default async function transformCommonjs( 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 dynamicRequireName = + replacedDynamicRequires.length > 0 && + deconflict( + [scope], + globals, + isDynamicRequireModulesEnabled ? CREATE_COMMONJS_REQUIRE_EXPORT : COMMONJS_REQUIRE_EXPORT + ); const deconflictedExportNames = Object.create(null); for (const [exportName, { scopes }] of exportsAssignmentsByName) { deconflictedExportNames[exportName] = deconflict([...scopes], globals, exportName); @@ -412,10 +407,17 @@ export default async function transformCommonjs( }); } for (const node of replacedDynamicRequires) { - magicString.overwrite(node.start, node.end, dynamicRequireName, { - contentOnly: true, - storeName: true - }); + magicString.overwrite( + node.start, + node.end, + isDynamicRequireModulesEnabled + ? `${dynamicRequireName}(${JSON.stringify(virtualDynamicRequirePath)})` + : dynamicRequireName, + { + contentOnly: true, + storeName: true + } + ); } // We cannot wrap ES/mixed modules @@ -470,7 +472,7 @@ export default async function transformCommonjs( resolveRequireSourcesAndGetMeta, needsRequireWrapper, isEsModule, - uses.require, + isDynamicRequireModulesEnabled, getIgnoreTryCatchRequireStatementMode ); const exportBlock = isEsModule diff --git a/packages/commonjs/test/fixtures/form/constant-template-literal/output.js b/packages/commonjs/test/fixtures/form/constant-template-literal/output.js index 08f8bd02d..ed766a8a3 100644 --- a/packages/commonjs/test/fixtures/form/constant-template-literal/output.js +++ b/packages/commonjs/test/fixtures/form/constant-template-literal/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/constant-template-literal/input.js?commonjs-exports" import require$$0 from "\u0000CWD/fixtures/form/constant-template-literal/tape.js?commonjs-proxy"; diff --git a/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js b/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js index de90c6826..9bf413331 100644 --- a/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js +++ b/packages/commonjs/test/fixtures/form/ignore-ids-function/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/ignore-ids-function/input.js?commonjs-exports" import require$$0 from "\u0000CWD/fixtures/form/ignore-ids-function/bar.js?commonjs-proxy"; diff --git a/packages/commonjs/test/fixtures/form/ignore-ids/output.js b/packages/commonjs/test/fixtures/form/ignore-ids/output.js index e37256ccb..7bf69819c 100644 --- a/packages/commonjs/test/fixtures/form/ignore-ids/output.js +++ b/packages/commonjs/test/fixtures/form/ignore-ids/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/ignore-ids/input.js?commonjs-exports" import require$$0 from "\u0000CWD/fixtures/form/ignore-ids/bar.js?commonjs-proxy"; diff --git a/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js index 5bf32420e..214e817e3 100644 --- a/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js +++ b/packages/commonjs/test/fixtures/form/multi-entry-module-exports/output1.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import require$$0 from "\u0000CWD/fixtures/form/multi-entry-module-exports/input2.js?commonjs-proxy"; const t2 = require$$0; diff --git a/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js b/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js index 05bb39f86..93cf331d5 100644 --- a/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js +++ b/packages/commonjs/test/fixtures/form/multiple-var-declarations-b/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations-b/input.js?commonjs-exports" import require$$0 from "\u0000CWD/fixtures/form/multiple-var-declarations-b/a.js?commonjs-proxy"; diff --git a/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js b/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js index 74dc40f2e..d5d652e50 100644 --- a/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js +++ b/packages/commonjs/test/fixtures/form/multiple-var-declarations-c/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations-c/input.js?commonjs-exports" import require$$0 from "\u0000CWD/fixtures/form/multiple-var-declarations-c/b.js?commonjs-proxy"; diff --git a/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js b/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js index 38a4a54aa..3e05dfdb0 100644 --- a/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js +++ b/packages/commonjs/test/fixtures/form/multiple-var-declarations/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/multiple-var-declarations/input.js?commonjs-exports" import require$$0 from "\u0000CWD/fixtures/form/multiple-var-declarations/a.js?commonjs-proxy"; import require$$1 from "\u0000CWD/fixtures/form/multiple-var-declarations/b.js?commonjs-proxy"; diff --git a/packages/commonjs/test/fixtures/form/no-exports-entry/output.js b/packages/commonjs/test/fixtures/form/no-exports-entry/output.js index b10040f7b..252fd167f 100644 --- a/packages/commonjs/test/fixtures/form/no-exports-entry/output.js +++ b/packages/commonjs/test/fixtures/form/no-exports-entry/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input_1 } from "\u0000fixtures/form/no-exports-entry/input.js?commonjs-exports" import require$$0 from "\u0000CWD/fixtures/form/no-exports-entry/dummy.js?commonjs-proxy"; diff --git a/packages/commonjs/test/fixtures/form/node-require-methods/output.js b/packages/commonjs/test/fixtures/form/node-require-methods/output.js index b1ceb2c2a..6aff4d3e1 100644 --- a/packages/commonjs/test/fixtures/form/node-require-methods/output.js +++ b/packages/commonjs/test/fixtures/form/node-require-methods/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/node-require-methods/input.js?commonjs-exports" var getFilePath = input.getFilePath = function getFilePath(someFile) { diff --git a/packages/commonjs/test/fixtures/form/require-collision/output.js b/packages/commonjs/test/fixtures/form/require-collision/output.js index d760dbf85..44fd7b388 100644 --- a/packages/commonjs/test/fixtures/form/require-collision/output.js +++ b/packages/commonjs/test/fixtures/form/require-collision/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/require-collision/input.js?commonjs-exports" import require$$1 from "\u0000CWD/fixtures/form/require-collision/foo.js?commonjs-proxy"; diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js index 51bfef8ef..b2a41f38e 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/unambiguous-with-default-export/input.js?commonjs-exports" import "\u0000CWD/fixtures/form/unambiguous-with-default-export/foo.js?commonjs-proxy"; diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js index 8b277a597..76b7883b0 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/unambiguous-with-import/input.js?commonjs-exports" import "\u0000CWD/fixtures/form/unambiguous-with-import/foo.js?commonjs-proxy"; diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js index c84e44011..a31cc3202 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { commonjsRequire as commonjsRequire } from "_commonjs-dynamic-modules"; import { __exports as input } from "\u0000fixtures/form/unambiguous-with-named-export/input.js?commonjs-exports" import "\u0000CWD/fixtures/form/unambiguous-with-named-export/foo.js?commonjs-proxy"; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-alias-hack/_config.js b/packages/commonjs/test/fixtures/function/dynamic-require-alias-hack/_config.js new file mode 100755 index 000000000..f52126137 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-alias-hack/_config.js @@ -0,0 +1,7 @@ +module.exports = { + description: 'resolves both windows and posix paths', + pluginOptions: { + dynamicRequireTargets: ['fixtures/function/dynamic-require-alias-hack/stub.js'], + ignoreDynamicRequires: true + } +}; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-alias-hack/main.js b/packages/commonjs/test/fixtures/function/dynamic-require-alias-hack/main.js new file mode 100755 index 000000000..636d42e03 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-alias-hack/main.js @@ -0,0 +1,9 @@ +/* eslint-disable global-require */ +// noinspection UnnecessaryLocalVariableJS + +// A hack used in many old libraries, saying "workaround to exclude package from browserify list." +// Will bypass rollup-commonjs finding out that this is a require that should not go through the plugin, and will do an infinite search. +const _require = require; +const buffer = _require('buffer'); + +t.is(buffer, require('buffer')); diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-alias-hack/stub.js b/packages/commonjs/test/fixtures/function/dynamic-require-alias-hack/stub.js new file mode 100755 index 000000000..28a021e39 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-alias-hack/stub.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 70584b812..1e80780c8 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -417,25 +417,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -508,7 +508,7 @@ Generated by [AVA](https://avajs.dev). let message;␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`, "/fixtures/function/dynamic-module-require");␊ + return createCommonjsRequire("/fixtures/function/dynamic-module-require")(`./${withName}`);␊ }␊ ␊ try {␊ @@ -551,25 +551,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -642,7 +642,7 @@ Generated by [AVA](https://avajs.dev). let message;␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`, "/fixtures/function/dynamic-require");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require")(`./${withName}`);␊ }␊ ␊ try {␊ @@ -665,6 +665,8 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ + var main = {};␊ + ␊ var direct;␊ var hasRequiredDirect;␊ ␊ @@ -705,25 +707,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -789,14 +791,12 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - var main = {};␊ - ␊ var submodule = {};␊ ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(name) {␊ - return commonjsRequire(name, "/fixtures/function/dynamic-require-absolute-import/sub");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-absolute-import/sub")(name);␊ }␊ ␊ submodule.moduleDirect = takeModule('module/direct');␊ @@ -815,6 +815,140 @@ Generated by [AVA](https://avajs.dev). `, } +## dynamic-require-alias-hack + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var require$$0 = require('buffer');␊ + ␊ + function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }␊ + ␊ + var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0);␊ + ␊ + var stub;␊ + var hasRequiredStub;␊ + ␊ + function requireStub () {␊ + if (hasRequiredStub) return stub;␊ + hasRequiredStub = 1;␊ + stub = function () {␊ + return 'Hello there';␊ + };␊ + return stub;␊ + }␊ + ␊ + var dynamicModules;␊ + ␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/fixtures/function/dynamic-require-alias-hack/stub.js": requireStub␊ + });␊ + }␊ + ␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return getDynamicModules()[resolvedPath]();␊ + }␊ + return require(path);␊ + }␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ + }␊ + ␊ + function commonjsResolve (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 global-require */␊ + ␊ + // noinspection UnnecessaryLocalVariableJS␊ + ␊ + // A hack used in many old libraries, saying "workaround to exclude package from browserify list."␊ + // Will bypass rollup-commonjs finding out that this is a require that should not go through the plugin, and will do an infinite search.␊ + const _require = createCommonjsRequire("/fixtures/function/dynamic-require-alias-hack");␊ + const buffer = _require('buffer');␊ + ␊ + t.is(buffer, require$$0__default["default"]);␊ + ␊ + module.exports = main;␊ + `, + } + ## dynamic-require-code-splitting > Snapshot 1 @@ -851,25 +985,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -941,14 +1075,14 @@ Generated by [AVA](https://avajs.dev). ␊ for (const index of [1, 2]) {␊ try {␊ - message = commonjsRequire(`./target${index}.js`, "/fixtures/function/dynamic-require-code-splitting");␊ + message = createCommonjsRequire("/fixtures/function/dynamic-require-code-splitting")(`./target${index}.js`);␊ } catch (err) {␊ ({ message } = err);␊ }␊ t.is(message, index.toString());␊ }␊ ␊ - exports.commonjsRequire = commonjsRequire;␊ + exports.createCommonjsRequire = createCommonjsRequire;␊ `, 'main.js': `'use strict';␊ ␊ @@ -960,7 +1094,7 @@ Generated by [AVA](https://avajs.dev). ␊ for (const index of [1, 2]) {␊ try {␊ - message = lib2.commonjsRequire(`./target${index}.js`, "/fixtures/function/dynamic-require-code-splitting");␊ + message = lib2.createCommonjsRequire("/fixtures/function/dynamic-require-code-splitting")(`./target${index}.js`);␊ } catch (err) {␊ ({ message } = err);␊ }␊ @@ -1026,25 +1160,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -1113,7 +1247,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`, "/fixtures/function/dynamic-require-es-entry");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-es-entry")(`./${withName}`);␊ }␊ ␊ var importer = takeModule('submodule.js');␊ @@ -1181,25 +1315,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -1270,7 +1404,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`, "/fixtures/function/dynamic-require-extensions");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-extensions")(`./${withName}`);␊ }␊ ␊ const withExtension = takeModule('submodule.js');␊ @@ -1379,25 +1513,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -1468,7 +1602,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`, "/fixtures/function/dynamic-require-globs");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-globs")(`./${withName}`);␊ }␊ ␊ t.is(takeModule('submodule1.js'), 'submodule1');␊ @@ -1521,25 +1655,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -1610,7 +1744,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(withName, "/fixtures/function/dynamic-require-instances");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-instances")(withName);␊ }␊ ␊ takeModule('./direct').value = 'direct-instance';␊ @@ -1645,25 +1779,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -1734,7 +1868,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`, "/fixtures/function/dynamic-require-json");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-json")(`./${withName}`);␊ }␊ ␊ t.deepEqual(takeModule('dynamic.json'), { value: 'present' });␊ @@ -1822,25 +1956,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -1911,7 +2045,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule$1(name) {␊ - return commonjsRequire(name, "/fixtures/function/dynamic-require-package/sub");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-package/sub")(name);␊ }␊ ␊ var sub = {␊ @@ -1922,7 +2056,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(name) {␊ - return commonjsRequire(name, "/fixtures/function/dynamic-require-package");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-package")(name);␊ }␊ ␊ t.is(takeModule('.'), 'same-directory');␊ @@ -1945,21 +2079,21 @@ Generated by [AVA](https://avajs.dev). { 'entry.js': `'use strict';␊ ␊ - var entry$1;␊ + var entry$1 = {};␊ + ␊ + var entry;␊ var hasRequiredEntry;␊ ␊ function requireEntry () {␊ - if (hasRequiredEntry) return entry$1;␊ + if (hasRequiredEntry) return entry;␊ hasRequiredEntry = 1;␊ - entry$1 = 'custom-module';␊ - return entry$1;␊ + entry = 'custom-module';␊ + return entry;␊ }␊ ␊ - var entry = {};␊ - ␊ t.is(requireEntry(), 'custom-module');␊ ␊ - module.exports = entry;␊ + module.exports = entry$1;␊ `, } @@ -1999,25 +2133,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -2088,7 +2222,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModuleWithDelimiter(name, delimiter) {␊ - return commonjsRequire(`.${delimiter}${name.replace(/=/g, delimiter)}`, "/fixtures/function/dynamic-require-relative-paths");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-relative-paths")(`.${delimiter}${name.replace(/=/g, delimiter)}`);␊ }␊ ␊ t.is(takeModuleWithDelimiter('sub=submodule.js', '/'), 'submodule');␊ @@ -2150,25 +2284,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -2239,7 +2373,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule$1(name) {␊ - return commonjsRequire(name, "/fixtures/function/dynamic-require-resolve-index/sub");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-resolve-index/sub")(name);␊ }␊ ␊ var sub = {␊ @@ -2250,7 +2384,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(name) {␊ - return commonjsRequire(name, "/fixtures/function/dynamic-require-resolve-index");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-resolve-index")(name);␊ }␊ ␊ t.is(takeModule('.'), 'same-directory');␊ @@ -2273,18 +2407,7 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ - var customModule = {exports: {}};␊ - ␊ - var hasRequiredCustomModule;␊ - ␊ - function requireCustomModule () {␊ - if (hasRequiredCustomModule) return customModule.exports;␊ - hasRequiredCustomModule = 1;␊ - (function (module) {␊ - module.exports = () => commonjsRequire.resolve('custom-module2',"/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module");␊ - } (customModule));␊ - return customModule.exports;␊ - }␊ + var main = {};␊ ␊ var customModule2;␊ var hasRequiredCustomModule2;␊ @@ -2292,7 +2415,7 @@ Generated by [AVA](https://avajs.dev). function requireCustomModule2 () {␊ if (hasRequiredCustomModule2) return customModule2;␊ hasRequiredCustomModule2 = 1;␊ - customModule2 = () => commonjsRequire.resolve('custom-module',"/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2");␊ + customModule2 = () => createCommonjsRequire("/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module2").resolve('custom-module');␊ return customModule2;␊ }␊ ␊ @@ -2307,25 +2430,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -2391,7 +2514,18 @@ Generated by [AVA](https://avajs.dev). return path;␊ }␊ ␊ - var main = {};␊ + var customModule = {exports: {}};␊ + ␊ + var hasRequiredCustomModule;␊ + ␊ + function requireCustomModule () {␊ + if (hasRequiredCustomModule) return customModule.exports;␊ + hasRequiredCustomModule = 1;␊ + (function (module) {␊ + module.exports = () => createCommonjsRequire("/fixtures/function/dynamic-require-resolve-reference/node_modules/custom-module").resolve('custom-module2');␊ + } (customModule));␊ + return customModule.exports;␊ + }␊ ␊ t.is(␊ requireCustomModule()(),␊ @@ -2433,25 +2567,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -2524,7 +2658,7 @@ Generated by [AVA](https://avajs.dev). let message;␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(`./${withName}`, "/");␊ + return createCommonjsRequire("/")(`./${withName}`);␊ }␊ ␊ try {␊ @@ -2547,6 +2681,8 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ + var main = {};␊ + ␊ var customModule = {exports: {}};␊ ␊ var circular = {};␊ @@ -2589,8 +2725,6 @@ Generated by [AVA](https://avajs.dev). return customModule.exports;␊ }␊ ␊ - var main = {};␊ - ␊ /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ const custom = requireCustomModule();␊ @@ -2664,25 +2798,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -2753,7 +2887,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule$1(name) {␊ - return commonjsRequire(name, "/fixtures/function/dynamic-require-slash-access/sub");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-slash-access/sub")(name);␊ }␊ ␊ var sub = {␊ @@ -2764,7 +2898,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(name) {␊ - return commonjsRequire(name, "/fixtures/function/dynamic-require-slash-access");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-slash-access")(name);␊ }␊ ␊ t.is(takeModule('.'), 'same-directory', '.');␊ @@ -2808,25 +2942,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return getDynamicModules()[resolvedPath]();␊ + }␊ + return require(path);␊ }␊ - return require(path);␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -2897,7 +3031,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(withName, "/fixtures/function/dynamic-require-targets-fallback");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-targets-fallback")(withName);␊ }␊ ␊ t.is(takeModule('./dep1.js'), 'dep');␊ @@ -2933,25 +3067,25 @@ Generated by [AVA](https://avajs.dev). });␊ }␊ ␊ - function commonjsRequire(path, originalModuleDir) {␊ - var resolvedPath = commonjsResolveImpl(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return getDynamicModules()[resolvedPath]();␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ }␊ - 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.');␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ }␊ ␊ 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;␊ @@ -3022,7 +3156,7 @@ Generated by [AVA](https://avajs.dev). /* eslint-disable import/no-dynamic-require, global-require */␊ ␊ function takeModule(withName) {␊ - return commonjsRequire(withName, "/fixtures/function/dynamic-require-targets-no-fallback");␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-targets-no-fallback")(withName);␊ }␊ ␊ t.is(takeModule('./dep1.js'), 'dep');␊ diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index 9a637b0f78efbc20252f51b2fa9f6550e0ac45c6..56d99191721677fa71980f018592595d6c47e358 100644 GIT binary patch literal 21233 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 literal 20734 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 From 804eb8e69d8521a762ef023ed55c8e258cb34fdf Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Tue, 14 Dec 2021 07:06:12 +0100 Subject: [PATCH 15/22] fix(commonjs): validate node-resolve peer version (#1038) --- packages/commonjs/package.json | 3 +- packages/commonjs/src/index.js | 10 +++++-- packages/commonjs/src/rollup-version.js | 22 ++++++++++---- packages/commonjs/test/test.js | 40 ++++++++++++++++++++++--- pnpm-lock.yaml | 10 +++---- 5 files changed, 66 insertions(+), 19 deletions(-) diff --git a/packages/commonjs/package.json b/packages/commonjs/package.json index 04afd15db..bb2c7b464 100644 --- a/packages/commonjs/package.json +++ b/packages/commonjs/package.json @@ -26,6 +26,7 @@ "ci:test": "pnpm test -- --verbose && pnpm test:ts", "prebuild": "del-cli dist", "prepare": "if [ ! -d 'dist' ]; then pnpm build; fi", + "prepublishOnly": "pnpm build", "prerelease": "pnpm build", "pretest": "pnpm build", "release": "pnpm plugin:release --workspace-root -- --pkg $npm_package_name", @@ -60,7 +61,7 @@ }, "devDependencies": { "@rollup/plugin-json": "^4.1.0", - "@rollup/plugin-node-resolve": "^13.0.6", + "@rollup/plugin-node-resolve": "^13.1.0", "locate-character": "^2.0.5", "require-relative": "^0.8.7", "rollup": "^2.67.3", diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index 627f98eb6..639f9e92d 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -23,7 +23,7 @@ import { hasCjsKeywords } from './parse'; import { getEsImportProxy, getStaticRequireProxy, getUnknownRequireProxy } from './proxies'; import getResolveId from './resolve-id'; import { getResolveRequireSourcesAndGetMeta } from './resolve-require-sources'; -import validateRollupVersion from './rollup-version'; +import validateVersion from './rollup-version'; import transformCommonjs from './transform-commonjs'; import { getName, getStrictRequiresFilter, normalizePathSlashes } from './utils'; @@ -186,8 +186,12 @@ export default function commonjs(options = {}) { return { ...rawOptions, plugins }; }, - buildStart() { - validateRollupVersion(this.meta.rollupVersion, peerDependencies.rollup); + buildStart({ plugins }) { + validateVersion(this.meta.rollupVersion, peerDependencies.rollup, 'rollup'); + const nodeResolve = plugins.find(({ name }) => name === 'node-resolve'); + if (nodeResolve) { + validateVersion(nodeResolve.version, '^13.0.6', '@rollup/plugin-node-resolve'); + } if (options.namedExports != null) { this.warn( 'The namedExports option from "@rollup/plugin-commonjs" is deprecated. Named exports are now handled automatically.' diff --git a/packages/commonjs/src/rollup-version.js b/packages/commonjs/src/rollup-version.js index 3c9136cc6..c16b2a106 100644 --- a/packages/commonjs/src/rollup-version.js +++ b/packages/commonjs/src/rollup-version.js @@ -1,20 +1,30 @@ -export default function validateRollupVersion(rollupVersion, peerDependencyVersion) { - const [major, minor] = rollupVersion.split('.').map(Number); - const versionRegexp = /\^(\d+\.\d+)\.\d+/g; +export default function validateVersion(actualVersion, peerDependencyVersion, name) { + const versionRegexp = /\^(\d+\.\d+\.\d+)/g; let minMajor = Infinity; let minMinor = Infinity; + let minPatch = Infinity; let foundVersion; // eslint-disable-next-line no-cond-assign while ((foundVersion = versionRegexp.exec(peerDependencyVersion))) { - const [foundMajor, foundMinor] = foundVersion[1].split('.').map(Number); + const [foundMajor, foundMinor, foundPatch] = foundVersion[1].split('.').map(Number); if (foundMajor < minMajor) { minMajor = foundMajor; minMinor = foundMinor; + minPatch = foundPatch; } } - if (major < minMajor || (major === minMajor && minor < minMinor)) { + if (!actualVersion) { throw new Error( - `Insufficient Rollup version: "@rollup/plugin-commonjs" requires at least rollup@${minMajor}.${minMinor} but found rollup@${rollupVersion}.` + `Insufficient ${name} version: "@rollup/plugin-commonjs" requires at least ${name}@${minMajor}.${minMinor}.${minPatch}.` + ); + } + const [major, minor, patch] = actualVersion.split('.').map(Number); + if ( + major < minMajor || + (major === minMajor && (minor < minMinor || (minor === minMinor && patch < minPatch))) + ) { + throw new Error( + `Insufficient ${name} version: "@rollup/plugin-commonjs" requires at least ${name}@${minMajor}.${minMinor}.${minPatch} but found ${name}@${actualVersion}.` ); } } diff --git a/packages/commonjs/test/test.js b/packages/commonjs/test/test.js index 097f1a6df..52d1aafda 100644 --- a/packages/commonjs/test/test.js +++ b/packages/commonjs/test/test.js @@ -2,7 +2,7 @@ import * as path from 'path'; import os from 'os'; -import resolve from '@rollup/plugin-node-resolve'; +import nodeResolve from '@rollup/plugin-node-resolve'; import test from 'ava'; import { getLocator } from 'locate-character'; @@ -91,7 +91,7 @@ test('supports an object of multiple entry points', async (t) => { b: require.resolve('./fixtures/samples/multiple-entry-points/b.js'), c: require.resolve('./fixtures/samples/multiple-entry-points/c.js') }, - plugins: [resolve(), commonjs()] + plugins: [nodeResolve(), commonjs()] }); const { output } = await bundle.generate({ @@ -212,7 +212,7 @@ test.serial('handles symlinked node_modules with preserveSymlinks: false', (t) = throw new Error(`Unexpected warning: ${warning.message}`); }, plugins: [ - resolve({ + nodeResolve({ preserveSymlinks: false, preferBuiltins: false }), @@ -400,7 +400,7 @@ test('rewrites top-level defines', async (t) => { test('respects options.external', async (t) => { const bundle = await rollup({ input: 'fixtures/samples/external/main.js', - plugins: [resolve(), commonjs()], + plugins: [nodeResolve(), commonjs()], external: ['baz'] }); @@ -731,3 +731,35 @@ test('does not transform typeof exports for mixed modules', async (t) => { t.is(code.includes('typeof exports'), true, '"typeof exports" not found in the code'); t.snapshot(code); }); + +test('throws when using an old node_resolve version', async (t) => { + let error = null; + try { + await rollup({ + input: 'ignored', + plugins: [commonjs(), { name: nodeResolve().name }] + }); + } catch (err) { + error = err; + } + t.like(error, { + message: + 'Insufficient @rollup/plugin-node-resolve version: "@rollup/plugin-commonjs" requires at least @rollup/plugin-node-resolve@13.0.6.' + }); +}); + +test('throws when using an inadequate node_resolve version', async (t) => { + let error = null; + try { + await rollup({ + input: 'ignored', + plugins: [commonjs(), { name: nodeResolve().name, version: '13.0.5' }] + }); + } catch (err) { + error = err; + } + t.like(error, { + message: + 'Insufficient @rollup/plugin-node-resolve version: "@rollup/plugin-commonjs" requires at least @rollup/plugin-node-resolve@13.0.6 but found @rollup/plugin-node-resolve@13.0.5.' + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 03de06bd0..48bd29f8d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -174,7 +174,7 @@ importers: packages/commonjs: specifiers: '@rollup/plugin-json': ^4.1.0 - '@rollup/plugin-node-resolve': ^13.0.6 + '@rollup/plugin-node-resolve': ^13.1.0 '@rollup/pluginutils': ^3.1.0 commondir: ^1.0.1 estree-walker: ^2.0.1 @@ -199,7 +199,7 @@ importers: resolve: 1.18.1 devDependencies: '@rollup/plugin-json': 4.1.0_rollup@2.67.3 - '@rollup/plugin-node-resolve': 13.0.6_rollup@2.67.3 + '@rollup/plugin-node-resolve': 13.1.0_rollup@2.67.3 locate-character: 2.0.5 require-relative: 0.8.7 rollup: 2.67.3 @@ -2486,8 +2486,8 @@ packages: resolution: {integrity: sha512-33/L34xS7HVUx23e0wOT2V1qPF1IrHgQccdJVm9uXGTB9vFBrrzBtkQymT8VskeKOxjz55MSqMv0xuLq+u98WQ==} dev: true - /@types/node/16.11.7: - resolution: {integrity: sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==} + /@types/node/16.11.12: + resolution: {integrity: sha512-+2Iggwg7PxoO5Kyhvsq9VarmPbIelXP070HMImEpbtGCoyWNINQj4wzjbQCXzdHTRXnqufutJb5KAURZANNBAw==} /@types/node/16.3.2: resolution: {integrity: sha512-jJs9ErFLP403I+hMLGnqDRWT0RYKSvArxuBVh2veudHV7ifEC1WAmjJADacZ7mRbA2nWgHtn8xyECMAot0SkAw==} @@ -2516,7 +2516,7 @@ packages: /@types/resolve/1.17.1: resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} dependencies: - '@types/node': 16.11.7 + '@types/node': 16.11.12 /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} From d01238fb5effc0b461c6285b99fa688c551d8cf8 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Tue, 14 Dec 2021 15:45:50 +0100 Subject: [PATCH 16/22] fix(commonjs): use correct version and add package exports (#1038) --- packages/commonjs/package.json | 8 ++++++-- packages/commonjs/rollup.config.js | 3 +++ .../test/fixtures/samples/caching/rollupWorker.js | 2 +- packages/commonjs/test/helpers/util.js | 2 +- packages/commonjs/test/test.js | 2 +- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/packages/commonjs/package.json b/packages/commonjs/package.json index bb2c7b464..6f3bb2e2a 100644 --- a/packages/commonjs/package.json +++ b/packages/commonjs/package.json @@ -13,8 +13,12 @@ "author": "Rich Harris ", "homepage": "https://github.com/rollup/plugins/tree/master/packages/commonjs/#readme", "bugs": "https://github.com/rollup/plugins/issues", - "main": "dist/index.js", - "module": "dist/index.es.js", + "main": "./dist/cjs/index.js", + "module": "./dist/es/index.js", + "exports": { + "require": "./dist/cjs/index.js", + "import": "./dist/es/index.js" + }, "engines": { "node": ">= 12.0.0" }, diff --git a/packages/commonjs/rollup.config.js b/packages/commonjs/rollup.config.js index 93f8a4c3e..825c4b1be 100644 --- a/packages/commonjs/rollup.config.js +++ b/packages/commonjs/rollup.config.js @@ -1,5 +1,7 @@ import json from '@rollup/plugin-json'; +import { emitModulePackageFile } from '../../shared/rollup.config'; + import pkg from './package.json'; export default { @@ -10,6 +12,7 @@ export default { { file: pkg.module, format: 'es', + plugins: [emitModulePackageFile()], sourcemap: true }, { diff --git a/packages/commonjs/test/fixtures/samples/caching/rollupWorker.js b/packages/commonjs/test/fixtures/samples/caching/rollupWorker.js index 2f80d6d4e..eb7e39ea6 100644 --- a/packages/commonjs/test/fixtures/samples/caching/rollupWorker.js +++ b/packages/commonjs/test/fixtures/samples/caching/rollupWorker.js @@ -2,7 +2,7 @@ const { workerData, parentPort } = require('worker_threads'); const { rollup } = require('rollup'); -const commonjs = require('../../../../dist/index'); +const commonjs = require('../../../..'); const { getCodeFromBundle } = require('../../../helpers/util'); generateCode(workerData); diff --git a/packages/commonjs/test/helpers/util.js b/packages/commonjs/test/helpers/util.js index 5a297d7d7..8e43b3778 100644 --- a/packages/commonjs/test/helpers/util.js +++ b/packages/commonjs/test/helpers/util.js @@ -1,6 +1,6 @@ const path = require('path'); -const commonjsPlugin = require('../../dist/index'); +const commonjsPlugin = require('../..'); function commonjs(options) { delete require.cache[require.resolve('../..')]; diff --git a/packages/commonjs/test/test.js b/packages/commonjs/test/test.js index 52d1aafda..4a297a301 100644 --- a/packages/commonjs/test/test.js +++ b/packages/commonjs/test/test.js @@ -451,7 +451,7 @@ test('does not warn even if the ES module does not export "default"', async (t) test('compiles with cache', async (t) => { // specific commonjs require() to ensure same instance is used // eslint-disable-next-line global-require - const commonjsInstance = require('../dist/index'); + const commonjsInstance = require('..'); const bundle = await rollup({ input: 'fixtures/function/index/main.js', From 017ea9009507fef19c74ceddc83cbb13507b565a Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Fri, 14 Jan 2022 15:33:55 +0100 Subject: [PATCH 17/22] fix(commonjs): proxy all entries to not break legacy polyfill plugins (#1038) --- packages/commonjs/package.json | 2 +- packages/commonjs/src/generate-imports.js | 13 +- packages/commonjs/src/helpers.js | 3 +- packages/commonjs/src/index.js | 69 ++++--- packages/commonjs/src/proxies.js | 36 ++-- packages/commonjs/src/resolve-id.js | 35 ++-- .../commonjs/src/resolve-require-sources.js | 129 ++++++++----- packages/commonjs/src/transform-commonjs.js | 22 +-- .../module-side-effects-late-entry/_config.js | 22 +++ .../module-side-effects-late-entry/foo.js | 2 + .../module-side-effects-late-entry/main.js | 3 + .../function/plugin-isentry/_config.js | 36 ++++ .../fixtures/function/plugin-isentry/dep.js | 2 + .../fixtures/function/plugin-isentry/main.js | 2 + .../fixtures/function/plugin-isentry/other.js | 1 + .../function/preserve-modules/_config.js | 14 ++ .../function/preserve-modules/main.js | 4 + packages/commonjs/test/form.js | 7 +- .../commonjs/test/snapshots/function.js.md | 139 +++++++++++++- .../commonjs/test/snapshots/function.js.snap | Bin 21233 -> 21721 bytes packages/commonjs/test/snapshots/test.js.md | 170 +++++++++++++++++ packages/commonjs/test/snapshots/test.js.snap | Bin 938 -> 1346 bytes packages/commonjs/test/test.js | 174 ++++++++++++++---- 23 files changed, 718 insertions(+), 167 deletions(-) create mode 100644 packages/commonjs/test/fixtures/function/module-side-effects-late-entry/_config.js create mode 100644 packages/commonjs/test/fixtures/function/module-side-effects-late-entry/foo.js create mode 100644 packages/commonjs/test/fixtures/function/module-side-effects-late-entry/main.js create mode 100644 packages/commonjs/test/fixtures/function/plugin-isentry/_config.js create mode 100644 packages/commonjs/test/fixtures/function/plugin-isentry/dep.js create mode 100644 packages/commonjs/test/fixtures/function/plugin-isentry/main.js create mode 100644 packages/commonjs/test/fixtures/function/plugin-isentry/other.js create mode 100644 packages/commonjs/test/fixtures/function/preserve-modules/_config.js create mode 100644 packages/commonjs/test/fixtures/function/preserve-modules/main.js diff --git a/packages/commonjs/package.json b/packages/commonjs/package.json index 6f3bb2e2a..ff706eeb6 100644 --- a/packages/commonjs/package.json +++ b/packages/commonjs/package.json @@ -52,7 +52,7 @@ "require" ], "peerDependencies": { - "rollup": "^2.61.1" + "rollup": "^2.67.0" }, "dependencies": { "@rollup/pluginutils": "^3.1.0", diff --git a/packages/commonjs/src/generate-imports.js b/packages/commonjs/src/generate-imports.js index 9c3aaa02e..a9cc478fe 100644 --- a/packages/commonjs/src/generate-imports.js +++ b/packages/commonjs/src/generate-imports.js @@ -90,11 +90,12 @@ export function getRequireHandlers() { exportsName, id, exportMode, - resolveRequireSourcesAndGetMeta, + resolveRequireSourcesAndUpdateMeta, needsRequireWrapper, isEsModule, isDynamicRequireModulesEnabled, - getIgnoreTryCatchRequireStatementMode + getIgnoreTryCatchRequireStatementMode, + commonjsMeta ) { const imports = []; imports.push(`import * as ${helpersName} from "${HELPERS_ID}";`); @@ -117,9 +118,10 @@ export function getRequireHandlers() { ); } const requiresBySource = collectSources(requireExpressions); - const { requireTargets, usesRequireWrapper } = await resolveRequireSourcesAndGetMeta( + const requireTargets = await resolveRequireSourcesAndUpdateMeta( id, needsRequireWrapper ? IS_WRAPPED_COMMONJS : !isEsModule, + commonjsMeta, Object.keys(requiresBySource).map((source) => { return { source, @@ -134,10 +136,7 @@ export function getRequireHandlers() { getIgnoreTryCatchRequireStatementMode, magicString ); - return { - importBlock: imports.length ? `${imports.join('\n')}\n\n` : '', - usesRequireWrapper - }; + return imports.length ? `${imports.join('\n')}\n\n` : ''; } return { diff --git a/packages/commonjs/src/helpers.js b/packages/commonjs/src/helpers.js index d2906ecf5..94d770d38 100644 --- a/packages/commonjs/src/helpers.js +++ b/packages/commonjs/src/helpers.js @@ -7,7 +7,8 @@ export const WRAPPED_SUFFIX = '?commonjs-wrapped'; export const EXTERNAL_SUFFIX = '?commonjs-external'; export const EXPORTS_SUFFIX = '?commonjs-exports'; export const MODULE_SUFFIX = '?commonjs-module'; -export const ES_IMPORT_SUFFIX = '?es-import'; +export const ENTRY_SUFFIX = '?commonjs-entry'; +export const ES_IMPORT_SUFFIX = '?commonjs-es-import'; export const DYNAMIC_MODULES_ID = '\0commonjs-dynamic-modules'; export const HELPERS_ID = '\0commonjsHelpers.js'; diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index 639f9e92d..b53fa7fd4 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -9,6 +9,7 @@ import { getDynamicModuleRegistry, getDynamicRequireModules } from './dynamic-mo import { DYNAMIC_MODULES_ID, + ENTRY_SUFFIX, ES_IMPORT_SUFFIX, EXPORTS_SUFFIX, EXTERNAL_SUFFIX, @@ -20,13 +21,20 @@ import { unwrapId } from './helpers'; import { hasCjsKeywords } from './parse'; -import { getEsImportProxy, getStaticRequireProxy, getUnknownRequireProxy } from './proxies'; +import { + getEntryProxy, + getEsImportProxy, + getStaticRequireProxy, + getUnknownRequireProxy +} from './proxies'; import getResolveId from './resolve-id'; -import { getResolveRequireSourcesAndGetMeta } from './resolve-require-sources'; +import { getRequireResolver } from './resolve-require-sources'; import validateVersion from './rollup-version'; import transformCommonjs from './transform-commonjs'; import { getName, getStrictRequiresFilter, normalizePathSlashes } from './utils'; +const PLUGIN_NAME = 'commonjs'; + export default function commonjs(options = {}) { const { ignoreGlobal, @@ -58,11 +66,6 @@ export default function commonjs(options = {}) { : () => typeof defaultIsModuleExportsOption === 'boolean' ? defaultIsModuleExportsOption : 'auto'; - const { - resolveRequireSourcesAndGetMeta, - getWrappedIds, - isRequiredId - } = getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndConditional); const dynamicRequireRoot = typeof options.dynamicRequireRoot === 'string' ? resolve(options.dynamicRequireRoot) @@ -73,9 +76,6 @@ export default function commonjs(options = {}) { ); const isDynamicRequireModulesEnabled = dynamicRequireModules.size > 0; - const esModulesWithDefaultExport = new Set(); - const esModulesWithNamedExports = new Set(); - const ignoreRequire = typeof options.ignore === 'function' ? options.ignore @@ -103,25 +103,31 @@ export default function commonjs(options = {}) { const sourceMap = options.sourceMap !== false; + // Initialized in buildStart + let requireResolver; + function transformAndCheckExports(code, id) { const { isEsModule, hasDefaultExport, hasNamedExports, ast } = analyzeTopLevelStatements( this.parse, code, id ); + + const commonjsMeta = this.getModuleInfo(id).meta.commonjs || {}; if (hasDefaultExport) { - esModulesWithDefaultExport.add(id); + commonjsMeta.hasDefaultExport = true; } if (hasNamedExports) { - esModulesWithNamedExports.add(id); + commonjsMeta.hasNamedExports = true; } if ( !dynamicRequireModules.has(normalizePathSlashes(id)) && - (!(hasCjsKeywords(code, ignoreGlobal) || isRequiredId(id)) || + (!(hasCjsKeywords(code, ignoreGlobal) || requireResolver.isRequiredId(id)) || (isEsModule && !options.transformMixedEsModules)) ) { - return { meta: { commonjs: { isCommonJS: false } } }; + commonjsMeta.isCommonJS = false; + return { meta: { commonjs: commonjsMeta } }; } const needsRequireWrapper = @@ -160,14 +166,15 @@ export default function commonjs(options = {}) { ast, getDefaultIsModuleExports(id), needsRequireWrapper, - resolveRequireSourcesAndGetMeta(this), - isRequiredId(id), - checkDynamicRequire + requireResolver.resolveRequireSourcesAndUpdateMeta(this), + requireResolver.isRequiredId(id), + checkDynamicRequire, + commonjsMeta ); } return { - name: 'commonjs', + name: PLUGIN_NAME, version, @@ -175,7 +182,7 @@ export default function commonjs(options = {}) { // We inject the resolver in the beginning so that "catch-all-resolver" like node-resolver // do not prevent our plugin from resolving entry points ot proxies. const plugins = Array.isArray(rawOptions.plugins) - ? rawOptions.plugins + ? [...rawOptions.plugins] : rawOptions.plugins ? [rawOptions.plugins] : []; @@ -197,11 +204,12 @@ export default function commonjs(options = {}) { 'The namedExports option from "@rollup/plugin-commonjs" is deprecated. Named exports are now handled automatically.' ); } + requireResolver = getRequireResolver(extensions, detectCyclesAndConditional); }, buildEnd() { if (options.strictRequires === 'debug') { - const wrappedIds = getWrappedIds(); + const wrappedIds = requireResolver.getWrappedIds(); if (wrappedIds.length) { this.warn({ code: 'WRAPPED_IDS', @@ -250,6 +258,15 @@ export default function commonjs(options = {}) { ); } + // entry suffix is just appended to not mess up relative external resolution + if (id.endsWith(ENTRY_SUFFIX)) { + return getEntryProxy( + id.slice(0, -ENTRY_SUFFIX.length), + defaultIsModuleExports, + this.getModuleInfo + ); + } + if (isWrappedId(id, ES_IMPORT_SUFFIX)) { return getEsImportProxy(unwrapId(id, ES_IMPORT_SUFFIX), defaultIsModuleExports); } @@ -265,18 +282,16 @@ export default function commonjs(options = {}) { if (isWrappedId(id, PROXY_SUFFIX)) { const actualId = unwrapId(id, PROXY_SUFFIX); - return getStaticRequireProxy( - actualId, - getRequireReturnsDefault(actualId), - esModulesWithDefaultExport, - esModulesWithNamedExports, - this.load - ); + return getStaticRequireProxy(actualId, getRequireReturnsDefault(actualId), this.load); } return null; }, + shouldTransformCachedModule(...args) { + return requireResolver.shouldTransformCachedModule.call(this, ...args); + }, + transform(code, id) { const extName = extname(id); if (extName !== '.cjs' && (!filter(id) || !extensions.includes(extName))) { diff --git a/packages/commonjs/src/proxies.js b/packages/commonjs/src/proxies.js index 2935612ac..10e9d0894 100644 --- a/packages/commonjs/src/proxies.js +++ b/packages/commonjs/src/proxies.js @@ -1,4 +1,4 @@ -import { HELPERS_ID } from './helpers'; +import { HELPERS_ID, IS_WRAPPED_COMMONJS } from './helpers'; import { capitalize, getName } from './utils'; export function getUnknownRequireProxy(id, requireReturnsDefault) { @@ -17,21 +17,15 @@ export function getUnknownRequireProxy(id, requireReturnsDefault) { return `import * as ${name} from ${JSON.stringify(id)}; ${exported}`; } -export async function getStaticRequireProxy( - id, - requireReturnsDefault, - esModulesWithDefaultExport, - esModulesWithNamedExports, - loadModule -) { +export async function getStaticRequireProxy(id, requireReturnsDefault, loadModule) { const name = getName(id); const { meta: { commonjs: commonjsMeta } } = await loadModule({ id }); - if (commonjsMeta && commonjsMeta.isCommonJS) { - return `export { __moduleExports as default } from ${JSON.stringify(id)};`; - } else if (!commonjsMeta) { + if (!commonjsMeta) { return getUnknownRequireProxy(id, requireReturnsDefault); + } else if (commonjsMeta.isCommonJS) { + return `export { __moduleExports as default } from ${JSON.stringify(id)};`; } else if (!requireReturnsDefault) { return `import { getAugmentedNamespace } from "${HELPERS_ID}"; import * as ${name} from ${JSON.stringify( id @@ -39,14 +33,30 @@ export async function getStaticRequireProxy( } else if ( requireReturnsDefault !== true && (requireReturnsDefault === 'namespace' || - !esModulesWithDefaultExport.has(id) || - (requireReturnsDefault === 'auto' && esModulesWithNamedExports.has(id))) + !commonjsMeta.hasDefaultExport || + (requireReturnsDefault === 'auto' && commonjsMeta.hasNamedExports)) ) { return `import * as ${name} from ${JSON.stringify(id)}; export default ${name};`; } return `export { default } from ${JSON.stringify(id)};`; } +export function getEntryProxy(id, defaultIsModuleExports, getModuleInfo) { + const { + meta: { commonjs: commonjsMeta }, + hasDefaultExport + } = getModuleInfo(id); + if (!commonjsMeta || commonjsMeta.isCommonJS !== IS_WRAPPED_COMMONJS) { + const stringifiedId = JSON.stringify(id); + let code = `export * from ${stringifiedId};`; + if (hasDefaultExport) { + code += `export { default } from ${stringifiedId};`; + } + return code; + } + return getEsImportProxy(id, defaultIsModuleExports); +} + export function getEsImportProxy(id, defaultIsModuleExports) { const name = getName(id); const exportsName = `${name}Exports`; diff --git a/packages/commonjs/src/resolve-id.js b/packages/commonjs/src/resolve-id.js index 74d209e5b..1f6c874a3 100644 --- a/packages/commonjs/src/resolve-id.js +++ b/packages/commonjs/src/resolve-id.js @@ -5,6 +5,7 @@ import { dirname, resolve, sep } from 'path'; import { DYNAMIC_MODULES_ID, + ENTRY_SUFFIX, ES_IMPORT_SUFFIX, EXPORTS_SUFFIX, EXTERNAL_SUFFIX, @@ -51,11 +52,8 @@ export function resolveExtensions(importee, importer, extensions) { export default function getResolveId(extensions) { return async function resolveId(importee, importer, resolveOptions) { // We assume that all requires are pre-resolved - if ( - resolveOptions.custom && - resolveOptions.custom['node-resolve'] && - resolveOptions.custom['node-resolve'].isRequire - ) { + const customOptions = resolveOptions.custom; + if (customOptions && customOptions['node-resolve'] && customOptions['node-resolve'].isRequire) { return null; } if (isWrappedId(importee, WRAPPED_SUFFIX)) { @@ -63,6 +61,7 @@ export default function getResolveId(extensions) { } if ( + importee.endsWith(ENTRY_SUFFIX) || isWrappedId(importee, MODULE_SUFFIX) || isWrappedId(importee, EXPORTS_SUFFIX) || isWrappedId(importee, PROXY_SUFFIX) || @@ -79,7 +78,8 @@ export default function getResolveId(extensions) { importer === DYNAMIC_MODULES_ID || // Proxies are only importing resolved ids, no need to resolve again isWrappedId(importer, PROXY_SUFFIX) || - isWrappedId(importer, ES_IMPORT_SUFFIX) + isWrappedId(importer, ES_IMPORT_SUFFIX) || + importer.endsWith(ENTRY_SUFFIX) ) { return importee; } @@ -99,22 +99,27 @@ export default function getResolveId(extensions) { // If this is an entry point or ESM import, we need to figure out if the importee is wrapped and // if that is the case, we need to add a proxy. - const customOptions = resolveOptions.custom; - - // If this is a require, we do not need a proxy - if (customOptions && customOptions['node-resolve'] && customOptions['node-resolve'].isRequire) { - return null; - } - const resolved = (await this.resolve(importee, importer, Object.assign({ skipSelf: true }, resolveOptions))) || resolveExtensions(importee, importer, extensions); - if (!resolved || resolved.external) { + // Make sure that even if other plugins resolve again, we ignore our own proxies + if ( + !resolved || + resolved.external || + resolved.id.endsWith(ENTRY_SUFFIX) || + isWrappedId(resolved.id, ES_IMPORT_SUFFIX) + ) { return resolved; } + const moduleInfo = await this.load(resolved); + if (resolveOptions.isEntry) { + moduleInfo.moduleSideEffects = true; + // We must not precede entry proxies with a `\0` as that will mess up relative external resolution + return resolved.id + ENTRY_SUFFIX; + } const { meta: { commonjs: commonjsMeta } - } = await this.load(resolved); + } = moduleInfo; if (commonjsMeta && commonjsMeta.isCommonJS === IS_WRAPPED_COMMONJS) { return wrapId(resolved.id, ES_IMPORT_SUFFIX); } diff --git a/packages/commonjs/src/resolve-require-sources.js b/packages/commonjs/src/resolve-require-sources.js index 76fae132e..49dc0dc2a 100644 --- a/packages/commonjs/src/resolve-require-sources.js +++ b/packages/commonjs/src/resolve-require-sources.js @@ -7,7 +7,7 @@ import { } from './helpers'; import { resolveExtensions } from './resolve-id'; -export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndConditional) { +export function getRequireResolver(extensions, detectCyclesAndConditional) { const knownCjsModuleTypes = Object.create(null); const requiredIds = Object.create(null); const unconditionallyRequiredIds = Object.create(null); @@ -31,11 +31,7 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndCo const getTypeForFullyAnalyzedModule = (id) => { const knownType = knownCjsModuleTypes[id]; - if ( - knownType === IS_WRAPPED_COMMONJS || - !detectCyclesAndConditional || - fullyAnalyzedModules[id] - ) { + if (knownType !== true || !detectCyclesAndConditional || fullyAnalyzedModules[id]) { return knownType; } fullyAnalyzedModules[id] = true; @@ -45,26 +41,80 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndCo return knownType; }; + const setInitialParentType = (id, initialCommonJSType) => { + // It is possible a transformed module is already fully analyzed when using + // the cache and one dependency introduces a new cycle. Then transform is + // run for a fully analzyed module again. Fully analyzed modules may never + // change their type as importers already trust their type. + knownCjsModuleTypes[id] = fullyAnalyzedModules[id] + ? knownCjsModuleTypes[id] + : initialCommonJSType; + if ( + detectCyclesAndConditional && + knownCjsModuleTypes[id] === true && + requiredIds[id] && + !unconditionallyRequiredIds[id] + ) { + knownCjsModuleTypes[id] = IS_WRAPPED_COMMONJS; + } + }; + + const setTypesForRequiredModules = async (parentId, resolved, isConditional, loadModule) => { + const childId = resolved.id; + requiredIds[childId] = true; + if (!(isConditional || knownCjsModuleTypes[parentId] === IS_WRAPPED_COMMONJS)) { + unconditionallyRequiredIds[childId] = true; + } + + getDependencies(parentId).add(childId); + if (!isCyclic(childId)) { + // This makes sure the current transform handler waits for all direct dependencies to be + // loaded and transformed and therefore for all transitive CommonJS dependencies to be + // loaded as well so that all cycles have been found and knownCjsModuleTypes is reliable. + await loadModule(resolved); + } + }; + return { getWrappedIds: () => Object.keys(knownCjsModuleTypes).filter( (id) => knownCjsModuleTypes[id] === IS_WRAPPED_COMMONJS ), isRequiredId: (id) => requiredIds[id], - resolveRequireSourcesAndGetMeta: (rollupContext) => async ( + async shouldTransformCachedModule({ id: parentId, meta: { commonjs: parentMeta } }) { + // Ignore modules that did not pass through the original transformer in a previous build + if (!(parentMeta && parentMeta.requires)) { + return false; + } + setInitialParentType(parentId, parentMeta.initialCommonJSType); + await Promise.all( + parentMeta.requires.map(({ resolved, isConditional }) => + setTypesForRequiredModules(parentId, resolved, isConditional, this.load) + ) + ); + if (getTypeForFullyAnalyzedModule(parentId) !== parentMeta.isCommonJS) { + return true; + } + for (const { + resolved: { id } + } of parentMeta.requires) { + if (getTypeForFullyAnalyzedModule(id) !== parentMeta.isRequiredCommonJS[id]) { + return true; + } + } + return false; + }, + /* eslint-disable no-param-reassign */ + resolveRequireSourcesAndUpdateMeta: (rollupContext) => async ( parentId, isParentCommonJS, + parentMeta, sources ) => { - knownCjsModuleTypes[parentId] = isParentCommonJS; - if ( - detectCyclesAndConditional && - knownCjsModuleTypes[parentId] && - requiredIds[parentId] && - !unconditionallyRequiredIds[parentId] - ) { - knownCjsModuleTypes[parentId] = IS_WRAPPED_COMMONJS; - } + parentMeta.initialCommonJSType = isParentCommonJS; + parentMeta.requires = []; + parentMeta.isRequiredCommonJS = Object.create(null); + setInitialParentType(parentId, isParentCommonJS); const requireTargets = await Promise.all( sources.map(async ({ source, isConditional }) => { // Never analyze or proxy internal modules @@ -82,38 +132,27 @@ export function getResolveRequireSourcesAndGetMeta(extensions, detectCyclesAndCo if (resolved.external) { return { id: wrapId(childId, EXTERNAL_SUFFIX), allowProxy: false }; } - requiredIds[childId] = true; - if (!(isConditional || knownCjsModuleTypes[parentId] === IS_WRAPPED_COMMONJS)) { - unconditionallyRequiredIds[childId] = true; - } - - getDependencies(parentId).add(childId); - if (!isCyclic(childId)) { - // This makes sure the current transform handler waits for all direct dependencies to be - // loaded and transformed and therefore for all transitive CommonJS dependencies to be - // loaded as well so that all cycles have been found and knownCjsModuleTypes is reliable. - await rollupContext.load(resolved); - } else if (detectCyclesAndConditional && knownCjsModuleTypes[parentId]) { - knownCjsModuleTypes[parentId] = IS_WRAPPED_COMMONJS; - } + parentMeta.requires.push({ resolved, isConditional }); + await setTypesForRequiredModules(parentId, resolved, isConditional, rollupContext.load); return { id: childId, allowProxy: true }; }) ); - return { - requireTargets: requireTargets.map(({ id: dependencyId, allowProxy }, index) => { - const isCommonJS = getTypeForFullyAnalyzedModule(dependencyId); - return { - source: sources[index].source, - id: allowProxy - ? isCommonJS === IS_WRAPPED_COMMONJS - ? wrapId(dependencyId, WRAPPED_SUFFIX) - : wrapId(dependencyId, PROXY_SUFFIX) - : dependencyId, - isCommonJS - }; - }), - usesRequireWrapper: getTypeForFullyAnalyzedModule(parentId) === IS_WRAPPED_COMMONJS - }; + parentMeta.isCommonJS = getTypeForFullyAnalyzedModule(parentId); + return requireTargets.map(({ id: dependencyId, allowProxy }, index) => { + // eslint-disable-next-line no-multi-assign + const isCommonJS = (parentMeta.isRequiredCommonJS[ + dependencyId + ] = getTypeForFullyAnalyzedModule(dependencyId)); + return { + source: sources[index].source, + id: allowProxy + ? isCommonJS === IS_WRAPPED_COMMONJS + ? wrapId(dependencyId, WRAPPED_SUFFIX) + : wrapId(dependencyId, PROXY_SUFFIX) + : dependencyId, + isCommonJS + }; + }); } }; } diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index 851115b47..5a71d0517 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -51,9 +51,10 @@ export default async function transformCommonjs( astCache, defaultIsModuleExports, needsRequireWrapper, - resolveRequireSourcesAndGetMeta, + resolveRequireSourcesAndUpdateMeta, isRequired, - checkDynamicRequire + checkDynamicRequire, + commonjsMeta ) { const ast = astCache || tryParse(parse, code, id); const magicString = new MagicString(code); @@ -437,7 +438,7 @@ export default async function transformCommonjs( ) && (ignoreGlobal || !uses.global) ) { - return { meta: { commonjs: { isCommonJS: false, isMixedModule: false } } }; + return { meta: { commonjs: { isCommonJS: false } } }; } let leadingComment = ''; @@ -459,7 +460,7 @@ export default async function transformCommonjs( ? 'exports' : 'module'; - const { importBlock, usesRequireWrapper } = await rewriteRequireExpressionsAndGetImportBlock( + const importBlock = await rewriteRequireExpressionsAndGetImportBlock( magicString, topLevelDeclarations, reassignedNames, @@ -469,12 +470,14 @@ export default async function transformCommonjs( exportsName, id, exportMode, - resolveRequireSourcesAndGetMeta, + resolveRequireSourcesAndUpdateMeta, needsRequireWrapper, isEsModule, isDynamicRequireModulesEnabled, - getIgnoreTryCatchRequireStatementMode + getIgnoreTryCatchRequireStatementMode, + commonjsMeta ); + const usesRequireWrapper = commonjsMeta.isCommonJS === IS_WRAPPED_COMMONJS; const exportBlock = isEsModule ? '' : rewriteExportsAndGetExportsBlock( @@ -527,11 +530,6 @@ function ${requireName} () { code: magicString.toString(), map: sourceMap ? magicString.generateMap() : null, syntheticNamedExports: isEsModule || usesRequireWrapper ? false : '__moduleExports', - meta: { - commonjs: { - isCommonJS: !isEsModule && (usesRequireWrapper ? IS_WRAPPED_COMMONJS : true), - isMixedModule: isEsModule - } - } + meta: { commonjs: commonjsMeta } }; } diff --git a/packages/commonjs/test/fixtures/function/module-side-effects-late-entry/_config.js b/packages/commonjs/test/fixtures/function/module-side-effects-late-entry/_config.js new file mode 100644 index 000000000..8c1d053bd --- /dev/null +++ b/packages/commonjs/test/fixtures/function/module-side-effects-late-entry/_config.js @@ -0,0 +1,22 @@ +const path = require('path'); + +module.exports = { + description: + 'use correct side-effects flags for files that become entry points after they are loaded', + options: { + treeshake: { moduleSideEffects: false }, + plugins: [ + { + load(id) { + if (id.endsWith('foo.js')) { + this.emitFile({ type: 'chunk', id: path.join(__dirname, 'foo.js') }); + } + } + } + ], + output: { chunkFileNames: 'generated-[name].js' } + }, + global: (global, t) => { + t.is(global.foo, 'foo'); + } +}; diff --git a/packages/commonjs/test/fixtures/function/module-side-effects-late-entry/foo.js b/packages/commonjs/test/fixtures/function/module-side-effects-late-entry/foo.js new file mode 100644 index 000000000..53d1fab39 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/module-side-effects-late-entry/foo.js @@ -0,0 +1,2 @@ +// This side-effect will only be respected if this is an entry point +global.foo = 'foo'; diff --git a/packages/commonjs/test/fixtures/function/module-side-effects-late-entry/main.js b/packages/commonjs/test/fixtures/function/module-side-effects-late-entry/main.js new file mode 100644 index 000000000..60af16024 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/module-side-effects-late-entry/main.js @@ -0,0 +1,3 @@ +import './foo.js'; + +export default 'main'; diff --git a/packages/commonjs/test/fixtures/function/plugin-isentry/_config.js b/packages/commonjs/test/fixtures/function/plugin-isentry/_config.js new file mode 100644 index 000000000..156176ad9 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/plugin-isentry/_config.js @@ -0,0 +1,36 @@ +const fs = require('fs'); +const path = require('path'); +const assert = require('assert'); + +const ID_MAIN = path.join(__dirname, 'main.js'); +const ID_OTHER = path.join(__dirname, 'other.js'); + +module.exports = { + description: 'provides correct values for ModuleInfo.isEntry to not break legacy plugins', + options: { + input: [ID_MAIN, ID_OTHER], + output: { + chunkFileNames: '[name].js' + }, + plugins: [ + { + transform(code, id) { + if (this.getModuleInfo(id).isEntry) { + return `import "polyfill";\n${code}`; + } + return null; + }, + resolveId(id) { + if (id === 'polyfill') return id; + return null; + }, + load(id) { + if (id === 'polyfill') { + return `global.entryDetected = true;`; + } + return null; + } + } + ] + } +}; diff --git a/packages/commonjs/test/fixtures/function/plugin-isentry/dep.js b/packages/commonjs/test/fixtures/function/plugin-isentry/dep.js new file mode 100644 index 000000000..2f5dc9fbe --- /dev/null +++ b/packages/commonjs/test/fixtures/function/plugin-isentry/dep.js @@ -0,0 +1,2 @@ +t.is(global.entryDetected, true); +module.exports = 'dep'; diff --git a/packages/commonjs/test/fixtures/function/plugin-isentry/main.js b/packages/commonjs/test/fixtures/function/plugin-isentry/main.js new file mode 100644 index 000000000..811a39ee5 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/plugin-isentry/main.js @@ -0,0 +1,2 @@ +t.is(global.entryDetected, true); +module.exports = require('./dep.js'); diff --git a/packages/commonjs/test/fixtures/function/plugin-isentry/other.js b/packages/commonjs/test/fixtures/function/plugin-isentry/other.js new file mode 100644 index 000000000..661ce2f2e --- /dev/null +++ b/packages/commonjs/test/fixtures/function/plugin-isentry/other.js @@ -0,0 +1 @@ +export const other = true; diff --git a/packages/commonjs/test/fixtures/function/preserve-modules/_config.js b/packages/commonjs/test/fixtures/function/preserve-modules/_config.js new file mode 100644 index 000000000..dbca5a506 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/preserve-modules/_config.js @@ -0,0 +1,14 @@ +module.exports = { + description: 'uses correct entry files names when preserving modules', + options: { + preserveModules: true + }, + pluginOptions: { + // Our entry is wrapped, so it will not be functional without a proper proxy + strictRequires: true + }, + // This will only work if "main" corresponds to the actual entry point that unwraps main.js + global: (global, t) => { + t.is(global.main, 'main'); + } +}; diff --git a/packages/commonjs/test/fixtures/function/preserve-modules/main.js b/packages/commonjs/test/fixtures/function/preserve-modules/main.js new file mode 100644 index 000000000..7696217a1 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/preserve-modules/main.js @@ -0,0 +1,4 @@ +global.main = 'main'; +console.log('main'); + +module.exports = 'main'; diff --git a/packages/commonjs/test/form.js b/packages/commonjs/test/form.js index 270d27ccf..182498e8b 100644 --- a/packages/commonjs/test/form.js +++ b/packages/commonjs/test/form.js @@ -54,15 +54,16 @@ if (path.sep === '/') { (config.solo ? test.only : test)(dir, (t) => Promise.all( inputEntries.map(async ([outputName, id]) => { - const { transform } = commonjs(config.options); - + const { buildStart, transform } = commonjs(config.options); + buildStart.call({ meta: { rollupVersion: '99.0.0' } }, { plugins: [] }); transformContext.getModuleInfo = (moduleId) => { return { isEntry: config.entry && moduleId === id, importers: config.importers && config.importers[outputName] ? config.importers[outputName].map((x) => `fixtures/form/${dir}/${x}`) - : [] + : [], + meta: {} }; }; const input = fs.readFileSync(id, 'utf-8'); diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index 1e80780c8..d928b3a85 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -3668,15 +3668,23 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ - var other = require('./other.js');␊ + var other = require('./other-aeb2ae1d.js');␊ ␊ - t.is(other, 'foo');␊ + t.is(other.other, 'foo');␊ `, - 'other.js': `'use strict';␊ + 'other-aeb2ae1d.js': `'use strict';␊ ␊ var other = 'foo';␊ ␊ - module.exports = other;␊ + exports.other = other;␊ + `, + 'other.js': `'use strict';␊ + ␊ + var other = require('./other-aeb2ae1d.js');␊ + ␊ + ␊ + ␊ + module.exports = other.other;␊ `, } @@ -4772,11 +4780,11 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ - var other = require('./other.js');␊ + var other = require('./other2.js');␊ ␊ var main = {};␊ ␊ - const foo = other;␊ + const foo = other.other;␊ ␊ t.is(foo, 'foo');␊ ␊ @@ -4784,9 +4792,17 @@ Generated by [AVA](https://avajs.dev). `, 'other.js': `'use strict';␊ ␊ + var other = require('./other2.js');␊ + ␊ + ␊ + ␊ + module.exports = other.other;␊ + `, + 'other2.js': `'use strict';␊ + ␊ var other = 'foo';␊ ␊ - module.exports = other;␊ + exports.other = other;␊ `, } @@ -4895,6 +4911,36 @@ Generated by [AVA](https://avajs.dev). `, } +## module-side-effects-late-entry + +> Snapshot 1 + + { + 'generated-foo.js': `'use strict';␊ + ␊ + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ + ␊ + // This side-effect will only be respected if this is an entry point␊ + commonjsGlobal.foo = 'foo';␊ + `, + 'generated-foo2.js': `'use strict';␊ + ␊ + require('./generated-foo.js');␊ + ␊ + var foo = {};␊ + ␊ + module.exports = foo;␊ + `, + 'main.js': `'use strict';␊ + ␊ + require('./generated-foo.js');␊ + ␊ + var main = 'main';␊ + ␊ + module.exports = main;␊ + `, + } + ## module_require > Snapshot 1 @@ -5292,6 +5338,85 @@ Generated by [AVA](https://avajs.dev). `, } +## plugin-isentry + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + require('./polyfill.js');␊ + ␊ + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ + ␊ + t.is(commonjsGlobal.entryDetected, true);␊ + var dep = 'dep';␊ + ␊ + t.is(commonjsGlobal.entryDetected, true);␊ + var main = dep;␊ + ␊ + module.exports = main;␊ + `, + 'other.js': `'use strict';␊ + ␊ + Object.defineProperty(exports, '__esModule', { value: true });␊ + ␊ + require('./polyfill.js');␊ + ␊ + const other = true;␊ + ␊ + exports.other = other;␊ + `, + 'polyfill.js': `'use strict';␊ + ␊ + global.entryDetected = true;␊ + `, + } + +## preserve-modules + +> Snapshot 1 + + { + '_virtual/_commonjsHelpers.js': `'use strict';␊ + ␊ + Object.defineProperty(exports, '__esModule', { value: true });␊ + ␊ + var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ + ␊ + exports.commonjsGlobal = commonjsGlobal;␊ + `, + 'main.js': `'use strict';␊ + ␊ + var main = require('./main2.js');␊ + ␊ + var mainExports = main.__require();␊ + ␊ + module.exports = mainExports;␊ + `, + 'main2.js': `'use strict';␊ + ␊ + Object.defineProperty(exports, '__esModule', { value: true });␊ + ␊ + var _commonjsHelpers = require('./_virtual/_commonjsHelpers.js');␊ + ␊ + var main;␊ + var hasRequiredMain;␊ + ␊ + function requireMain () {␊ + if (hasRequiredMain) return main;␊ + hasRequiredMain = 1;␊ + _commonjsHelpers.commonjsGlobal.main = 'main';␊ + console.log('main');␊ + ␊ + main = 'main';␊ + return main;␊ + }␊ + ␊ + exports.__require = requireMain;␊ + `, + } + ## react-apollo > Snapshot 1 diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index 56d99191721677fa71980f018592595d6c47e358..f12cfa25e749e4f43cc6d7258e7bd2b50f3899b2 100644 GIT binary patch literal 21721 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 diff --git a/packages/commonjs/test/snapshots/test.js.md b/packages/commonjs/test/snapshots/test.js.md index 1b1ebe464..d565de262 100644 --- a/packages/commonjs/test/snapshots/test.js.md +++ b/packages/commonjs/test/snapshots/test.js.md @@ -115,3 +115,173 @@ Generated by [AVA](https://avajs.dev). ␊ export { foo as default };␊ ` + +## updates all relevant modules when using the cache and the wrapping of a module changes + +> Snapshot 1 + + `'use strict';␊ + ␊ + var first = {};␊ + ␊ + var second = {};␊ + ␊ + second.second = 'second';␊ + ␊ + first.first = 'first'; first.first += second.second;␊ + ␊ + var main = 'main' + first.first;␊ + ␊ + module.exports = main;␊ + ` + +> Snapshot 2 + + `'use strict';␊ + ␊ + var first = {};␊ + ␊ + var second = {};␊ + ␊ + var hasRequiredSecond;␊ + ␊ + function requireSecond () {␊ + if (hasRequiredSecond) return second;␊ + hasRequiredSecond = 1;␊ + second.second = 'second'; second.second += requireFirst().first;␊ + return second;␊ + }␊ + ␊ + var hasRequiredFirst;␊ + ␊ + function requireFirst () {␊ + if (hasRequiredFirst) return first;␊ + hasRequiredFirst = 1;␊ + first.first = 'first'; first.first += requireSecond().second;␊ + return first;␊ + }␊ + ␊ + var main = 'main' + requireFirst().first;␊ + ␊ + module.exports = main;␊ + ` + +> Snapshot 3 + + `'use strict';␊ + ␊ + function getAugmentedNamespace(n) {␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ + Object.keys(n).forEach(function (k) {␊ + var d = Object.getOwnPropertyDescriptor(n, k);␊ + Object.defineProperty(a, k, d.get ? d : {␊ + enumerable: true,␊ + get: function () {␊ + return n[k];␊ + }␊ + });␊ + });␊ + return a;␊ + }␊ + ␊ + var second = {};␊ + ␊ + var hasRequiredSecond;␊ + ␊ + function requireSecond () {␊ + if (hasRequiredSecond) return second;␊ + hasRequiredSecond = 1;␊ + second.second = 'second';␊ + return second;␊ + }␊ + ␊ + let first = 'first'; if (Math.random() < 1) first += requireSecond().second;␊ + ␊ + var first$1 = /*#__PURE__*/Object.freeze({␊ + __proto__: null,␊ + get first () { return first; }␊ + });␊ + ␊ + var require$$0 = /*@__PURE__*/getAugmentedNamespace(first$1);␊ + ␊ + var main = 'main' + require$$0.first;␊ + ␊ + module.exports = main;␊ + ` + +## updates mixed modules when using the cache and the wrapping of a module changes + +> Snapshot 1 + + `'use strict';␊ + ␊ + Object.defineProperty(exports, '__esModule', { value: true });␊ + ␊ + var first = {};␊ + ␊ + first.first = 'first';␊ + ␊ + const main = 'main'; const result = first.first;␊ + ␊ + exports.main = main;␊ + exports.result = result;␊ + ` + +> Snapshot 2 + + `'use strict';␊ + ␊ + Object.defineProperty(exports, '__esModule', { value: true });␊ + ␊ + var main$1 = /*#__PURE__*/Object.freeze({␊ + __proto__: null,␊ + get main () { return main; },␊ + get result () { return result; }␊ + });␊ + ␊ + function getAugmentedNamespace(n) {␊ + var f = n.default;␊ + if (typeof f == "function") {␊ + var a = function () {␊ + return f.apply(this, arguments);␊ + };␊ + a.prototype = f.prototype;␊ + } else a = {};␊ + Object.defineProperty(a, '__esModule', {value: true});␊ + Object.keys(n).forEach(function (k) {␊ + var d = Object.getOwnPropertyDescriptor(n, k);␊ + Object.defineProperty(a, k, d.get ? d : {␊ + enumerable: true,␊ + get: function () {␊ + return n[k];␊ + }␊ + });␊ + });␊ + return a;␊ + }␊ + ␊ + var first = {};␊ + ␊ + var require$$0 = /*@__PURE__*/getAugmentedNamespace(main$1);␊ + ␊ + var hasRequiredFirst;␊ + ␊ + function requireFirst () {␊ + if (hasRequiredFirst) return first;␊ + hasRequiredFirst = 1;␊ + first.first = 'first' + require$$0.main;␊ + return first;␊ + }␊ + ␊ + const main = 'main'; const result = requireFirst().first;␊ + ␊ + exports.main = main;␊ + exports.result = result;␊ + ` diff --git a/packages/commonjs/test/snapshots/test.js.snap b/packages/commonjs/test/snapshots/test.js.snap index 68529726427894ada7fa0377b4fea98960699f33..f5ee342d78e132627bb06a3af5c206bc49e0ac24 100644 GIT binary patch literal 1346 zcmV-I1-<$~RzV*DKM6#QN=eIs(kKZBFxG1AosBo%?3&r#q-o?s zh13J$hTsH<1BXf+s#1yHN=Ow~P(ekC!~ux|L~ueJIl!Br_0QUYG@?=kwY1)uH}l@S z_vZWF%-&KI<)E_s>gnq1&Lt)I#(D3DN8bK6qp;t{_@bX&J78SSuAf;r^YfKwFTIoD z(!zwIyqh&|d4KLymrs0f|B0V29Gc+L$*g$F2NmV&m6y+ddF0~FYcIa`pndbBCo)|6 z8yorYmmBU}{h`k)i|vQs2zD}D`qCjq`Skbbi|vh_i@*BY4}5?9#?dU7KCX(VbXYux zk0{F5b4#ZCR_VD9PgcE0-*?~4aOroGiju{M*e`RRGC6TMqs1YCFrscV(ki*!xyCAK zMutrs*Cz`!=nxuh>g0SUpix)^%`{1PHn3xlXhqn9b<2y%EJQRW(9NU%x8~6~mV#o2wDN3zP-D3ZF*vbJo0R`P75x8iG z%MFkCD^Uw(pj<)e({LPLGc#g3Kr`^e2v%|SSu1K8ju!+}=S^z)cCe=Bp#ZuI$Do`? zKbcC6+pW3vqFAA}TCbyiE$Jj;w_axo-CS3MH|VojMhzCPF(^gZU>DOM6Ih$V#9FZz zP1U7dB^mlV17^9B8{D=GN$r}5K4`G`Sw5^;&>C71TMcYAwOlu~H8^4z1}gB8HNK&S z^rYw65K^|4JAf3&rRcYW3hx++NaKxuaME*)y|s$mZ%RT;CW;4i``I?6&TyW4I--#Z zbMn9)BE&R9N~v(vG#6f2oHxxvNm_O&As2|gl~YZ#LxU(V%~|kc&nxEC6(R#i_->)Y zQA~Xi4s_+P3}+AOh;9jj>WQ{te^|IDjjhQtJCo|^{C~Bj7=*sTRcRkRJF_gEQ3eP z)?jA(Jx(|v9&Uvt@c}S?E3A=C7}x`r09ER>$!3Vr8dzKAt!7K_d)@AbW8-RaKBnv3 zhM%l6N5Up`I}w%@zX)v}!>$gsi(oT-IEe;lMNWv1(Nk6eg=wY5CYh8V>f!2Ga6kR*m~>g1@U%G(H9dMDKIiP4|4$MfQP`n(tm z)R18I>_j4ZMo*}TmbUBRFj)8DSQUm03Mq1>VSz08ahiE#kfr6}wL314MX zNVs>l{@2geyO`GF_{zSSM(D#F82%P|3O|G3ANkZTbo;)&I=#X$Tmh2H>3(i2(xdz? z1%BY}a68=oeBvIr|3};ww>BO!yY=u!a_1r8+CJbe)5l-?2RE*rzx}J%UkDUcT&WTO E059*9kN^Mx literal 938 zcmV;b16BM%RzVogn_g;Hsk_CV>XTMj5h)+ByTym4mI@p!jkK%X)DCgWJEH`{>cb z_dk6xc=X+cia{T1%b$;bj&}Pm{n)uNdHFN(cg3Iwo0j$K?tveD(R}CIOWpXDZ=%mD z20j10Wo=q#P0q?0>xGSb6(>y)5+$RdayqtseQ=0F)rhKR( z!66x^VHo3ODcRg*`dxz)8z2-C+!z%^6v*ISjC`cVumi0Qp>M)P`t0oF#{q_dCkhVf z^fji&UKk4@U9*&o2V&~hpbl;XuS2UwJhe;D#O+1>MxLQ}*zc2nuiTVy)bDGD%+B)i zRyq4E^3e5qt0-ZsTauv=u(w6RvNTp({lc$Pn*J?--|E<_ZL8o~*YfJcK-aJJU~O;) zPJ>nhS`8gLTWbwjJkKKsW0{(UdIggOvs07uz|#Jq5Zk)sH(HCV1QB2ighe5^YCb~| zLK*JWZWo-C=OYz3dB@aPieun-40}>itDKu-lvL7Kq;UWP1TJ6{ivf!lafmtNuy+7C zU5DD3mCDj6Y91_sLSV?&BZ(pPe7Ogog)$+`L6zZpqwM>g)AECOO zj;6>J2Jf;dCNnlfm*;{QbtxkE3LYK1x*{f-h+-LPOZ!x-+J|ZJ%M5OgS0$=catJ*( zo5gcijiW?Q^C;EH6B4dk&Gd_TGbxnNIdqui&I~+YOog!GR|a_c-N2r>6;>_L(#{{*IFJw#?vju0kO!kYEh ze1HGF8+*QAZx)n8iTEM9l+E{z=)T_up2jh;DÍvU3rn$>3gt!2okj}_&v{r^e+ M2hUKdAEgEW03LwJqyPW_ diff --git a/packages/commonjs/test/test.js b/packages/commonjs/test/test.js index 4a297a301..2f86e9f17 100644 --- a/packages/commonjs/test/test.js +++ b/packages/commonjs/test/test.js @@ -1,11 +1,13 @@ /* eslint-disable line-comment-position, no-new-func, no-undefined */ -import * as path from 'path'; import os from 'os'; +import * as path from 'path'; + import nodeResolve from '@rollup/plugin-node-resolve'; import test from 'ava'; import { getLocator } from 'locate-character'; + import { rollup } from 'rollup'; import { SourceMapConsumer } from 'source-map'; import { install } from 'source-map-support'; @@ -19,6 +21,23 @@ install(); process.chdir(__dirname); +const loader = (modules) => { + return { + load(id) { + if (Object.hasOwnProperty.call(modules, id)) { + return modules[id]; + } + return null; + }, + resolveId(id) { + if (Object.hasOwnProperty.call(modules, id)) { + return id; + } + return null; + } + }; +}; + test('Rollup peer dependency has correct format', (t) => { t.regex(peerDependencies.rollup, /^\^\d+\.\d+\.\d+(\|\|\^\d+\.\d+\.\d+)*$/); }); @@ -449,20 +468,18 @@ test('does not warn even if the ES module does not export "default"', async (t) }); test('compiles with cache', async (t) => { - // specific commonjs require() to ensure same instance is used - // eslint-disable-next-line global-require - const commonjsInstance = require('..'); + const plugin = commonjs(); - const bundle = await rollup({ + const { cache } = await rollup({ input: 'fixtures/function/index/main.js', - plugins: [commonjsInstance()] + plugins: [plugin] }); await t.notThrowsAsync( rollup({ input: 'fixtures/function/index/main.js', - plugins: [commonjsInstance()], - cache: bundle + plugins: [plugin], + cache }) ); }); @@ -547,20 +564,10 @@ test('produces optimized code when importing esm with a known default export', a input: 'main.js', plugins: [ commonjs({ requireReturnsDefault: true }), - { - load(id) { - if (id === 'main.js') { - return 'module.exports = require("esm.js")'; - } - if (id === 'esm.js') { - return 'export const ignored = "ignored"; export default "default"'; - } - return null; - }, - resolveId(id) { - return id; - } - } + loader({ + 'main.js': 'module.exports = require("esm.js")', + 'esm.js': 'export const ignored = "ignored"; export default "default"' + }) ] }); t.snapshot(await getCodeFromBundle(bundle)); @@ -571,20 +578,10 @@ test('produces optimized code when importing esm without a default export', asyn input: 'main.js', plugins: [ commonjs(), - { - load(id) { - if (id === 'main.js') { - return 'module.exports = require("esm.js")'; - } - if (id === 'esm.js') { - return 'export const value = "value";'; - } - return null; - }, - resolveId(id) { - return id; - } - } + loader({ + 'main.js': 'module.exports = require("esm.js")', + 'esm.js': 'export const value = "value";' + }) ] }); t.snapshot(await getCodeFromBundle(bundle)); @@ -763,3 +760,108 @@ test('throws when using an inadequate node_resolve version', async (t) => { 'Insufficient @rollup/plugin-node-resolve version: "@rollup/plugin-commonjs" requires at least @rollup/plugin-node-resolve@13.0.6 but found @rollup/plugin-node-resolve@13.0.5.' }); }); + +test('updates all relevant modules when using the cache and the wrapping of a module changes', async (t) => { + const modules = {}; + const resetModules = () => { + modules['main.js'] = "module.exports = 'main' + require('first.js').first;"; + modules['first.js'] = "exports.first = 'first'; exports.first += require('second.js').second;"; + modules['second.js'] = "exports.second = 'second';"; + }; + const options = { + input: 'main.js', + plugins: [commonjs({ transformMixedEsModules: true }), loader(modules)], + onwarn(warning) { + if (warning.code !== 'CIRCULAR_DEPENDENCY') { + throw new Error(warning.message); + } + } + }; + + resetModules(); + let bundle = await rollup(options); + t.is((await executeBundle(bundle, t)).exports, 'mainfirstsecond'); + const firstCode = await getCodeFromBundle(bundle); + t.snapshot(firstCode); + + options.cache = bundle.cache; + modules['second.js'] = "exports.second = 'second'; exports.second += require('first.js').first;"; + bundle = await rollup(options); + t.is((await executeBundle(bundle, t)).exports, 'mainfirstsecondfirst'); + t.snapshot(await getCodeFromBundle(bundle)); + + options.cache = bundle.cache; + resetModules(); + bundle = await rollup(options); + t.is(await getCodeFromBundle(bundle), firstCode); + + options.cache = bundle.cache; + modules['first.js'] = + "export let first = 'first'; if (Math.random() < 1) first += require('second.js').second;"; + bundle = await rollup(options); + t.is((await executeBundle(bundle, t)).exports, 'mainfirstsecond'); + t.snapshot(await getCodeFromBundle(bundle)); + + options.cache = bundle.cache; + resetModules(); + bundle = await rollup(options); + t.is(await getCodeFromBundle(bundle), firstCode); +}); + +test('updates mixed modules when using the cache and the wrapping of a module changes', async (t) => { + const modules = {}; + const resetModules = () => { + modules['main.js'] = + "export const main = 'main'; export const result = require('first.js').first;"; + modules['first.js'] = "exports.first = 'first';"; + }; + const options = { + input: 'main.js', + plugins: [commonjs({ transformMixedEsModules: true }), loader(modules)], + onwarn(warning) { + if (warning.code !== 'CIRCULAR_DEPENDENCY') { + throw new Error(warning.message); + } + } + }; + + resetModules(); + let bundle = await rollup(options); + t.deepEqual((await executeBundle(bundle, t)).exports, { main: 'main', result: 'first' }); + const firstCode = await getCodeFromBundle(bundle); + t.snapshot(firstCode); + + options.cache = bundle.cache; + modules['first.js'] = "exports.first = 'first' + require('main.js').main"; + bundle = await rollup(options); + t.deepEqual((await executeBundle(bundle, t)).exports, { main: 'main', result: 'firstmain' }); + t.snapshot(await getCodeFromBundle(bundle)); + + options.cache = bundle.cache; + resetModules(); + bundle = await rollup(options); + t.is(await getCodeFromBundle(bundle), firstCode); +}); + +test('allows the config to be reused', async (t) => { + const config = { + preserveModules: true, + plugins: [ + commonjs({ requireReturnsDefault: true }), + loader({ + 'foo.js': "console.log('foo')", + 'bar.js': "console.log('bar')" + }) + ] + }; + let bundle = await rollup({ input: 'foo.js', ...config }); + t.deepEqual( + bundle.cache.modules.map(({ id }) => id), + ['foo.js', 'foo.js?commonjs-entry'] + ); + bundle = await rollup({ input: 'bar.js', ...config }); + t.deepEqual( + bundle.cache.modules.map(({ id }) => id), + ['bar.js', 'bar.js?commonjs-entry'] + ); +}); From a521f47b9d6f1785147ceed183dd02ccf45dd017 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Mon, 7 Feb 2022 07:13:23 +0100 Subject: [PATCH 18/22] fix(commonjs): add heuristic to deoptimize requires after calling imported function (requires rollup@2.68.0) (#1038) BREAKING CHANGES: Requires at least rollup@2.68.0 --- packages/commonjs/package.json | 4 +- packages/commonjs/src/proxies.js | 3 +- packages/commonjs/src/resolve-id.js | 2 +- .../commonjs/src/resolve-require-sources.js | 112 +++-- packages/commonjs/src/transform-commonjs.js | 15 +- .../unambiguous-with-default-export/output.js | 1 - .../form/unambiguous-with-import/output.js | 1 - .../unambiguous-with-named-export/output.js | 1 - .../_config.js | 4 + .../browser.js | 1 + .../call-non-local-function-semantics/main.js | 7 + .../platform.js | 1 + .../proxy.js | 3 + .../commonjs/test/snapshots/function.js.md | 40 ++ .../commonjs/test/snapshots/function.js.snap | Bin 21721 -> 21882 bytes packages/commonjs/test/snapshots/test.js.md | 179 ++++---- packages/commonjs/test/snapshots/test.js.snap | Bin 1346 -> 1298 bytes packages/commonjs/test/test.js | 382 ++++++++++++++++-- packages/json/src/index.js | 4 +- packages/node-resolve/src/index.js | 6 +- packages/run/test/test.js | 6 +- .../export-namespace-export-class/test.ts | 2 +- pnpm-lock.yaml | 66 ++- 23 files changed, 660 insertions(+), 180 deletions(-) create mode 100644 packages/commonjs/test/fixtures/function/call-non-local-function-semantics/_config.js create mode 100644 packages/commonjs/test/fixtures/function/call-non-local-function-semantics/browser.js create mode 100644 packages/commonjs/test/fixtures/function/call-non-local-function-semantics/main.js create mode 100644 packages/commonjs/test/fixtures/function/call-non-local-function-semantics/platform.js create mode 100644 packages/commonjs/test/fixtures/function/call-non-local-function-semantics/proxy.js diff --git a/packages/commonjs/package.json b/packages/commonjs/package.json index ff706eeb6..e4643da9b 100644 --- a/packages/commonjs/package.json +++ b/packages/commonjs/package.json @@ -52,7 +52,7 @@ "require" ], "peerDependencies": { - "rollup": "^2.67.0" + "rollup": "^2.68.0" }, "dependencies": { "@rollup/pluginutils": "^3.1.0", @@ -68,7 +68,7 @@ "@rollup/plugin-node-resolve": "^13.1.0", "locate-character": "^2.0.5", "require-relative": "^0.8.7", - "rollup": "^2.67.3", + "rollup": "^2.68.0", "shx": "^0.3.2", "source-map": "^0.7.3", "source-map-support": "^0.5.19", diff --git a/packages/commonjs/src/proxies.js b/packages/commonjs/src/proxies.js index 10e9d0894..eb6ff9ea5 100644 --- a/packages/commonjs/src/proxies.js +++ b/packages/commonjs/src/proxies.js @@ -73,7 +73,6 @@ export function getEsImportProxy(id, defaultIsModuleExports) { } return { code, - syntheticNamedExports: '__moduleExports', - meta: { commonjs: { isCommonJS: false } } + syntheticNamedExports: '__moduleExports' }; } diff --git a/packages/commonjs/src/resolve-id.js b/packages/commonjs/src/resolve-id.js index 1f6c874a3..43066afad 100644 --- a/packages/commonjs/src/resolve-id.js +++ b/packages/commonjs/src/resolve-id.js @@ -121,7 +121,7 @@ export default function getResolveId(extensions) { meta: { commonjs: commonjsMeta } } = moduleInfo; if (commonjsMeta && commonjsMeta.isCommonJS === IS_WRAPPED_COMMONJS) { - return wrapId(resolved.id, ES_IMPORT_SUFFIX); + return { id: wrapId(resolved.id, ES_IMPORT_SUFFIX), meta: { commonjs: { resolved } } }; } return resolved; }; diff --git a/packages/commonjs/src/resolve-require-sources.js b/packages/commonjs/src/resolve-require-sources.js index 49dc0dc2a..11647e010 100644 --- a/packages/commonjs/src/resolve-require-sources.js +++ b/packages/commonjs/src/resolve-require-sources.js @@ -1,6 +1,8 @@ import { + ES_IMPORT_SUFFIX, EXTERNAL_SUFFIX, IS_WRAPPED_COMMONJS, + isWrappedId, PROXY_SUFFIX, wrapId, WRAPPED_SUFFIX @@ -27,6 +29,9 @@ export function getRequireResolver(extensions, detectCyclesAndConditional) { return false; }; + // Once a module is listed here, its type (wrapped or not) is fixed and may + // not change for the rest of the current build, to not break already + // transformed modules. const fullyAnalyzedModules = Object.create(null); const getTypeForFullyAnalyzedModule = (id) => { @@ -34,7 +39,6 @@ export function getRequireResolver(extensions, detectCyclesAndConditional) { if (knownType !== true || !detectCyclesAndConditional || fullyAnalyzedModules[id]) { return knownType; } - fullyAnalyzedModules[id] = true; if (isCyclic(id)) { return (knownCjsModuleTypes[id] = IS_WRAPPED_COMMONJS); } @@ -42,13 +46,11 @@ export function getRequireResolver(extensions, detectCyclesAndConditional) { }; const setInitialParentType = (id, initialCommonJSType) => { - // It is possible a transformed module is already fully analyzed when using - // the cache and one dependency introduces a new cycle. Then transform is - // run for a fully analzyed module again. Fully analyzed modules may never - // change their type as importers already trust their type. - knownCjsModuleTypes[id] = fullyAnalyzedModules[id] - ? knownCjsModuleTypes[id] - : initialCommonJSType; + // Fully analyzed modules may never change type + if (fullyAnalyzedModules[id]) { + return; + } + knownCjsModuleTypes[id] = initialCommonJSType; if ( detectCyclesAndConditional && knownCjsModuleTypes[id] === true && @@ -59,7 +61,7 @@ export function getRequireResolver(extensions, detectCyclesAndConditional) { } }; - const setTypesForRequiredModules = async (parentId, resolved, isConditional, loadModule) => { + const analyzeRequiredModule = async (parentId, resolved, isConditional, loadModule) => { const childId = resolved.id; requiredIds[childId] = true; if (!(isConditional || knownCjsModuleTypes[parentId] === IS_WRAPPED_COMMONJS)) { @@ -68,41 +70,85 @@ export function getRequireResolver(extensions, detectCyclesAndConditional) { getDependencies(parentId).add(childId); if (!isCyclic(childId)) { - // This makes sure the current transform handler waits for all direct dependencies to be - // loaded and transformed and therefore for all transitive CommonJS dependencies to be - // loaded as well so that all cycles have been found and knownCjsModuleTypes is reliable. + // This makes sure the current transform handler waits for all direct + // dependencies to be loaded and transformed and therefore for all + // transitive CommonJS dependencies to be loaded as well so that all + // cycles have been found and knownCjsModuleTypes is reliable. await loadModule(resolved); } }; + const getTypeForImportedModule = async (resolved, loadModule) => { + if (resolved.id in knownCjsModuleTypes) { + // This handles cyclic ES dependencies + return knownCjsModuleTypes[resolved.id]; + } + const { + meta: { commonjs } + } = await loadModule(resolved); + return (commonjs && commonjs.isCommonJS) || false; + }; + return { getWrappedIds: () => Object.keys(knownCjsModuleTypes).filter( (id) => knownCjsModuleTypes[id] === IS_WRAPPED_COMMONJS ), isRequiredId: (id) => requiredIds[id], - async shouldTransformCachedModule({ id: parentId, meta: { commonjs: parentMeta } }) { - // Ignore modules that did not pass through the original transformer in a previous build - if (!(parentMeta && parentMeta.requires)) { - return false; - } - setInitialParentType(parentId, parentMeta.initialCommonJSType); - await Promise.all( - parentMeta.requires.map(({ resolved, isConditional }) => - setTypesForRequiredModules(parentId, resolved, isConditional, this.load) - ) - ); - if (getTypeForFullyAnalyzedModule(parentId) !== parentMeta.isCommonJS) { - return true; - } - for (const { - resolved: { id } - } of parentMeta.requires) { - if (getTypeForFullyAnalyzedModule(id) !== parentMeta.isRequiredCommonJS[id]) { + async shouldTransformCachedModule({ + id: parentId, + resolvedSources, + meta: { commonjs: parentMeta } + }) { + // We explicitly track ES modules to handle ciruclar imports + if (!(parentMeta && parentMeta.isCommonJS)) knownCjsModuleTypes[parentId] = false; + if (isWrappedId(parentId, ES_IMPORT_SUFFIX)) return false; + const parentRequires = parentMeta && parentMeta.requires; + if (parentRequires) { + setInitialParentType(parentId, parentMeta.initialCommonJSType); + await Promise.all( + parentRequires.map(({ resolved, isConditional }) => + analyzeRequiredModule(parentId, resolved, isConditional, this.load) + ) + ); + if (getTypeForFullyAnalyzedModule(parentId) !== parentMeta.isCommonJS) { return true; } + for (const { + resolved: { id } + } of parentRequires) { + if (getTypeForFullyAnalyzedModule(id) !== parentMeta.isRequiredCommonJS[id]) { + return true; + } + } + // Now that we decided to go with the cached copy, neither the parent + // module nor any of its children may change types anymore + fullyAnalyzedModules[parentId] = true; + for (const { + resolved: { id } + } of parentRequires) { + fullyAnalyzedModules[id] = true; + } } - return false; + const parentRequireSet = new Set((parentRequires || []).map(({ resolved: { id } }) => id)); + return ( + await Promise.all( + Object.keys(resolvedSources) + .map((source) => resolvedSources[source]) + .filter(({ id }) => !parentRequireSet.has(id)) + .map(async (resolved) => { + if (isWrappedId(resolved.id, ES_IMPORT_SUFFIX)) { + return ( + (await getTypeForImportedModule( + (await this.load({ id: resolved.id })).meta.commonjs.resolved, + this.load + )) !== IS_WRAPPED_COMMONJS + ); + } + return (await getTypeForImportedModule(resolved, this.load)) === IS_WRAPPED_COMMONJS; + }) + ) + ).some((shouldTransform) => shouldTransform); }, /* eslint-disable no-param-reassign */ resolveRequireSourcesAndUpdateMeta: (rollupContext) => async ( @@ -133,16 +179,18 @@ export function getRequireResolver(extensions, detectCyclesAndConditional) { return { id: wrapId(childId, EXTERNAL_SUFFIX), allowProxy: false }; } parentMeta.requires.push({ resolved, isConditional }); - await setTypesForRequiredModules(parentId, resolved, isConditional, rollupContext.load); + await analyzeRequiredModule(parentId, resolved, isConditional, rollupContext.load); return { id: childId, allowProxy: true }; }) ); parentMeta.isCommonJS = getTypeForFullyAnalyzedModule(parentId); + fullyAnalyzedModules[parentId] = true; return requireTargets.map(({ id: dependencyId, allowProxy }, index) => { // eslint-disable-next-line no-multi-assign const isCommonJS = (parentMeta.isRequiredCommonJS[ dependencyId ] = getTypeForFullyAnalyzedModule(dependencyId)); + fullyAnalyzedModules[dependencyId] = true; return { source: sources[index].source, id: allowProxy diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index 5a71d0517..5287c5f79 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -95,6 +95,7 @@ export default async function transformCommonjs( const topLevelDefineCompiledEsmExpressions = []; const replacedGlobal = []; const replacedDynamicRequires = []; + const importedVariables = new Set(); walk(ast, { enter(node, parent) { @@ -208,6 +209,11 @@ export default async function transformCommonjs( } if (!isRequireExpression(node, scope)) { + const keypath = getKeypath(node.callee); + if (keypath && importedVariables.has(keypath.name)) { + // Heuristic to deoptimize requires after a required function has been called + currentConditionalNodeEnd = Infinity; + } return; } @@ -236,6 +242,11 @@ export default async function transformCommonjs( currentConditionalNodeEnd !== null, parent.type === 'ExpressionStatement' ? parent : node ); + if (parent.type === 'VariableDeclarator' && parent.id.type === 'Identifier') { + for (const name of extractAssignedNames(parent.id)) { + importedVariables.add(name); + } + } } return; } @@ -448,7 +459,9 @@ export default async function transformCommonjs( magicString.remove(0, commentEnd).trim(); } - const exportMode = shouldWrap + const exportMode = isEsModule + ? 'none' + : shouldWrap ? uses.module ? 'module' : 'exports' diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js index b2a41f38e..2d6dac42c 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-default-export/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { __exports as input } from "\u0000fixtures/form/unambiguous-with-default-export/input.js?commonjs-exports" import "\u0000CWD/fixtures/form/unambiguous-with-default-export/foo.js?commonjs-proxy"; export default {}; diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js index 76b7883b0..0a89b5bf6 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-import/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { __exports as input } from "\u0000fixtures/form/unambiguous-with-import/input.js?commonjs-exports" import "\u0000CWD/fixtures/form/unambiguous-with-import/foo.js?commonjs-proxy"; import './bar.js'; diff --git a/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js b/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js index a31cc3202..13bee26c4 100644 --- a/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js +++ b/packages/commonjs/test/fixtures/form/unambiguous-with-named-export/output.js @@ -1,5 +1,4 @@ import * as commonjsHelpers from "_commonjsHelpers.js"; -import { __exports as input } from "\u0000fixtures/form/unambiguous-with-named-export/input.js?commonjs-exports" import "\u0000CWD/fixtures/form/unambiguous-with-named-export/foo.js?commonjs-proxy"; export {}; diff --git a/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/_config.js b/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/_config.js new file mode 100644 index 000000000..ac0ea14e6 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/_config.js @@ -0,0 +1,4 @@ +module.exports = { + description: + 'uses strict require semantics for all modules that are required after an imported function is called' +}; diff --git a/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/browser.js b/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/browser.js new file mode 100644 index 000000000..842765579 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/browser.js @@ -0,0 +1 @@ +module.exports = 'browser'; diff --git a/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/main.js b/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/main.js new file mode 100644 index 000000000..f9e23dd6c --- /dev/null +++ b/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/main.js @@ -0,0 +1,7 @@ +// simplified from dd-trace +const platform = require('./platform'); +const browser = require('./browser'); + +platform.use(browser); + +require('./proxy'); diff --git a/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/platform.js b/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/platform.js new file mode 100644 index 000000000..93634d9df --- /dev/null +++ b/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/platform.js @@ -0,0 +1 @@ +exports.use = (platform) => (exports.platform = platform); diff --git a/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/proxy.js b/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/proxy.js new file mode 100644 index 000000000..e490667ea --- /dev/null +++ b/packages/commonjs/test/fixtures/function/call-non-local-function-semantics/proxy.js @@ -0,0 +1,3 @@ +const { platform } = require('./platform.js'); + +t.is(platform, 'browser'); diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index d928b3a85..a49552585 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -87,6 +87,46 @@ Generated by [AVA](https://avajs.dev). `, } +## call-non-local-function-semantics + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var main = {};␊ + ␊ + var platform$1 = {};␊ + ␊ + platform$1.use = (platform) => (platform$1.platform = platform);␊ + ␊ + var browser$1 = 'browser';␊ + ␊ + var proxy = {};␊ + ␊ + var hasRequiredProxy;␊ + ␊ + function requireProxy () {␊ + if (hasRequiredProxy) return proxy;␊ + hasRequiredProxy = 1;␊ + const { platform } = platform$1;␊ + ␊ + t.is(platform, 'browser');␊ + return proxy;␊ + }␊ + ␊ + // simplified from dd-trace␊ + const platform = platform$1;␊ + const browser = browser$1;␊ + ␊ + platform.use(browser);␊ + ␊ + requireProxy();␊ + ␊ + module.exports = main;␊ + `, + } + ## circular-dependencies > Snapshot 1 diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index f12cfa25e749e4f43cc6d7258e7bd2b50f3899b2..ee77041b1edfa02a4e29444f61ba44cce76d0478 100644 GIT binary patch delta 20600 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 Q+J40KsVE#xsKdefF9>+tivR!s delta 20354 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 F0sx!iW?BFM diff --git a/packages/commonjs/test/snapshots/test.js.md b/packages/commonjs/test/snapshots/test.js.md index d565de262..684f9bc65 100644 --- a/packages/commonjs/test/snapshots/test.js.md +++ b/packages/commonjs/test/snapshots/test.js.md @@ -116,57 +116,51 @@ Generated by [AVA](https://avajs.dev). export { foo as default };␊ ` -## updates all relevant modules when using the cache and the wrapping of a module changes +## handles when an imported dependency of an ES module changes type > Snapshot 1 `'use strict';␊ ␊ - var first = {};␊ + const dep = 'esm';␊ ␊ - var second = {};␊ - ␊ - second.second = 'second';␊ - ␊ - first.first = 'first'; first.first += second.second;␊ - ␊ - var main = 'main' + first.first;␊ - ␊ - module.exports = main;␊ + module.exports = dep;␊ ` > Snapshot 2 `'use strict';␊ ␊ - var first = {};␊ + var dep_1 = 'cjs';␊ ␊ - var second = {};␊ - ␊ - var hasRequiredSecond;␊ + module.exports = dep_1;␊ + ` + +> Snapshot 3 + + `'use strict';␊ ␊ - function requireSecond () {␊ - if (hasRequiredSecond) return second;␊ - hasRequiredSecond = 1;␊ - second.second = 'second'; second.second += requireFirst().first;␊ - return second;␊ - }␊ + var dep$1 = {};␊ ␊ - var hasRequiredFirst;␊ + var hasRequiredDep;␊ ␊ - function requireFirst () {␊ - if (hasRequiredFirst) return first;␊ - hasRequiredFirst = 1;␊ - first.first = 'first'; first.first += requireSecond().second;␊ - return first;␊ + function requireDep () {␊ + if (hasRequiredDep) return dep$1;␊ + hasRequiredDep = 1;␊ + dep$1.dep = 'cjs'; dep$1.dep += requireDep().dep;␊ + return dep$1;␊ }␊ ␊ - var main = 'main' + requireFirst().first;␊ + var depExports = requireDep();␊ ␊ - module.exports = main;␊ + var dep = depExports.dep;␊ + ␊ + module.exports = dep;␊ ` -> Snapshot 3 +## handles when a required dependency of a CJS module changes type + +> Snapshot 1 `'use strict';␊ ␊ @@ -191,60 +185,58 @@ Generated by [AVA](https://avajs.dev). return a;␊ }␊ ␊ - var second = {};␊ + const dep = 'esm';␊ ␊ - var hasRequiredSecond;␊ - ␊ - function requireSecond () {␊ - if (hasRequiredSecond) return second;␊ - hasRequiredSecond = 1;␊ - second.second = 'second';␊ - return second;␊ - }␊ - ␊ - let first = 'first'; if (Math.random() < 1) first += requireSecond().second;␊ - ␊ - var first$1 = /*#__PURE__*/Object.freeze({␊ + var dep$1 = /*#__PURE__*/Object.freeze({␊ __proto__: null,␊ - get first () { return first; }␊ + dep: dep␊ });␊ ␊ - var require$$0 = /*@__PURE__*/getAugmentedNamespace(first$1);␊ + var require$$0 = /*@__PURE__*/getAugmentedNamespace(dep$1);␊ ␊ - var main = 'main' + require$$0.first;␊ + var main = require$$0.dep;␊ ␊ module.exports = main;␊ ` -## updates mixed modules when using the cache and the wrapping of a module changes - -> Snapshot 1 +> Snapshot 2 `'use strict';␊ ␊ - Object.defineProperty(exports, '__esModule', { value: true });␊ - ␊ - var first = {};␊ + var dep = {};␊ ␊ - first.first = 'first';␊ + dep.dep = 'cjs';␊ ␊ - const main = 'main'; const result = first.first;␊ + var main = dep.dep;␊ ␊ - exports.main = main;␊ - exports.result = result;␊ + module.exports = main;␊ ` -> Snapshot 2 +> Snapshot 3 `'use strict';␊ ␊ - Object.defineProperty(exports, '__esModule', { value: true });␊ + var dep = {};␊ ␊ - var main$1 = /*#__PURE__*/Object.freeze({␊ - __proto__: null,␊ - get main () { return main; },␊ - get result () { return result; }␊ - });␊ + var hasRequiredDep;␊ + ␊ + function requireDep () {␊ + if (hasRequiredDep) return dep;␊ + hasRequiredDep = 1;␊ + dep.dep = 'cjs'; dep.dep += requireDep().dep;␊ + return dep;␊ + }␊ + ␊ + var main = requireDep().dep;␊ + ␊ + module.exports = main;␊ + ` + +## handles when a required dependency of a mixed ES module changes type + +> Snapshot 1 + + `'use strict';␊ ␊ function getAugmentedNamespace(n) {␊ var f = n.default;␊ @@ -267,21 +259,60 @@ Generated by [AVA](https://avajs.dev). return a;␊ }␊ ␊ - var first = {};␊ + const dep = 'esm';␊ + ␊ + var dep$1 = /*#__PURE__*/Object.freeze({␊ + __proto__: null,␊ + dep: dep␊ + });␊ + ␊ + var require$$0 = /*@__PURE__*/getAugmentedNamespace(dep$1);␊ + ␊ + var main = require$$0.dep;␊ + ␊ + module.exports = main;␊ + ` + +> Snapshot 2 + + `'use strict';␊ + ␊ + var dep = {};␊ ␊ - var require$$0 = /*@__PURE__*/getAugmentedNamespace(main$1);␊ + dep.dep = 'cjs';␊ ␊ - var hasRequiredFirst;␊ + var main = dep.dep;␊ ␊ - function requireFirst () {␊ - if (hasRequiredFirst) return first;␊ - hasRequiredFirst = 1;␊ - first.first = 'first' + require$$0.main;␊ - return first;␊ + module.exports = main;␊ + ` + +> Snapshot 3 + + `'use strict';␊ + ␊ + var dep = {};␊ + ␊ + var hasRequiredDep;␊ + ␊ + function requireDep () {␊ + if (hasRequiredDep) return dep;␊ + hasRequiredDep = 1;␊ + dep.dep = 'cjs'; dep.dep += requireDep().dep;␊ + return dep;␊ }␊ ␊ - const main = 'main'; const result = requireFirst().first;␊ + var main = requireDep().dep;␊ + ␊ + module.exports = main;␊ + ` + +## handles ESM cycles when using the cache + +> Snapshot 1 + + `'use strict';␊ + ␊ + console.log('dep');␊ ␊ - exports.main = main;␊ - exports.result = result;␊ + console.log('main');␊ ` diff --git a/packages/commonjs/test/snapshots/test.js.snap b/packages/commonjs/test/snapshots/test.js.snap index f5ee342d78e132627bb06a3af5c206bc49e0ac24..46745cca1e118eadba1549a887865b282670e4a0 100644 GIT binary patch literal 1298 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 E059*9kN^Mx diff --git a/packages/commonjs/test/test.js b/packages/commonjs/test/test.js index 2f86e9f17..138ee2e06 100644 --- a/packages/commonjs/test/test.js +++ b/packages/commonjs/test/test.js @@ -761,86 +761,390 @@ test('throws when using an inadequate node_resolve version', async (t) => { }); }); -test('updates all relevant modules when using the cache and the wrapping of a module changes', async (t) => { +const onwarn = (warning) => { + if (warning.code !== 'CIRCULAR_DEPENDENCY') { + throw new Error(warning.message); + } +}; + +const getTransformTracker = (trackedId) => { + const trackedTransforms = []; + const meta = {}; + return { + meta, + trackedTransforms, + tracker: { + name: 'transform-tracker', + transform(code, id) { + trackedTransforms.push(id); + }, + moduleParsed({ id, meta: { commonjs: commonjsMeta } }) { + if (id === trackedId) { + Object.assign(meta, commonjsMeta); + } + } + } + }; +}; + +test('handles when an imported dependency of an ES module changes type', async (t) => { + const { meta, tracker, trackedTransforms } = getTransformTracker('dep.js'); const modules = {}; const resetModules = () => { - modules['main.js'] = "module.exports = 'main' + require('first.js').first;"; - modules['first.js'] = "exports.first = 'first'; exports.first += require('second.js').second;"; - modules['second.js'] = "exports.second = 'second';"; + modules['main.js'] = "import {dep} from 'dep.js';export default dep;"; + modules['dep.js'] = "export const dep = 'esm';"; }; const options = { input: 'main.js', - plugins: [commonjs({ transformMixedEsModules: true }), loader(modules)], - onwarn(warning) { - if (warning.code !== 'CIRCULAR_DEPENDENCY') { - throw new Error(warning.message); - } - } + plugins: [commonjs(), loader(modules), tracker], + onwarn }; resetModules(); let bundle = await rollup(options); - t.is((await executeBundle(bundle, t)).exports, 'mainfirstsecond'); - const firstCode = await getCodeFromBundle(bundle); - t.snapshot(firstCode); + t.is(meta.isCommonJS, false); + t.deepEqual((await executeBundle(bundle, t)).exports, 'esm'); + t.deepEqual(trackedTransforms, ['main.js', 'dep.js', 'main.js?commonjs-entry']); + trackedTransforms.length = 0; + const esCode = await getCodeFromBundle(bundle); + t.snapshot(esCode); + + modules['dep.js'] = "exports.dep = 'cjs';"; + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, true); + t.deepEqual((await executeBundle(bundle, t)).exports, 'cjs'); + t.deepEqual(trackedTransforms, ['dep.js', '\0commonjsHelpers.js', '\0dep.js?commonjs-exports']); + trackedTransforms.length = 0; + const cjsCode = await getCodeFromBundle(bundle); + t.snapshot(cjsCode); + + modules['dep.js'] = "exports.dep = 'cjs'; exports.dep += require('dep.js').dep;"; + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, 'withRequireFunction'); + t.deepEqual((await executeBundle(bundle, t)).exports, 'cjscjs'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js', '\0dep.js?commonjs-es-import']); + trackedTransforms.length = 0; + const wrappedCode = await getCodeFromBundle(bundle); + t.snapshot(wrappedCode); + resetModules(); options.cache = bundle.cache; - modules['second.js'] = "exports.second = 'second'; exports.second += require('first.js').first;"; bundle = await rollup(options); - t.is((await executeBundle(bundle, t)).exports, 'mainfirstsecondfirst'); - t.snapshot(await getCodeFromBundle(bundle)); + t.is(meta.isCommonJS, false); + t.deepEqual((await executeBundle(bundle, t)).exports, 'esm'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js']); + trackedTransforms.length = 0; + t.is(await getCodeFromBundle(bundle), esCode); + modules['dep.js'] = "exports.dep = 'cjs'; exports.dep += require('dep.js').dep;"; options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, 'withRequireFunction'); + t.deepEqual((await executeBundle(bundle, t)).exports, 'cjscjs'); + t.deepEqual(trackedTransforms, [ + 'dep.js', + 'main.js', + '\0dep.js?commonjs-es-import', + '\0commonjsHelpers.js', + '\0dep.js?commonjs-exports' + ]); + trackedTransforms.length = 0; + t.is(await getCodeFromBundle(bundle), wrappedCode); + + modules['dep.js'] = "exports.dep = 'cjs';"; + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, true); + t.deepEqual((await executeBundle(bundle, t)).exports, 'cjs'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js']); + trackedTransforms.length = 0; + t.is(await getCodeFromBundle(bundle), cjsCode); + + resetModules(); + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, false); + t.deepEqual((await executeBundle(bundle, t)).exports, 'esm'); + t.deepEqual(trackedTransforms, ['dep.js']); + trackedTransforms.length = 0; + t.is(await getCodeFromBundle(bundle), esCode); +}); + +test('handles when a dynamically imported dependency of an ES module changes type', async (t) => { + const { meta, tracker, trackedTransforms } = getTransformTracker('dep.js'); + const modules = {}; + const resetModules = () => { + modules['main.js'] = "export default import('dep.js').then(({dep}) => dep);"; + modules['dep.js'] = "export const dep = 'esm';"; + }; + const options = { + input: 'main.js', + plugins: [commonjs(), loader(modules), tracker], + onwarn + }; + resetModules(); + let bundle = await rollup(options); + t.is(meta.isCommonJS, false); + t.deepEqual(await (await executeBundle(bundle, t)).exports, 'esm'); + t.deepEqual(trackedTransforms, ['main.js', 'main.js?commonjs-entry', 'dep.js']); + trackedTransforms.length = 0; + + modules['dep.js'] = "exports.dep = 'cjs';"; + options.cache = bundle.cache; bundle = await rollup(options); - t.is(await getCodeFromBundle(bundle), firstCode); + t.is(meta.isCommonJS, true); + t.deepEqual(await (await executeBundle(bundle, t)).exports, 'cjs'); + t.deepEqual(trackedTransforms, ['dep.js', '\0commonjsHelpers.js', '\0dep.js?commonjs-exports']); + trackedTransforms.length = 0; + modules['dep.js'] = "exports.dep = 'cjs'; exports.dep += require('dep.js').dep;"; options.cache = bundle.cache; - modules['first.js'] = - "export let first = 'first'; if (Math.random() < 1) first += require('second.js').second;"; bundle = await rollup(options); - t.is((await executeBundle(bundle, t)).exports, 'mainfirstsecond'); - t.snapshot(await getCodeFromBundle(bundle)); + t.is(meta.isCommonJS, 'withRequireFunction'); + t.deepEqual(await (await executeBundle(bundle, t)).exports, 'cjscjs'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js', '\0dep.js?commonjs-es-import']); + trackedTransforms.length = 0; + resetModules(); options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, false); + t.deepEqual(await (await executeBundle(bundle, t)).exports, 'esm'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js']); + trackedTransforms.length = 0; + + modules['dep.js'] = "exports.dep = 'cjs'; exports.dep += require('dep.js').dep;"; + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, 'withRequireFunction'); + t.deepEqual(await (await executeBundle(bundle, t)).exports, 'cjscjs'); + t.deepEqual(trackedTransforms, [ + 'dep.js', + 'main.js', + '\0dep.js?commonjs-es-import', + '\0commonjsHelpers.js', + '\0dep.js?commonjs-exports' + ]); + trackedTransforms.length = 0; + + modules['dep.js'] = "exports.dep = 'cjs';"; + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, true); + t.deepEqual(await (await executeBundle(bundle, t)).exports, 'cjs'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js']); + trackedTransforms.length = 0; + resetModules(); + options.cache = bundle.cache; bundle = await rollup(options); - t.is(await getCodeFromBundle(bundle), firstCode); + t.is(meta.isCommonJS, false); + t.deepEqual(await (await executeBundle(bundle, t)).exports, 'esm'); + t.deepEqual(trackedTransforms, ['dep.js']); + trackedTransforms.length = 0; }); -test('updates mixed modules when using the cache and the wrapping of a module changes', async (t) => { +test('handles when a required dependency of a CJS module changes type', async (t) => { + const { meta, tracker, trackedTransforms } = getTransformTracker('dep.js'); const modules = {}; const resetModules = () => { - modules['main.js'] = - "export const main = 'main'; export const result = require('first.js').first;"; - modules['first.js'] = "exports.first = 'first';"; + modules['main.js'] = "module.exports = require('dep.js').dep;"; + modules['dep.js'] = "export const dep = 'esm';"; }; const options = { input: 'main.js', - plugins: [commonjs({ transformMixedEsModules: true }), loader(modules)], - onwarn(warning) { - if (warning.code !== 'CIRCULAR_DEPENDENCY') { - throw new Error(warning.message); - } - } + plugins: [commonjs(), loader(modules), tracker], + onwarn + }; + + resetModules(); + let bundle = await rollup(options); + t.is(meta.isCommonJS, false); + t.deepEqual((await executeBundle(bundle, t)).exports, 'esm'); + t.deepEqual(trackedTransforms, [ + 'dep.js', + 'main.js', + 'main.js?commonjs-entry', + '\0commonjsHelpers.js', + '\0dep.js?commonjs-proxy' + ]); + trackedTransforms.length = 0; + const esCode = await getCodeFromBundle(bundle); + t.snapshot(esCode); + + modules['dep.js'] = "exports.dep = 'cjs';"; + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, true); + t.deepEqual((await executeBundle(bundle, t)).exports, 'cjs'); + t.deepEqual(trackedTransforms, [ + 'dep.js', + 'main.js', + '\0dep.js?commonjs-proxy', + '\0dep.js?commonjs-exports' + ]); + trackedTransforms.length = 0; + const cjsCode = await getCodeFromBundle(bundle); + t.snapshot(cjsCode); + + modules['dep.js'] = "exports.dep = 'cjs'; exports.dep += require('dep.js').dep;"; + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, 'withRequireFunction'); + t.deepEqual((await executeBundle(bundle, t)).exports, 'cjscjs'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js']); + trackedTransforms.length = 0; + const wrappedCode = await getCodeFromBundle(bundle); + t.snapshot(wrappedCode); + + resetModules(); + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, false); + t.deepEqual((await executeBundle(bundle, t)).exports, 'esm'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js', '\0dep.js?commonjs-proxy']); + trackedTransforms.length = 0; + t.is(await getCodeFromBundle(bundle), esCode); + + modules['dep.js'] = "exports.dep = 'cjs'; exports.dep += require('dep.js').dep;"; + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, 'withRequireFunction'); + t.deepEqual((await executeBundle(bundle, t)).exports, 'cjscjs'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js', '\0dep.js?commonjs-exports']); + trackedTransforms.length = 0; + t.is(await getCodeFromBundle(bundle), wrappedCode); + + modules['dep.js'] = "exports.dep = 'cjs';"; + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, true); + t.deepEqual((await executeBundle(bundle, t)).exports, 'cjs'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js', '\0dep.js?commonjs-proxy']); + trackedTransforms.length = 0; + t.is(await getCodeFromBundle(bundle), cjsCode); + + resetModules(); + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, false); + t.deepEqual((await executeBundle(bundle, t)).exports, 'esm'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js', '\0dep.js?commonjs-proxy']); + trackedTransforms.length = 0; + t.is(await getCodeFromBundle(bundle), esCode); +}); + +test('handles when a required dependency of a mixed ES module changes type', async (t) => { + const { meta, tracker, trackedTransforms } = getTransformTracker('dep.js'); + const modules = {}; + const resetModules = () => { + modules['main.js'] = "export default require('dep.js').dep;"; + modules['dep.js'] = "export const dep = 'esm';"; + }; + const options = { + input: 'main.js', + plugins: [commonjs({ transformMixedEsModules: true }), loader(modules), tracker], + onwarn }; resetModules(); let bundle = await rollup(options); - t.deepEqual((await executeBundle(bundle, t)).exports, { main: 'main', result: 'first' }); - const firstCode = await getCodeFromBundle(bundle); - t.snapshot(firstCode); + t.is(meta.isCommonJS, false); + t.deepEqual((await executeBundle(bundle, t)).exports, 'esm'); + t.deepEqual(trackedTransforms, [ + 'dep.js', + 'main.js', + 'main.js?commonjs-entry', + '\0commonjsHelpers.js', + '\0dep.js?commonjs-proxy' + ]); + trackedTransforms.length = 0; + const esCode = await getCodeFromBundle(bundle); + t.snapshot(esCode); + + modules['dep.js'] = "exports.dep = 'cjs';"; + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, true); + t.deepEqual((await executeBundle(bundle, t)).exports, 'cjs'); + t.deepEqual(trackedTransforms, [ + 'dep.js', + 'main.js', + '\0dep.js?commonjs-proxy', + '\0dep.js?commonjs-exports' + ]); + trackedTransforms.length = 0; + const cjsCode = await getCodeFromBundle(bundle); + t.snapshot(cjsCode); + + modules['dep.js'] = "exports.dep = 'cjs'; exports.dep += require('dep.js').dep;"; + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, 'withRequireFunction'); + t.deepEqual((await executeBundle(bundle, t)).exports, 'cjscjs'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js']); + trackedTransforms.length = 0; + const wrappedCode = await getCodeFromBundle(bundle); + t.snapshot(wrappedCode); + resetModules(); options.cache = bundle.cache; - modules['first.js'] = "exports.first = 'first' + require('main.js').main"; bundle = await rollup(options); - t.deepEqual((await executeBundle(bundle, t)).exports, { main: 'main', result: 'firstmain' }); - t.snapshot(await getCodeFromBundle(bundle)); + t.is(meta.isCommonJS, false); + t.deepEqual((await executeBundle(bundle, t)).exports, 'esm'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js', '\0dep.js?commonjs-proxy']); + trackedTransforms.length = 0; + t.is(await getCodeFromBundle(bundle), esCode); + + modules['dep.js'] = "exports.dep = 'cjs'; exports.dep += require('dep.js').dep;"; + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, 'withRequireFunction'); + t.deepEqual((await executeBundle(bundle, t)).exports, 'cjscjs'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js', '\0dep.js?commonjs-exports']); + trackedTransforms.length = 0; + t.is(await getCodeFromBundle(bundle), wrappedCode); + modules['dep.js'] = "exports.dep = 'cjs';"; options.cache = bundle.cache; + bundle = await rollup(options); + t.is(meta.isCommonJS, true); + t.deepEqual((await executeBundle(bundle, t)).exports, 'cjs'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js', '\0dep.js?commonjs-proxy']); + trackedTransforms.length = 0; + t.is(await getCodeFromBundle(bundle), cjsCode); + resetModules(); + options.cache = bundle.cache; bundle = await rollup(options); - t.is(await getCodeFromBundle(bundle), firstCode); + t.is(meta.isCommonJS, false); + t.deepEqual((await executeBundle(bundle, t)).exports, 'esm'); + t.deepEqual(trackedTransforms, ['dep.js', 'main.js', '\0dep.js?commonjs-proxy']); + trackedTransforms.length = 0; + t.is(await getCodeFromBundle(bundle), esCode); +}); + +test('handles ESM cycles when using the cache', async (t) => { + const modules = {}; + const resetModules = () => { + modules['main.js'] = "import 'dep.js';console.log('main');"; + modules['dep.js'] = "import 'main.js';console.log('dep');"; + }; + const options = { + input: 'main.js', + plugins: [commonjs(), loader(modules)], + onwarn + }; + + resetModules(); + let bundle = await rollup(options); + + options.cache = bundle.cache; + bundle = await rollup(options); + t.snapshot(await getCodeFromBundle(bundle)); }); test('allows the config to be reused', async (t) => { diff --git a/packages/json/src/index.js b/packages/json/src/index.js index 9767e83ca..63e37c280 100755 --- a/packages/json/src/index.js +++ b/packages/json/src/index.js @@ -8,11 +8,11 @@ export default function json(options = {}) { name: 'json', // eslint-disable-next-line no-shadow - transform(json, id) { + transform(code, id) { if (id.slice(-5) !== '.json' || !filter(id)) return null; try { - const parsed = JSON.parse(json); + const parsed = JSON.parse(code); return { code: dataToEsm(parsed, { preferConst: options.preferConst, diff --git a/packages/node-resolve/src/index.js b/packages/node-resolve/src/index.js index ddb1ffb78..8daafcffe 100644 --- a/packages/node-resolve/src/index.js +++ b/packages/node-resolve/src/index.js @@ -242,14 +242,14 @@ export function nodeResolve(opts = {}) { version, - buildStart(options) { - rollupOptions = options; + buildStart(buildOptions) { + rollupOptions = buildOptions; for (const warning of warnings) { this.warn(warning); } - ({ preserveSymlinks } = options); + ({ preserveSymlinks } = buildOptions); }, generateBundle() { diff --git a/packages/run/test/test.js b/packages/run/test/test.js index fdbc808ff..ffba8ea18 100644 --- a/packages/run/test/test.js +++ b/packages/run/test/test.js @@ -99,13 +99,13 @@ test('throws an error when bundle is not written to disk', async (t) => { test('detects changes - forks a new child process and kills older process', async (t) => { // eslint-disable-next-line no-shadow - const input = join(cwd, 'change-detect-input.js'); + const testInput = join(cwd, 'change-detect-input.js'); const bundle = await rollup({ - input, + input: testInput, plugins: [run()] }); await bundle.write(outputOptions); - await writeFile(input, "export const Greeting = () => 'Hola'; // eslint-disable-line"); + await writeFile(testInput, "export const Greeting = () => 'Hola'; // eslint-disable-line"); await bundle.write(outputOptions); t.true(mockChildProcess.calledWithExactly(outputOptions.file, [], {})); t.is(mockChildProcess().kill.callCount, 1); diff --git a/packages/typescript/test/fixtures/export-namespace-export-class/test.ts b/packages/typescript/test/fixtures/export-namespace-export-class/test.ts index 43fc12c68..6565f7c69 100644 --- a/packages/typescript/test/fixtures/export-namespace-export-class/test.ts +++ b/packages/typescript/test/fixtures/export-namespace-export-class/test.ts @@ -2,6 +2,6 @@ // test.ts export namespace MODE { - // eslint-disable-next-line no-shadow + // eslint-disable-next-line no-shadow,@typescript-eslint/no-shadow export class MODE {} } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 48bd29f8d..41304a331 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -99,18 +99,6 @@ importers: rollup: 2.67.3 typescript: 4.1.2 - packages/auto-install/test/fixtures/pnpm: - specifiers: - node-noop: ^1.0.0 - dependencies: - node-noop: 1.0.0 - - packages/auto-install/test/fixtures/pnpm-bare: - specifiers: - node-noop: ^1.0.0 - dependencies: - node-noop: 1.0.0 - packages/babel: specifiers: '@babel/core': ^7.10.5 @@ -184,13 +172,13 @@ importers: magic-string: ^0.25.7 require-relative: ^0.8.7 resolve: ^1.17.0 - rollup: ^2.67.3 + rollup: ^2.68.0 shx: ^0.3.2 source-map: ^0.7.3 source-map-support: ^0.5.19 typescript: ^3.9.7 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.67.3 + '@rollup/pluginutils': 3.1.0_rollup@2.68.0 commondir: 1.0.1 estree-walker: 2.0.1 glob: 7.1.6 @@ -198,11 +186,11 @@ importers: magic-string: 0.25.7 resolve: 1.18.1 devDependencies: - '@rollup/plugin-json': 4.1.0_rollup@2.67.3 - '@rollup/plugin-node-resolve': 13.1.0_rollup@2.67.3 + '@rollup/plugin-json': 4.1.0_rollup@2.68.0 + '@rollup/plugin-node-resolve': 13.1.3_rollup@2.68.0 locate-character: 2.0.5 require-relative: 0.8.7 - rollup: 2.67.3 + rollup: 2.68.0 shx: 0.3.3 source-map: 0.7.3 source-map-support: 0.5.19 @@ -2166,6 +2154,15 @@ packages: rollup: 2.67.3 dev: true + /@rollup/plugin-json/4.1.0_rollup@2.68.0: + resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.68.0 + rollup: 2.68.0 + dev: true + /@rollup/plugin-node-resolve/10.0.0_rollup@2.67.3: resolution: {integrity: sha512-sNijGta8fqzwA1VwUEtTvWCx2E7qC70NMsDh4ZG13byAXYigBNZMxALhKUSycBks5gupJdq0lFrKumFrRZ8H3A==} engines: {node: '>= 10.0.0'} @@ -2181,6 +2178,21 @@ packages: rollup: 2.67.3 dev: true + /@rollup/plugin-node-resolve/13.1.3_rollup@2.68.0: + resolution: {integrity: sha512-BdxNk+LtmElRo5d06MGY4zoepyrXX1tkzX2hrnPEZ53k78GuOMWLqmJDGIIOPwVRIFZrLQOo+Yr6KtCuLIA0AQ==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^2.42.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.68.0 + '@types/resolve': 1.17.1 + builtin-modules: 3.2.0 + deepmerge: 4.2.2 + is-module: 1.0.0 + resolve: 1.20.0 + rollup: 2.68.0 + dev: true + /@rollup/plugin-node-resolve/8.4.0_rollup@2.67.3: resolution: {integrity: sha512-LFqKdRLn0ShtQyf6SBYO69bGE1upV6wUhBX0vFOUnLAyzx5cwp8svA0eHUnu8+YU57XOkrMtfG63QOpQx25pHQ==} engines: {node: '>= 8.0.0'} @@ -2288,6 +2300,17 @@ packages: picomatch: 2.2.2 rollup: 2.67.3 + /@rollup/pluginutils/3.1.0_rollup@2.68.0: + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.2.2 + rollup: 2.68.0 + /@rollup/pluginutils/4.1.2: resolution: {integrity: sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ==} engines: {node: '>= 8.0.0'} @@ -6190,6 +6213,7 @@ packages: /node-noop/1.0.0: resolution: {integrity: sha1-R6Pn2Az/qmRYNkvSLthcqzMHvnk=} + dev: true /node-preload/0.2.1: resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} @@ -7469,6 +7493,14 @@ packages: fsevents: 2.3.2 dev: true + /rollup/2.68.0: + resolution: {integrity: sha512-XrMKOYK7oQcTio4wyTz466mucnd8LzkiZLozZ4Rz0zQD+HeX4nUK4B8GrTX/2EvN2/vBF/i2WnaXboPxo0JylA==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /run-parallel/1.1.9: resolution: {integrity: sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==} dev: true From 368f9c88f4c6bbd30687c0110e71cf152f2d1a31 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Thu, 24 Feb 2022 13:39:29 +0100 Subject: [PATCH 19/22] fix(commonjs): handle external dependencies when using the cache (#1038) --- packages/commonjs/README.md | 2 +- .../commonjs/src/resolve-require-sources.js | 4 +- packages/commonjs/test/snapshots/test.js.md | 19 +++++++++ packages/commonjs/test/snapshots/test.js.snap | Bin 1298 -> 1442 bytes packages/commonjs/test/test.js | 40 ++++++++++++++++++ 5 files changed, 62 insertions(+), 3 deletions(-) diff --git a/packages/commonjs/README.md b/packages/commonjs/README.md index c126e4ac2..44a7652db 100644 --- a/packages/commonjs/README.md +++ b/packages/commonjs/README.md @@ -13,7 +13,7 @@ ## Requirements -This plugin requires an [LTS](https://github.com/nodejs/Release) Node version (v8.0.0+) and Rollup v2.38.3+. +This plugin requires an [LTS](https://github.com/nodejs/Release) Node version (v12.0.0+) and Rollup v2.68.0+. If you are using [`@rollup/plugin-node-resolve`](https://github.com/rollup/plugins/tree/master/packages/node-resolve), it should be v13.0.6+. ## Install diff --git a/packages/commonjs/src/resolve-require-sources.js b/packages/commonjs/src/resolve-require-sources.js index 11647e010..f96ace50e 100644 --- a/packages/commonjs/src/resolve-require-sources.js +++ b/packages/commonjs/src/resolve-require-sources.js @@ -100,7 +100,7 @@ export function getRequireResolver(extensions, detectCyclesAndConditional) { resolvedSources, meta: { commonjs: parentMeta } }) { - // We explicitly track ES modules to handle ciruclar imports + // We explicitly track ES modules to handle circular imports if (!(parentMeta && parentMeta.isCommonJS)) knownCjsModuleTypes[parentId] = false; if (isWrappedId(parentId, ES_IMPORT_SUFFIX)) return false; const parentRequires = parentMeta && parentMeta.requires; @@ -135,7 +135,7 @@ export function getRequireResolver(extensions, detectCyclesAndConditional) { await Promise.all( Object.keys(resolvedSources) .map((source) => resolvedSources[source]) - .filter(({ id }) => !parentRequireSet.has(id)) + .filter(({ id, external }) => !(external || parentRequireSet.has(id))) .map(async (resolved) => { if (isWrappedId(resolved.id, ES_IMPORT_SUFFIX)) { return ( diff --git a/packages/commonjs/test/snapshots/test.js.md b/packages/commonjs/test/snapshots/test.js.md index 684f9bc65..63fc433c8 100644 --- a/packages/commonjs/test/snapshots/test.js.md +++ b/packages/commonjs/test/snapshots/test.js.md @@ -316,3 +316,22 @@ Generated by [AVA](https://avajs.dev). ␊ console.log('main');␊ ` + +## handles external dependencies when using the cache + +> Snapshot 1 + + `'use strict';␊ + ␊ + var require$$0 = require('external');␊ + ␊ + function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }␊ + ␊ + var require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0);␊ + ␊ + var second = require$$0__default["default"].second;␊ + ␊ + var main = require$$0.first + second;␊ + ␊ + module.exports = main;␊ + ` diff --git a/packages/commonjs/test/snapshots/test.js.snap b/packages/commonjs/test/snapshots/test.js.snap index 46745cca1e118eadba1549a887865b282670e4a0..dbca1b612c8afce4e7b746e26997480a0f0409e6 100644 GIT binary patch literal 1442 zcmV;T1zq|gCk3Dey)4x|L%O{r(FD3tq3H0q=Nm@B|WbTU_p1yGA@#k*UFTB?u6KHue?)?1w zXXZ%pwvX}$rnVk)evJwAJg)bz`{R>L-|*Rgj{SH`e(xg};{rXN2o{DZR`0cv^!3O= z%{-nRJ3TyPZF|RjDJIZwu9u`Aep>$glK%Yn&nmyYIR5V9J#m4)dSkHSTY`1XP56}h z1WU1AX-n*W*>@?p9y80HoKGgpj_o=YRV}BY$U3dbsZMa3m^MdS)%2W*b?6x{P13Tb z>eMi8I>DS8W!}6(=V}h~+ziN?M&136?psvOzyiz=%cnW;m`|b3P0kPo+!74ILLI-e zX`rrU+TMU}x};=LNN1Bt!?(+x>Db^_eZ#Qm9>&PLLileA7Lovl!$7g92PP^KxN1?m z;#FY)2J?tM2)pqyFc2IE;GudjiKq7yuc{iB<1j_MGGgn_w331}C?@QJ!4&$*MG8W1 z!7OG13x&yI5#p^&}K5K(0!Q)k1QN&t5k%o}K!geH<_?EZ57|P|N zt;;FU2HVrtHTxc5+EGxZ?li}yMV8c1J#OH3hnjqc8Xg^<5<$u3Np~$Zo&NM}?JT2E z)6T)D4meOH?g9FwZ!)Tna9^5bzycUiP!E!` z;>rxi5x3y3!A7zXLO^UF#!EdSE>w31r_Z;8CalXrkMpX`nFX89!YE_d+~h-5$}p={ z$G3DSQLr7TSWbyp4LukJv0?Ne1n%;r)}vm8^m9Lm3lYWjj!G^3U)41DTZ^}K67_LU zhowg0Rj9YeuS`=+w*DxYrf!XtsbU9&2zF7Ut%iQ&gT4`xiCgGmq-wipD+w+`IQfx< zpxq>*E?}snRQi?(jU)H9l)cc1EaMW@gR9TCp=QC1P09 zp{We$TpsVH&hIAYgxVNA<3l@eEyF=PlUq$+#GhT5DsnrCIwy>q6hGlE5%t$?ShdcJ zwu>G*Y%ofnq6*s5G(owh<-qnWDqalc|ZL_J(V7R%?JM*V>c~e()-d<+fu9~&$nzW5M+fH`N;f=sJ=jOCpml`wiN}?<5462z^Vq25jY{4afg2<6DvrSa06tc_3PKYA0M4P&;Q#;t literal 1298 zcmV+t1?~DlRzVs2__600000000B+ zRa=M~RT!RZTGt7MDn1Ch*5B>wOw#P65%H3+u7yokuyvPhD@q#1lgyc9Hj|k+m))*Q z9;C2RsYNMX9u!nW3WB9Acm)M7*e9v_sx10YFZilYBL3&hOm3T9meR)r&Sd60=f8dD zKi`3vAc(?P>F&|>r=NJ>waXW;j_!T^O$6~bi{t3YgHxyVHNpN~e{21YH-3n5^gmo+ zK6u0P_nrLagLmFObW3v2x0mA_EsO-?OgKJ?3xf0Ur5(z-_|okB>~H5ET|@5-P45td z3+IoY_5ATU_^e;B^>z`j5Go{-<%`eo)&f34nIC^ZSAbhmz@6Xet z(_j31_UBvk2OnFHbM(#|gK;VxXGB5xZsv$;yqY<5aeB(!^RDqqjH6HP5`>?AdH<`c z+KWG)lK*&V?!C49;~X8|9gNfAc=;wlhzp~fi`Y)#=Ga4$?^19*$EbKxK9Q){mTQ|- zG3}}>X|yRN`@se=EQWTw895j0^D|doq!mxmsBTzv-m#n1@m6GdqG>yxn+8c$se9Pg ze3MFPScN5G`ZNcg<5Os{kW0h?773JUq_8*&m-ARDj`vPsO7nH0I-qESi*5sHhY651D|j|etOC1%h{w1V=w zb5^rx!Rl4IQN+4Gk%o}K;y4mZeA62*g?9O9YAXk7ws+eG?!E`O?Pw@bx52Om-z6n< zj}tiE=O*9hhE<2Fcu`Vi(cR2Ve?B8){cRL_n#e|dz4wW<$iFsd{$jg23!` z+veMGZ?+v3Aq4mYVvKWdrAciaB6oL9A&tHjsDUO0hs~=w_A*#>848Yrr%XCpqYjo- zvwc&8G6lfpw&lNaX@p0donSxA1i2| zs$Qx(Yqm+$XCr-)+6`Kz-T}Ybpq59q$4P^_O;Vw<6%fMNMUR#e=8+E?I3yFNFvZB# zIPY(f*$_s46d~w)F=|I$ASuT)DP3~k}@06oqv~WGrHMeXtD( z{|!>jZsE$L_Nwaqv4w)FrZQo|x { t.snapshot(await getCodeFromBundle(bundle)); }); +test('handles external dependencies when using the cache', async (t) => { + const modules = {}; + const resetModules = () => { + modules['main.js'] = + "import first from 'first.js';import second from 'second.js';export default first + second;"; + modules['first.js'] = "export {first as default} from 'external';"; + modules['second.js'] = "module.exports = require('external').second;"; + }; + const options = { + input: 'main.js', + external: ['external'], + plugins: [commonjs(), loader(modules)], + onwarn + }; + + resetModules(); + let bundle = await rollup(options); + t.is( + ( + await executeBundle(bundle, t, { + context: { + require(id) { + if (id === 'external') { + return { first: 'first', second: 'second' }; + } + throw new Error(`Unexpected require "${id}"`); + } + } + }) + ).exports, + 'firstsecond' + ); + const code = await getCodeFromBundle(bundle); + t.snapshot(code); + + options.cache = bundle.cache; + bundle = await rollup(options); + t.is(await getCodeFromBundle(bundle), code); +}); + test('allows the config to be reused', async (t) => { const config = { preserveModules: true, From e5f1abdd05e56cc179c6ba741186591d364a84c1 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Sun, 3 Apr 2022 07:26:36 +0200 Subject: [PATCH 20/22] fix(commonjs): Do not change semantics when removing requires in if statements (#1038) --- packages/commonjs/src/generate-imports.js | 4 +- packages/commonjs/src/transform-commonjs.js | 15 +- .../conditional-require-non-strict/_config.js | 4 + .../conditional-require-non-strict/bar.js | 1 + .../conditional-require-non-strict/foo.js | 1 + .../conditional-require-non-strict/main.js | 7 + .../function/dynamic-require-empty/_config.js | 6 + .../function/dynamic-require-empty/main.js | 6 + .../dynamic-require-empty/submodule.js | 0 .../commonjs/test/snapshots/function.js.md | 148 ++++++++++++++++++ .../commonjs/test/snapshots/function.js.snap | Bin 21882 -> 22034 bytes 11 files changed, 187 insertions(+), 5 deletions(-) create mode 100644 packages/commonjs/test/fixtures/function/conditional-require-non-strict/_config.js create mode 100644 packages/commonjs/test/fixtures/function/conditional-require-non-strict/bar.js create mode 100644 packages/commonjs/test/fixtures/function/conditional-require-non-strict/foo.js create mode 100644 packages/commonjs/test/fixtures/function/conditional-require-non-strict/main.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-empty/_config.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-empty/main.js create mode 100755 packages/commonjs/test/fixtures/function/dynamic-require-empty/submodule.js diff --git a/packages/commonjs/src/generate-imports.js b/packages/commonjs/src/generate-imports.js index a9cc478fe..59fdd997d 100644 --- a/packages/commonjs/src/generate-imports.js +++ b/packages/commonjs/src/generate-imports.js @@ -60,7 +60,7 @@ export function getRequireStringArg(node) { export function getRequireHandlers() { const requireExpressions = []; - function addRequireStatement( + function addRequireExpression( sourceId, node, scope, @@ -140,7 +140,7 @@ export function getRequireHandlers() { } return { - addRequireStatement, + addRequireExpression, rewriteRequireExpressionsAndGetImportBlock }; } diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index 5287c5f79..88b13b7c5 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -78,7 +78,7 @@ export default async function transformCommonjs( // unconditional require elsewhere. let currentConditionalNodeEnd = null; const conditionalNodes = new Set(); - const { addRequireStatement, rewriteRequireExpressionsAndGetImportBlock } = getRequireHandlers(); + const { addRequireExpression, rewriteRequireExpressionsAndGetImportBlock } = getRequireHandlers(); // See which names are assigned to. This is necessary to prevent // illegally replacing `var foo = require('foo')` with `import foo from 'foo'`, @@ -233,14 +233,22 @@ export default async function transformCommonjs( const requireStringArg = getRequireStringArg(node); if (!ignoreRequire(requireStringArg)) { const usesReturnValue = parent.type !== 'ExpressionStatement'; - addRequireStatement( + const toBeRemoved = + parent.type === 'ExpressionStatement' && + (!currentConditionalNodeEnd || + // We should completely remove requires directly in a try-catch + // so that Rollup can remove up the try-catch + (currentTryBlockEnd !== null && currentTryBlockEnd < currentConditionalNodeEnd)) + ? parent + : node; + addRequireExpression( requireStringArg, node, scope, usesReturnValue, currentTryBlockEnd !== null, currentConditionalNodeEnd !== null, - parent.type === 'ExpressionStatement' ? parent : node + toBeRemoved ); if (parent.type === 'VariableDeclarator' && parent.id.type === 'Identifier') { for (const name of extractAssignedNames(parent.id)) { @@ -442,6 +450,7 @@ export default async function transformCommonjs( !( shouldWrap || isRequired || + needsRequireWrapper || uses.module || uses.exports || uses.require || diff --git a/packages/commonjs/test/fixtures/function/conditional-require-non-strict/_config.js b/packages/commonjs/test/fixtures/function/conditional-require-non-strict/_config.js new file mode 100644 index 000000000..fc1671434 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/conditional-require-non-strict/_config.js @@ -0,0 +1,4 @@ +module.exports = { + description: 'handles conditional require statements in non-strict mode', + pluginOptions: { strictRequires: false } +}; diff --git a/packages/commonjs/test/fixtures/function/conditional-require-non-strict/bar.js b/packages/commonjs/test/fixtures/function/conditional-require-non-strict/bar.js new file mode 100644 index 000000000..4a625a917 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/conditional-require-non-strict/bar.js @@ -0,0 +1 @@ +global.bar = true; diff --git a/packages/commonjs/test/fixtures/function/conditional-require-non-strict/foo.js b/packages/commonjs/test/fixtures/function/conditional-require-non-strict/foo.js new file mode 100644 index 000000000..a446ce3ad --- /dev/null +++ b/packages/commonjs/test/fixtures/function/conditional-require-non-strict/foo.js @@ -0,0 +1 @@ +global.foo = true; diff --git a/packages/commonjs/test/fixtures/function/conditional-require-non-strict/main.js b/packages/commonjs/test/fixtures/function/conditional-require-non-strict/main.js new file mode 100644 index 000000000..e64d67ec9 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/conditional-require-non-strict/main.js @@ -0,0 +1,7 @@ +if (Math.random() < 2) require('./foo.js'); +if (Math.random() > 2) require('./bar.js'); + +global.main = true; + +t.is(global.foo, true, 'foo'); +t.is(global.main, true, 'main'); diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-empty/_config.js b/packages/commonjs/test/fixtures/function/dynamic-require-empty/_config.js new file mode 100755 index 000000000..a416647cf --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-empty/_config.js @@ -0,0 +1,6 @@ +module.exports = { + description: 'allows dynamically requiring an empty file', + pluginOptions: { + dynamicRequireTargets: ['fixtures/function/dynamic-require-empty/submodule.js'] + } +}; diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-empty/main.js b/packages/commonjs/test/fixtures/function/dynamic-require-empty/main.js new file mode 100755 index 000000000..d1c0f89d7 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/dynamic-require-empty/main.js @@ -0,0 +1,6 @@ +/* eslint-disable import/no-dynamic-require, global-require */ +function takeModule(withName) { + return require(`./${withName}`); +} + +t.deepEqual(takeModule('submodule'), {}); diff --git a/packages/commonjs/test/fixtures/function/dynamic-require-empty/submodule.js b/packages/commonjs/test/fixtures/function/dynamic-require-empty/submodule.js new file mode 100755 index 000000000..e69de29bb diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index a49552585..8f1eaa57b 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -258,6 +258,30 @@ Generated by [AVA](https://avajs.dev). `, } +## conditional-require-non-strict + +> 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 = {};␊ + ␊ + commonjsGlobal.foo = true;␊ + ␊ + commonjsGlobal.bar = true;␊ + ␊ + commonjsGlobal.main = true;␊ + ␊ + t.is(commonjsGlobal.foo, true, 'foo');␊ + t.is(commonjsGlobal.main, true, 'main');␊ + ␊ + module.exports = main;␊ + `, + } + ## custom-options > Snapshot 1 @@ -7565,3 +7589,127 @@ Generated by [AVA](https://avajs.dev). module.exports = main;␊ `, } + +## dynamic-require-empty + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var submodule = {};␊ + ␊ + var hasRequiredSubmodule;␊ + ␊ + function requireSubmodule () {␊ + if (hasRequiredSubmodule) return submodule;␊ + hasRequiredSubmodule = 1;␊ + ␊ + return submodule;␊ + }␊ + ␊ + var dynamicModules;␊ + ␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/fixtures/function/dynamic-require-empty/submodule.js": requireSubmodule␊ + });␊ + }␊ + ␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ + }␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ + }␊ + ␊ + function commonjsResolve (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 */␊ + ␊ + function takeModule(withName) {␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-empty")(`./${withName}`);␊ + }␊ + ␊ + t.deepEqual(takeModule('submodule'), {});␊ + ␊ + module.exports = main;␊ + `, + } diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index ee77041b1edfa02a4e29444f61ba44cce76d0478..c4fac9a4fa226d12ca80434f86677057cb751983 100644 GIT binary patch delta 21623 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 NuZqIS_y!!T{{wQ^h Date: Mon, 18 Apr 2022 14:04:54 +0200 Subject: [PATCH 21/22] fix(commonjs): Warn when plugins do not pass options to resolveId (#1038) --- packages/commonjs/README.md | 2 + packages/commonjs/src/index.js | 18 +- packages/commonjs/src/resolve-id.js | 159 +++++++++++------- .../commonjs/src/resolve-require-sources.js | 10 +- .../_config.js | 29 ++++ .../warn-this-resolve-without-options/foo.js | 1 + .../warn-this-resolve-without-options/main.js | 3 + .../commonjs/test/snapshots/function.js.md | 17 ++ .../commonjs/test/snapshots/function.js.snap | Bin 22034 -> 22058 bytes 9 files changed, 168 insertions(+), 71 deletions(-) create mode 100644 packages/commonjs/test/fixtures/function/warn-this-resolve-without-options/_config.js create mode 100644 packages/commonjs/test/fixtures/function/warn-this-resolve-without-options/foo.js create mode 100644 packages/commonjs/test/fixtures/function/warn-this-resolve-without-options/main.js diff --git a/packages/commonjs/README.md b/packages/commonjs/README.md index 44a7652db..225ed182c 100644 --- a/packages/commonjs/README.md +++ b/packages/commonjs/README.md @@ -68,6 +68,8 @@ You can also provide a [minimatch pattern](https://github.com/isaacs/minimatch), Type: `string | string[]`
Default: `[]` +_Note: In previous versions, this option would spin up a rather comprehensive mock environment that was capable of handling modules that manipulate `require.cache`. This is no longer supported. If you rely on this e.g. when using request-promise-native, use version 21 of this plugin._ + Some modules contain dynamic `require` calls, or require modules that contain circular dependencies, which are not handled well by static imports. Including those modules as `dynamicRequireTargets` will simulate a CommonJS (NodeJS-like) environment for them with support for dynamic dependencies. It also enables `strictRequires` for those modules, see above. diff --git a/packages/commonjs/src/index.js b/packages/commonjs/src/index.js index b53fa7fd4..3c8f5f642 100644 --- a/packages/commonjs/src/index.js +++ b/packages/commonjs/src/index.js @@ -99,7 +99,7 @@ export default function commonjs(options = {}) { }; }; - const resolveId = getResolveId(extensions); + const { currentlyResolving, resolveId } = getResolveId(extensions); const sourceMap = options.sourceMap !== false; @@ -204,7 +204,11 @@ export default function commonjs(options = {}) { 'The namedExports option from "@rollup/plugin-commonjs" is deprecated. Named exports are now handled automatically.' ); } - requireResolver = getRequireResolver(extensions, detectCyclesAndConditional); + requireResolver = getRequireResolver( + extensions, + detectCyclesAndConditional, + currentlyResolving + ); }, buildEnd() { @@ -260,15 +264,13 @@ export default function commonjs(options = {}) { // entry suffix is just appended to not mess up relative external resolution if (id.endsWith(ENTRY_SUFFIX)) { - return getEntryProxy( - id.slice(0, -ENTRY_SUFFIX.length), - defaultIsModuleExports, - this.getModuleInfo - ); + const acutalId = id.slice(0, -ENTRY_SUFFIX.length); + return getEntryProxy(acutalId, getDefaultIsModuleExports(acutalId), this.getModuleInfo); } if (isWrappedId(id, ES_IMPORT_SUFFIX)) { - return getEsImportProxy(unwrapId(id, ES_IMPORT_SUFFIX), defaultIsModuleExports); + const actualId = unwrapId(id, ES_IMPORT_SUFFIX); + return getEsImportProxy(actualId, getDefaultIsModuleExports(actualId)); } if (id === DYNAMIC_MODULES_ID) { diff --git a/packages/commonjs/src/resolve-id.js b/packages/commonjs/src/resolve-id.js index 43066afad..7fa7f04fe 100644 --- a/packages/commonjs/src/resolve-id.js +++ b/packages/commonjs/src/resolve-id.js @@ -50,79 +50,114 @@ export function resolveExtensions(importee, importer, extensions) { } export default function getResolveId(extensions) { - return async function resolveId(importee, importer, resolveOptions) { - // We assume that all requires are pre-resolved - const customOptions = resolveOptions.custom; - if (customOptions && customOptions['node-resolve'] && customOptions['node-resolve'].isRequire) { - return null; - } - if (isWrappedId(importee, WRAPPED_SUFFIX)) { - return unwrapId(importee, WRAPPED_SUFFIX); - } + const currentlyResolving = new Map(); - if ( - importee.endsWith(ENTRY_SUFFIX) || - isWrappedId(importee, MODULE_SUFFIX) || - isWrappedId(importee, EXPORTS_SUFFIX) || - isWrappedId(importee, PROXY_SUFFIX) || - isWrappedId(importee, ES_IMPORT_SUFFIX) || - isWrappedId(importee, EXTERNAL_SUFFIX) || - importee.startsWith(HELPERS_ID) || - importee === DYNAMIC_MODULES_ID - ) { - return importee; - } + return { + /** + * This is a Maps of importers to Sets of require sources being resolved at + * the moment by resolveRequireSourcesAndUpdateMeta + */ + currentlyResolving, + async resolveId(importee, importer, resolveOptions) { + const customOptions = resolveOptions.custom; + // All logic below is specific to ES imports. + // Also, if we do not skip this logic for requires that are resolved while + // transforming a commonjs file, it can easily lead to deadlocks. + if ( + customOptions && + customOptions['node-resolve'] && + customOptions['node-resolve'].isRequire + ) { + return null; + } + const currentlyResolvingForParent = currentlyResolving.get(importer); + if (currentlyResolvingForParent && currentlyResolvingForParent.has(importee)) { + this.warn({ + code: 'THIS_RESOLVE_WITHOUT_OPTIONS', + message: + 'It appears a plugin has implemented a "resolveId" hook that uses "this.resolve" without forwarding the third "options" parameter of "resolveId". This is problematic as it can lead to wrong module resolutions especially for the node-resolve plugin and in certain cases cause early exit errors for the commonjs plugin.\nIn rare cases, this warning can appear if the same file is both imported and required from the same mixed ES/CommonJS module, in which case it can be ignored.', + url: 'https://rollupjs.org/guide/en/#resolveid' + }); + return null; + } + + if (isWrappedId(importee, WRAPPED_SUFFIX)) { + return unwrapId(importee, WRAPPED_SUFFIX); + } - if (importer) { if ( - importer === DYNAMIC_MODULES_ID || - // Proxies are only importing resolved ids, no need to resolve again - isWrappedId(importer, PROXY_SUFFIX) || - isWrappedId(importer, ES_IMPORT_SUFFIX) || - importer.endsWith(ENTRY_SUFFIX) + importee.endsWith(ENTRY_SUFFIX) || + isWrappedId(importee, MODULE_SUFFIX) || + isWrappedId(importee, EXPORTS_SUFFIX) || + isWrappedId(importee, PROXY_SUFFIX) || + isWrappedId(importee, ES_IMPORT_SUFFIX) || + isWrappedId(importee, EXTERNAL_SUFFIX) || + importee.startsWith(HELPERS_ID) || + importee === DYNAMIC_MODULES_ID ) { return importee; } - if (isWrappedId(importer, EXTERNAL_SUFFIX)) { - // We need to return null for unresolved imports so that the proper warning is shown - if (!(await this.resolve(importee, importer, { skipSelf: true }))) { - return null; + + if (importer) { + if ( + importer === DYNAMIC_MODULES_ID || + // Proxies are only importing resolved ids, no need to resolve again + isWrappedId(importer, PROXY_SUFFIX) || + isWrappedId(importer, ES_IMPORT_SUFFIX) || + importer.endsWith(ENTRY_SUFFIX) + ) { + return importee; + } + if (isWrappedId(importer, EXTERNAL_SUFFIX)) { + // We need to return null for unresolved imports so that the proper warning is shown + if ( + !(await this.resolve( + importee, + importer, + Object.assign({ skipSelf: true }, resolveOptions) + )) + ) { + return null; + } + // For other external imports, we need to make sure they are handled as external + return { id: importee, external: true }; } - // For other external imports, we need to make sure they are handled as external - return { id: importee, external: true }; } - } - if (importee.startsWith('\0')) { - return null; - } + if (importee.startsWith('\0')) { + return null; + } - // If this is an entry point or ESM import, we need to figure out if the importee is wrapped and - // if that is the case, we need to add a proxy. - const resolved = - (await this.resolve(importee, importer, Object.assign({ skipSelf: true }, resolveOptions))) || - resolveExtensions(importee, importer, extensions); - // Make sure that even if other plugins resolve again, we ignore our own proxies - if ( - !resolved || - resolved.external || - resolved.id.endsWith(ENTRY_SUFFIX) || - isWrappedId(resolved.id, ES_IMPORT_SUFFIX) - ) { + // If this is an entry point or ESM import, we need to figure out if the importee is wrapped and + // if that is the case, we need to add a proxy. + const resolved = + (await this.resolve( + importee, + importer, + Object.assign({ skipSelf: true }, resolveOptions) + )) || resolveExtensions(importee, importer, extensions); + // Make sure that even if other plugins resolve again, we ignore our own proxies + if ( + !resolved || + resolved.external || + resolved.id.endsWith(ENTRY_SUFFIX) || + isWrappedId(resolved.id, ES_IMPORT_SUFFIX) + ) { + return resolved; + } + const moduleInfo = await this.load(resolved); + if (resolveOptions.isEntry) { + moduleInfo.moduleSideEffects = true; + // We must not precede entry proxies with a `\0` as that will mess up relative external resolution + return resolved.id + ENTRY_SUFFIX; + } + const { + meta: { commonjs: commonjsMeta } + } = moduleInfo; + if (commonjsMeta && commonjsMeta.isCommonJS === IS_WRAPPED_COMMONJS) { + return { id: wrapId(resolved.id, ES_IMPORT_SUFFIX), meta: { commonjs: { resolved } } }; + } return resolved; } - const moduleInfo = await this.load(resolved); - if (resolveOptions.isEntry) { - moduleInfo.moduleSideEffects = true; - // We must not precede entry proxies with a `\0` as that will mess up relative external resolution - return resolved.id + ENTRY_SUFFIX; - } - const { - meta: { commonjs: commonjsMeta } - } = moduleInfo; - if (commonjsMeta && commonjsMeta.isCommonJS === IS_WRAPPED_COMMONJS) { - return { id: wrapId(resolved.id, ES_IMPORT_SUFFIX), meta: { commonjs: { resolved } } }; - } - return resolved; }; } diff --git a/packages/commonjs/src/resolve-require-sources.js b/packages/commonjs/src/resolve-require-sources.js index f96ace50e..d392a0755 100644 --- a/packages/commonjs/src/resolve-require-sources.js +++ b/packages/commonjs/src/resolve-require-sources.js @@ -9,7 +9,7 @@ import { } from './helpers'; import { resolveExtensions } from './resolve-id'; -export function getRequireResolver(extensions, detectCyclesAndConditional) { +export function getRequireResolver(extensions, detectCyclesAndConditional, currentlyResolving) { const knownCjsModuleTypes = Object.create(null); const requiredIds = Object.create(null); const unconditionallyRequiredIds = Object.create(null); @@ -161,16 +161,20 @@ export function getRequireResolver(extensions, detectCyclesAndConditional) { parentMeta.requires = []; parentMeta.isRequiredCommonJS = Object.create(null); setInitialParentType(parentId, isParentCommonJS); + const currentlyResolvingForParent = currentlyResolving.get(parentId) || new Set(); + currentlyResolving.set(parentId, currentlyResolvingForParent); const requireTargets = await Promise.all( sources.map(async ({ source, isConditional }) => { // Never analyze or proxy internal modules if (source.startsWith('\0')) { return { id: source, allowProxy: false }; } + currentlyResolvingForParent.add(source); const resolved = (await rollupContext.resolve(source, parentId, { custom: { 'node-resolve': { isRequire: true } } })) || resolveExtensions(source, parentId, extensions); + currentlyResolvingForParent.delete(source); if (!resolved) { return { id: wrapId(source, EXTERNAL_SUFFIX), allowProxy: false }; } @@ -201,6 +205,10 @@ export function getRequireResolver(extensions, detectCyclesAndConditional) { isCommonJS }; }); + }, + isCurrentlyResolving(source, parentId) { + const currentlyResolvingForParent = currentlyResolving.get(parentId); + return currentlyResolvingForParent && currentlyResolvingForParent.has(source); } }; } diff --git a/packages/commonjs/test/fixtures/function/warn-this-resolve-without-options/_config.js b/packages/commonjs/test/fixtures/function/warn-this-resolve-without-options/_config.js new file mode 100644 index 000000000..a79b74cb8 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/warn-this-resolve-without-options/_config.js @@ -0,0 +1,29 @@ +const assert = require('assert'); + +const warnings = []; + +module.exports = { + description: 'Warns when another plugin uses this.resolve without forwarding options', + options: { + onwarn(warning) { + warnings.push(warning); + }, + plugins: [ + { + name: 'test', + resolveId(source, importer) { + return this.resolve(source, importer, { skipSelf: true }); + }, + buildEnd() { + assert.strictEqual(warnings.length, 1); + assert.strictEqual( + warnings[0].message, + 'It appears a plugin has implemented a "resolveId" hook that uses "this.resolve" without forwarding the third "options" parameter of "resolveId". This is problematic as it can lead to wrong module resolutions especially for the node-resolve plugin and in certain cases cause early exit errors for the commonjs plugin.\nIn rare cases, this warning can appear if the same file is both imported and required from the same mixed ES/CommonJS module, in which case it can be ignored.' + ); + assert.strictEqual(warnings[0].pluginCode, 'THIS_RESOLVE_WITHOUT_OPTIONS'); + assert.strictEqual(warnings[0].url, 'https://rollupjs.org/guide/en/#resolveid'); + } + } + ] + } +}; diff --git a/packages/commonjs/test/fixtures/function/warn-this-resolve-without-options/foo.js b/packages/commonjs/test/fixtures/function/warn-this-resolve-without-options/foo.js new file mode 100644 index 000000000..ce0fffb75 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/warn-this-resolve-without-options/foo.js @@ -0,0 +1 @@ +module.exports = 21; diff --git a/packages/commonjs/test/fixtures/function/warn-this-resolve-without-options/main.js b/packages/commonjs/test/fixtures/function/warn-this-resolve-without-options/main.js new file mode 100644 index 000000000..ba12948f6 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/warn-this-resolve-without-options/main.js @@ -0,0 +1,3 @@ +const foo = require('./foo'); + +module.exports = foo * 2; diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index 8f1eaa57b..f34b58c15 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -7713,3 +7713,20 @@ Generated by [AVA](https://avajs.dev). module.exports = main;␊ `, } + +## warn-this-resolve-without-options + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var foo$1 = 21;␊ + ␊ + const foo = foo$1;␊ + ␊ + var main = foo * 2;␊ + ␊ + module.exports = main;␊ + `, + } diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index c4fac9a4fa226d12ca80434f86677057cb751983..e9e8b3c332571bd81f28f7d9518ab356eac84fac 100644 GIT binary patch delta 21790 zcmZ6yQ*@?H6E+&#&V&|~NBwrxyo+qr{@ZQHhOPi$*qYvTXi-#*yrldi6VUaPyS zR$YBnRYDbbMHM(8q%K6NVrS^!Y+>(0>c)xy0j5H9Zo-?Rict>Uumf_dLM4fW1N+~A zyySyVQ(0QNMh-J^0N;FuC6Wu23Nb-DN6NdH46BY)ydOt9a}m^Ea~1|sXLW8|V|KuNZTQH@EyU_II(#ObBFoGORJzU+IMVT#@z z2Hk*r5Gt?hT{!AauTdnl!a1CmzsAC=J)hw&`$5z~Es?wAany9}^cfsaGmZmG$<>O+ zCQ;Rv-?P4_5$NG7Hzsc-YOX0jXJ&@K(dq3=hvTK(_%E`yZ)Hs0Xbdz>zjyA*tJmq( zhh6*WAX85czplir0CApW4mzehXwF+>@&yoZnIY17o3-T$ykZqvsBr%r-ctd7TF$xk z*bdU+R<(&s%vu{vwCjyFaoIIeY&v|M9reC%h5mN}tArBd*JDfA>Z=uxs+QdjIy1ed z(IcKfKMuKt7EP~z_9Wf6`75CpjyLOuU)s%@60^pB;L0_g#%3F8TmnStt&?J}b^s#N z0=i2dlTanf>e1=Yj5_aQr#ms8z`vdgWg?-SoEl4=T+mZ&KalI9{;>My?&H!(F4QS> zl7UZZdbxbS=yiQn;_96HKGUXBnCD9B65F1^+4fo$0BkaDxXq|+FaVz?N{Fsd-9|Yj zwp<1)%_RD7Z*xrYLE3lp6rVS4%GCyp|L6CX1Sx_<8jomXx0Y}dVp<7h-e0@@Xp z&CcIqe;V|~wSKj_ZCKu4^ZCTZyVqD_409%+n}DXEhBUzFy{NlAlZoSgyB4mY7j>eH~@b@b}7$2GzY(OoJ#*=-Y^bBt4vY__~=LrR9} zLP~^);rQ-|0N(sd1|p3&+|@Q z<5>6axfBSSj=jlAGP*lGx0KL{gl7B@iwJ#z;f$4BzJjBCO3*fFw-^y@1w7MURFiGq+xu)r?R;{JGVK+dO-_z2x7oX) z_e+7U&uv$g{*&NYw*IlNrLNZvYWd9fp~K{z?8SzU3%C%w-s&2T&sS7fUN%}y4u^+0 z^PRTW`X#(|e%Y0R9pblLfsxJU+CG32r0X@IvEV*53#ECU88S87>v7nYU25mO6^N*R z`iU8G)m2)PE+VjfTI`Lg$>&{pu+m)gaLwYPoL$pw=e)-B+|7Nnzj&M>?^|(n0Ag_& zz|ynsym>;s-m%LCk)(fYxKdZQJ*Xf>D?rlBT-_g&*L1uWhUR|0p`@bfr2>7kGpMk@ zb+(Sc$0T$rEYthH0`uI}BMPMGDOeg3hL<;~&|hpeE1e`-_f7|Va(EqU5X?G^2*mqe zcQKh z5-o-&!3M3TWwsust7q8u*^14hl=W=eIYIgNokA0!UVV<%7vBRQ8uiO##*U-a=wxBk zKk3U$pZ8=Jb-UYO_B)TE zjGuB{e$}23#V=!;S8<;+Bk6gx)R;1UP1fTQF5Ko;%&l~JFVx)k_RYE)gigGg`L-Mz zf0TUQ_w_iME|tE{c+K3$>Semhio zCQf`E<;LS7x}X_-@NNW5-n6V^eechV<KF4*16IY<}xyxEAT8inWc7ago->c3rP${LwBX)+E08< z=yvjOQcw~!+7pzI%U5K5+{I#lf~`iK{nl6dyzLBF&7tFc1EX7LXR6LN-)8y982j4a zaMOG9gcJFKGD*Ad)qUE(b?0^Uc1XMSx2@T_S3=SQZpp^pE*{xP+7D(I{^)kw?WjJI z5ckd6>d!Yv0`(<^f6Nd5bRP8_)PmgPb|sN)0j(8AzH5zMBH*0cUBLMq^2=h?=-Cx- z{T4wJypqw^`Se+*=YC5p+?xMww3Ex=1XnPy%_g@7v!}YIeYW+0cuxfv#REeG7eedl zD}@(myJuPmod%Bf%6o~npKQ=XdSN(v&aOvR4&2+m+-(maUq4R;o(wD=y-ANQS8BZe z1qyuC$%U@5yKI+n;CbD=b+|qD?@74x9rt#s&-B!rt)!yL8=mBo_$P7oe%jQoAH!U6 z7z&SC9#?+~Aj$bcnM|ql;D7v0nc>AD@>vDm*j8*>8A3w(K0ivc?KD50_>Xhg{`Ljc z?!3n9^p4JsnUfZOvjI|ab1t)s(nzWpX5m{t#DO&o!=kfz0NSX+AdXH&wvhY;}xF2Tv|o0{l20;SX_YF z71E;^J}MtTbaJ)QZs#nBg!{Lwpsv*CJ{J7oiu-Z2SKo1TNsq4PC#=XdiE8nd z+Z&0WCcozwHVLoyVDPbTrvV8PQIl!1+nYObeJAVJ3#YT+K~Xn`w?8(HaO`S@w2tp{ zc=}6xz@Fr(K{vz)P|K7xU7uCKlt~ z*Q52_94>!8JmDEUaAkgeLzjzm1%9=EjeceZ)fB!%`{6`hg zutTx3{{bXvK1r?CJU7|HCLk1eda4Y4Q6?u|L0@ziOn#C*ynEYt75Mh^Y4WS-^NIH! zlSs%uSFxB6bZDKNrR4T!F*= zKUA}$rM52fWt-)BPX|<1c^3S<1lW)%?BTlK zW@#@Uv+aqxR(`i1zaK^M`MmkOvaiaJK1>c)G_~3RY-gEwe=pfkbetn$0ukQ!pZ^-W?f-kHdbc>IwI|nHq>tAYN|LOFmnqkJaGpT^>wynXV2&$-q^C`5B%{{K(+v10EZ6z_DD$iU+H2~O+PXRUx!rwn zj0MTx$OKAKur~%#3Zn0^@U3p-ADAe~m&Db1U1Hn;#>G z)2Pp%Zhxs8f&Om@`TG4y#>-KjCvQv6`k8mK^KV=0rT-z^#{yd0t+Wjo!k$;8nVaIy zUp@z*RN`XtlN}})S00PWOg@R8R`KHkr^G9)Z{9C#2tXnL*f@a< zIe|3eWMIu~?D*q{Ld>hV(7Nb9TV;>zP|>pVX8CF+@-V$ocxz&z6yl??)ezjuX8bMP zhG#nqc;r;oU{Fj;RS``fVDI%1@aoLk`@cr6lNMH3HFVUdA>RZ zu*C8q3^q()ls&t{eX$HiylpcmZuA0)~%N~DHGHrtN{LPynPUL13#A`AooupN;5LUkv?`we1^PafCmI2?jl8tLPeC8Gw!j>j!~`(ONnwEhuTsimFcL> zYUT!BBf&XV$MQslN;zdhcVY$adfg3g9sw`5VQLR*ej&qNb#8ktavXY$#M)!8oNYQA z-&$$g8yivxoWGTvS~2|I)kZo&kBhe*5k4ZV810dOi|Vb6+@>4WxbDaa%)6zFtuV3E zi9-zF5Ki&3q8dWv1UkSL>m%ZLtikMHKnJDD*VIW;buk;TONeUzPB3c{`DI+&EodFI zSr=8OXtYW@hYFS_SLA~gq!ga#gB~FLyU^%>a4Au-d{ouRB-J@lp-noBuWtmhRU-}? z?GwDxRf25Y=G6+9zRVUG$Wx19HpvB2MR@6F5{wk0!p+wMbSu;rO{Cc z13Gie9oX?v%d{wWdDvNYx<$)n&=T7JzSnZ-I&hNh3+HD~>^GAmu_cC4H}-4tVnQ#h zgtfXC&1=8#GZV%gsT3aEdQF4Kfkv$(D56(`de-Mzj>_P30YEFl6D-BcndQ z#UL#$(-$^*#|#bF1DsfF(=p=`uHu;dG0;qyIo+RNWi)~{R0BI&L!~UaE(EefNCXvC z*t_tkbdh%~P=|S6(=e#!);58nv9?DG(lrgOyl_Y+`k(Rv-c&+vHT8l|4Hm$=+~)^;NsQ@5v&9kF-^{!$dBS*NPyFW;v*0(fcvB_n-o5S{v=xU&SX{{z9igUWMD znxAGWZ%?T$eM0gUv>kFCJa!~KOo&R~*1B_x-V6(i>bIa^QOgD<{cE5Hj9Cqu3Y&}h zpi(-<=l*i$x}uQ|2r+{zoC(@%p1V>!+rHgks& z1h9&56QPkA=_6UD)7CI9WldO=z@X?P5~N)$y!{CvzatgxrpqKY_U(;Nok|$?5PLvV739oer=hL7+4n~e!ixF;ANNxBAC+|r90^dVBewMfM}qNq++2gZ z8BAim$7Ql%_CnK+-NC4zeHpT62>TtI0yJ4dz|)?lK5D!8s@}`Q^~KrRu(NrLdG4L) zV#v8*sLzE3VG&3XKqOG;j|JAjjI=ojkNy;Wy%ZCGivI4u9P>}h_@GL}Ou^2EP>F6? zQnCS=dA1`udN(OUj)QZV+!BSIp0w@WOOf?SYGa(b`oR9LHh9K_6>eD#ppL`h(!#h7NYa-$m)sEK*Un;@4KAU$)pQ8Q@ zbEmjKSi`69FG(zxvTCN6Gi_*41Aa>ch(9!5E|)eZh(d~E(gxZtC>j5rqoC!YzcZP( zkSexmPKPjTi2y6>Kq2kNcr;XxO_NNsGwk))%z>y?__?Q`$;*&0YGt3hgA4D_^|o7d zU4Ak=$BDA4DLGJvR+ENw z4kEF605`D2rm*@8K*=02+zt1$GUuiI|a|ZY?8Y1C`*$5CvtOfvUo>CNkYYe zi~MIJa{^5avjwh{?p|cb9m1I+yDk!`y%G8_DJa_K$DtPHJNRlnDMZZOHN@n`c&KJNPpz5M}6B^Rb3oAaVX<1?6-GH z#)NEHWlhEJmU~?XgLxp{F4M=VrMH~-&P$gp+THpO<3TtmABEI)x?i3ql6=Dfw&?!y zyANkE_oFXPnG{q9vg=p4b{DSk)-#NntN%)KXD+Y@8~e@VKZN1awbh<3Z(QOtiD!q( zn^d~6+07sYA2u2^L0spTJtIhRDkJMP5$ZaTf$tznh+W>2L^z3trWU{3kf{%b3U)ZL ze0Ev^VTGL?GGc57foen67tUJ;q=StToVjmcT6XNOj?XWS%BM`F9GFF>Nd!yAWFs+P zHDfItSSI^?DlTRe5{?rS++$iqV^1}*bKKLXv+S6l-RnD9O>## z!KFcD7=&dV2Rz%XwT8?jh&HfjoOm#_Vz1Oot13#Ic_O1I=68k3FKA9$<&twHUxDN1 zaN6=nW=$=`PojKWTcC~%HCRRM4U7n3lY<>X?BucWU<<<9=HbhQP0%*#A(?xm-3HD7 zRCAiE6-yku82()<*h|w6p?pS(wp%2BFn$33l2vvSK9goO|17p#G9?fKi4$|6VM(`) zMmRy=97BI=xNGFo$B1vbjy)%;IE6M&O1N8cExsZ+jRlhd0bqx!X>C#U3>A-Pj~Xli z;Zo8r`)1|+dT{)vbKCekWHdy0*(=iutr?474)O+Lc1Dg$Gj!_jA9}Qg{!?(ocFisM z=So%H#9XroZ%n&WVa-eWJ+81x&N&KP2j6vclB*Ls5-r`Ot_9RiD4# zW2l&JqN}nm8Nv-xN9jh zX9ydfo6?!~96VECgkDh|ICb7?CV3=~>D za1x+@NoMEQR8RkwQ6yMM=91XUXksV2JPD)Lxs5=L6$G3v*Oa2C5H(d}cS2>|vZ*CG zIOHDpT1e9kdkEWUX%$Xg=PP(2iSzqYL2EMF&e@w?C{UOgyP!V?HAj3p@ zU7fe*#sGXOf74txLB%?Vo72_f#(6K8pM^OQZdc>MWhlS@41bX0h5UF6ZZ;HxFy^kw zhW&|e+nTXX|rH2%XKIXO#JbJlBs-14j|f5u&0zSPg0|`#4KGebf;) z;FEKC+r_|TE;wD5*Ytonr{DV$6B!eRP5~d+)CVl|h6!Ag9{dfMWNw>L0POEB+v(uH%P23Mv0md8YJfvmlLW49R8QXcQ>DOuHoGt+Fr>$_FyN6N)(%g+7U3*3l2 zkZ!SS)XrtRQW5>BGY!VS{h*XgsY3W)2zvI^**}%V>4{8N@MCN;e(S==Ou`+sID8g< z+BA#M)pV6#ifCtFCA`d2*ZHeF8HPmcQv%#f1=z`L(1%yid-Ufh%#w=eej|qA??@eQ zUuCZUhM%|lMB(Et|QgOJn?s(*y6KY8KTMixNBfd zWa*asY_i^!&B4^(}D9; z6WncW*!zj|6zEF@^s-Q9TbZYqHcv@s;*VY>hB~LDm z9P69WN9sbB)4F1$Gh-IOD|k!!cOI!_O3m=nQnU9a^6Wz+!|IvuB~!z zweERd{o)0*^H`j!i3$biSeJHX6Ls{F$8GOAUcsBz3t~x>PPohBDgd<)9~R`i=oEX( z2qrxFRywDPc#?>hx#Wk zo0#P?fr{{;vB>uhO&}_7d1QWykGHX9m?-hSei9s>o`w`XLQqQd$6&*9iG|0XeZm&r z7n4s{G8>SYN5U4jT));$XE_HID!o|3a2sI2kX^5W69-vQ=yF z*cSiy421gUka281WvWV16D^N@q6V563^>XhyDM4I1r#=GGC)dwiXr3BKu$rK!PrZD zyikzb8Hvk{Y}-UGBV3ngcJWqG`ul?<6AsQ5uNcV8i+kS6jQlCn_Yc?vfr62O8`vxa zbqjd30KkzoTEJbVWaylE4A#Dg4x?=dKZDmLcIZgz9a z-rqLiN}qShsTOUJv&PQw@~UM1Na?Dkold0g6xvFs0TPE)h_wr#2{c4EbDZ6%ZRl;T zF2=`+ITq>C?D`Bopk{*15TnRNz9q6f;YZcuZq~@Vj{O zv}{0$BzkwB=o<(|yZxoU|Aa&Ac7aTgYa=8k_h-4JPR^@e##5_b@$37Ry=oCRhV{Ph zCqKD>fUECk2R{I9?V|2;1v^lpO=cScXZC2_e7SQTj1$7RK1nbs3|cz^&rD(stD+xzyv|1jpD5 z{pIaT{4tnCr1raN$K_ZN!83Zt!ANi(HZ+5^H=^ddH}!Bn0n|d16uHEpHc7DpKKZ|* z01HRy^2B$u690ll9kDEIb@m9eMySCVOc~UBAwti9UIw#uS}cWFIE1Zw~co304QQ9~rv@jhkZPi(=S>+>K=ocZ*E>uU{@7K*y(m z-dAqTm%_?d>G{{f!@WPZHn_Jb76yWPcRv^)!yt3E z`E4{~yceM*Ce&DI+X8XmN-Np9^d?rY{!vv%p7C^4;i7>pF7-jSy#+CP;Z{hZ;1SmG znt9QF@VjjY`*t$Zi5W#r1yBT;Ot#8sMJK?HPne#l{LGdXq7(YV6ghztlm=iy>U!YA zqwPi+TN}$aqJ5_mS29)4jDSmLiJ)b3RL-Jfi=-WRu^ObAN=;2|?~gR^GWf>%gP3FP zS$0+iDl2u&mL?DL%->vfe^b=uFXSKkRU|{4&_E6O2)GF$35`R}HogwLELYZlCxp}A z2GdoJ_5@!=jvWrwrhW_af{uXrd=n-lZL+Nnlbhf!%># zrJ*J&*I8F(R1hy4E5jsH9lKd)`@RIYXR#GBcM?mKuZ3qu_u-z{@w!0x&CKfZ$_RQV zp_T%zWJZJacG$A8gOL&6!_;{gLKFA+YF-$(@(9;71Hr&Y%XD0=X6KKtQ8GZ8l&CCSh;!+NyJ2P}$5L#9Tb4e^8y<|nAt>RIF-U(GS5Xo_ z{yR7=3GI`}siV_Lk*ig)w=2~wa=^FWHz$Siz_B;)ns0}{Z1X6-aOaojg zX%f7|2t_^cMA)!^k*Y-0sQC?nJO^gLx`GI(1B>~}_YG46Vjz%$t>t8LwSCl+jpd;? zXnV7`GxJBclMfQ>6TB8CQcFeJA?}{agDWr8>9~OzgvY?_%*?n70;gj*_iAzm{+< zxN)zU4*gCLpU zXQGnZ+xDd=K{8yymSMuIY>DJpwp&1@3xQO7ekc0pQMcJiU>bJ`m`*a>+|=g!xegoG z=Ng_u?%Q|brCnNwFfT%U4tfPtXbu(o{H4rr*uO2l#h1pWv~ppMx1DsEO!#;G*`gg4 z>z`|`>S@mdS`P{iPju!~gQ02)cu1R)qT7lJPH+a;8l{F0YmYpZ3 zOq@gpoan@$G-Bh5uXQz`8a--Y1E%I6s7zFvJXtndhp8Xxw6BJTsT!s_aB;7OgS{R1 ze(ARTKcbB)E-tnQPidDfmSb=&uvrwn}CMEZ78(esQh>PpzHm+MklUSdF2M0fzqwKINtNcDVKO zSYb{fY^*Pdi8-bE)-P=VE2bwGZT)+(fyZ8L2-f;Lsk#<1BnOe`E*55|hkBqfLq| z5}w8l*CrJuzSyTodQ)-FSD|g4!}12IW%LYfsK+x5>&;n0d17q3R6yHwuI0Zv2ZvJ>q7dqkC(+%IT5+3i&UUe-*86{pO?~S01N>C7A zhsxWkgy)$5ka#kP1}JL;ZwliZF#&?%f*XIv=2Ad6OWI8)Z%DHO+)^1e zvFblMv{~YYOw~?jtn^UwYPN6RRqPk(Ax|1=aq{^VV>Hm%cIiyGwUn0YoOpn^V^tnB z*TaO8KPfnb=B6rP;tAt!oNH>la26|9V0A%8utl0YL`fUulqzy4pIQ+h1<@8%OLza@ zIMYxYyOEk>nPuzX{<#_I5~?(s6;K+K`xT&q7c?@ z7|dA#uxLLQQKYD*%{-W;+!X)?4hhWrg43T}GHwJk4y@8c zne$)^Q&3T|O`sebj*vm`d<&kX^xxj#nz@;n*({h28(ny>SvFFo>;3ys@=|6z+w;h9 zCJp&}bzve0;lJk=x6uD9n($#W)sqT9rho}Aq9^dDsU&iu=E&a;{$ zSl&6i+V-RbN#7}e0luyoD+Nm?U}t$diKX!LZwuNSAG>me@rnqlN%+Lz$AcGfZXwv3 z_|hB#5&EsWpzHSD)f=6+&Sz;p?Xl3nG+F$|ER2;qO%mi%&9#H5n_|$Cr`4ei#nwYF2z&Y%sd)kRO*-?Eva7zyQ1(Fk~H9GDbaa6e)& zzc3tV-8@MfIvx>QbQUGarus4JO3xz}yal6pVptdDa5MBn3rsqUOOa4ZG9H)%2MULr zVnPX-JgkA{lP|FywQgMqJg&fCiE&k|t`u4MpWAT8gJgeVE4CQ{F(urdw%m-8p=Q7_ znXjf{RPCv4f>>kifYw{rG`8~Mw6JH;YT%^YhDmF16&1lxHb>y4fGrVxV_DYhTSVQc`!{h5tWI){LqWND#(xB=#48A+F2ZVi!VCc__?`U_3V*aF_N9>5=}6D;O+=19po!j6)UFJjlp3Q&7aKqW+kk25jIl?sYBck_&29 z*eM#-D*59n!oy^LmA)&hA$*{SF*L^BHc9gXKPJjm=o9!j|5DE;DyWbGfu1QPW;v8> ze+zL~ViDq*XJ*mvw}0q9cy>~%YiXk51#V3CMmJ8J7z(+x*;SsfmlNoQ-4bLRxNqO7+_&tg8x;NYlr3HO_DH5@4 zfw^i8YBXpZ#sFJnM}Rdds2>~@R81yR%x06xM1ZFXO}j;7#|4 zU9sb9$mZ2VJ0c`C&`)W}^u&rP!(9F^WdpMq#dUsxO+1p9(h*P+_Xm17^YOhVyGG|< z-&keG??MP0cWzwJG>sFyQ*Rpn4X>Dl`aU9#R$Y8QukVgq_XN1QMvaYrA&kGSmNUy+USVj zn|UrHIieLLG7C)3`M)|sH<6Ud8LMEyH!x%meb9KerbnBBzGp%O^Yx0}fDPB4q|M^u zs#BU^a!uT6M|7f4vTJ^4fCMXUxcC~NDWE*;j%+`QWv}Z?7{|gRyG2^f?8BKJ&`ddA zIyX{FLw^Jb|23=kRH7Ptp=apJC!Y$?*<>*mO`ltHHUYB9dv>{%9k4dJ_{5*KA;-5} zWh`9f%9F@i~_SvSF?L6T$(c3wLx9I zaN@t><@Yq%1Kc1ZGh+Yyf9yCJ6Ha30+}}qER4IAMHzpa!NOBl9LT-cIJ-#5^Mm>oM9s@4tdl!040Ut3U5#ekKa>3z^~jAEEL1DD)fJTv5pZfoYOD^HK%c--7{6)ICFFe0Gk! z7>dMH#fe~}MGU<|lt7QtRQRucXCGy33prnFsL%^4hvt0;(^;XTsLf|66Z&0*cvC_t zv=eFUR+->V2ajG1tkHy;xVrFVg-BB&NE=q{|B8@y389tL7#WyD88y^AgeEo#hi9ls z5UQ&x+V&S4+AA42>Z|nCaP%_*IZBP1NrSE8BNnp|771w=cmb<<;l%>%rxA+UEbfCQ zIo%`{AH6P^8bn5aJ>A2;z=I}Nc*pf8u8tu=n-s3Xw6**$3dK+ik=5_k7vYY7kQit2 z{a#^3Ll}^@w5-#_Vh|SoIC{j^ zk<^D9JX|+h3INTG9wSY6H(O-Q>IoREvgbfjpsffP%O;tbPE_}w7(4_FE5>Yy=&ZgS zc%}U=!o)tBx=Lo~sQy*ip-kxrFJyuQX*C}t1;rn6eQ*%;@e03FOn;y|>nXHp{GMcF zeh2OUvQ>pw;3^6X!K;{2BCCdf8xo0S(4|Y{){^D@;Rra{YL%72M?kEqE+4ZwRW>#k zs#Kv_2pI)}StEZp0rPMa5J{%EGPL*Gr-;n%5z7w*9kv8*a@-tq0>y9c-V?s zfw7tp#Y=1V{ntmBZFEYP5CQ6qb~dr1Q2*2C#MYoIEFMXbQYx~&UCCAgtE}Ytm;@hsGE{D27RpQu_rS>#5Vu%OIsO;4{?#n zf`=(1aiY*J@&kiSI$eJhqIydT_0$B&lrGu^MFA28rjlEBG@Tarw9*7yq~vR~O|{6u zOo~?^b=pm9EaatRO=EZAljAw;?N4vF`?Pb0XqY5=xdT zR<1VwX?H*FS;^IvQVk!y{LT9jF|(}tLWI$=1s{^$8(9we_$SK${vwt(!q%)%;TsbA zn*?Z$H~sua__NibZ0&fYNb~2s^H1h!mezPTDTj8ON;?)*b9$i(lY@S@7&E{)AOnJ;`T()V^5J_Tl~W2i49C0Y*pwr& zuqVy|fu_uTxWbR%oMc%qbtfJM%B51u(EEh5p`mrKoRlcy-^&N7f8+#N|07qy4zkb# zek@abTsju8M7dGS zJ;_^rl&6ZLKua%NFV|@x^1H|&%-{$p2t+W4!G{r{pjoG(klFY|ET8j2gc`Ke%T$B#vxz7H2fD_uaK-z4lb_;C%~+~t_d zO%W)L>$Wu#S-@l06E7}AI%moJ89EdH)kLL&?T8WAT0&6z?7vf~>hDIUu|Xj(#F5FK zj#hVN!@4=d)T_H#X|43#kQGsJL zBHQ$17Oic2{c(71VkP9~^?-uSA-fG!u{=426j?)fy$XuKcQy8DB{U3-D7!zVviDqB-fDU5!JGz?+luJkUbOwptT==1>zvWO9xp28#-#-{i4Kf zGJh}|dxas%{(~Y)T^6S3T}b=7?TELGD(%C6yoFj`cVooIb`2;Dt74}p|?17Hp`NJWh_LheK~ZyBK!K}f^S+)Q0pHy)5Q*%LKsp?I^^-9ZrKB4 z-WQTXa5R%WU4~a;{F7^gY*t)388Uk)Q9NmK@uJ~#VG(m-eZY?frkGW{=m#2HgX!`# ze9;`*yxIfp`INv&`g!89V*fy==Hsy-gD2n-=6>AIZym5ri(!bW|iu=h&1!~XgANe zDZ7NemOt+j+LyJ0O%Ago8eH1_x)qELv%A+}B(;`E)AN^Qb0330wD+61roRIt8C=C# zUBr}I4PQ?OpLQK@CJz)o|8n^U1olR$upK3}Eh-f!I-Z(^Z{Nrz)Q5DhO;Mh@^GcAE z-!u!65}EiSmBfpjnJl*CaxbTXyeuWm?R(lY=R!aIE64-+C%5}Uf9>{!98JCTDn|Ks zLw_SyCfhGXSZ4{l1PTO?s`=cJoB0ClHCCv#FslSoMT(iIYU^(aBNfYXgR%A+gPG4q z;*n8uuyz^Dfvc=E&1YeoSmm?9i+D8(f}_bLA2W+0j(rx832{f{lqHqhFySAa))V8l z<|S-g`p#Jr=H+AetW?Yy#;RWi<3_^<^M|hDy40KzT?+T~wc{mF-9|{kFEi}J7Ag_> zcR;ig#d$%LuzSkiM0!^Qb|A(o>ds}usJ7+y>%-w=2OE0}D&ycKUfbQLYS2Tgb&@4F z3CnV4d-)X~p4JB}Zv&!U0aWz!lyyM<02WD(8!-|z`CUv$$)YdsIU5ETZf~n~BQ^Z| zeD6pc)^8Nq@=#HGtQKisNy=F3h<}8@*8zo>nl)Rnn!eT)akSmp1O`uB!bb}0(i-wf zLi|4Xj9W`k6YuhT2Vnx1{@9WH^2NT-YOFvDZ1G78h(sTWXS30|G<>uM({YPB3u9M| ztxjg_;yDAo-^h;_%}!pyb(wO~sJsL&zTUmvPLX$?b%Ls|Jx7-2_dj;>F}a8zhq^)n z^>|(C^Y8+<%Kj=PwgFm*#6lFJk8egziLaUenc)|qeY^EPDr6)?ColYjD2dT3&pxhv5mZ%8 zs*0a&kd>;Flpxg2T_~z}5%iJFiSh?&Ry)DJ;g(%Xhu7LkJ8b!l!uhnmrcO`LZiVv~ znVVNv+vvY497yz5Q~OGHL7Jq&0SF*puTe)UP;~RAg6-8N94|=?1SKcX8G&;W3trxVaX&ux_sX7r#0ns=-vDrL>W$OfMqI_+ zWNKsCF6c>3Zs`)9Qa<9Fp5y7~V>`ZwgmDFn;hWDhke`$@)q1$9HTyOVSEei3r6*Nc zSbEH;0O43}HjGj=eQn+7Ps57flI-Y-o z{n8_lz!j@OmuFT&KK074r@Z>o%$O+*W-Nrn*7!qUTpF(F>`p9pavI)Tl8zxU8)`$| zz$na#RLQdO81e3(WGR59^5)?65i}%GN%hmet8GDq)|Jzz%O{`2?06Pm4x$f|l0FG0 zH-%VMZg``w_88a}s!htT^bI1O4P04M$|?q}mM&S**t~DU+&==7(w&R~oPt~5gL9Fh zVJrUiy#u-3CD6!nWd=r!Kv@FPN#qHDVs+CB;b%)O>#5cc3k1^fh~eD~PRl zwRRN~*;XUh>buis88~FS^0SCY0??IB8(JkOh4VGJwCa8P=+9X*1ZJK* zARv4e$E2s4x5PSjiqmu*M1wtr>wxz6uC*dJnsPNRD!qjxX*$He(qRxTMbK=r0f~q2 z5G1Gi!XSMtq(o_pOLkU6H1v$0r6_`-AILn%%UIyC9?l&(EE3g4Xdcazh-@vuX+C3` zZS{8>dcs_TM}WjkMNVq7t`&Nbdd=QHzZI)^Iy7AGj?#rgTq5>sYIo2jsHf zTqJi!KEYf&^4KET(b@qKs4~CAGcQe4B~l_Su}>Qr=KXP0T1MW8*aJ+&^E@C4#fH;` zeoVP@V$E1lel@Fjujf7M#+nCQ6l<5YjY1qTXxaokdW>ndo9HhqM^dYln6r-++P%g` zu@m>@Hdp#fEzUnCYwPUMV0Nn1*qJ8kXaC@?pT$`%aT%^7;oy$?x)gaC;%^zifjt%0BUs5O;Zm~r~fMA|Ko6ua(QDVVVB=@o@py=rQ`4&1~v&D`S|11CdN zE1l?TGM^ZDlX9aNlVlV>2X#=Z+m2gU5lI%Td80Qq>5(>^a&=T3i}wt|IOTrTA1C>3 z4a7c`?99^pog;jzzRA~idmV4qlnYvQ77^h$w&FXtx)-uX-fCACM%S$59K-336NV5} zc$emrY9Yt*g?RuJq%e~d!n|-{HIL&JlK7^)L$cngYn9UT??x6cyfcGM?#MDBAsrl! zZ!|aOw;h{h!#xF4AZ+is86Jpp7AooLMMn?caJUW*+>|HDyKyVHEK$g*r2;Qf`Ly#^ zZ1hV}94>#*KTg9XI7NqI$cpma&c)KTTXS)@vB+bMF%CU_%^3>D&^G)#OA+0f5#dHG zGs!nUX3{V4f{alkKEkgR+a##_^i!9=Jpi|p*nr<^;|%PXikG2u{P4|eFAUNCI)`Hl zrS_2wRrXCxhYn}XH6L<4heL(JI+Ckc`&!|0ziNxD zDv&?ZwUmOKVxQM<|F+tlxDB$M9WiJ4HW9Ko!u!)7lv3|mk`qBVMYMlPE`>YX!Cz$k zPAd6)3$jaVSQi5rby2N97quB3WH67|GT9J`82?@2#eT= z6Q@ldmpnH1=f@GQ$2YNGlAtD41rL2p^spTJewyjyq_ghWwF(cvOl||Zi|z}(aO4wP zr@s^H1k3s_ZU$=QW;b|3X%Acvd^3jP{pu~&ADCSw&cAmI_&;)?$9wqDnrz`uRL~F6 z8QKINHdKytOL#udosF9V>Sr>c-Ax40^bHSpV9NF1~v90glPDgByzzp zF}C7EonwCTgR`-3c=BuGGisi{5IUi+Pb>Lks|<_1zqYBEoj7U;eg-a-yCwGE1gtU_ z*9F2FbCNn%zy*^LnI~Y<-+0)3f(tC4pn)-;9HloK@<;hsCcy}Av*uNvBbii4h9=!* z*=^@qz~qIo?_|ssK?5<(POY@&$=e!R!9HR}h=l>*?e|ciSRY9LK`_7=1aT)ejbgXn zZr94nL%hwq-Ai;B+)2y3H3z39vzo#OH8WB_=vOux8N%aWrULru%RZAGFx$0nW#<(_ z#NY9ekIUjbtw|a6jq=$g(^4_oyNU9u^)raqxO2RQHs?v}7c6|C(*Fy$305ile`b}}=%D{(ig43~CoCKKKEv&+EY z)+*1CO#7HPgKm^9ia2?am5JX*iJEI-jNuT8947W;FO9S^j}Wek=y-;!nSX@}<<}5( z-ib5KKrOxk(MKRpj=keqhWz+;DYU+y(L9vP`AykDV?kktW)?cWw;Do`p`wNNe%jb?AN@&2SI)pSYH z%5)P>;tQ|EZ7oDg8uK)o@>-_M6u9lW)l*scs&GK5nFA?aF0sR$Q)K2Pko*1=GPY4q z77J%3{*RPWj(T#RTsF)1RFnP-2+dehRF{Qt?A~_5@lp=?!9S+@smgW>iBEe)D1e8Q zEU}&agZHfD9nHA--dsy&=a~ePSCP>@TO2K)Bp|?>P&dQQ|24i1Uey1Y?7p)`sI}`> zwO3b!d?AKTz^XjkeFb7K6lK+2!XDDnD-R5rRm3I~sgE(9y~0=>a(4*<7}5;rhQMuJ zN}it{-SjYW?oz5)Wp?aX>@>%rh#Ts@wpU>|TDdf(1-YuH@LyANCcm&|?%YehIJ+zD z@uksZYz+=y6dIjMS(nr8@gsPu@O3yo0qPG#if2VWZ0l+emAP?)A*3Dh+=BgyiCXR% zh5sC%7ok&1WZ=NxxzrkSGKGkI?9cj+i()Ah4BclB0absG#HFXZCQ3f4Q~%jbY;cNq zVr-nPqwJNPKRqwid81*zv46;F8(LiL<$sY}*E2IOwVTEp_q&#st=q`hhwgDeEJjob zsRoxRi`Zxy=>x=PFX{2EXAc#rG{Yg*tFiC67yk3+R#H}$Gr`=lrZQFGd~Sc_dik1} z3k);8aC1jwo3J$hlzaU(1yWLN;7&khU04iucwadZ4+ zn*_h>hpFGfU?*oFO@1EYrE66JC>Db(YBz~n@&rXPbSCp1z<5{%GsR>0L+PqBsBP+Q z7YbCE9T}H$v$qWAM^&b@=pN~7%F0}~@l}~Am?#;Ex5O7dcc+PyxH3w>eh>j7{98FD zx4a*1ip1mu&Y4qls6R`LIs3N!>{_kvE>FX`7-%z$h9aI<_tMn_#02Z*N#^6 z^#O{J2u5y~E8jU!%y0uqlVGPwRX_UPBz7gjR_>FaLR7{Mv+tsdXQhzTk35Fin>2$tL z`!5-KXhbV?hn`gHW*6K-a9-}Q6>q%vhe5}u_Y>5nM9s7erbI1jB(^^c(0Ki{moK6g zVpAX4)ON1HQLq}Yl(HU$sMRRC`3@V?@AqY3kW#;z_7lR|ACyBqkM{(|PHhHt1fUpL z(Kv$_dJ)DDvkGQT8tfoG%+$yyG^ASU*Vl;3b0AwwqJPZaO}eL5VzpW15h4mI8wHQX zGB$20Q?L9c#}9;Cl_hXj4D#w_3&e^`oXkjh2Bauc2snLKqm3>~%+EZrDKZ(##PygU z`DyTZ9aZ}S+7##kG#uPUnU909pXcN?xkiO#(z~L$Qfw*YlqkPWR9`$6@5dlbN^Ev- z4JO8eOMQmKTjJo5lRgMR-Y8-2KXMgqi>GgHN!-xwmW!9;VM$~$BqyNeMxoTJ3Ol-V zma9$s$eHMC{uA`yR3h^K#}b{}2X4$gTU5{wqZs}dOr$W~mva2VdZFVrXyNQ2k89=o zON4q*9QTXlYiBKH_3C{Uq6y*In~4^^OfX4*GQ#Hv!#Ij>5?vS$AUxQdNh#h?#Gtrx z)9AYZ5aTBO9uy+tHNF5{m> z-+QY&Tj^BYR{6W`#>#P&3+ra&210w4F}wYF6h)uatS)LJTv>Bx^D<@x07 zyrVHLjdnIc;LoE!ni%1qp~0r^WXd&bTvLfvDjZYjx26wS2#S?~ku3#7r{UQhov#p- c_kAuJz~I27tSIysQ$fJIgH$rIl>qO50B;UAd;kCd delta 21762 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 o>eX&AP9;_=GmK?6fca4IGdIChs4 Date: Sun, 24 Apr 2022 15:39:33 +1000 Subject: [PATCH 22/22] fix(commonjs): support CJS modules re-exporting transpiled ESM modules (#1165) --- packages/commonjs/src/transform-commonjs.js | 8 +- .../_config.js | 3 + .../transpiled-esm-reexported-default/dep.js | 2 + .../transpiled-esm-reexported-default/main.js | 3 + .../proxy.js | 1 + .../_config.js | 3 + .../entry.js | 2 + .../main.js | 3 + .../proxy.js | 1 + .../_config.js | 3 + .../entry.js | 3 + .../main.js | 3 + .../proxy.js | 1 + .../_config.js | 3 + .../entry.js | 2 + .../main.js | 8 + .../proxy.js | 1 + .../_config.js | 3 + .../transpiled-esm-reexported-mixed/dep.js | 3 + .../transpiled-esm-reexported-mixed/main.js | 4 + .../transpiled-esm-reexported-mixed/proxy.js | 1 + .../_config.js | 3 + .../transpiled-esm-reexported-named/dep.js | 2 + .../transpiled-esm-reexported-named/main.js | 3 + .../transpiled-esm-reexported-named/proxy.js | 1 + .../commonjs/test/snapshots/function.js.md | 500 +++++++++++++----- .../commonjs/test/snapshots/function.js.snap | Bin 22058 -> 22705 bytes packages/commonjs/test/snapshots/test.js.md | 24 +- packages/commonjs/test/snapshots/test.js.snap | Bin 1442 -> 1558 bytes 29 files changed, 462 insertions(+), 132 deletions(-) create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/_config.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/dep.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/main.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/proxy.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/_config.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/entry.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/main.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/proxy.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/_config.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/entry.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/main.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/proxy.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/_config.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/entry.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/main.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/proxy.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/_config.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/dep.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/main.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/proxy.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/_config.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/dep.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/main.js create mode 100644 packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/proxy.js diff --git a/packages/commonjs/src/transform-commonjs.js b/packages/commonjs/src/transform-commonjs.js index 88b13b7c5..45507aa23 100644 --- a/packages/commonjs/src/transform-commonjs.js +++ b/packages/commonjs/src/transform-commonjs.js @@ -71,6 +71,7 @@ export default async function transformCommonjs( let programDepth = 0; let currentTryBlockEnd = null; let shouldWrap = false; + let reexports = false; const globals = new Set(); // A conditionalNode is a node for which execution is not guaranteed. If such a node is a require @@ -151,8 +152,9 @@ export default async function transformCommonjs( if (hasDefineEsmProperty(node.right)) { shouldWrap = true; } - } else if (defaultIsModuleExports === false) { + } else if (isRequireExpression(node.right, scope)) { shouldWrap = true; + reexports = true; } } } else if (exportName === KEY_COMPILED_ESM) { @@ -444,7 +446,9 @@ export default async function transformCommonjs( shouldWrap = !isEsModule && (shouldWrap || (uses.exports && moduleExportsAssignments.length > 0)); const detectWrappedDefault = shouldWrap && - (topLevelDefineCompiledEsmExpressions.length > 0 || code.indexOf('__esModule') >= 0); + (reexports || + topLevelDefineCompiledEsmExpressions.length > 0 || + code.indexOf('__esModule') >= 0); if ( !( diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/_config.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/_config.js new file mode 100644 index 000000000..8f05f508a --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'creates the correct exports from CJS module re-exporting a transpiled ES module', +}; diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/dep.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/dep.js new file mode 100644 index 000000000..fb5eac450 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/dep.js @@ -0,0 +1,2 @@ +Object.defineProperty(exports, '__esModule', { value: true }); +exports.default = 'default'; diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/main.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/main.js new file mode 100644 index 000000000..b84f4f5e7 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/main.js @@ -0,0 +1,3 @@ +import dep from './proxy'; + +t.is(dep, 'default'); diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/proxy.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/proxy.js new file mode 100644 index 000000000..4e05226db --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-default/proxy.js @@ -0,0 +1 @@ +module.exports = require('./dep'); diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/_config.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/_config.js new file mode 100644 index 000000000..8f05f508a --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'creates the correct exports from CJS module re-exporting a transpiled ES module', +}; diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/entry.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/entry.js new file mode 100644 index 000000000..fb5eac450 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/entry.js @@ -0,0 +1,2 @@ +Object.defineProperty(exports, '__esModule', { value: true }); +exports.default = 'default'; diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/main.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/main.js new file mode 100644 index 000000000..0e8346288 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/main.js @@ -0,0 +1,3 @@ +import * as entry from './proxy'; + +t.deepEqual(entry, { default: 'default' }); diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/proxy.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/proxy.js new file mode 100644 index 000000000..e9fb5b056 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-default/proxy.js @@ -0,0 +1 @@ +module.exports = require('./entry'); diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/_config.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/_config.js new file mode 100644 index 000000000..8f05f508a --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'creates the correct exports from CJS module re-exporting a transpiled ES module', +}; diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/entry.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/entry.js new file mode 100644 index 000000000..8b154e2ff --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/entry.js @@ -0,0 +1,3 @@ +Object.defineProperty(exports, '__esModule', { value: true }); +exports.default = 'default'; +exports.named = 'named'; diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/main.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/main.js new file mode 100644 index 000000000..c89f3ba76 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/main.js @@ -0,0 +1,3 @@ +import * as entry from './proxy'; + +t.deepEqual(entry, { default: 'default', named: 'named' }); diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/proxy.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/proxy.js new file mode 100644 index 000000000..e9fb5b056 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-mixed/proxy.js @@ -0,0 +1 @@ +module.exports = require('./entry'); diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/_config.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/_config.js new file mode 100644 index 000000000..8f05f508a --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'creates the correct exports from CJS module re-exporting a transpiled ES module', +}; diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/entry.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/entry.js new file mode 100644 index 000000000..51016a8e7 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/entry.js @@ -0,0 +1,2 @@ +Object.defineProperty(exports, '__esModule', { value: true }); +exports.named = 'named'; diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/main.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/main.js new file mode 100644 index 000000000..70f090348 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/main.js @@ -0,0 +1,8 @@ +import * as entry from './proxy'; + +t.deepEqual(entry, { + default: { + named: 'named', + }, + named: 'named' +}); diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/proxy.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/proxy.js new file mode 100644 index 000000000..e9fb5b056 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-entry-named/proxy.js @@ -0,0 +1 @@ +module.exports = require('./entry'); diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/_config.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/_config.js new file mode 100644 index 000000000..8f05f508a --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'creates the correct exports from CJS module re-exporting a transpiled ES module', +}; diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/dep.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/dep.js new file mode 100644 index 000000000..1522ddc2b --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/dep.js @@ -0,0 +1,3 @@ +Object.defineProperty(exports, '__esModule', { value: true }); +exports.named = 'named'; +exports.default = 'default'; diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/main.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/main.js new file mode 100644 index 000000000..3209dd8a0 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/main.js @@ -0,0 +1,4 @@ +import dep, { named } from './proxy'; + +t.is(dep, 'default'); +t.is(named, 'named'); diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/proxy.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/proxy.js new file mode 100644 index 000000000..4e05226db --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-mixed/proxy.js @@ -0,0 +1 @@ +module.exports = require('./dep'); diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/_config.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/_config.js new file mode 100644 index 000000000..8f05f508a --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'creates the correct exports from CJS module re-exporting a transpiled ES module', +}; diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/dep.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/dep.js new file mode 100644 index 000000000..51016a8e7 --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/dep.js @@ -0,0 +1,2 @@ +Object.defineProperty(exports, '__esModule', { value: true }); +exports.named = 'named'; diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/main.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/main.js new file mode 100644 index 000000000..070b383ed --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/main.js @@ -0,0 +1,3 @@ +import { named } from './proxy'; + +t.is(named, 'named'); diff --git a/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/proxy.js b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/proxy.js new file mode 100644 index 000000000..4e05226db --- /dev/null +++ b/packages/commonjs/test/fixtures/function/transpiled-esm-reexported-named/proxy.js @@ -0,0 +1 @@ +module.exports = require('./dep'); diff --git a/packages/commonjs/test/snapshots/function.js.md b/packages/commonjs/test/snapshots/function.js.md index f34b58c15..8f39e945e 100644 --- a/packages/commonjs/test/snapshots/function.js.md +++ b/packages/commonjs/test/snapshots/function.js.md @@ -1199,6 +1199,130 @@ Generated by [AVA](https://avajs.dev). `, } +## dynamic-require-empty + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var submodule = {};␊ + ␊ + var hasRequiredSubmodule;␊ + ␊ + function requireSubmodule () {␊ + if (hasRequiredSubmodule) return submodule;␊ + hasRequiredSubmodule = 1;␊ + ␊ + return submodule;␊ + }␊ + ␊ + var dynamicModules;␊ + ␊ + function getDynamicModules() {␊ + return dynamicModules || (dynamicModules = {␊ + "/fixtures/function/dynamic-require-empty/submodule.js": requireSubmodule␊ + });␊ + }␊ + ␊ + function createCommonjsRequire(originalModuleDir) {␊ + function handleRequire(path) {␊ + var resolvedPath = commonjsResolve(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.');␊ + }␊ + handleRequire.resolve = function (path) {␊ + var resolvedPath = commonjsResolve(path, originalModuleDir);␊ + if (resolvedPath !== null) {␊ + return resolvedPath;␊ + }␊ + return require.resolve(path);␊ + };␊ + return handleRequire;␊ + }␊ + ␊ + function commonjsResolve (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 */␊ + ␊ + function takeModule(withName) {␊ + return createCommonjsRequire("/fixtures/function/dynamic-require-empty")(`./${withName}`);␊ + }␊ + ␊ + t.deepEqual(takeModule('submodule'), {});␊ + ␊ + module.exports = main;␊ + `, + } + ## dynamic-require-es-entry > Snapshot 1 @@ -5127,13 +5251,17 @@ Generated by [AVA](https://avajs.dev). { 'main.js': `'use strict';␊ ␊ + var reexport = {exports: {}};␊ + ␊ var _export = {};␊ ␊ _export.named = 2;␊ ␊ - var reexport = _export;␊ + (function (module) {␊ + module.exports = _export;␊ + } (reexport));␊ ␊ - t.is(reexport.named, 2);␊ + t.is(reexport.exports.named, 2);␊ `, } @@ -5413,11 +5541,21 @@ Generated by [AVA](https://avajs.dev). ␊ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};␊ ␊ + function getDefaultExportFromCjs (x) {␊ + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;␊ + }␊ + ␊ + var main$1 = {exports: {}};␊ + ␊ t.is(commonjsGlobal.entryDetected, true);␊ var dep = 'dep';␊ ␊ - t.is(commonjsGlobal.entryDetected, true);␊ - var main = dep;␊ + (function (module) {␊ + t.is(commonjsGlobal.entryDetected, true);␊ + module.exports = dep;␊ + } (main$1));␊ + ␊ + var main = /*@__PURE__*/getDefaultExportFromCjs(main$1.exports);␊ ␊ module.exports = main;␊ `, @@ -7340,6 +7478,236 @@ Generated by [AVA](https://avajs.dev). `, } +## transpiled-esm-reexported-default + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + function getDefaultExportFromCjs (x) {␊ + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;␊ + }␊ + ␊ + var proxy = {exports: {}};␊ + ␊ + var dep$1 = {};␊ + ␊ + Object.defineProperty(dep$1, '__esModule', { value: true });␊ + dep$1.default = 'default';␊ + ␊ + (function (module) {␊ + module.exports = dep$1;␊ + } (proxy));␊ + ␊ + var dep = /*@__PURE__*/getDefaultExportFromCjs(proxy.exports);␊ + ␊ + t.is(dep, 'default');␊ + `, + } + +## transpiled-esm-reexported-entry-default + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + function _mergeNamespaces(n, m) {␊ + m.forEach(function (e) {␊ + e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {␊ + if (k !== 'default' && !(k in n)) {␊ + var d = Object.getOwnPropertyDescriptor(e, k);␊ + Object.defineProperty(n, k, d.get ? d : {␊ + enumerable: true,␊ + get: function () { return e[k]; }␊ + });␊ + }␊ + });␊ + });␊ + return Object.freeze(n);␊ + }␊ + ␊ + function getDefaultExportFromCjs (x) {␊ + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;␊ + }␊ + ␊ + var proxy$1 = {exports: {}};␊ + ␊ + var entry$1 = {};␊ + ␊ + Object.defineProperty(entry$1, '__esModule', { value: true });␊ + entry$1.default = 'default';␊ + ␊ + (function (module) {␊ + module.exports = entry$1;␊ + } (proxy$1));␊ + ␊ + var proxy = /*@__PURE__*/getDefaultExportFromCjs(proxy$1.exports);␊ + ␊ + var entry = /*#__PURE__*/Object.freeze(/*#__PURE__*/_mergeNamespaces({␊ + __proto__: null,␊ + 'default': proxy␊ + }, [proxy$1.exports]));␊ + ␊ + t.deepEqual(entry, { default: 'default' });␊ + `, + } + +## transpiled-esm-reexported-entry-mixed + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + function _mergeNamespaces(n, m) {␊ + m.forEach(function (e) {␊ + e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {␊ + if (k !== 'default' && !(k in n)) {␊ + var d = Object.getOwnPropertyDescriptor(e, k);␊ + Object.defineProperty(n, k, d.get ? d : {␊ + enumerable: true,␊ + get: function () { return e[k]; }␊ + });␊ + }␊ + });␊ + });␊ + return Object.freeze(n);␊ + }␊ + ␊ + function getDefaultExportFromCjs (x) {␊ + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;␊ + }␊ + ␊ + var proxy$1 = {exports: {}};␊ + ␊ + var entry$1 = {};␊ + ␊ + Object.defineProperty(entry$1, '__esModule', { value: true });␊ + entry$1.default = 'default';␊ + entry$1.named = 'named';␊ + ␊ + (function (module) {␊ + module.exports = entry$1;␊ + } (proxy$1));␊ + ␊ + var proxy = /*@__PURE__*/getDefaultExportFromCjs(proxy$1.exports);␊ + ␊ + var entry = /*#__PURE__*/Object.freeze(/*#__PURE__*/_mergeNamespaces({␊ + __proto__: null,␊ + 'default': proxy␊ + }, [proxy$1.exports]));␊ + ␊ + t.deepEqual(entry, { default: 'default', named: 'named' });␊ + `, + } + +## transpiled-esm-reexported-entry-named + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + function _mergeNamespaces(n, m) {␊ + m.forEach(function (e) {␊ + e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {␊ + if (k !== 'default' && !(k in n)) {␊ + var d = Object.getOwnPropertyDescriptor(e, k);␊ + Object.defineProperty(n, k, d.get ? d : {␊ + enumerable: true,␊ + get: function () { return e[k]; }␊ + });␊ + }␊ + });␊ + });␊ + return Object.freeze(n);␊ + }␊ + ␊ + function getDefaultExportFromCjs (x) {␊ + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;␊ + }␊ + ␊ + var proxy$1 = {exports: {}};␊ + ␊ + var entry$1 = {};␊ + ␊ + Object.defineProperty(entry$1, '__esModule', { value: true });␊ + entry$1.named = 'named';␊ + ␊ + (function (module) {␊ + module.exports = entry$1;␊ + } (proxy$1));␊ + ␊ + var proxy = /*@__PURE__*/getDefaultExportFromCjs(proxy$1.exports);␊ + ␊ + var entry = /*#__PURE__*/Object.freeze(/*#__PURE__*/_mergeNamespaces({␊ + __proto__: null,␊ + 'default': proxy␊ + }, [proxy$1.exports]));␊ + ␊ + t.deepEqual(entry, {␊ + default: {␊ + named: 'named',␊ + },␊ + named: 'named'␊ + });␊ + `, + } + +## transpiled-esm-reexported-mixed + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + function getDefaultExportFromCjs (x) {␊ + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;␊ + }␊ + ␊ + var proxy = {exports: {}};␊ + ␊ + var dep$1 = {};␊ + ␊ + Object.defineProperty(dep$1, '__esModule', { value: true });␊ + dep$1.named = 'named';␊ + dep$1.default = 'default';␊ + ␊ + (function (module) {␊ + module.exports = dep$1;␊ + } (proxy));␊ + ␊ + var dep = /*@__PURE__*/getDefaultExportFromCjs(proxy.exports);␊ + ␊ + t.is(dep, 'default');␊ + t.is(proxy.exports.named, 'named');␊ + `, + } + +## transpiled-esm-reexported-named + +> Snapshot 1 + + { + 'main.js': `'use strict';␊ + ␊ + var proxy = {exports: {}};␊ + ␊ + var dep = {};␊ + ␊ + Object.defineProperty(dep, '__esModule', { value: true });␊ + dep.named = 'named';␊ + ␊ + (function (module) {␊ + module.exports = dep;␊ + } (proxy));␊ + ␊ + t.is(proxy.exports.named, 'named');␊ + `, + } + ## transpiled-esm-required > Snapshot 1 @@ -7590,130 +7958,6 @@ Generated by [AVA](https://avajs.dev). `, } -## dynamic-require-empty - -> Snapshot 1 - - { - 'main.js': `'use strict';␊ - ␊ - var submodule = {};␊ - ␊ - var hasRequiredSubmodule;␊ - ␊ - function requireSubmodule () {␊ - if (hasRequiredSubmodule) return submodule;␊ - hasRequiredSubmodule = 1;␊ - ␊ - return submodule;␊ - }␊ - ␊ - var dynamicModules;␊ - ␊ - function getDynamicModules() {␊ - return dynamicModules || (dynamicModules = {␊ - "/fixtures/function/dynamic-require-empty/submodule.js": requireSubmodule␊ - });␊ - }␊ - ␊ - function createCommonjsRequire(originalModuleDir) {␊ - function handleRequire(path) {␊ - var resolvedPath = commonjsResolve(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.');␊ - }␊ - handleRequire.resolve = function (path) {␊ - var resolvedPath = commonjsResolve(path, originalModuleDir);␊ - if (resolvedPath !== null) {␊ - return resolvedPath;␊ - }␊ - return require.resolve(path);␊ - };␊ - return handleRequire;␊ - }␊ - ␊ - function commonjsResolve (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 */␊ - ␊ - function takeModule(withName) {␊ - return createCommonjsRequire("/fixtures/function/dynamic-require-empty")(`./${withName}`);␊ - }␊ - ␊ - t.deepEqual(takeModule('submodule'), {});␊ - ␊ - module.exports = main;␊ - `, - } - ## warn-this-resolve-without-options > Snapshot 1 diff --git a/packages/commonjs/test/snapshots/function.js.snap b/packages/commonjs/test/snapshots/function.js.snap index e9e8b3c332571bd81f28f7d9518ab356eac84fac..4d687e69aea4cbc6f3658f10391fa106ce60ef3d 100644 GIT binary patch literal 22705 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 xu;hb?kclE;K>nwIU-7`EDJ?JG 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 diff --git a/packages/commonjs/test/snapshots/test.js.md b/packages/commonjs/test/snapshots/test.js.md index 63fc433c8..a3a119159 100644 --- a/packages/commonjs/test/snapshots/test.js.md +++ b/packages/commonjs/test/snapshots/test.js.md @@ -10,9 +10,19 @@ Generated by [AVA](https://avajs.dev). `'use strict';␊ ␊ + function getDefaultExportFromCjs (x) {␊ + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;␊ + }␊ + ␊ + var main$1 = {exports: {}};␊ + ␊ var require$$0 = "default";␊ ␊ - var main = require$$0;␊ + (function (module) {␊ + module.exports = require$$0;␊ + } (main$1));␊ + ␊ + var main = /*@__PURE__*/getDefaultExportFromCjs(main$1.exports);␊ ␊ module.exports = main;␊ ` @@ -23,6 +33,10 @@ Generated by [AVA](https://avajs.dev). `'use strict';␊ ␊ + function getDefaultExportFromCjs (x) {␊ + return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;␊ + }␊ + ␊ function getAugmentedNamespace(n) {␊ var f = n.default;␊ if (typeof f == "function") {␊ @@ -44,6 +58,8 @@ Generated by [AVA](https://avajs.dev). return a;␊ }␊ ␊ + var main$1 = {exports: {}};␊ + ␊ const value = "value";␊ ␊ var esm = /*#__PURE__*/Object.freeze({␊ @@ -53,7 +69,11 @@ Generated by [AVA](https://avajs.dev). ␊ var require$$0 = /*@__PURE__*/getAugmentedNamespace(esm);␊ ␊ - var main = require$$0;␊ + (function (module) {␊ + module.exports = require$$0;␊ + } (main$1));␊ + ␊ + var main = /*@__PURE__*/getDefaultExportFromCjs(main$1.exports);␊ ␊ module.exports = main;␊ ` diff --git a/packages/commonjs/test/snapshots/test.js.snap b/packages/commonjs/test/snapshots/test.js.snap index dbca1b612c8afce4e7b746e26997480a0f0409e6..925f06c48650e6d14011e754110468985cd90c6d 100644 GIT binary patch literal 1558 zcmV+x2I=`hRzVF00000000B+ zR$FKsRT!Slwhg-$idHCSEWc^(%qE*jBVKonwV1SmsV!|S$aWcLch2liGCQ-KOS`em zgA^)C6`^=}Q1FHniY;xyD_HT`2a#4^m7qesynA^l;(yMW%kE|qLh+$U0<)R<&wu^? z%lQi_LC6XN<=gt_9^ZHOOBc>w?%(k8t4PGZ?fC3HvTgjBepIk8>95V*^2)awx;{jJZ}JbCflW6#{AU3_;_iczbp@Z_i8 zKQ$)GH-A{%Ju`6J{x!v@Klcm5d#nHWIN!hJ{FUQBtSfGNcrMMT?_~M2?mGSqtQLfC zCiW=Ci=$I#w~U+X-!fiEG3u2yg7E#1CqKKaJ^S6$(r?f2eEaBKX-56>2L5bb%bz=M z6oj@jCl<5Ws%^QpNo3QmNuoxYVy>ImPz{Sx+tu`)NOkGi zS(zqPPu7TTSY(%DH;LoTN~G1a9nZ~!s3^qUVQaog#5^2^gR1G10(g#3AfP4>st!;~ zFb;>?M(!P|SC@6uwjGJRI;y4F4JijhAQ>$Gbij z`ldHn4&{o`(P9devCg#h%)SShb`%te+n}@t%aRQd8_wL!(137L-_>b{A69 z?N8r8cNvA6HjYJgKnZo#-AxYohC{Ro>Pu1v4ksfOB%0BTp@Y=PoKMEoHR; zVnxj3TLs^$Vm9dNDm;;883owMJd3=jIgRnIKpqUQ6kaCOX0>knrUn%PmJK!2uBc|L2g6V;nA`*0U7FM&nnegd^+Rph!jQ45f}mH0$GOHsDGo&9z%Z}pr8JR8d&tUc<+?7p(V+*D zs$2kAs6{L4QmXK5RFLH zAPYT1WmH;|F)*ASrBavGX49ONyt?7iYq922<1~^?CZIoRl2NKA`C>OG5EBDY!@B^W z_mZK`TQAzS3%XonLb(|->teJrE(w!rwceJ_nIs(A^dUdO)mCB?#H~6;)58|B@-V|< zSkR%FJZMxNi%_E@i(*17jNYNU40kP0iO5r!4_}0zRhlVNJDGq2MoqGx@Kj~>-0Kc+ zzeYReU+A#z5b^|((3YYw$Q7jkmT#JQb`=(=a5mn{IvS$8aC;OKvz%LSC@yg2&9CIt z{@&X`v>V`S$Cce-Fg#ph&-^JYZt6c>Ll#*==B*%0T0lDH8uVgb5(t;l*Yx0C9%KLK zF}CQn%x4_KgWk#PWiV_@9C=qU!zx2Lz IcyAQ|0IT-=8UO$Q literal 1442 zcmV;T1zq|gCk3Dey)4x|L%O{r(FD3tq3H0q=Nm@B|WbTU_p1yGA@#k*UFTB?u6KHue?)?1w zXXZ%pwvX}$rnVk)evJwAJg)bz`{R>L-|*Rgj{SH`e(xg};{rXN2o{DZR`0cv^!3O= z%{-nRJ3TyPZF|RjDJIZwu9u`Aep>$glK%Yn&nmyYIR5V9J#m4)dSkHSTY`1XP56}h z1WU1AX-n*W*>@?p9y80HoKGgpj_o=YRV}BY$U3dbsZMa3m^MdS)%2W*b?6x{P13Tb z>eMi8I>DS8W!}6(=V}h~+ziN?M&136?psvOzyiz=%cnW;m`|b3P0kPo+!74ILLI-e zX`rrU+TMU}x};=LNN1Bt!?(+x>Db^_eZ#Qm9>&PLLileA7Lovl!$7g92PP^KxN1?m z;#FY)2J?tM2)pqyFc2IE;GudjiKq7yuc{iB<1j_MGGgn_w331}C?@QJ!4&$*MG8W1 z!7OG13x&yI5#p^&}K5K(0!Q)k1QN&t5k%o}K!geH<_?EZ57|P|N zt;;FU2HVrtHTxc5+EGxZ?li}yMV8c1J#OH3hnjqc8Xg^<5<$u3Np~$Zo&NM}?JT2E z)6T)D4meOH?g9FwZ!)Tna9^5bzycUiP!E!` z;>rxi5x3y3!A7zXLO^UF#!EdSE>w31r_Z;8CalXrkMpX`nFX89!YE_d+~h-5$}p={ z$G3DSQLr7TSWbyp4LukJv0?Ne1n%;r)}vm8^m9Lm3lYWjj!G^3U)41DTZ^}K67_LU zhowg0Rj9YeuS`=+w*DxYrf!XtsbU9&2zF7Ut%iQ&gT4`xiCgGmq-wipD+w+`IQfx< zpxq>*E?}snRQi?(jU)H9l)cc1EaMW@gR9TCp=QC1P09 zp{We$TpsVH&hIAYgxVNA<3l@eEyF=PlUq$+#GhT5DsnrCIwy>q6hGlE5%t$?ShdcJ zwu>G*Y%ofnq6*s5G(owh<-qnWDqalc|ZL_J(V7R%?JM*V>c~e()-d<+fu9~&$nzW5M+fH`N;f=sJ=jOCpml`wiN}?<5462z^Vq25jY{4afg2<6DvrSa06tc_3PKYA0M4P&;Q#;t