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:
parent
93e4e6d438
commit
00106b7ef4
34 changed files with 834 additions and 122 deletions
|
@ -37,8 +37,8 @@ test/production/emit-decorator-metadata/**/*.js
|
|||
test/e2e/app-dir/rsc-errors/app/swc/use-client/page.js
|
||||
test-timings.json
|
||||
packages/next-swc/crates/**
|
||||
bench/nested-deps/pages/**
|
||||
bench/nested-deps/components/**
|
||||
bench/nested-deps/**
|
||||
bench/nested-deps-app-router/**
|
||||
packages/next-bundle-analyzer/index.d.ts
|
||||
examples/with-typescript-graphql/lib/gql/
|
||||
test/development/basic/hmr/components/parse-error.js
|
||||
|
|
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -17,6 +17,7 @@ test/node_modules
|
|||
*.log
|
||||
pids
|
||||
*.cpuprofile
|
||||
*.heapsnapshot
|
||||
|
||||
# coverage
|
||||
.nyc_output
|
||||
|
|
15
bench/app-router-server/package.json
Normal file
15
bench/app-router-server/package.json
Normal 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"
|
||||
}
|
||||
}
|
|
@ -176,6 +176,7 @@ if (require.main === module) {
|
|||
type: 'string',
|
||||
}).argv
|
||||
|
||||
fs.mkdirSync(outdir, { recursive: true })
|
||||
generateFuzzponents(outdir, seed, depth, opts)
|
||||
}
|
||||
|
12
bench/fuzzponent/package.json
Normal file
12
bench/fuzzponent/package.json
Normal 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"
|
||||
}
|
||||
}
|
39
bench/fuzzponent/readme.md
Normal file
39
bench/fuzzponent/readme.md
Normal 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"]
|
||||
```
|
|
@ -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"
|
||||
}
|
||||
}
|
2
bench/nested-deps-app-router/.gitignore
vendored
Normal file
2
bench/nested-deps-app-router/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
components/*
|
||||
CPU*
|
|
@ -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 />
|
||||
</>
|
||||
)
|
||||
}
|
14
bench/nested-deps-app-router/app/layout.js
Normal file
14
bench/nested-deps-app-router/app/layout.js
Normal 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>
|
||||
)
|
||||
}
|
|
@ -0,0 +1,8 @@
|
|||
'use client'
|
||||
import React from 'react'
|
||||
|
||||
import Comp from '../../components/index.jsx'
|
||||
|
||||
export default function Home() {
|
||||
return <Comp />
|
||||
}
|
|
@ -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 />
|
||||
</>
|
||||
)
|
||||
}
|
|
@ -0,0 +1,6 @@
|
|||
import React from 'react'
|
||||
import Comp from '../../components/index.jsx'
|
||||
|
||||
export default function Home() {
|
||||
return <Comp />
|
||||
}
|
253
bench/nested-deps-app-router/bench.mjs
Normal file
253
bench/nested-deps-app-router/bench.mjs
Normal 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()
|
||||
}
|
8
bench/nested-deps-app-router/next.config.js
Normal file
8
bench/nested-deps-app-router/next.config.js
Normal 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,
|
||||
},
|
||||
}
|
19
bench/nested-deps-app-router/package.json
Normal file
19
bench/nested-deps-app-router/package.json
Normal 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:*"
|
||||
}
|
||||
}
|
|
@ -5,5 +5,4 @@ module.exports = {
|
|||
eslint: {
|
||||
ignoreDuringBuilds: true,
|
||||
},
|
||||
swcMinify: true,
|
||||
}
|
||||
|
|
|
@ -1,20 +1,19 @@
|
|||
{
|
||||
"name": "bench-nested-deps",
|
||||
"scripts": {
|
||||
"prepare": "rimraf components && mkdir components && node ./fuzzponent.js -d 2 -s 206 -o components",
|
||||
"dev": "cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 node ../../node_modules/next/dist/bin/next dev",
|
||||
"build": "cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 node ../../node_modules/next/dist/bin/next build",
|
||||
"start": "cross-env NEXT_PRIVATE_LOCAL_WEBPACK=1 node ../../node_modules/next/dist/bin/next start",
|
||||
"dev-nocache": "rimraf .next && yarn dev",
|
||||
"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 && yarn build"
|
||||
"build-nocache": "rimraf .next && pnpm build-application"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@babel/types": "7.18.0",
|
||||
"@babel/generator": "7.18.0",
|
||||
"random-seed": "0.3.0",
|
||||
"fuzzponent": "workspace:*",
|
||||
"cross-env": "^7.0.3",
|
||||
"pretty-ms": "^7.0.1",
|
||||
"rimraf": "^3.0.2",
|
||||
"yargs": "16.2.0"
|
||||
"next": "workspace:*"
|
||||
}
|
||||
}
|
||||
|
|
5
bench/minimal-server/start.js → bench/next-minimal-server/bin/minimal-server.js
Normal file → Executable file
5
bench/minimal-server/start.js → bench/next-minimal-server/bin/minimal-server.js
Normal file → Executable file
|
@ -1,12 +1,13 @@
|
|||
#!/usr/bin/env node
|
||||
process.env.NODE_ENV = 'production'
|
||||
|
||||
require('../../test/lib/react-channel-require-hook')
|
||||
require('../../../test/lib/react-channel-require-hook')
|
||||
|
||||
console.time('next-cold-start')
|
||||
const NextServer = require('next/dist/server/next-server').default
|
||||
const path = require('path')
|
||||
|
||||
const appDir = path.join(__dirname, 'benchmark-app')
|
||||
const appDir = process.cwd()
|
||||
const distDir = '.next'
|
||||
|
||||
const compiledConfig = require(path.join(
|
|
@ -1,7 +1,8 @@
|
|||
{
|
||||
"name": "next-minimal-server",
|
||||
"description": "Minimal server for Next.js for benchmarking/perf analysis purposes.",
|
||||
"scripts": {
|
||||
"start": "node start.js"
|
||||
"bin": "./bin/minimal-server.js",
|
||||
"peerDependencies": {
|
||||
"next": "workspace:*"
|
||||
}
|
||||
}
|
|
@ -1,8 +1,8 @@
|
|||
{
|
||||
"name": "next-bench",
|
||||
"name": "bench-rendering",
|
||||
"scripts": {
|
||||
"build": "next build",
|
||||
"start": "NODE_ENV=production npm run build && NODE_ENV=production next start",
|
||||
"build-application": "next build",
|
||||
"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-big": "ab -c1 -n500 http://0.0.0.0:3000/stateless-big",
|
||||
"bench:recursive-copy": "node recursive-copy/run"
|
||||
|
|
|
@ -12,7 +12,7 @@ export function startedDevelopmentServer(appUrl: string, bindAddr: string) {
|
|||
}
|
||||
|
||||
type CompilerDiagnostics = {
|
||||
modules: number
|
||||
totalModulesCount: number
|
||||
errors: string[] | null
|
||||
warnings: string[] | null
|
||||
}
|
||||
|
@ -142,10 +142,10 @@ buildStore.subscribe((state) => {
|
|||
clientWasLoading && (serverWasLoading || edgeServerWasLoading)
|
||||
? 'client and server'
|
||||
: undefined,
|
||||
modules:
|
||||
(clientWasLoading ? client.modules : 0) +
|
||||
(serverWasLoading ? server.modules : 0) +
|
||||
(edgeServerWasLoading ? edgeServer?.modules || 0 : 0),
|
||||
totalModulesCount:
|
||||
(clientWasLoading ? client.totalModulesCount : 0) +
|
||||
(serverWasLoading ? server.totalModulesCount : 0) +
|
||||
(edgeServerWasLoading ? edgeServer?.totalModulesCount || 0 : 0),
|
||||
hasEdgeServer: !!edgeServer,
|
||||
}
|
||||
if (client.errors && clientWasLoading) {
|
||||
|
@ -257,7 +257,7 @@ export function watchCompilers(
|
|||
|
||||
onEvent({
|
||||
loading: false,
|
||||
modules: stats.compilation.modules.size,
|
||||
totalModulesCount: stats.compilation.modules.size,
|
||||
errors: hasErrors ? errors : null,
|
||||
warnings: hasWarnings ? warnings : null,
|
||||
})
|
||||
|
|
|
@ -19,7 +19,7 @@ export type OutputState =
|
|||
loading: false
|
||||
typeChecking: boolean
|
||||
partial: 'client and server' | undefined
|
||||
modules: number
|
||||
totalModulesCount: number
|
||||
errors: string[] | null
|
||||
warnings: string[] | null
|
||||
hasEdgeServer: boolean
|
||||
|
@ -111,8 +111,8 @@ store.subscribe((state) => {
|
|||
}
|
||||
|
||||
let modulesMessage = ''
|
||||
if (state.modules) {
|
||||
modulesMessage = ` (${state.modules} modules)`
|
||||
if (state.totalModulesCount) {
|
||||
modulesMessage = ` (${state.totalModulesCount} modules)`
|
||||
}
|
||||
|
||||
let partialMessage = ''
|
||||
|
|
|
@ -67,6 +67,7 @@ import { AppBuildManifestPlugin } from './webpack/plugins/app-build-manifest-plu
|
|||
import { SubresourceIntegrityPlugin } from './webpack/plugins/subresource-integrity-plugin'
|
||||
import { NextFontManifestPlugin } from './webpack/plugins/next-font-manifest-plugin'
|
||||
import { getSupportedBrowsers } from './utils'
|
||||
import { MemoryWithGcCachePlugin } from './webpack/plugins/memory-with-gc-cache-plugin'
|
||||
|
||||
type ExcludesFalse = <T>(x: T | false) => x is T
|
||||
type ClientEntries = {
|
||||
|
@ -2351,6 +2352,7 @@ export default async function getBaseWebpackConfig(
|
|||
].filter(Boolean),
|
||||
},
|
||||
plugins: [
|
||||
dev && new MemoryWithGcCachePlugin({ maxGenerations: 5 }),
|
||||
dev && isClient && new ReactRefreshWebpackPlugin(webpack),
|
||||
// Makes sure `Buffer` and `process` are polyfilled in client and flight bundles (same behavior as webpack 4)
|
||||
(isClient || isEdgeServer) &&
|
||||
|
@ -2695,6 +2697,8 @@ export default async function getBaseWebpackConfig(
|
|||
|
||||
const cache: any = {
|
||||
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:
|
||||
// - Next.js version
|
||||
// - next.config.js keys that affect compilation
|
||||
|
|
|
@ -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
|
@ -28,6 +28,10 @@ import { APP_DIR_ALIAS, WEBPACK_LAYERS } from '../../lib/constants'
|
|||
import { recursiveDelete } from '../../lib/recursive-delete'
|
||||
import {
|
||||
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,
|
||||
RSC_MODULE_TYPES,
|
||||
} from '../../shared/lib/constants'
|
||||
|
@ -966,17 +970,21 @@ export default class HotReloader {
|
|||
)
|
||||
|
||||
if (!this.hasAmpEntrypoints) {
|
||||
delete entrypoints.amp
|
||||
delete entrypoints[CLIENT_STATIC_FILES_RUNTIME_AMP]
|
||||
}
|
||||
if (!this.hasPagesRouterEntrypoints) {
|
||||
delete entrypoints.main
|
||||
delete entrypoints[CLIENT_STATIC_FILES_RUNTIME_MAIN]
|
||||
delete entrypoints['pages/_app']
|
||||
delete entrypoints['pages/_error']
|
||||
delete entrypoints['/_error']
|
||||
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) {
|
||||
delete entrypoints['main-app']
|
||||
delete entrypoints[CLIENT_STATIC_FILES_RUNTIME_MAIN_APP]
|
||||
}
|
||||
|
||||
return entrypoints
|
||||
|
|
316
pnpm-lock.yaml
316
pnpm-lock.yaml
|
@ -543,6 +543,87 @@ importers:
|
|||
specifier: 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:
|
||||
dependencies:
|
||||
'@szmarczak/http-timer':
|
||||
|
@ -2221,10 +2302,6 @@ packages:
|
|||
dependencies:
|
||||
'@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:
|
||||
resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
|
@ -4942,7 +5019,7 @@ packages:
|
|||
resolution: {integrity: sha512-vhAmLPAiC8j9K2GnsnLPCIH5wCrPpYIVBCWRBFDCB7Y/BXLqi/O+1RSTTM2bsmg6U/551+FCf9PNPxjABmxHTw==}
|
||||
engines: {node: '>=6.9.0'}
|
||||
dependencies:
|
||||
'@babel/helper-validator-identifier': 7.16.7
|
||||
'@babel/helper-validator-identifier': 7.19.1
|
||||
to-fast-properties: 2.0.0
|
||||
|
||||
/@bazel/bazelisk@1.12.1:
|
||||
|
@ -5249,7 +5326,7 @@ packages:
|
|||
ignore: 4.0.6
|
||||
import-fresh: 3.3.0
|
||||
js-yaml: 3.14.1
|
||||
minimatch: 3.1.2
|
||||
minimatch: 3.0.4
|
||||
strip-json-comments: 3.1.1
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
@ -5606,7 +5683,7 @@ packages:
|
|||
dependencies:
|
||||
'@humanwhocodes/object-schema': 1.2.1
|
||||
debug: 4.1.1
|
||||
minimatch: 3.1.2
|
||||
minimatch: 3.0.4
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
dev: true
|
||||
|
@ -5777,7 +5854,7 @@ packages:
|
|||
chalk: 4.0.0
|
||||
collect-v8-coverage: 1.0.1
|
||||
exit: 0.1.2
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
graceful-fs: 4.2.11
|
||||
istanbul-lib-coverage: 3.2.0
|
||||
istanbul-lib-instrument: 4.0.3
|
||||
|
@ -6100,7 +6177,7 @@ packages:
|
|||
dependencies:
|
||||
'@lerna/child-process': 4.0.0
|
||||
'@lerna/describe-ref': 4.0.0
|
||||
minimatch: 3.1.2
|
||||
minimatch: 3.0.4
|
||||
npmlog: 4.1.2
|
||||
slash: 3.0.0
|
||||
dev: true
|
||||
|
@ -6657,7 +6734,7 @@ packages:
|
|||
chalk: 4.1.2
|
||||
dedent: 0.7.0
|
||||
load-json-file: 6.2.0
|
||||
minimatch: 3.1.2
|
||||
minimatch: 3.0.4
|
||||
npmlog: 4.1.2
|
||||
p-map: 4.0.0
|
||||
p-pipe: 3.1.0
|
||||
|
@ -7409,7 +7486,7 @@ packages:
|
|||
'@rollup/pluginutils': 3.1.0(rollup@2.35.1)
|
||||
commondir: 1.0.1
|
||||
estree-walker: 2.0.2
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
is-reference: 1.2.1
|
||||
magic-string: 0.25.7
|
||||
resolve: 1.22.2
|
||||
|
@ -9028,11 +9105,11 @@ packages:
|
|||
/acorn-walk@8.0.0:
|
||||
resolution: {integrity: sha512-oZRad/3SMOI/pxbbmqyurIx7jHw1wZDcR9G44L8pUVFEomX/0dH89SrM1KaDXuv1NpzAXz6Op/Xu/Qd5XXzdEA==}
|
||||
engines: {node: '>=0.4.0'}
|
||||
dev: false
|
||||
|
||||
/acorn-walk@8.2.0:
|
||||
resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
|
||||
engines: {node: '>=0.4.0'}
|
||||
dev: true
|
||||
|
||||
/acorn@7.4.1:
|
||||
resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
|
||||
|
@ -9490,7 +9567,6 @@ packages:
|
|||
|
||||
/asap@2.0.6:
|
||||
resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
|
||||
dev: true
|
||||
|
||||
/asciichart@1.5.25:
|
||||
resolution: {integrity: sha512-PNxzXIPPOtWq8T7bgzBtk9cI2lgS4SJZthUHEiQ1aoIc3lNzGfUvIvo9LiAnq26TACo9t1/4qP6KTGAUbzX9Xg==}
|
||||
|
@ -10302,7 +10378,7 @@ packages:
|
|||
'@npmcli/move-file': 1.0.1
|
||||
chownr: 2.0.0
|
||||
fs-minipass: 2.1.0
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
infer-owner: 1.0.4
|
||||
lru-cache: 6.0.0
|
||||
minipass: 3.1.3
|
||||
|
@ -10811,7 +10887,6 @@ packages:
|
|||
string-width: 4.2.3
|
||||
strip-ansi: 6.0.1
|
||||
wrap-ansi: 7.0.0
|
||||
dev: true
|
||||
|
||||
/clone-deep@4.0.1:
|
||||
resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==}
|
||||
|
@ -10967,6 +11042,7 @@ packages:
|
|||
|
||||
/commander@2.20.3:
|
||||
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
|
||||
dev: true
|
||||
|
||||
/commander@4.1.1:
|
||||
resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
|
||||
|
@ -11424,6 +11500,14 @@ packages:
|
|||
cross-spawn: 7.0.3
|
||||
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:
|
||||
resolution: {integrity: sha512-+JhD65rDNqLbGmB3Gzs3HrEKC0aQnD+XA3SY6RjgkF88jV2q5cTc5+CwxlS3sdmLk98gpPt5CF9XRnPdlxZe6w==}
|
||||
dependencies:
|
||||
|
@ -12159,11 +12243,24 @@ packages:
|
|||
resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
|
||||
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:
|
||||
resolution: {integrity: sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==}
|
||||
engines: {node: '>=10'}
|
||||
dependencies:
|
||||
globby: 11.1.0
|
||||
globby: 11.0.1
|
||||
graceful-fs: 4.2.11
|
||||
is-glob: 4.0.3
|
||||
is-path-cwd: 2.2.0
|
||||
|
@ -12571,6 +12668,10 @@ packages:
|
|||
minimalistic-crypto-utils: 1.0.1
|
||||
dev: true
|
||||
|
||||
/emitter-mixin@0.0.3:
|
||||
resolution: {integrity: sha512-DlYAjELhPGbpH7qLS00H+CnoLxKxZblXuLDBwl1I8ozlQ0xITmlopiEunFmb3lYzrSD+EW7sIEw5fSoZgNiO8Q==}
|
||||
dev: false
|
||||
|
||||
/emittery@0.8.1:
|
||||
resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==}
|
||||
engines: {node: '>=10'}
|
||||
|
@ -12665,6 +12766,13 @@ packages:
|
|||
resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
|
||||
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:
|
||||
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
|
||||
dependencies:
|
||||
|
@ -13233,7 +13341,7 @@ packages:
|
|||
json-stable-stringify-without-jsonify: 1.0.1
|
||||
levn: 0.4.1
|
||||
lodash.merge: 4.6.2
|
||||
minimatch: 3.1.2
|
||||
minimatch: 3.0.4
|
||||
natural-compare: 1.4.0
|
||||
optionator: 0.9.1
|
||||
progress: 2.0.3
|
||||
|
@ -14129,6 +14237,15 @@ packages:
|
|||
engines: {node: '>=0.10.0'}
|
||||
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:
|
||||
resolution: {integrity: sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==}
|
||||
dependencies:
|
||||
|
@ -14247,7 +14364,6 @@ packages:
|
|||
/get-caller-file@2.0.5:
|
||||
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
|
||||
engines: {node: 6.* || 8.* || >= 10.*}
|
||||
dev: true
|
||||
|
||||
/get-intrinsic@1.1.1:
|
||||
resolution: {integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==}
|
||||
|
@ -14509,9 +14625,10 @@ packages:
|
|||
fs.realpath: 1.0.0
|
||||
inflight: 1.0.6
|
||||
inherits: 2.0.4
|
||||
minimatch: 3.1.2
|
||||
minimatch: 3.0.4
|
||||
once: 1.4.0
|
||||
path-is-absolute: 1.0.1
|
||||
dev: true
|
||||
|
||||
/global-dirs@2.1.0:
|
||||
resolution: {integrity: sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==}
|
||||
|
@ -14588,7 +14705,6 @@ packages:
|
|||
ignore: 5.2.0
|
||||
merge2: 1.4.1
|
||||
slash: 3.0.0
|
||||
dev: false
|
||||
|
||||
/globby@11.1.0:
|
||||
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
|
||||
|
@ -14624,6 +14740,18 @@ packages:
|
|||
slash: 4.0.0
|
||||
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:
|
||||
resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
|
||||
|
||||
|
@ -15085,7 +15213,7 @@ packages:
|
|||
deepmerge: 4.2.2
|
||||
eslint: 7.32.0
|
||||
espree: 7.3.1
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
inquirer: 7.3.3
|
||||
json-merge-patch: 1.0.2
|
||||
minimist: 1.2.6
|
||||
|
@ -15320,7 +15448,7 @@ packages:
|
|||
/ignore-walk@3.0.4:
|
||||
resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==}
|
||||
dependencies:
|
||||
minimatch: 3.1.2
|
||||
minimatch: 3.0.4
|
||||
dev: true
|
||||
|
||||
/ignore@4.0.6:
|
||||
|
@ -15331,7 +15459,6 @@ packages:
|
|||
/ignore@5.2.0:
|
||||
resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==}
|
||||
engines: {node: '>= 4'}
|
||||
dev: false
|
||||
|
||||
/ignore@5.2.4:
|
||||
resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
|
||||
|
@ -15473,7 +15600,7 @@ packages:
|
|||
resolution: {integrity: sha512-PO64kVeArePvhX7Ff0jVWkpnE1DfGRvaWcStYrPugcJz9twQGYibagKJuIMHCX7ENcp0M6LJlcjLBuLD5KeJMg==}
|
||||
engines: {node: '>=10'}
|
||||
dependencies:
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
npm-package-arg: 8.1.0
|
||||
promzard: 0.3.0
|
||||
read: 1.0.7
|
||||
|
@ -15952,11 +16079,30 @@ packages:
|
|||
symbol-observable: 1.2.0
|
||||
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:
|
||||
resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==}
|
||||
engines: {node: '>=6'}
|
||||
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:
|
||||
resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
|
||||
engines: {node: '>=8'}
|
||||
|
@ -16267,7 +16413,7 @@ packages:
|
|||
async: 3.2.4
|
||||
chalk: 4.1.2
|
||||
filelist: 1.0.4
|
||||
minimatch: 3.1.2
|
||||
minimatch: 3.0.4
|
||||
dev: true
|
||||
|
||||
/jest-changed-files@27.0.6:
|
||||
|
@ -16354,7 +16500,7 @@ packages:
|
|||
babel-jest: 27.0.6(@babel/core@7.18.0)
|
||||
chalk: 4.0.0
|
||||
deepmerge: 4.2.2
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
graceful-fs: 4.2.11
|
||||
is-ci: 3.0.0
|
||||
jest-circus: 27.5.1
|
||||
|
@ -16808,7 +16954,7 @@ packages:
|
|||
cjs-module-lexer: 1.2.2
|
||||
collect-v8-coverage: 1.0.1
|
||||
exit: 0.1.2
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
graceful-fs: 4.2.11
|
||||
jest-haste-map: 27.5.1
|
||||
jest-message-util: 27.5.1
|
||||
|
@ -16840,7 +16986,7 @@ packages:
|
|||
cjs-module-lexer: 1.2.2
|
||||
collect-v8-coverage: 1.0.1
|
||||
execa: 5.0.0
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
graceful-fs: 4.2.11
|
||||
jest-haste-map: 27.5.1
|
||||
jest-message-util: 27.5.1
|
||||
|
@ -17198,7 +17344,6 @@ packages:
|
|||
|
||||
/json-stringify-safe@5.0.1:
|
||||
resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
|
||||
dev: true
|
||||
|
||||
/json-to-ast@2.1.0:
|
||||
resolution: {integrity: sha512-W9Lq347r8tA1DfMvAGn9QNcgYm4Wm7Yc+k8e6vezpMnRT+NHbtlxgNBXRVjXe9YM6eTn6+p/MKOlV/aABJcSnQ==}
|
||||
|
@ -17231,7 +17376,6 @@ packages:
|
|||
universalify: 1.0.0
|
||||
optionalDependencies:
|
||||
graceful-fs: 4.2.11
|
||||
dev: true
|
||||
|
||||
/jsonparse@1.3.1:
|
||||
resolution: {integrity: sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=}
|
||||
|
@ -17279,6 +17423,11 @@ packages:
|
|||
set-immediate-shim: 1.0.1
|
||||
dev: true
|
||||
|
||||
/junk@1.0.3:
|
||||
resolution: {integrity: sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: false
|
||||
|
||||
/jwa@1.4.1:
|
||||
resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==}
|
||||
dependencies:
|
||||
|
@ -17848,7 +17997,6 @@ packages:
|
|||
|
||||
/lodash@4.17.20:
|
||||
resolution: {integrity: sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==}
|
||||
dev: true
|
||||
|
||||
/lodash@4.17.21:
|
||||
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
|
||||
|
@ -18097,6 +18245,16 @@ packages:
|
|||
resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==}
|
||||
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:
|
||||
resolution: {integrity: sha512-NWlApBjW9az9qRPaeg7CX4sQBWwytqz32bIEo1PW9pRW+kBP9KLRfJO3UC+TV31EcQZEUq7eMzikC7zt3zPJcw==}
|
||||
engines: {node: '>=0.12'}
|
||||
|
@ -18853,7 +19011,6 @@ packages:
|
|||
resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==}
|
||||
dependencies:
|
||||
brace-expansion: 1.1.11
|
||||
dev: true
|
||||
|
||||
/minimatch@3.1.2:
|
||||
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
|
||||
|
@ -18990,7 +19147,6 @@ packages:
|
|||
hasBin: true
|
||||
dependencies:
|
||||
minimist: 1.2.6
|
||||
dev: true
|
||||
|
||||
/mkdirp@1.0.4:
|
||||
resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
|
||||
|
@ -19091,7 +19247,7 @@ packages:
|
|||
array-differ: 1.0.0
|
||||
array-union: 1.0.2
|
||||
arrify: 1.0.1
|
||||
minimatch: 3.1.2
|
||||
minimatch: 3.0.4
|
||||
dev: false
|
||||
|
||||
/multimatch@5.0.0:
|
||||
|
@ -19102,7 +19258,7 @@ packages:
|
|||
array-differ: 3.0.0
|
||||
array-union: 2.1.0
|
||||
arrify: 2.0.1
|
||||
minimatch: 3.1.2
|
||||
minimatch: 3.0.4
|
||||
dev: true
|
||||
|
||||
/mute-stream@0.0.7:
|
||||
|
@ -19230,7 +19386,7 @@ packages:
|
|||
resolution: {integrity: sha1-X1Zl2TNRM1yqvvjxxVRRbPXx5OU=}
|
||||
engines: {node: '>= 0.10.5'}
|
||||
dependencies:
|
||||
minimatch: 3.1.2
|
||||
minimatch: 3.0.4
|
||||
dev: false
|
||||
|
||||
/node-emoji@1.10.0:
|
||||
|
@ -19284,7 +19440,7 @@ packages:
|
|||
hasBin: true
|
||||
dependencies:
|
||||
env-paths: 2.2.1
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
graceful-fs: 4.2.11
|
||||
mkdirp: 0.5.5
|
||||
nopt: 4.0.3
|
||||
|
@ -19302,7 +19458,7 @@ packages:
|
|||
hasBin: true
|
||||
dependencies:
|
||||
env-paths: 2.2.1
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
graceful-fs: 4.2.11
|
||||
nopt: 5.0.0
|
||||
npmlog: 4.1.2
|
||||
|
@ -19466,7 +19622,7 @@ packages:
|
|||
engines: {node: '>=10'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
ignore-walk: 3.0.4
|
||||
npm-bundled: 1.1.2
|
||||
npm-normalize-package-bin: 1.0.1
|
||||
|
@ -20326,6 +20482,10 @@ packages:
|
|||
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
|
||||
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:
|
||||
resolution: {integrity: sha512-T3hWy7tyXlk3QvPFnT+o2tmXRzU4GkitkUWLp/WZ0S/FXd7XMx176tRurgTvHTNMJOQzTcesHNpBqetH86mQ9g==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
@ -20442,7 +20602,6 @@ packages:
|
|||
/pify@2.3.0:
|
||||
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: true
|
||||
|
||||
/pify@3.0.0:
|
||||
resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==}
|
||||
|
@ -20459,16 +20618,14 @@ packages:
|
|||
dev: true
|
||||
|
||||
/pinkie-promise@2.0.1:
|
||||
resolution: {integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o=}
|
||||
resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dependencies:
|
||||
pinkie: 2.0.4
|
||||
dev: true
|
||||
|
||||
/pinkie@2.0.4:
|
||||
resolution: {integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA=}
|
||||
resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: true
|
||||
|
||||
/pirates@4.0.5:
|
||||
resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
|
||||
|
@ -20827,7 +20984,7 @@ packages:
|
|||
/postcss-functions@3.0.0:
|
||||
resolution: {integrity: sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=}
|
||||
dependencies:
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
object-assign: 4.1.1
|
||||
postcss: 6.0.23
|
||||
postcss-value-parser: 3.3.1
|
||||
|
@ -21991,7 +22148,6 @@ packages:
|
|||
resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==}
|
||||
dependencies:
|
||||
asap: 2.0.6
|
||||
dev: true
|
||||
|
||||
/promise@8.1.0:
|
||||
resolution: {integrity: sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==}
|
||||
|
@ -22092,6 +22248,10 @@ packages:
|
|||
ipaddr.js: 1.9.0
|
||||
dev: true
|
||||
|
||||
/prr@1.0.1:
|
||||
resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
|
||||
dev: false
|
||||
|
||||
/pseudomap@1.0.2:
|
||||
resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==}
|
||||
|
||||
|
@ -22152,7 +22312,7 @@ packages:
|
|||
engines: {node: '>=4.4.0', npm: '>=5.2.0'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
postcss: 7.0.32
|
||||
postcss-selector-parser: 6.0.11
|
||||
yargs: 14.2.2
|
||||
|
@ -22220,11 +22380,10 @@ packages:
|
|||
dev: true
|
||||
|
||||
/random-seed@0.3.0:
|
||||
resolution: {integrity: sha1-2UXy4fOPSejViRNDG4v2u5N1Vs0=}
|
||||
resolution: {integrity: sha512-y13xtn3kcTlLub3HKWXxJNeC2qK4mB59evwZ5EkeRlolx+Bp2ztF7LbcZmyCnOqlHQrLnfuNbi1sVmm9lPDlDA==}
|
||||
engines: {node: '>= 0.6.0'}
|
||||
dependencies:
|
||||
json-stringify-safe: 5.0.1
|
||||
dev: true
|
||||
|
||||
/random-string@0.2.0:
|
||||
resolution: {integrity: sha512-isA91IquV3ZrFbvwkAtExP8aGL+csx3KGEsEJrvCidzOHioPl5B5g7WyJlk0lMkEz5/i1PqrWTvcdtJHPtrp1g==}
|
||||
|
@ -22475,7 +22634,7 @@ packages:
|
|||
/read-package-json@2.1.1:
|
||||
resolution: {integrity: sha512-dAiqGtVc/q5doFz6096CcnXhpYk0ZN8dEKVkGLU0CsASt8SrgF6SF7OTKAYubfvFhWaqofl+Y8HK19GR8jwW+A==}
|
||||
dependencies:
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
json-parse-better-errors: 1.0.2
|
||||
normalize-package-data: 2.5.0
|
||||
npm-normalize-package-bin: 1.0.1
|
||||
|
@ -22487,7 +22646,7 @@ packages:
|
|||
resolution: {integrity: sha512-4TnJZ5fnDs+/3deg1AuMExL4R1SFNRLQeOhV9c8oDKm3eoG6u8xU0r0mNNRJHi3K6B+jXmT7JOhwhAklWw9SSQ==}
|
||||
engines: {node: '>=10'}
|
||||
dependencies:
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
json-parse-even-better-errors: 2.3.1
|
||||
normalize-package-data: 3.0.0
|
||||
npm-normalize-package-bin: 1.0.1
|
||||
|
@ -22656,6 +22815,21 @@ packages:
|
|||
resolve: 1.22.2
|
||||
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:
|
||||
resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
|
@ -22996,7 +23170,6 @@ packages:
|
|||
/require-directory@2.1.1:
|
||||
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
|
||||
engines: {node: '>=0.10.0'}
|
||||
dev: true
|
||||
|
||||
/require-from-string@1.2.1:
|
||||
resolution: {integrity: sha512-H7AkJWMobeskkttHyhTVtS0fxpFLjxhbfMa6Bk3wimP7sdPRGL3EyCg3sAQenFfAe+xQ+oAc85Nmtvq0ROM83Q==}
|
||||
|
@ -23218,21 +23391,20 @@ packages:
|
|||
resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
dev: false
|
||||
|
||||
/rimraf@2.7.1:
|
||||
resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
glob: 7.2.0
|
||||
dev: true
|
||||
glob: 7.1.7
|
||||
|
||||
/rimraf@3.0.2:
|
||||
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
|
||||
/ripemd160@2.0.2:
|
||||
resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
|
||||
|
@ -23726,7 +23898,7 @@ packages:
|
|||
engines: {node: '>=4'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
interpret: 1.4.0
|
||||
rechoir: 0.6.2
|
||||
dev: true
|
||||
|
@ -23768,6 +23940,11 @@ packages:
|
|||
resolution: {integrity: sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==}
|
||||
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:
|
||||
resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==}
|
||||
engines: {node: '>=6'}
|
||||
|
@ -24816,7 +24993,7 @@ packages:
|
|||
optional: true
|
||||
dependencies:
|
||||
acorn: 8.8.2
|
||||
commander: 2.20.3
|
||||
commander: 2.20.0
|
||||
source-map: 0.7.4
|
||||
source-map-support: 0.5.20
|
||||
dev: true
|
||||
|
@ -24839,7 +25016,7 @@ packages:
|
|||
dependencies:
|
||||
'@jridgewell/source-map': 0.3.3
|
||||
acorn: 8.8.2
|
||||
commander: 2.20.3
|
||||
commander: 2.20.0
|
||||
source-map-support: 0.5.20
|
||||
|
||||
/terser@5.5.1:
|
||||
|
@ -24848,7 +25025,7 @@ packages:
|
|||
hasBin: true
|
||||
dependencies:
|
||||
acorn: 8.5.0
|
||||
commander: 2.20.3
|
||||
commander: 2.20.0
|
||||
source-map: 0.7.4
|
||||
source-map-support: 0.5.20
|
||||
dev: true
|
||||
|
@ -24858,8 +25035,8 @@ packages:
|
|||
engines: {node: '>=8'}
|
||||
dependencies:
|
||||
'@istanbuljs/schema': 0.1.2
|
||||
glob: 7.2.0
|
||||
minimatch: 3.1.2
|
||||
glob: 7.1.7
|
||||
minimatch: 3.0.4
|
||||
|
||||
/text-extensions@1.9.0:
|
||||
resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==}
|
||||
|
@ -24980,7 +25157,7 @@ packages:
|
|||
resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
|
||||
|
||||
/to-fast-properties@2.0.0:
|
||||
resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=}
|
||||
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
|
||||
engines: {node: '>=4'}
|
||||
|
||||
/to-object-path@0.3.0:
|
||||
|
@ -25459,7 +25636,7 @@ packages:
|
|||
debug: 4.1.1
|
||||
fault: 1.0.4
|
||||
figures: 3.1.0
|
||||
glob: 7.2.0
|
||||
glob: 7.1.7
|
||||
ignore: 5.2.4
|
||||
is-buffer: 2.0.4
|
||||
is-empty: 1.2.0
|
||||
|
@ -25681,12 +25858,10 @@ packages:
|
|||
/universalify@1.0.0:
|
||||
resolution: {integrity: sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
dev: true
|
||||
|
||||
/universalify@2.0.0:
|
||||
resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
|
||||
engines: {node: '>= 10.0.0'}
|
||||
dev: true
|
||||
|
||||
/unpipe@1.0.0:
|
||||
resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
|
||||
|
@ -26090,12 +26265,12 @@ packages:
|
|||
engines: {node: '>= 10.13.0'}
|
||||
hasBin: true
|
||||
dependencies:
|
||||
acorn: 8.8.0
|
||||
acorn-walk: 8.0.0
|
||||
acorn: 8.5.0
|
||||
acorn-walk: 8.2.0
|
||||
chalk: 4.1.2
|
||||
commander: 7.2.0
|
||||
gzip-size: 6.0.0
|
||||
lodash: 4.17.21
|
||||
lodash: 4.17.20
|
||||
opener: 1.5.2
|
||||
sirv: 1.0.10
|
||||
ws: 7.5.3
|
||||
|
@ -26458,7 +26633,6 @@ packages:
|
|||
/y18n@5.0.5:
|
||||
resolution: {integrity: sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg==}
|
||||
engines: {node: '>=10'}
|
||||
dev: true
|
||||
|
||||
/yallist@2.1.2:
|
||||
resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==}
|
||||
|
@ -26491,7 +26665,6 @@ packages:
|
|||
/yargs-parser@20.2.4:
|
||||
resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==}
|
||||
engines: {node: '>=10'}
|
||||
dev: true
|
||||
|
||||
/yargs-parser@21.0.1:
|
||||
resolution: {integrity: sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==}
|
||||
|
@ -26525,7 +26698,6 @@ packages:
|
|||
string-width: 4.2.3
|
||||
y18n: 5.0.5
|
||||
yargs-parser: 20.2.4
|
||||
dev: true
|
||||
|
||||
/yargs@17.5.1:
|
||||
resolution: {integrity: sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
packages:
|
||||
- 'packages/*'
|
||||
- 'bench/vercel/'
|
||||
- 'bench/*'
|
||||
- 'packages/next-swc/crates/next-dev-tests/test-harness'
|
||||
- 'packages/next-swc/crates/next-dev-tests/tests'
|
||||
- 'packages/next-swc/crates/next-core/js'
|
||||
|
|
|
@ -35,7 +35,7 @@ describe('modularize-imports', () => {
|
|||
),
|
||||
]
|
||||
|
||||
expect(modules.length).toBeGreaterThan(1)
|
||||
expect(modules.length).toBeGreaterThanOrEqual(1)
|
||||
for (const [, , , moduleCount] of modules) {
|
||||
// Ensure that the number of modules is less than 1000 - otherwise we're
|
||||
// importing the entire library.
|
||||
|
|
Loading…
Reference in a new issue