From 2aa37609d762da92641f41e1e00a416d5dade0dc Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Sun, 21 Aug 2022 06:49:21 +0200 Subject: [PATCH] fix(node-resolve): preserve moduleSideEffects when re-resolving files --- packages/node-resolve/package.json | 6 +- packages/node-resolve/src/index.js | 71 +++++--- packages/node-resolve/test/side-effects.js | 137 ++++++++++++++ .../test/snapshots/side-effects.js.md | 82 +++++++++ .../test/snapshots/side-effects.js.snap | Bin 0 -> 449 bytes packages/node-resolve/test/test.js | 171 +++++++++--------- pnpm-lock.yaml | 88 +++++---- 7 files changed, 406 insertions(+), 149 deletions(-) create mode 100755 packages/node-resolve/test/side-effects.js create mode 100644 packages/node-resolve/test/snapshots/side-effects.js.md create mode 100644 packages/node-resolve/test/snapshots/side-effects.js.snap diff --git a/packages/node-resolve/package.json b/packages/node-resolve/package.json index c0f1a4dd6..cfacac87a 100644 --- a/packages/node-resolve/package.json +++ b/packages/node-resolve/package.json @@ -52,7 +52,7 @@ "modules" ], "peerDependencies": { - "rollup": "^2.42.0" + "rollup": "^2.78.0" }, "dependencies": { "@rollup/pluginutils": "^3.1.0", @@ -66,10 +66,10 @@ "@babel/core": "^7.10.5", "@babel/plugin-transform-typescript": "^7.10.5", "@rollup/plugin-babel": "^5.1.0", - "@rollup/plugin-commonjs": "^16.0.0", + "@rollup/plugin-commonjs": "^22.0.2", "@rollup/plugin-json": "^4.1.0", "es5-ext": "^0.10.53", - "rollup": "^2.67.3", + "rollup": "^2.78.1", "source-map": "^0.7.3", "string-capitalize": "^1.0.1" }, diff --git a/packages/node-resolve/src/index.js b/packages/node-resolve/src/index.js index 74cdaf025..637412316 100644 --- a/packages/node-resolve/src/index.js +++ b/packages/node-resolve/src/index.js @@ -82,7 +82,7 @@ export function nodeResolve(opts = {}) { const browserMapCache = new Map(); let preserveSymlinks; - const doResolveId = async (context, importee, importer, custom) => { + const resolveLikeNode = async (context, importee, importer, custom) => { // strip query params from import const [importPath, params] = importee.split('?'); const importSuffix = `${params ? `?${params}` : ''}`; @@ -257,39 +257,52 @@ export function nodeResolve(opts = {}) { isDirCached.clear(); }, - async resolveId(importee, importer, resolveOptions) { - if (importee === ES6_BROWSER_EMPTY) { - return importee; - } - // ignore IDs with null character, these belong to other plugins - if (/\0/.test(importee)) return null; + resolveId: { + order: 'post', + async handler(importee, importer, resolveOptions) { + if (importee === ES6_BROWSER_EMPTY) { + return importee; + } + // ignore IDs with null character, these belong to other plugins + if (/\0/.test(importee)) return null; - if (/\0/.test(importer)) { - importer = undefined; - } + const { custom = {} } = resolveOptions; + const { 'node-resolve': { resolved: alreadyResolved } = {} } = custom; + if (alreadyResolved) { + return alreadyResolved; + } - const resolved = await doResolveId(this, importee, importer, resolveOptions.custom); - if (resolved) { - const resolvedResolved = await this.resolve( - resolved.id, - importer, - Object.assign({ skipSelf: true }, resolveOptions) - ); - if (resolvedResolved) { - // Handle plugins that manually make the result external - if (resolvedResolved.external) { - return false; - } - // Allow other plugins to take over resolution. Rollup core will not - // change the id if it corresponds to an existing file - if (resolvedResolved.id !== resolved.id) { - return resolvedResolved; + if (/\0/.test(importer)) { + importer = undefined; + } + + const resolved = await resolveLikeNode(this, importee, importer, custom); + if (resolved) { + // This way, plugins may attach additional meta information to the + // resolved id or make it external. We do not skip node-resolve here + // because another plugin might again use `this.resolve` in its + // `resolveId` hook, in which case we want to add the correct + // `moduleSideEffects` information. + const resolvedResolved = await this.resolve(resolved.id, importer, { + ...resolveOptions, + custom: { ...custom, 'node-resolve': { resolved } } + }); + if (resolvedResolved) { + // Handle plugins that manually make the result external + if (resolvedResolved.external) { + return false; + } + // Allow other plugins to take over resolution. Rollup core will not + // change the id if it corresponds to an existing file + if (resolvedResolved.id !== resolved.id) { + return resolvedResolved; + } + // Pass on meta information added by other plugins + return { ...resolved, meta: resolvedResolved.meta }; } - // Pass on meta information added by other plugins - return { ...resolved, meta: resolvedResolved.meta }; } + return resolved; } - return resolved; }, load(importee) { diff --git a/packages/node-resolve/test/side-effects.js b/packages/node-resolve/test/side-effects.js new file mode 100755 index 000000000..8415e42fa --- /dev/null +++ b/packages/node-resolve/test/side-effects.js @@ -0,0 +1,137 @@ +import { join } from 'path'; + +import test from 'ava'; +import { rollup } from 'rollup'; + +import commonjs from '@rollup/plugin-commonjs'; + +import { nodeResolve } from '..'; +import { getCode, testBundle } from '../../../util/test'; + +process.chdir(join(__dirname, 'fixtures')); + +const failOnWarn = (t) => (warning) => + t.fail(`No warnings were expected, got:\n${warning.code}\n${warning.message}`); + +test('respects the package.json sideEffects property for files in root package by default', async (t) => { + const bundle = await rollup({ + input: 'root-package-side-effect/index.js', + onwarn: failOnWarn(t), + plugins: [ + nodeResolve({ + rootDir: 'root-package-side-effect' + }) + ] + }); + + const code = await getCode(bundle); + t.false(code.includes('side effect')); + t.snapshot(code); +}); + +test('respects the package.json sideEffects when commonjs plugin is used', async (t) => { + const bundle = await rollup({ + input: 'root-package-side-effect/index.js', + onwarn: failOnWarn(t), + plugins: [ + commonjs(), + nodeResolve({ + rootDir: 'root-package-side-effect' + }) + ] + }); + + const code = await getCode(bundle); + t.false(code.includes('side effect')); + t.snapshot(code); +}); + +test('respects the package.json sideEffects when when another plugin uses this.load it its resolveId hook', async (t) => { + const bundle = await rollup({ + input: 'root-package-side-effect/index.js', + onwarn: failOnWarn(t), + plugins: [ + { + name: 'test', + async resolveId(source, importer, resolveOptions) { + const resolved = await this.resolve(source, importer, { + ...resolveOptions, + skipSelf: true + }); + // This starts loading the module and fixes the value of + // `moduleSideEffects` with whatever is contained in "resolved" + await this.load(resolved); + return resolved; + } + }, + nodeResolve({ + rootDir: 'root-package-side-effect' + }) + ] + }); + + const code = await getCode(bundle); + t.false(code.includes('side effect')); + t.snapshot(code); +}); + +test('respects the package.json sideEffects property for files in the root package and supports deep side effects', async (t) => { + const bundle = await rollup({ + input: 'deep-side-effects/index.js', + onwarn: failOnWarn(t), + plugins: [ + nodeResolve({ + rootDir: 'deep-side-effects' + }) + ] + }); + const code = await getCode(bundle); + t.true(code.includes('shallow side effect')); + t.true(code.includes('deep side effect')); + t.snapshot(code); +}); + +test('does not prefix the sideEffects property if the side effect contains a "/"', async (t) => { + const bundle = await rollup({ + input: 'deep-side-effects-with-specific-side-effects/index.js', + onwarn: failOnWarn(t), + plugins: [ + nodeResolve({ + rootDir: 'deep-side-effects-with-specific-side-effects' + }) + ] + }); + const code = await getCode(bundle); + t.true(code.includes('shallow side effect')); + t.false(code.includes('deep side effects')); + t.snapshot(code); +}); + +test('ignores the package.json sideEffects property for files in root package with "ignoreSideEffectsForRoot" option', async (t) => { + const bundle = await rollup({ + input: 'root-package-side-effect/index.js', + onwarn: failOnWarn(t), + plugins: [ + nodeResolve({ + rootDir: 'root-package-side-effect', + ignoreSideEffectsForRoot: true + }) + ] + }); + + const code = await getCode(bundle); + t.true(code.includes('side effect')); + t.snapshot(code); +}); + +test('handles package side-effects', async (t) => { + const bundle = await rollup({ + input: 'side-effects.js', + onwarn: failOnWarn(t), + plugins: [nodeResolve()] + }); + await testBundle(t, bundle); + t.snapshot(global.sideEffects); + + delete global.sideEffects; +}); diff --git a/packages/node-resolve/test/snapshots/side-effects.js.md b/packages/node-resolve/test/snapshots/side-effects.js.md new file mode 100644 index 000000000..228e59801 --- /dev/null +++ b/packages/node-resolve/test/snapshots/side-effects.js.md @@ -0,0 +1,82 @@ +# Snapshot report for `test/side-effects.js` + +The actual snapshot is saved in `side-effects.js.snap`. + +Generated by [AVA](https://avajs.dev). + +## respects the package.json sideEffects property for files in root package by default + +> Snapshot 1 + + `'use strict';␊ + ␊ + console.log('main');␊ + ` + +## respects the package.json sideEffects when commonjs plugin is used + +> Snapshot 1 + + `'use strict';␊ + ␊ + console.log('main');␊ + ` + +## respects the package.json sideEffects when when another plugin uses this.load it its resolveId hook + +> Snapshot 1 + + `'use strict';␊ + ␊ + console.log('main');␊ + ` + +## respects the package.json sideEffects property for files in the root package and supports deep side effects + +> Snapshot 1 + + `'use strict';␊ + ␊ + console.log('deep side effect');␊ + ␊ + console.log('shallow side effect');␊ + ␊ + console.log('main');␊ + ` + +## does not prefix the sideEffects property if the side effect contains a "/" + +> Snapshot 1 + + `'use strict';␊ + ␊ + console.log('shallow side effect');␊ + ␊ + console.log('main');␊ + ` + +## ignores the package.json sideEffects property for files in root package with "ignoreSideEffectsForRoot" option + +> Snapshot 1 + + `'use strict';␊ + ␊ + console.log('side effect');␊ + ␊ + console.log('main');␊ + ` + +## handles package side-effects + +> Snapshot 1 + + [ + 'array-dep1', + 'array-dep3', + 'array-dep5', + 'array-index', + 'false-dep1', + 'true-dep1', + 'true-dep2', + 'true-index', + ] diff --git a/packages/node-resolve/test/snapshots/side-effects.js.snap b/packages/node-resolve/test/snapshots/side-effects.js.snap new file mode 100644 index 0000000000000000000000000000000000000000..a095c83e5a8308c2aa01dde31fe25d7389884546 GIT binary patch literal 449 zcmV;y0Y3ggRzVoq<(6yuF8O|9+oQ+G00NajZ0yU``AEcgOM`9MiG?$}&N6~UPXKY( zu}B&B*Ma}M&YFq%t39(}1dILx;%?D{)7^5evGSF!723MfubL4os>Z~?F!kV@au@rh zsk@ji{kz|^^(Z4)Gy;g%7_rD&E6*33<(R$3@%^)2MzClX5N~lYc~HA`{y(F9hNiw0 zzAubm(T70H40JgNFtRcTGG?on7N;r{mlS0tm#ABFaV6*H73b%q>gD98YpAEBrWPm^ zXQreoq^6~%0u^YYt0>M$%*n|w$FC?iF*6S&iej-NK8r~=P6eNF7&g(@CQLa~m>e@qjvFGEnU|7U0h45bYfMYbDNaSPkQFA! rSyEJrD#eB&WdxIAhnonN0^3GG=#rMNGor literal 0 HcmV?d00001 diff --git a/packages/node-resolve/test/test.js b/packages/node-resolve/test/test.js index 9c08ce211..d81d13b27 100755 --- a/packages/node-resolve/test/test.js +++ b/packages/node-resolve/test/test.js @@ -1,14 +1,15 @@ -import { join, resolve, dirname } from 'path'; +import { dirname, join, resolve } from 'path'; -import test from 'ava'; -import { rollup } from 'rollup'; import babel from '@rollup/plugin-babel'; import commonjs from '@rollup/plugin-commonjs'; -import { getCode, getImports, testBundle } from '../../../util/test'; +import test from 'ava'; +import { rollup } from 'rollup'; import { nodeResolve } from '..'; +import { getCode, getImports, testBundle } from '../../../util/test'; + process.chdir(join(__dirname, 'fixtures')); const failOnWarn = (t) => (warning) => @@ -185,7 +186,7 @@ test('handles package.json being a directory earlier in the path', async (t) => }); test('ignores IDs with null character', async (t) => { - const result = await nodeResolve().resolveId('\0someid', 'test.js', {}); + const result = await nodeResolve().resolveId.handler('\0someid', 'test.js', {}); t.is(result, null); }); @@ -306,83 +307,6 @@ test('resolves dynamic imports', async (t) => { t.is(result.default, 42); }); -test('respects the package.json sideEffects property for files in root package by default', async (t) => { - const bundle = await rollup({ - input: 'root-package-side-effect/index.js', - onwarn: failOnWarn(t), - plugins: [ - nodeResolve({ - rootDir: 'root-package-side-effect' - }) - ] - }); - - const code = await getCode(bundle); - t.false(code.includes('side effect')); - t.snapshot(code); -}); - -test('respects the package.json sideEffects property for files in the root package and supports deep side effects', async (t) => { - const bundle = await rollup({ - input: 'deep-side-effects/index.js', - onwarn: failOnWarn(t), - plugins: [ - nodeResolve({ - rootDir: 'deep-side-effects' - }) - ] - }); - const code = await getCode(bundle); - t.true(code.includes('shallow side effect')); - t.true(code.includes('deep side effect')); - t.snapshot(code); -}); - -test('does not prefix the sideEffects property if the side effect contains a "/"', async (t) => { - const bundle = await rollup({ - input: 'deep-side-effects-with-specific-side-effects/index.js', - onwarn: failOnWarn(t), - plugins: [ - nodeResolve({ - rootDir: 'deep-side-effects-with-specific-side-effects' - }) - ] - }); - const code = await getCode(bundle); - t.true(code.includes('shallow side effect')); - t.false(code.includes('deep side effects')); - t.snapshot(code); -}); - -test('ignores the package.json sideEffects property for files in root package with "ignoreSideEffectsForRoot" option', async (t) => { - const bundle = await rollup({ - input: 'root-package-side-effect/index.js', - onwarn: failOnWarn(t), - plugins: [ - nodeResolve({ - rootDir: 'root-package-side-effect', - ignoreSideEffectsForRoot: true - }) - ] - }); - - const code = await getCode(bundle); - t.true(code.includes('side effect')); - t.snapshot(code); -}); - -test('handles package side-effects', async (t) => { - const bundle = await rollup({ - input: 'side-effects.js', - onwarn: failOnWarn(t), - plugins: [nodeResolve()] - }); - await testBundle(t, bundle); - t.snapshot(global.sideEffects); - - delete global.sideEffects; -}); - test('can resolve imports with hash in path', async (t) => { const bundle = await rollup({ input: 'hash-in-path.js', @@ -526,7 +450,52 @@ test('passes on "isEntry" flag', async (t) => { t.deepEqual(resolveOptions, [ ['other.js', 'main.js', { custom: {}, isEntry: true }], ['main.js', void 0, { custom: {}, isEntry: true }], - ['dep.js', 'main.js', { custom: {}, isEntry: false }] + [ + 'other.js', + 'main.js', + { + custom: { + 'node-resolve': { + resolved: { + id: join(__dirname, 'fixtures', 'entry', 'other.js'), + moduleSideEffects: null + } + } + }, + isEntry: true + } + ], + [ + 'main.js', + void 0, + { + custom: { + 'node-resolve': { + resolved: { + id: join(__dirname, 'fixtures', 'entry', 'main.js'), + moduleSideEffects: null + } + } + }, + isEntry: true + } + ], + ['dep.js', 'main.js', { custom: {}, isEntry: false }], + [ + 'dep.js', + 'main.js', + { + custom: { + 'node-resolve': { + resolved: { + id: join(__dirname, 'fixtures', 'entry', 'dep.js'), + moduleSideEffects: null + } + } + }, + isEntry: false + } + ] ]); }); @@ -554,7 +523,38 @@ test('passes on custom options', async (t) => { }); t.deepEqual(resolveOptions, [ ['main.js', void 0, { custom: { test: 42 }, isEntry: false }], - ['other.js', void 0, { custom: {}, isEntry: true }] + [ + 'main.js', + void 0, + { + custom: { + test: 42, + 'node-resolve': { + resolved: { + id: join(__dirname, 'fixtures', 'entry', 'main.js'), + moduleSideEffects: null + } + } + }, + isEntry: false + } + ], + ['other.js', void 0, { custom: {}, isEntry: true }], + [ + 'other.js', + void 0, + { + custom: { + 'node-resolve': { + resolved: { + id: join(__dirname, 'fixtures', 'entry', 'other.js'), + moduleSideEffects: null + } + } + }, + isEntry: true + } + ] ]); }); @@ -591,7 +591,8 @@ test('allow other plugins to take over resolution', async (t) => { { name: 'change-resolution', resolveId(importee) { - if (importee.endsWith('main.js')) { + // Only resolve if the id has been pre-resolved by node-resolve + if (importee === join(__dirname, 'fixtures', 'entry', 'main.js')) { return { id: join(dirname(importee), 'other.js'), meta: { 'change-resolution': 'changed' } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0cdd7fee9..8bcd9d76c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: 5.3 +lockfileVersion: 5.4 importers: @@ -372,7 +372,7 @@ importers: '@babel/core': ^7.10.5 '@babel/plugin-transform-typescript': ^7.10.5 '@rollup/plugin-babel': ^5.1.0 - '@rollup/plugin-commonjs': ^16.0.0 + '@rollup/plugin-commonjs': ^22.0.2 '@rollup/plugin-json': ^4.1.0 '@rollup/pluginutils': ^3.1.0 '@types/resolve': 1.17.1 @@ -381,11 +381,11 @@ importers: is-builtin-module: ^3.1.0 is-module: ^1.0.0 resolve: ^1.19.0 - rollup: ^2.67.3 + rollup: ^2.78.1 source-map: ^0.7.3 string-capitalize: ^1.0.1 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.67.3 + '@rollup/pluginutils': 3.1.0_rollup@2.78.1 '@types/resolve': 1.17.1 deepmerge: 4.2.2 is-builtin-module: 3.1.0 @@ -394,11 +394,11 @@ importers: devDependencies: '@babel/core': 7.12.3 '@babel/plugin-transform-typescript': 7.12.1_@babel+core@7.12.3 - '@rollup/plugin-babel': 5.3.0_@babel+core@7.12.3+rollup@2.67.3 - '@rollup/plugin-commonjs': 16.0.0_rollup@2.67.3 - '@rollup/plugin-json': 4.1.0_rollup@2.67.3 + '@rollup/plugin-babel': 5.3.0_pcb26gospqgsyouccbwgqwmoa4 + '@rollup/plugin-commonjs': 22.0.2_rollup@2.78.1 + '@rollup/plugin-json': 4.1.0_rollup@2.78.1 es5-ext: 0.10.53 - rollup: 2.67.3 + rollup: 2.78.1 source-map: 0.7.3 string-capitalize: 1.0.1 @@ -805,7 +805,7 @@ packages: /@babel/helper-get-function-arity/7.10.4: resolution: {integrity: sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==} dependencies: - '@babel/types': 7.12.1 + '@babel/types': 7.14.5 dev: true /@babel/helper-get-function-arity/7.14.5: @@ -1054,6 +1054,8 @@ packages: resolution: {integrity: sha512-kFsOS0IbsuhO5ojF8Hc8z/8vEIOkylVBrjiZUbLTE3XFe0Qi+uu6HjzQixkFaqr0ZPAMZcBVxEwmsnsLPZ2Xsw==} engines: {node: '>=6.0.0'} hasBin: true + dependencies: + '@babel/types': 7.14.5 dev: true /@babel/parser/7.14.7: @@ -2068,7 +2070,7 @@ packages: slash: 3.0.0 dev: true - /@rollup/plugin-babel/5.3.0_@babel+core@7.12.3+rollup@2.67.3: + /@rollup/plugin-babel/5.3.0_pcb26gospqgsyouccbwgqwmoa4: resolution: {integrity: sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -2080,9 +2082,9 @@ packages: optional: true dependencies: '@babel/core': 7.12.3 - '@babel/helper-module-imports': 7.12.1 - '@rollup/pluginutils': 3.1.0_rollup@2.67.3 - rollup: 2.67.3 + '@babel/helper-module-imports': 7.14.5 + '@rollup/pluginutils': 3.1.0_rollup@2.78.1 + rollup: 2.78.1 dev: true /@rollup/plugin-buble/0.21.3_rollup@2.67.3: @@ -2129,20 +2131,20 @@ packages: rollup: 2.67.3 dev: true - /@rollup/plugin-commonjs/16.0.0_rollup@2.67.3: - resolution: {integrity: sha512-LuNyypCP3msCGVQJ7ki8PqYdpjfEkE/xtFa5DqlF+7IBD0JsfMZ87C58heSwIMint58sAUZbt3ITqOmdQv/dXw==} - engines: {node: '>= 8.0.0'} + /@rollup/plugin-commonjs/22.0.2_rollup@2.78.1: + resolution: {integrity: sha512-//NdP6iIwPbMTcazYsiBMbJW7gfmpHom33u1beiIoHDEM0Q9clvtQB1T0efvMqHeKsGohiHo97BCPCkBXdscwg==} + engines: {node: '>= 12.0.0'} peerDependencies: - rollup: ^2.30.0 + rollup: ^2.68.0 dependencies: - '@rollup/pluginutils': 3.1.0_rollup@2.67.3 + '@rollup/pluginutils': 3.1.0_rollup@2.78.1 commondir: 1.0.1 estree-walker: 2.0.1 - glob: 7.1.6 + glob: 7.1.7 is-reference: 1.2.1 magic-string: 0.25.7 - resolve: 1.18.1 - rollup: 2.67.3 + resolve: 1.20.0 + rollup: 2.78.1 dev: true /@rollup/plugin-json/4.1.0_rollup@2.67.3: @@ -2163,6 +2165,15 @@ packages: rollup: 2.68.0 dev: true + /@rollup/plugin-json/4.1.0_rollup@2.78.1: + resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.78.1 + rollup: 2.78.1 + dev: true + /@rollup/plugin-node-resolve/10.0.0_rollup@2.67.3: resolution: {integrity: sha512-sNijGta8fqzwA1VwUEtTvWCx2E7qC70NMsDh4ZG13byAXYigBNZMxALhKUSycBks5gupJdq0lFrKumFrRZ8H3A==} engines: {node: '>= 10.0.0'} @@ -2311,6 +2322,17 @@ packages: picomatch: 2.2.2 rollup: 2.68.0 + /@rollup/pluginutils/3.1.0_rollup@2.78.1: + 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.3.0 + rollup: 2.78.1 + /@rollup/pluginutils/4.1.2: resolution: {integrity: sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ==} engines: {node: '>= 8.0.0'} @@ -3573,7 +3595,7 @@ packages: dev: true /commondir/1.0.1: - resolution: {integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=} + resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} /compare-versions/3.6.0: resolution: {integrity: sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==} @@ -4810,14 +4832,13 @@ packages: dev: true /fs.realpath/1.0.0: - resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} /fsevents/2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] requiresBuild: true - dev: true optional: true /function-bind/1.1.1: @@ -5035,7 +5056,6 @@ packages: engines: {node: '>= 6.x'} dependencies: iterall: 1.3.0 - dev: true /hard-rejection/2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} @@ -5275,7 +5295,7 @@ packages: dev: true /inflight/1.0.6: - resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} dependencies: once: 1.4.0 wrappy: 1.0.2 @@ -5659,7 +5679,6 @@ packages: /iterall/1.3.0: resolution: {integrity: sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==} - dev: true /js-string-escape/1.0.1: resolution: {integrity: sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=} @@ -6407,7 +6426,7 @@ packages: dev: true /once/1.4.0: - resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: wrappy: 1.0.2 @@ -6623,7 +6642,7 @@ packages: dev: true /path-is-absolute/1.0.1: - resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} /path-key/3.1.1: @@ -7506,7 +7525,6 @@ packages: hasBin: true optionalDependencies: fsevents: 2.3.2 - dev: true /rollup/2.68.0: resolution: {integrity: sha512-XrMKOYK7oQcTio4wyTz466mucnd8LzkiZLozZ4Rz0zQD+HeX4nUK4B8GrTX/2EvN2/vBF/i2WnaXboPxo0JylA==} @@ -7514,7 +7532,13 @@ packages: hasBin: true optionalDependencies: fsevents: 2.3.2 - dev: true + + /rollup/2.78.1: + resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 /run-parallel/1.1.9: resolution: {integrity: sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==} @@ -8471,7 +8495,7 @@ packages: dev: true /wrappy/1.0.2: - resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} /write-file-atomic/2.4.3: resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==}