Optimize webpack memory cache garbage collection (#54397)

## What

Adds a reworked version of webpack's [built-in memory cache garbage
collection
plugin](853bfda35a/lib/cache/MemoryWithGcCachePlugin.js (L15))
that is more aggressive in cleaning up unused modules than the default.

The default marks 1/5th of the modules as "up for potentially being
garbage collected". The new plugin always checks all modules. In my
testing this does not cause much overhead compared to the current
approach which leverages writing to two separate maps. The change also
makes the memory cache eviction more predictable: when an item has not
been accessed for 5 compilations it is evicted from the memory cache, it
could still be in the disk cache.


In order to test this change I had to spin up the benchmarks but these
were a bit outdated so I've cleaned up the benchmark applications.

---------

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
This commit is contained in:
Tim Neutkens 2023-08-23 15:46:32 +02:00 committed by GitHub
parent 93e4e6d438
commit 00106b7ef4
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
34 changed files with 834 additions and 122 deletions

View file

@ -37,8 +37,8 @@ test/production/emit-decorator-metadata/**/*.js
test/e2e/app-dir/rsc-errors/app/swc/use-client/page.js test/e2e/app-dir/rsc-errors/app/swc/use-client/page.js
test-timings.json test-timings.json
packages/next-swc/crates/** packages/next-swc/crates/**
bench/nested-deps/pages/** bench/nested-deps/**
bench/nested-deps/components/** bench/nested-deps-app-router/**
packages/next-bundle-analyzer/index.d.ts packages/next-bundle-analyzer/index.d.ts
examples/with-typescript-graphql/lib/gql/ examples/with-typescript-graphql/lib/gql/
test/development/basic/hmr/components/parse-error.js test/development/basic/hmr/components/parse-error.js

1
.gitignore vendored
View file

@ -17,6 +17,7 @@ test/node_modules
*.log *.log
pids pids
*.cpuprofile *.cpuprofile
*.heapsnapshot
# coverage # coverage
.nyc_output .nyc_output

View file

@ -0,0 +1,15 @@
{
"name": "bench-app-router-server",
"private": true,
"license": "MIT",
"dependencies": {
"webpack-bundle-analyzer": "^4.6.1",
"webpack-stats-plugin": "^1.1.0",
"next": "workspace:*",
"next-minimal-server": "workspace:*"
},
"scripts": {
"build-application": "next build",
"start": "next-minimal-server"
}
}

View file

@ -176,6 +176,7 @@ if (require.main === module) {
type: 'string', type: 'string',
}).argv }).argv
fs.mkdirSync(outdir, { recursive: true })
generateFuzzponents(outdir, seed, depth, opts) generateFuzzponents(outdir, seed, depth, opts)
} }

View file

@ -0,0 +1,12 @@
{
"name": "fuzzponent",
"bin": {
"fuzzponent": "./bin/fuzzponent.js"
},
"dependencies": {
"@babel/types": "7.18.0",
"@babel/generator": "7.18.0",
"random-seed": "0.3.0",
"yargs": "16.2.0"
}
}

View file

@ -0,0 +1,39 @@
# Fuzzponent
Originally built by [Dale Bustad](https://github.com/divmain/fuzzponent) while at Vercel.
[Original repository](https://github.com/divmain/fuzzponent).
Generate a nested React component dependency graph, useful for benchmarking.
## Example
To create a dependency tree with `3020` files in the `components` directory:
```
fuzzponent --depth 2 --seed 206 --outdir components
```
You can then import the entrypoint of the dependency tree at `components/index.js`.
## Options
```
Options:
--help Show help [boolean]
--version Show version number [boolean]
-d, --depth component hierarchy depth [number] [required]
-s, --seed prng seed [number] [required]
-o, --outdir the directory where components should be written
[string] [default: "/Users/timneutkens/projects/next.js/bench/nested-deps"]
--minLen the smallest acceptable component name length
[number] [default: 18]
--maxLen the largest acceptable component name length
[number] [default: 24]
--minChild the smallest number of acceptable component children
[number] [default: 4]
--maxChild the largest number of acceptable component children
[number] [default: 80]
--extension extension to use for generated components
[string] [default: "jsx"]
```

View file

@ -1,14 +0,0 @@
{
"name": "stats-app",
"private": true,
"license": "MIT",
"dependencies": {
"webpack-bundle-analyzer": "^4.6.1",
"webpack-stats-plugin": "^1.1.0"
},
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
}
}

View file

@ -0,0 +1,2 @@
components/*
CPU*

View file

@ -0,0 +1,13 @@
'use client'
import React from 'react'
import Comp from '../../components/index.jsx'
export default function Home() {
return (
<>
<h1>Hello!!!!!!!!!!!!</h1>
<Comp />
</>
)
}

View file

@ -0,0 +1,14 @@
import React from 'react'
export const metadata = {
title: 'Next.js',
description: 'Generated by Next.js',
}
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>{children}</body>
</html>
)
}

View file

@ -0,0 +1,8 @@
'use client'
import React from 'react'
import Comp from '../../components/index.jsx'
export default function Home() {
return <Comp />
}

View file

@ -0,0 +1,12 @@
import React from 'react'
import Comp from '../../components/index.jsx'
import ClientComponent from './client-component'
export default function Home() {
return (
<>
<Comp />
<ClientComponent />
</>
)
}

View file

@ -0,0 +1,6 @@
import React from 'react'
import Comp from '../../components/index.jsx'
export default function Home() {
return <Comp />
}

View file

@ -0,0 +1,253 @@
import { execSync, spawn } from 'child_process'
import { join } from 'path'
import { fileURLToPath } from 'url'
import fetch from 'node-fetch'
import {
existsSync,
readFileSync,
writeFileSync,
unlinkSync,
promises as fs,
} from 'fs'
import prettyMs from 'pretty-ms'
import treeKill from 'tree-kill'
const ROOT_DIR = join(fileURLToPath(import.meta.url), '..', '..', '..')
const CWD = join(ROOT_DIR, 'bench', 'nested-deps')
const NEXT_BIN = join(ROOT_DIR, 'packages', 'next', 'dist', 'bin', 'next')
const [, , command = 'all'] = process.argv
async function killApp(instance) {
await new Promise((resolve, reject) => {
treeKill(instance.pid, (err) => {
if (err) {
if (
process.platform === 'win32' &&
typeof err.message === 'string' &&
(err.message.includes(`no running instance of the task`) ||
err.message.includes(`not found`))
) {
// Windows throws an error if the process is already stopped
//
// Command failed: taskkill /pid 6924 /T /F
// ERROR: The process with PID 6924 (child process of PID 6736) could not be terminated.
// Reason: There is no running instance of the task.
return resolve()
}
return reject(err)
}
resolve()
})
})
}
class File {
constructor(path) {
this.path = path
this.originalContent = existsSync(this.path)
? readFileSync(this.path, 'utf8')
: null
}
write(content) {
if (!this.originalContent) {
this.originalContent = content
}
writeFileSync(this.path, content, 'utf8')
}
replace(pattern, newValue) {
const currentContent = readFileSync(this.path, 'utf8')
if (pattern instanceof RegExp) {
if (!pattern.test(currentContent)) {
throw new Error(
`Failed to replace content.\n\nPattern: ${pattern.toString()}\n\nContent: ${currentContent}`
)
}
} else if (typeof pattern === 'string') {
if (!currentContent.includes(pattern)) {
throw new Error(
`Failed to replace content.\n\nPattern: ${pattern}\n\nContent: ${currentContent}`
)
}
} else {
throw new Error(`Unknown replacement attempt type: ${pattern}`)
}
const newContent = currentContent.replace(pattern, newValue)
this.write(newContent)
}
prepend(line) {
const currentContent = readFileSync(this.path, 'utf8')
this.write(line + '\n' + currentContent)
}
delete() {
unlinkSync(this.path)
}
restore() {
this.write(this.originalContent)
}
}
function runNextCommandDev(argv, opts = {}) {
const env = {
...process.env,
NODE_ENV: undefined,
__NEXT_TEST_MODE: 'true',
FORCE_COLOR: 3,
...opts.env,
}
const nodeArgs = opts.nodeArgs || []
return new Promise((resolve, reject) => {
const instance = spawn(NEXT_BIN, [...nodeArgs, ...argv], {
cwd: CWD,
env,
})
let didResolve = false
function handleStdout(data) {
const message = data.toString()
const bootupMarkers = {
dev: /compiled .*successfully/i,
start: /started server/i,
}
if (
(opts.bootupMarker && opts.bootupMarker.test(message)) ||
bootupMarkers[opts.nextStart ? 'start' : 'dev'].test(message)
) {
if (!didResolve) {
didResolve = true
resolve(instance)
instance.removeListener('data', handleStdout)
}
}
if (typeof opts.onStdout === 'function') {
opts.onStdout(message)
}
if (opts.stdout !== false) {
process.stdout.write(message)
}
}
function handleStderr(data) {
const message = data.toString()
if (typeof opts.onStderr === 'function') {
opts.onStderr(message)
}
if (opts.stderr !== false) {
process.stderr.write(message)
}
}
instance.stdout.on('data', handleStdout)
instance.stderr.on('data', handleStderr)
instance.on('close', () => {
instance.stdout.removeListener('data', handleStdout)
instance.stderr.removeListener('data', handleStderr)
if (!didResolve) {
didResolve = true
resolve()
}
})
instance.on('error', (err) => {
reject(err)
})
})
}
function waitFor(millis) {
return new Promise((resolve) => setTimeout(resolve, millis))
}
await fs.rm('.next', { recursive: true }).catch(() => {})
const file = new File(join(CWD, 'pages/index.jsx'))
const results = []
try {
if (command === 'dev' || command === 'all') {
const instance = await runNextCommandDev(['dev', '--port', '3000'])
function waitForCompiled() {
return new Promise((resolve) => {
function waitForOnData(data) {
const message = data.toString()
const compiledRegex =
/compiled client and server successfully in (\d*[.]?\d+)\s*(m?s) \((\d+) modules\)/gm
const matched = compiledRegex.exec(message)
if (matched) {
resolve({
'time (ms)': (matched[2] === 's' ? 1000 : 1) * Number(matched[1]),
modules: Number(matched[3]),
})
instance.stdout.removeListener('data', waitForOnData)
}
}
instance.stdout.on('data', waitForOnData)
})
}
const [res, initial] = await Promise.all([
fetch('http://localhost:3000/'),
waitForCompiled(),
])
if (res.status !== 200) {
throw new Error('Fetching / failed')
}
results.push(initial)
file.prepend('// First edit')
results.push(await waitForCompiled())
await waitFor(1000)
file.prepend('// Second edit')
results.push(await waitForCompiled())
await waitFor(1000)
file.prepend('// Third edit')
results.push(await waitForCompiled())
console.table(results)
await killApp(instance)
}
if (command === 'build' || command === 'all') {
// ignore error
await fs.rm('.next', { recursive: true, force: true }).catch(() => {})
execSync(`node ${NEXT_BIN} build ./bench/nested-deps`, {
cwd: ROOT_DIR,
stdio: 'inherit',
env: {
...process.env,
TRACE_TARGET: 'jaeger',
},
})
const traceString = await fs.readFile(join(CWD, '.next', 'trace'), 'utf8')
const traces = traceString
.split('\n')
.filter((line) => line)
.map((line) => JSON.parse(line))
const { duration } = traces.pop().find(({ name }) => name === 'next-build')
console.info('next build duration: ', prettyMs(duration / 1000))
}
} finally {
file.restore()
}

View file

@ -0,0 +1,8 @@
const idx = process.execArgv.indexOf('--cpu-prof')
if (idx >= 0) process.execArgv.splice(idx, 1)
module.exports = {
eslint: {
ignoreDuringBuilds: true,
},
}

View file

@ -0,0 +1,19 @@
{
"name": "bench-nested-deps-app-router",
"scripts": {
"prepare-bench": "rimraf components && fuzzponent -d 2 -s 206 -o components",
"dev": "cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 next dev",
"build-application": "cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 next build",
"start": "cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 next start",
"dev-nocache": "rimraf .next && pnpm dev",
"dev-cpuprofile-nocache": "rimraf .next && cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 node --cpu-prof ../../node_modules/next/dist/bin/next",
"build-nocache": "rimraf .next && pnpm build-application"
},
"devDependencies": {
"fuzzponent": "workspace:*",
"cross-env": "^7.0.3",
"pretty-ms": "^7.0.1",
"rimraf": "^3.0.2",
"next": "workspace:*"
}
}

View file

@ -5,5 +5,4 @@ module.exports = {
eslint: { eslint: {
ignoreDuringBuilds: true, ignoreDuringBuilds: true,
}, },
swcMinify: true,
} }

View file

@ -1,20 +1,19 @@
{ {
"name": "bench-nested-deps",
"scripts": { "scripts": {
"prepare": "rimraf components && mkdir components && node ./fuzzponent.js -d 2 -s 206 -o components", "prepare-bench": "rimraf components && fuzzponent -d 2 -s 206 -o components",
"dev": "cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 node ../../node_modules/next/dist/bin/next dev", "dev": "cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 next dev",
"build": "cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 node ../../node_modules/next/dist/bin/next build", "build-application": "cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 next build",
"start": "cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 node ../../node_modules/next/dist/bin/next start", "start": "cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 next start",
"dev-nocache": "rimraf .next && yarn dev", "dev-nocache": "rimraf .next && pnpm dev",
"dev-cpuprofile-nocache": "rimraf .next && cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 node --cpu-prof ../../node_modules/next/dist/bin/next", "dev-cpuprofile-nocache": "rimraf .next && cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 node --cpu-prof ../../node_modules/next/dist/bin/next",
"build-nocache": "rimraf .next && yarn build" "build-nocache": "rimraf .next && pnpm build-application"
}, },
"devDependencies": { "devDependencies": {
"@babel/types": "7.18.0", "fuzzponent": "workspace:*",
"@babel/generator": "7.18.0",
"random-seed": "0.3.0",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"pretty-ms": "^7.0.1", "pretty-ms": "^7.0.1",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"yargs": "16.2.0" "next": "workspace:*"
} }
} }

View file

@ -1,12 +1,13 @@
#!/usr/bin/env node
process.env.NODE_ENV = 'production' process.env.NODE_ENV = 'production'
require('../../test/lib/react-channel-require-hook') require('../../../test/lib/react-channel-require-hook')
console.time('next-cold-start') console.time('next-cold-start')
const NextServer = require('next/dist/server/next-server').default const NextServer = require('next/dist/server/next-server').default
const path = require('path') const path = require('path')
const appDir = path.join(__dirname, 'benchmark-app') const appDir = process.cwd()
const distDir = '.next' const distDir = '.next'
const compiledConfig = require(path.join( const compiledConfig = require(path.join(

View file

@ -1,7 +1,8 @@
{ {
"name": "next-minimal-server", "name": "next-minimal-server",
"description": "Minimal server for Next.js for benchmarking/perf analysis purposes.", "description": "Minimal server for Next.js for benchmarking/perf analysis purposes.",
"scripts": { "bin": "./bin/minimal-server.js",
"start": "node start.js" "peerDependencies": {
"next": "workspace:*"
} }
} }

View file

@ -1,8 +1,8 @@
{ {
"name": "next-bench", "name": "bench-rendering",
"scripts": { "scripts": {
"build": "next build", "build-application": "next build",
"start": "NODE_ENV=production npm run build && NODE_ENV=production next start", "start": "NODE_ENV=production pnpm build-application && NODE_ENV=production next start",
"bench:stateless": "ab -c1 -n3000 http://0.0.0.0:3000/stateless", "bench:stateless": "ab -c1 -n3000 http://0.0.0.0:3000/stateless",
"bench:stateless-big": "ab -c1 -n500 http://0.0.0.0:3000/stateless-big", "bench:stateless-big": "ab -c1 -n500 http://0.0.0.0:3000/stateless-big",
"bench:recursive-copy": "node recursive-copy/run" "bench:recursive-copy": "node recursive-copy/run"

View file

@ -12,7 +12,7 @@ export function startedDevelopmentServer(appUrl: string, bindAddr: string) {
} }
type CompilerDiagnostics = { type CompilerDiagnostics = {
modules: number totalModulesCount: number
errors: string[] | null errors: string[] | null
warnings: string[] | null warnings: string[] | null
} }
@ -142,10 +142,10 @@ buildStore.subscribe((state) => {
clientWasLoading && (serverWasLoading || edgeServerWasLoading) clientWasLoading && (serverWasLoading || edgeServerWasLoading)
? 'client and server' ? 'client and server'
: undefined, : undefined,
modules: totalModulesCount:
(clientWasLoading ? client.modules : 0) + (clientWasLoading ? client.totalModulesCount : 0) +
(serverWasLoading ? server.modules : 0) + (serverWasLoading ? server.totalModulesCount : 0) +
(edgeServerWasLoading ? edgeServer?.modules || 0 : 0), (edgeServerWasLoading ? edgeServer?.totalModulesCount || 0 : 0),
hasEdgeServer: !!edgeServer, hasEdgeServer: !!edgeServer,
} }
if (client.errors && clientWasLoading) { if (client.errors && clientWasLoading) {
@ -257,7 +257,7 @@ export function watchCompilers(
onEvent({ onEvent({
loading: false, loading: false,
modules: stats.compilation.modules.size, totalModulesCount: stats.compilation.modules.size,
errors: hasErrors ? errors : null, errors: hasErrors ? errors : null,
warnings: hasWarnings ? warnings : null, warnings: hasWarnings ? warnings : null,
}) })

View file

@ -19,7 +19,7 @@ export type OutputState =
loading: false loading: false
typeChecking: boolean typeChecking: boolean
partial: 'client and server' | undefined partial: 'client and server' | undefined
modules: number totalModulesCount: number
errors: string[] | null errors: string[] | null
warnings: string[] | null warnings: string[] | null
hasEdgeServer: boolean hasEdgeServer: boolean
@ -111,8 +111,8 @@ store.subscribe((state) => {
} }
let modulesMessage = '' let modulesMessage = ''
if (state.modules) { if (state.totalModulesCount) {
modulesMessage = ` (${state.modules} modules)` modulesMessage = ` (${state.totalModulesCount} modules)`
} }
let partialMessage = '' let partialMessage = ''

View file

@ -67,6 +67,7 @@ import { AppBuildManifestPlugin } from './webpack/plugins/app-build-manifest-plu
import { SubresourceIntegrityPlugin } from './webpack/plugins/subresource-integrity-plugin' import { SubresourceIntegrityPlugin } from './webpack/plugins/subresource-integrity-plugin'
import { NextFontManifestPlugin } from './webpack/plugins/next-font-manifest-plugin' import { NextFontManifestPlugin } from './webpack/plugins/next-font-manifest-plugin'
import { getSupportedBrowsers } from './utils' import { getSupportedBrowsers } from './utils'
import { MemoryWithGcCachePlugin } from './webpack/plugins/memory-with-gc-cache-plugin'
type ExcludesFalse = <T>(x: T | false) => x is T type ExcludesFalse = <T>(x: T | false) => x is T
type ClientEntries = { type ClientEntries = {
@ -2351,6 +2352,7 @@ export default async function getBaseWebpackConfig(
].filter(Boolean), ].filter(Boolean),
}, },
plugins: [ plugins: [
dev && new MemoryWithGcCachePlugin({ maxGenerations: 5 }),
dev && isClient && new ReactRefreshWebpackPlugin(webpack), dev && isClient && new ReactRefreshWebpackPlugin(webpack),
// Makes sure `Buffer` and `process` are polyfilled in client and flight bundles (same behavior as webpack 4) // Makes sure `Buffer` and `process` are polyfilled in client and flight bundles (same behavior as webpack 4)
(isClient || isEdgeServer) && (isClient || isEdgeServer) &&
@ -2695,6 +2697,8 @@ export default async function getBaseWebpackConfig(
const cache: any = { const cache: any = {
type: 'filesystem', type: 'filesystem',
// Disable memory cache in development in favor of our own MemoryWithGcCachePlugin.
maxMemoryGenerations: dev ? 0 : Infinity, // Infinity is default value for production in webpack currently.
// Includes: // Includes:
// - Next.js version // - Next.js version
// - next.config.js keys that affect compilation // - next.config.js keys that affect compilation

View file

@ -0,0 +1,139 @@
/*
This plugin is based on the internal one in webpack but heavily modified to use a different caching heuristic.
https://github.com/webpack/webpack/blob/853bfda35a0080605c09e1bdeb0103bcb9367a10/lib/cache/MemoryWithGcCachePlugin.js#L15
https://github.com/webpack/webpack/blob/main/LICENSE
Copyright JS Foundation and other contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
The change in this plugin compared to the built-in one in webpack is that this plugin always cleans up after 5 compilations.
The built-in plugin only cleans up "total modules / max generations".
The default for max generations is 5, so 1/5th of the modules would be marked for deletion.
This plugin instead always checks the cache and decreases the time to live of all entries. That way memory is cleaned up earlier.
*/
import { type Compiler, webpack } from 'next/dist/compiled/webpack/webpack'
// Webpack doesn't expose Etag as a type so get it this way instead.
type Etag = Parameters<typeof webpack.Cache.prototype.get>[1]
/**
* Entry in the memory cache
*/
interface CacheEntry {
/**
* Webpack provided etag
*/
etag: Etag
/**
* Webpack provided data
*/
data: unknown | null
/**
* Number of compilations left before the cache item is evicted.
*/
ttl: number
}
// Used to hook into the memory stage of the webpack caching
const CACHE_STAGE_MEMORY = -10 // TODO: Somehow webpack.Cache.STAGE_MEMORY doesn't work.
const PLUGIN_NAME = 'NextJsMemoryWithGcCachePlugin'
export class MemoryWithGcCachePlugin {
/**
* Maximum number of compilations to keep the cache entry around for when it's not used.
* We keep the modules for a few more compilations so that if you comment out a package and bring it back it doesn't need a full compile again.
*/
private maxGenerations: number
constructor({ maxGenerations }: { maxGenerations: number }) {
this.maxGenerations = maxGenerations
}
apply(compiler: Compiler) {
const maxGenerations = this.maxGenerations
/**
* The memory cache
*/
const cache = new Map<string, CacheEntry>()
/**
* Cache cleanup implementation
*/
function decreaseTTLAndEvict() {
for (const [identifier, entry] of cache) {
// Decrease item time to live
entry.ttl--
// if ttl is 0 or below, evict entry from the cache
if (entry.ttl <= 0) {
cache.delete(identifier)
}
}
}
compiler.hooks.afterDone.tap(PLUGIN_NAME, decreaseTTLAndEvict)
compiler.cache.hooks.store.tap(
{ name: PLUGIN_NAME, stage: CACHE_STAGE_MEMORY },
(identifier, etag, data) => {
cache.set(identifier, { etag, data, ttl: maxGenerations })
}
)
compiler.cache.hooks.get.tap(
{ name: PLUGIN_NAME, stage: CACHE_STAGE_MEMORY },
(identifier, etag, gotHandlers) => {
const cacheEntry = cache.get(identifier)
// Item found
if (cacheEntry !== undefined) {
// When cache entry is hit we reset the counter.
cacheEntry.ttl = maxGenerations
// Handles `null` separately as it doesn't have an etag.
if (cacheEntry.data === null) {
return null
}
return cacheEntry.etag === etag ? cacheEntry.data : null
}
// Handle case where other cache does have the identifier, puts it into the memory cache
gotHandlers.push((result, callback) => {
cache.set(identifier, {
// Handles `null` separately as it doesn't have an etag.
etag: result === null ? null : etag,
data: result,
ttl: maxGenerations,
})
return callback()
})
// No item found
return undefined
}
)
compiler.cache.hooks.shutdown.tap(
{ name: PLUGIN_NAME, stage: CACHE_STAGE_MEMORY },
() => {
cache.clear()
}
)
}
}

