From c583aafcd6f4c0515a52cbf1995b02f008c06950 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Mon, 7 Feb 2022 07:13:23 +0100 Subject: [PATCH] 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