File diff suppressed because one or more lines are too long

View file

@ -28,6 +28,10 @@ import { APP_DIR_ALIAS, WEBPACK_LAYERS } from '../../lib/constants'
import { recursiveDelete } from '../../lib/recursive-delete' import { recursiveDelete } from '../../lib/recursive-delete'
import { import {
BLOCKED_PAGES, BLOCKED_PAGES,
CLIENT_STATIC_FILES_RUNTIME_AMP,
CLIENT_STATIC_FILES_RUNTIME_MAIN,
CLIENT_STATIC_FILES_RUNTIME_MAIN_APP,
CLIENT_STATIC_FILES_RUNTIME_REACT_REFRESH,
COMPILER_NAMES, COMPILER_NAMES,
RSC_MODULE_TYPES, RSC_MODULE_TYPES,
} from '../../shared/lib/constants' } from '../../shared/lib/constants'
@ -966,17 +970,21 @@ export default class HotReloader {
) )
if (!this.hasAmpEntrypoints) { if (!this.hasAmpEntrypoints) {
delete entrypoints.amp delete entrypoints[CLIENT_STATIC_FILES_RUNTIME_AMP]
} }
if (!this.hasPagesRouterEntrypoints) { if (!this.hasPagesRouterEntrypoints) {
delete entrypoints.main delete entrypoints[CLIENT_STATIC_FILES_RUNTIME_MAIN]
delete entrypoints['pages/_app'] delete entrypoints['pages/_app']
delete entrypoints['pages/_error'] delete entrypoints['pages/_error']
delete entrypoints['/_error'] delete entrypoints['/_error']
delete entrypoints['pages/_document'] delete entrypoints['pages/_document']
} }
// Remove React Refresh entrypoint chunk as `app` doesn't require it.
if (!this.hasAmpEntrypoints && !this.hasPagesRouterEntrypoints) {
delete entrypoints[CLIENT_STATIC_FILES_RUNTIME_REACT_REFRESH]
}
if (!this.hasAppRouterEntrypoints) { if (!this.hasAppRouterEntrypoints) {
delete entrypoints['main-app'] delete entrypoints[CLIENT_STATIC_FILES_RUNTIME_MAIN_APP]
} }
return entrypoints return entrypoints

View file

@ -543,6 +543,87 @@ importers:
specifier: 8.2.3 specifier: 8.2.3
version: 8.2.3 version: 8.2.3
bench/app-router-server:
dependencies:
next:
specifier: workspace:*
version: link:../../packages/next
next-minimal-server:
specifier: workspace:*
version: link:../next-minimal-server
webpack-bundle-analyzer:
specifier: ^4.6.1
version: 4.7.0
webpack-stats-plugin:
specifier: ^1.1.0
version: 1.1.0
bench/fuzzponent:
dependencies:
'@babel/generator':
specifier: 7.18.0
version: 7.18.0
'@babel/types':
specifier: 7.18.0
version: 7.18.0
random-seed:
specifier: 0.3.0
version: 0.3.0
yargs:
specifier: 16.2.0
version: 16.2.0
bench/nested-deps:
devDependencies:
cross-env:
specifier: ^7.0.3
version: 7.0.3
fuzzponent:
specifier: workspace:*
version: link:../fuzzponent
next:
specifier: workspace:*
version: link:../../packages/next
pretty-ms:
specifier: ^7.0.1
version: 7.0.1
rimraf:
specifier: ^3.0.2
version: 3.0.2
bench/nested-deps-app-router:
devDependencies:
cross-env:
specifier: ^7.0.3
version: 7.0.3
fuzzponent:
specifier: workspace:*
version: link:../fuzzponent
next:
specifier: workspace:*
version: link:../../packages/next
pretty-ms:
specifier: ^7.0.1
version: 7.0.1
rimraf:
specifier: ^3.0.2
version: 3.0.2
bench/next-minimal-server:
dependencies:
next:
specifier: workspace:*
version: link:../../packages/next
bench/rendering:
dependencies:
fs-extra:
specifier: 10.0.0
version: 10.0.0
recursive-copy:
specifier: 2.0.11
version: 2.0.11
bench/vercel: bench/vercel:
dependencies: dependencies:
'@szmarczak/http-timer': '@szmarczak/http-timer':
@ -2221,10 +2302,6 @@ packages:
dependencies: dependencies:
'@babel/types': 7.18.0 '@babel/types': 7.18.0
/@babel/helper-validator-identifier@7.16.7:
resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==}
engines: {node: '>=6.9.0'}
/@babel/helper-validator-identifier@7.19.1: /@babel/helper-validator-identifier@7.19.1:
resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
@ -4942,7 +5019,7 @@ packages:
resolution: {integrity: sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==} resolution: {integrity: sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
dependencies: dependencies:
'@babel/helper-validator-identifier': 7.16.7 '@babel/helper-validator-identifier': 7.19.1
to-fast-properties: 2.0.0 to-fast-properties: 2.0.0
/@bazel/bazelisk@1.12.1: /@bazel/bazelisk@1.12.1:
@ -5249,7 +5326,7 @@ packages:
ignore: 4.0.6 ignore: 4.0.6
import-fresh: 3.3.0 import-fresh: 3.3.0
js-yaml: 3.14.1 js-yaml: 3.14.1
minimatch: 3.1.2 minimatch: 3.0.4
strip-json-comments: 3.1.1 strip-json-comments: 3.1.1
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
@ -5606,7 +5683,7 @@ packages:
dependencies: dependencies:
'@humanwhocodes/object-schema': 1.2.1 '@humanwhocodes/object-schema': 1.2.1
debug: 4.1.1 debug: 4.1.1
minimatch: 3.1.2 minimatch: 3.0.4
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
dev: true dev: true
@ -5777,7 +5854,7 @@ packages:
chalk: 4.0.0 chalk: 4.0.0
collect-v8-coverage: 1.0.1 collect-v8-coverage: 1.0.1
exit: 0.1.2 exit: 0.1.2
glob: 7.2.0 glob: 7.1.7
graceful-fs: 4.2.11 graceful-fs: 4.2.11
istanbul-lib-coverage: 3.2.0 istanbul-lib-coverage: 3.2.0
istanbul-lib-instrument: 4.0.3 istanbul-lib-instrument: 4.0.3
@ -6100,7 +6177,7 @@ packages:
dependencies: dependencies:
'@lerna/child-process': 4.0.0 '@lerna/child-process': 4.0.0
'@lerna/describe-ref': 4.0.0 '@lerna/describe-ref': 4.0.0
minimatch: 3.1.2 minimatch: 3.0.4
npmlog: 4.1.2 npmlog: 4.1.2
slash: 3.0.0 slash: 3.0.0
dev: true dev: true
@ -6657,7 +6734,7 @@ packages:
chalk: 4.1.2 chalk: 4.1.2
dedent: 0.7.0 dedent: 0.7.0
load-json-file: 6.2.0 load-json-file: 6.2.0
minimatch: 3.1.2 minimatch: 3.0.4
npmlog: 4.1.2 npmlog: 4.1.2
p-map: 4.0.0 p-map: 4.0.0
p-pipe: 3.1.0 p-pipe: 3.1.0
@ -7409,7 +7486,7 @@ packages:
'@rollup/pluginutils': 3.1.0(rollup@2.35.1) '@rollup/pluginutils': 3.1.0(rollup@2.35.1)
commondir: 1.0.1 commondir: 1.0.1
estree-walker: 2.0.2 estree-walker: 2.0.2
glob: 7.2.0 glob: 7.1.7
is-reference: 1.2.1 is-reference: 1.2.1
magic-string: 0.25.7 magic-string: 0.25.7
resolve: 1.22.2 resolve: 1.22.2
@ -9028,11 +9105,11 @@ packages:
/acorn-walk@8.0.0: /acorn-walk@8.0.0:
resolution: {integrity: sha512-oZRad/3SMOI/pxbbmqyurIx7jHw1wZDcR9G44L8pUVFEomX/0dH89SrM1KaDXuv1NpzAXz6Op/Xu/Qd5XXzdEA==} resolution: {integrity: sha512-oZRad/3SMOI/pxbbmqyurIx7jHw1wZDcR9G44L8pUVFEomX/0dH89SrM1KaDXuv1NpzAXz6Op/Xu/Qd5XXzdEA==}
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
dev: false
/acorn-walk@8.2.0: /acorn-walk@8.2.0:
resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
engines: {node: '>=0.4.0'} engines: {node: '>=0.4.0'}
dev: true
/acorn@7.4.1: /acorn@7.4.1:
resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
@ -9490,7 +9567,6 @@ packages:
/asap@2.0.6: /asap@2.0.6:
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
dev: true
/asciichart@1.5.25: /asciichart@1.5.25:
resolution: {integrity: sha512-PNxzXIPPOtWq8T7bgzBtk9cI2lgS4SJZthUHEiQ1aoIc3lNzGfUvIvo9LiAnq26TACo9t1/4qP6KTGAUbzX9Xg==} resolution: {integrity: sha512-PNxzXIPPOtWq8T7bgzBtk9cI2lgS4SJZthUHEiQ1aoIc3lNzGfUvIvo9LiAnq26TACo9t1/4qP6KTGAUbzX9Xg==}
@ -10302,7 +10378,7 @@ packages:
'@npmcli/move-file': 1.0.1 '@npmcli/move-file': 1.0.1
chownr: 2.0.0 chownr: 2.0.0
fs-minipass: 2.1.0 fs-minipass: 2.1.0
glob: 7.2.0 glob: 7.1.7
infer-owner: 1.0.4 infer-owner: 1.0.4
lru-cache: 6.0.0 lru-cache: 6.0.0
minipass: 3.1.3 minipass: 3.1.3
@ -10811,7 +10887,6 @@ packages:
string-width: 4.2.3 string-width: 4.2.3
strip-ansi: 6.0.1 strip-ansi: 6.0.1
wrap-ansi: 7.0.0 wrap-ansi: 7.0.0
dev: true
/clone-deep@4.0.1: /clone-deep@4.0.1:
resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==}
@ -10967,6 +11042,7 @@ packages:
/commander@2.20.3: /commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
dev: true
/commander@4.1.1: /commander@4.1.1:
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
@ -11424,6 +11500,14 @@ packages:
cross-spawn: 7.0.3 cross-spawn: 7.0.3
dev: true dev: true
/cross-env@7.0.3:
resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
hasBin: true
dependencies:
cross-spawn: 7.0.3
dev: true
/cross-fetch@3.1.2: /cross-fetch@3.1.2:
resolution: {integrity: sha512-+JhD65rDNqLbGmB3Gzs3HrEKC0aQnD+XA3SY6RjgkF88jV2q5cTc5+CwxlS3sdmLk98gpPt5CF9XRnPdlxZe6w==} resolution: {integrity: sha512-+JhD65rDNqLbGmB3Gzs3HrEKC0aQnD+XA3SY6RjgkF88jV2q5cTc5+CwxlS3sdmLk98gpPt5CF9XRnPdlxZe6w==}
dependencies: dependencies:
@ -12159,11 +12243,24 @@ packages:
resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
dev: true dev: true
/del@2.2.2:
resolution: {integrity: sha512-Z4fzpbIRjOu7lO5jCETSWoqUDVe0IPOlfugBsF6suen2LKDlVb4QZpKEM9P+buNJ4KI1eN7I083w/pbKUpsrWQ==}
engines: {node: '>=0.10.0'}
dependencies:
globby: 5.0.0
is-path-cwd: 1.0.0
is-path-in-cwd: 1.0.1
object-assign: 4.1.1
pify: 2.3.0
pinkie-promise: 2.0.1
rimraf: 2.7.1
dev: false
/del@6.0.0: /del@6.0.0:
resolution: {integrity: sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==} resolution: {integrity: sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
dependencies: dependencies:
globby: 11.1.0 globby: 11.0.1
graceful-fs: 4.2.11 graceful-fs: 4.2.11
is-glob: 4.0.3 is-glob: 4.0.3
is-path-cwd: 2.2.0 is-path-cwd: 2.2.0
@ -12571,6 +12668,10 @@ packages:
minimalistic-crypto-utils: 1.0.1 minimalistic-crypto-utils: 1.0.1
dev: true dev: true
/emitter-mixin@0.0.3:
resolution: {integrity: sha512-DlYAjELhPGbpH7qLS00H+CnoLxKxZblXuLDBwl1I8ozlQ0xITmlopiEunFmb3lYzrSD+EW7sIEw5fSoZgNiO8Q==}
dev: false
/emittery@0.8.1: /emittery@0.8.1:
resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==}
engines: {node: '>=10'} engines: {node: '>=10'}
@ -12665,6 +12766,13 @@ packages:
resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
dev: true dev: true
/errno@0.1.8:
resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
hasBin: true
dependencies:
prr: 1.0.1
dev: false
/error-ex@1.3.2: /error-ex@1.3.2:
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
dependencies: dependencies:
@ -13233,7 +13341,7 @@ packages:
json-stable-stringify-without-jsonify: 1.0.1 json-stable-stringify-without-jsonify: 1.0.1
levn: 0.4.1 levn: 0.4.1
lodash.merge: 4.6.2 lodash.merge: 4.6.2
minimatch: 3.1.2 minimatch: 3.0.4
natural-compare: 1.4.0 natural-compare: 1.4.0
optionator: 0.9.1 optionator: 0.9.1
progress: 2.0.3 progress: 2.0.3
@ -14129,6 +14237,15 @@ packages:
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true dev: true
/fs-extra@10.0.0:
resolution: {integrity: sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==}
engines: {node: '>=12'}
dependencies:
graceful-fs: 4.2.11
jsonfile: 6.0.1
universalify: 2.0.0
dev: false
/fs-extra@5.0.0: /fs-extra@5.0.0:
resolution: {integrity: sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==} resolution: {integrity: sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==}
dependencies: dependencies:
@ -14247,7 +14364,6 @@ packages:
/get-caller-file@2.0.5: /get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*} engines: {node: 6.* || 8.* || >= 10.*}
dev: true
/get-intrinsic@1.1.1: /get-intrinsic@1.1.1:
resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==} resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==}
@ -14509,9 +14625,10 @@ packages:
fs.realpath: 1.0.0 fs.realpath: 1.0.0
inflight: 1.0.6 inflight: 1.0.6
inherits: 2.0.4 inherits: 2.0.4
minimatch: 3.1.2 minimatch: 3.0.4
once: 1.4.0 once: 1.4.0
path-is-absolute: 1.0.1 path-is-absolute: 1.0.1
dev: true
/global-dirs@2.1.0: /global-dirs@2.1.0:
resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==} resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==}
@ -14588,7 +14705,6 @@ packages:
ignore: 5.2.0 ignore: 5.2.0
merge2: 1.4.1 merge2: 1.4.1
slash: 3.0.0 slash: 3.0.0
dev: false
/globby@11.1.0: /globby@11.1.0:
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
@ -14624,6 +14740,18 @@ packages:
slash: 4.0.0 slash: 4.0.0
dev: false dev: false
/globby@5.0.0:
resolution: {integrity: sha512-HJRTIH2EeH44ka+LWig+EqT2ONSYpVlNfx6pyd592/VF1TbfljJ7elwie7oSwcViLGqOdWocSdu2txwBF9bjmQ==}
engines: {node: '>=0.10.0'}
dependencies:
array-union: 1.0.2
arrify: 1.0.1
glob: 7.1.7
object-assign: 4.1.1
pify: 2.3.0
pinkie-promise: 2.0.1
dev: false
/globrex@0.1.2: /globrex@0.1.2:
resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
@ -15085,7 +15213,7 @@ packages:
deepmerge: 4.2.2 deepmerge: 4.2.2
eslint: 7.32.0 eslint: 7.32.0
espree: 7.3.1 espree: 7.3.1
glob: 7.2.0 glob: 7.1.7
inquirer: 7.3.3 inquirer: 7.3.3
json-merge-patch: 1.0.2 json-merge-patch: 1.0.2
minimist: 1.2.6 minimist: 1.2.6
@ -15320,7 +15448,7 @@ packages:
/ignore-walk@3.0.4: /ignore-walk@3.0.4:
resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==} resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==}
dependencies: dependencies:
minimatch: 3.1.2 minimatch: 3.0.4
dev: true dev: true
/ignore@4.0.6: /ignore@4.0.6:
@ -15331,7 +15459,6 @@ packages:
/ignore@5.2.0: /ignore@5.2.0:
resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==}
engines: {node: '>= 4'} engines: {node: '>= 4'}
dev: false
/ignore@5.2.4: /ignore@5.2.4:
resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
@ -15473,7 +15600,7 @@ packages:
resolution: {integrity: sha512-PO64kVeArePvhX7Ff0jVWkpnE1DfGRvaWcStYrPugcJz9twQGYibagKJuIMHCX7ENcp0M6LJlcjLBuLD5KeJMg==} resolution: {integrity: sha512-PO64kVeArePvhX7Ff0jVWkpnE1DfGRvaWcStYrPugcJz9twQGYibagKJuIMHCX7ENcp0M6LJlcjLBuLD5KeJMg==}
engines: {node: '>=10'} engines: {node: '>=10'}
dependencies: dependencies:
glob: 7.2.0 glob: 7.1.7
npm-package-arg: 8.1.0 npm-package-arg: 8.1.0
promzard: 0.3.0 promzard: 0.3.0
read: 1.0.7 read: 1.0.7
@ -15952,11 +16079,30 @@ packages:
symbol-observable: 1.2.0 symbol-observable: 1.2.0
dev: true dev: true
/is-path-cwd@1.0.0:
resolution: {integrity: sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==}
engines: {node: '>=0.10.0'}
dev: false
/is-path-cwd@2.2.0: /is-path-cwd@2.2.0:
resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==}
engines: {node: '>=6'} engines: {node: '>=6'}
dev: true dev: true
/is-path-in-cwd@1.0.1:
resolution: {integrity: sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==}
engines: {node: '>=0.10.0'}
dependencies:
is-path-inside: 1.0.1
dev: false
/is-path-inside@1.0.1:
resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==}
engines: {node: '>=0.10.0'}
dependencies:
path-is-inside: 1.0.2
dev: false
/is-path-inside@3.0.3: /is-path-inside@3.0.3:
resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -16267,7 +16413,7 @@ packages:
async: 3.2.4 async: 3.2.4
chalk: 4.1.2 chalk: 4.1.2
filelist: 1.0.4 filelist: 1.0.4
minimatch: 3.1.2 minimatch: 3.0.4
dev: true dev: true
/jest-changed-files@27.0.6: /jest-changed-files@27.0.6:
@ -16354,7 +16500,7 @@ packages:
babel-jest: 27.0.6(@babel/core@7.18.0) babel-jest: 27.0.6(@babel/core@7.18.0)
chalk: 4.0.0 chalk: 4.0.0
deepmerge: 4.2.2 deepmerge: 4.2.2
glob: 7.2.0 glob: 7.1.7
graceful-fs: 4.2.11 graceful-fs: 4.2.11
is-ci: 3.0.0 is-ci: 3.0.0
jest-circus: 27.5.1 jest-circus: 27.5.1
@ -16808,7 +16954,7 @@ packages:
cjs-module-lexer: 1.2.2 cjs-module-lexer: 1.2.2
collect-v8-coverage: 1.0.1 collect-v8-coverage: 1.0.1
exit: 0.1.2 exit: 0.1.2
glob: 7.2.0 glob: 7.1.7
graceful-fs: 4.2.11 graceful-fs: 4.2.11
jest-haste-map: 27.5.1 jest-haste-map: 27.5.1
jest-message-util: 27.5.1 jest-message-util: 27.5.1
@ -16840,7 +16986,7 @@ packages:
cjs-module-lexer: 1.2.2 cjs-module-lexer: 1.2.2
collect-v8-coverage: 1.0.1 collect-v8-coverage: 1.0.1
execa: 5.0.0 execa: 5.0.0
glob: 7.2.0 glob: 7.1.7
graceful-fs: 4.2.11 graceful-fs: 4.2.11
jest-haste-map: 27.5.1 jest-haste-map: 27.5.1
jest-message-util: 27.5.1 jest-message-util: 27.5.1
@ -17198,7 +17344,6 @@ packages:
/json-stringify-safe@5.0.1: /json-stringify-safe@5.0.1:
resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
dev: true
/json-to-ast@2.1.0: /json-to-ast@2.1.0:
resolution: {integrity: sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==} resolution: {integrity: sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==}
@ -17231,7 +17376,6 @@ packages:
universalify: 1.0.0 universalify: 1.0.0
optionalDependencies: optionalDependencies:
graceful-fs: 4.2.11 graceful-fs: 4.2.11
dev: true
/jsonparse@1.3.1: /jsonparse@1.3.1:
resolution: {integrity: sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=} resolution: {integrity: sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=}
@ -17279,6 +17423,11 @@ packages:
set-immediate-shim: 1.0.1 set-immediate-shim: 1.0.1
dev: true dev: true
/junk@1.0.3:
resolution: {integrity: sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w==}
engines: {node: '>=0.10.0'}
dev: false
/jwa@1.4.1: /jwa@1.4.1:
resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==}
dependencies: dependencies:
@ -17848,7 +17997,6 @@ packages:
/lodash@4.17.20: /lodash@4.17.20:
resolution: {integrity: sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==} resolution: {integrity: sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==}
dev: true
/lodash@4.17.21: /lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
@ -18097,6 +18245,16 @@ packages:
resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
/maximatch@0.1.0:
resolution: {integrity: sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==}
engines: {node: '>=0.10.0'}
dependencies:
array-differ: 1.0.0
array-union: 1.0.2
arrify: 1.0.1
minimatch: 3.0.4
dev: false
/maxmin@2.1.0: /maxmin@2.1.0:
resolution: {integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==} resolution: {integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==}
engines: {node: '>=0.12'} engines: {node: '>=0.12'}
@ -18853,7 +19011,6 @@ packages:
resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==}
dependencies: dependencies:
brace-expansion: 1.1.11 brace-expansion: 1.1.11
dev: true
/minimatch@3.1.2: /minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@ -18990,7 +19147,6 @@ packages:
hasBin: true hasBin: true
dependencies: dependencies:
minimist: 1.2.6 minimist: 1.2.6
dev: true
/mkdirp@1.0.4: /mkdirp@1.0.4:
resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
@ -19091,7 +19247,7 @@ packages:
array-differ: 1.0.0 array-differ: 1.0.0
array-union: 1.0.2 array-union: 1.0.2
arrify: 1.0.1 arrify: 1.0.1
minimatch: 3.1.2 minimatch: 3.0.4
dev: false dev: false
/multimatch@5.0.0: /multimatch@5.0.0:
@ -19102,7 +19258,7 @@ packages:
array-differ: 3.0.0 array-differ: 3.0.0
array-union: 2.1.0 array-union: 2.1.0
arrify: 2.0.1 arrify: 2.0.1
minimatch: 3.1.2 minimatch: 3.0.4
dev: true dev: true
/mute-stream@0.0.7: /mute-stream@0.0.7:
@ -19230,7 +19386,7 @@ packages:
resolution: {integrity: sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=} resolution: {integrity: sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=}
engines: {node: '>= 0.10.5'} engines: {node: '>= 0.10.5'}
dependencies: dependencies:
minimatch: 3.1.2 minimatch: 3.0.4
dev: false dev: false
/node-emoji@1.10.0: /node-emoji@1.10.0:
@ -19284,7 +19440,7 @@ packages:
hasBin: true hasBin: true
dependencies: dependencies:
env-paths: 2.2.1 env-paths: 2.2.1
glob: 7.2.0 glob: 7.1.7
graceful-fs: 4.2.11 graceful-fs: 4.2.11
mkdirp: 0.5.5 mkdirp: 0.5.5
nopt: 4.0.3 nopt: 4.0.3
@ -19302,7 +19458,7 @@ packages:
hasBin: true hasBin: true
dependencies: dependencies:
env-paths: 2.2.1 env-paths: 2.2.1
glob: 7.2.0 glob: 7.1.7
graceful-fs: 4.2.11 graceful-fs: 4.2.11
nopt: 5.0.0 nopt: 5.0.0
npmlog: 4.1.2 npmlog: 4.1.2
@ -19466,7 +19622,7 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
dependencies: dependencies:
glob: 7.2.0 glob: 7.1.7
ignore-walk: 3.0.4 ignore-walk: 3.0.4
npm-bundled: 1.1.2 npm-bundled: 1.1.2
npm-normalize-package-bin: 1.0.1 npm-normalize-package-bin: 1.0.1
@ -20326,6 +20482,10 @@ packages:
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
/path-is-inside@1.0.2:
resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==}
dev: false
/path-key@1.0.0: /path-key@1.0.0:
resolution: {integrity: sha512-T3hWy7tyXlk3QvPFnT+o2tmXRzU4GkitkUWLp/WZ0S/FXd7XMx176tRurgTvHTNMJOQzTcesHNpBqetH86mQ9g==} resolution: {integrity: sha512-T3hWy7tyXlk3QvPFnT+o2tmXRzU4GkitkUWLp/WZ0S/FXd7XMx176tRurgTvHTNMJOQzTcesHNpBqetH86mQ9g==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -20442,7 +20602,6 @@ packages:
/pify@2.3.0: /pify@2.3.0:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true
/pify@3.0.0: /pify@3.0.0:
resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==}
@ -20459,16 +20618,14 @@ packages:
dev: true dev: true
/pinkie-promise@2.0.1: /pinkie-promise@2.0.1:
resolution: {integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o=} resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dependencies: dependencies:
pinkie: 2.0.4 pinkie: 2.0.4
dev: true
/pinkie@2.0.4: /pinkie@2.0.4:
resolution: {integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA=} resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true
/pirates@4.0.5: /pirates@4.0.5:
resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
@ -20827,7 +20984,7 @@ packages:
/postcss-functions@3.0.0: /postcss-functions@3.0.0:
resolution: {integrity: sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=} resolution: {integrity: sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=}
dependencies: dependencies:
glob: 7.2.0 glob: 7.1.7
object-assign: 4.1.1 object-assign: 4.1.1
postcss: 6.0.23 postcss: 6.0.23
postcss-value-parser: 3.3.1 postcss-value-parser: 3.3.1
@ -21991,7 +22148,6 @@ packages:
resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==}
dependencies: dependencies:
asap: 2.0.6 asap: 2.0.6
dev: true
/promise@8.1.0: /promise@8.1.0:
resolution: {integrity: sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==} resolution: {integrity: sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==}
@ -22092,6 +22248,10 @@ packages:
ipaddr.js: 1.9.0 ipaddr.js: 1.9.0
dev: true dev: true
/prr@1.0.1:
resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
dev: false
/pseudomap@1.0.2: /pseudomap@1.0.2:
resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==}
@ -22152,7 +22312,7 @@ packages:
engines: {node: '>=4.4.0', npm: '>=5.2.0'} engines: {node: '>=4.4.0', npm: '>=5.2.0'}
hasBin: true hasBin: true
dependencies: dependencies:
glob: 7.2.0 glob: 7.1.7
postcss: 7.0.32 postcss: 7.0.32
postcss-selector-parser: 6.0.11 postcss-selector-parser: 6.0.11
yargs: 14.2.2 yargs: 14.2.2
@ -22220,11 +22380,10 @@ packages:
dev: true dev: true
/random-seed@0.3.0: /random-seed@0.3.0:
resolution: {integrity: sha1-2UXy4fOPSejViRNDG4v2u5N1Vs0=} resolution: {integrity: sha512-y13xtn3kcTlLub3HKWXxJNeC2qK4mB59evwZ5EkeRlolx+Bp2ztF7LbcZmyCnOqlHQrLnfuNbi1sVmm9lPDlDA==}
engines: {node: '>= 0.6.0'} engines: {node: '>= 0.6.0'}
dependencies: dependencies:
json-stringify-safe: 5.0.1 json-stringify-safe: 5.0.1
dev: true
/random-string@0.2.0: /random-string@0.2.0:
resolution: {integrity: sha512-isA91IquV3ZrFbvwkAtExP8aGL+csx3KGEsEJrvCidzOHioPl5B5g7WyJlk0lMkEz5/i1PqrWTvcdtJHPtrp1g==} resolution: {integrity: sha512-isA91IquV3ZrFbvwkAtExP8aGL+csx3KGEsEJrvCidzOHioPl5B5g7WyJlk0lMkEz5/i1PqrWTvcdtJHPtrp1g==}
@ -22475,7 +22634,7 @@ packages:
/read-package-json@2.1.1: /read-package-json@2.1.1:
resolution: {integrity: sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==} resolution: {integrity: sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==}
dependencies: dependencies:
glob: 7.2.0 glob: 7.1.7
json-parse-better-errors: 1.0.2 json-parse-better-errors: 1.0.2
normalize-package-data: 2.5.0 normalize-package-data: 2.5.0
npm-normalize-package-bin: 1.0.1 npm-normalize-package-bin: 1.0.1
@ -22487,7 +22646,7 @@ packages:
resolution: {integrity: sha512-4TnJZ5fnDs+/3deg1AuMExL4R1SFNRLQeOhV9c8oDKm3eoG6u8xU0r0mNNRJHi3K6B+jXmT7JOhwhAklWw9SSQ==} resolution: {integrity: sha512-4TnJZ5fnDs+/3deg1AuMExL4R1SFNRLQeOhV9c8oDKm3eoG6u8xU0r0mNNRJHi3K6B+jXmT7JOhwhAklWw9SSQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
dependencies: dependencies:
glob: 7.2.0 glob: 7.1.7
json-parse-even-better-errors: 2.3.1 json-parse-even-better-errors: 2.3.1
normalize-package-data: 3.0.0 normalize-package-data: 3.0.0
npm-normalize-package-bin: 1.0.1 npm-normalize-package-bin: 1.0.1
@ -22656,6 +22815,21 @@ packages:
resolve: 1.22.2 resolve: 1.22.2
dev: true dev: true
/recursive-copy@2.0.11:
resolution: {integrity: sha512-DqL2kO10mUne7XK5BPcwRtOJJZKhddD7IrW4UmHmKrwdV3HLPWcw6Jr4Jh12ooddfJOVz7ynFoFYYnPM7De0Og==}
dependencies:
del: 2.2.2
emitter-mixin: 0.0.3
errno: 0.1.8
graceful-fs: 4.2.11
junk: 1.0.3
maximatch: 0.1.0
mkdirp: 0.5.5
pify: 2.3.0
promise: 7.3.1
slash: 1.0.0
dev: false
/redent@1.0.0: /redent@1.0.0:
resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==} resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -22996,7 +23170,6 @@ packages:
/require-directory@2.1.1: /require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dev: true
/require-from-string@1.2.1: /require-from-string@1.2.1:
resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==} resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==}
@ -23218,21 +23391,20 @@ packages:
resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==}
hasBin: true hasBin: true
dependencies: dependencies:
glob: 7.2.0 glob: 7.1.7
dev: false dev: false
/rimraf@2.7.1: /rimraf@2.7.1:
resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
hasBin: true hasBin: true
dependencies: dependencies:
glob: 7.2.0 glob: 7.1.7
dev: true
/rimraf@3.0.2: /rimraf@3.0.2:
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
hasBin: true hasBin: true
dependencies: dependencies:
glob: 7.2.0 glob: 7.1.7
/ripemd160@2.0.2: /ripemd160@2.0.2:
resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==} resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
@ -23726,7 +23898,7 @@ packages:
engines: {node: '>=4'} engines: {node: '>=4'}
hasBin: true hasBin: true
dependencies: dependencies:
glob: 7.2.0 glob: 7.1.7
interpret: 1.4.0 interpret: 1.4.0
rechoir: 0.6.2 rechoir: 0.6.2
dev: true dev: true
@ -23768,6 +23940,11 @@ packages:
resolution: {integrity: sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==} resolution: {integrity: sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==}
dev: true dev: true
/slash@1.0.0:
resolution: {integrity: sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==}
engines: {node: '>=0.10.0'}
dev: false
/slash@2.0.0: /slash@2.0.0:
resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==} resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -24816,7 +24993,7 @@ packages:
optional: true optional: true
dependencies: dependencies:
acorn: 8.8.2 acorn: 8.8.2
commander: 2.20.3 commander: 2.20.0
source-map: 0.7.4 source-map: 0.7.4
source-map-support: 0.5.20 source-map-support: 0.5.20
dev: true dev: true
@ -24839,7 +25016,7 @@ packages:
dependencies: dependencies:
'@jridgewell/source-map': 0.3.3 '@jridgewell/source-map': 0.3.3
acorn: 8.8.2 acorn: 8.8.2
commander: 2.20.3 commander: 2.20.0
source-map-support: 0.5.20 source-map-support: 0.5.20
/terser@5.5.1: /terser@5.5.1:
@ -24848,7 +25025,7 @@ packages:
hasBin: true hasBin: true
dependencies: dependencies:
acorn: 8.5.0 acorn: 8.5.0
commander: 2.20.3 commander: 2.20.0
source-map: 0.7.4 source-map: 0.7.4
source-map-support: 0.5.20 source-map-support: 0.5.20
dev: true dev: true
@ -24858,8 +25035,8 @@ packages:
engines: {node: '>=8'} engines: {node: '>=8'}
dependencies: dependencies:
'@istanbuljs/schema': 0.1.2 '@istanbuljs/schema': 0.1.2
glob: 7.2.0 glob: 7.1.7
minimatch: 3.1.2 minimatch: 3.0.4
/text-extensions@1.9.0: /text-extensions@1.9.0:
resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==}
@ -24980,7 +25157,7 @@ packages:
resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
/to-fast-properties@2.0.0: /to-fast-properties@2.0.0:
resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'} engines: {node: '>=4'}
/to-object-path@0.3.0: /to-object-path@0.3.0:
@ -25459,7 +25636,7 @@ packages:
debug: 4.1.1 debug: 4.1.1
fault: 1.0.4 fault: 1.0.4
figures: 3.1.0 figures: 3.1.0
glob: 7.2.0 glob: 7.1.7
ignore: 5.2.4 ignore: 5.2.4
is-buffer: 2.0.4 is-buffer: 2.0.4
is-empty: 1.2.0 is-empty: 1.2.0
@ -25681,12 +25858,10 @@ packages:
/universalify@1.0.0: /universalify@1.0.0:
resolution: {integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==} resolution: {integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==}
engines: {node: '>= 10.0.0'} engines: {node: '>= 10.0.0'}
dev: true
/universalify@2.0.0: /universalify@2.0.0:
resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
engines: {node: '>= 10.0.0'} engines: {node: '>= 10.0.0'}
dev: true
/unpipe@1.0.0: /unpipe@1.0.0:
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
@ -26090,12 +26265,12 @@ packages:
engines: {node: '>= 10.13.0'} engines: {node: '>= 10.13.0'}
hasBin: true hasBin: true
dependencies: dependencies:
acorn: 8.8.0 acorn: 8.5.0
acorn-walk: 8.0.0 acorn-walk: 8.2.0
chalk: 4.1.2 chalk: 4.1.2
commander: 7.2.0 commander: 7.2.0
gzip-size: 6.0.0 gzip-size: 6.0.0
lodash: 4.17.21 lodash: 4.17.20
opener: 1.5.2 opener: 1.5.2
sirv: 1.0.10 sirv: 1.0.10
ws: 7.5.3 ws: 7.5.3
@ -26458,7 +26633,6 @@ packages:
/y18n@5.0.5: /y18n@5.0.5:
resolution: {integrity: sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==} resolution: {integrity: sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==}
engines: {node: '>=10'} engines: {node: '>=10'}
dev: true
/yallist@2.1.2: /yallist@2.1.2:
resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==}
@ -26491,7 +26665,6 @@ packages:
/yargs-parser@20.2.4: /yargs-parser@20.2.4:
resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==}
engines: {node: '>=10'} engines: {node: '>=10'}
dev: true
/yargs-parser@21.0.1: /yargs-parser@21.0.1:
resolution: {integrity: sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==} resolution: {integrity: sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==}
@ -26525,7 +26698,6 @@ packages:
string-width: 4.2.3 string-width: 4.2.3
y18n: 5.0.5 y18n: 5.0.5
yargs-parser: 20.2.4 yargs-parser: 20.2.4
dev: true
/yargs@17.5.1: /yargs@17.5.1:
resolution: {integrity: sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==} resolution: {integrity: sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==}

View file

@ -1,6 +1,6 @@
packages: packages:
- 'packages/*' - 'packages/*'
- 'bench/vercel/' - 'bench/*'
- 'packages/next-swc/crates/next-dev-tests/test-harness' - 'packages/next-swc/crates/next-dev-tests/test-harness'
- 'packages/next-swc/crates/next-dev-tests/tests' - 'packages/next-swc/crates/next-dev-tests/tests'
- 'packages/next-swc/crates/next-core/js' - 'packages/next-swc/crates/next-core/js'

View file

@ -35,7 +35,7 @@ describe('modularize-imports', () => {
), ),
] ]
expect(modules.length).toBeGreaterThan(1) expect(modules.length).toBeGreaterThanOrEqual(1)
for (const [, , , moduleCount] of modules) { for (const [, , , moduleCount] of modules) {
// Ensure that the number of modules is less than 1000 - otherwise we're // Ensure that the number of modules is less than 1000 - otherwise we're
// importing the entire library. // importing the entire library.