From eecc3342cb417ed22341985afb566d1e128cacdd Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Tue, 30 Mar 2021 04:26:35 -0400 Subject: [PATCH 01/36] Temporarily remove experimental ESLint integration (#23521) This pull request **temporarily** removes ESLint, as it was not landed in accordance with our standard experimental policies. We are fully committed to landing this change again. This is being reverted because: - Next.js has very strict goals for its install size. This feature resulted in adding over 17MB, or a 43.6% increase. - The feature was not first landed under the `experimental` key in `next.config.js`, rather, it was added under the stable namespace (top-level) - Using the feature doesn't do a "guided setup" like TypeScript, it should ask you to "bring your own" dependencies for ESLint - It uses a undesirable ESLint plugin name: `plugin:@next/next/recommended`. This should read out as strictly `next`, or as short as we can get it. - Does not provide actionable warnings (missing link to resolve issue) - Does not follow appropriate console output styling. We need to revisit how these are presented. To re-land this, we need to ensure the following minimums are met: - Very minor change in install size - Fully experimental (i.e. flagged) with warnings - Finalized package name and configuration shape, preferably so we can do ` { extends: 'next' } `. --- .eslintignore | 2 - .../next.config.js/eslint-warnings-errors.md | 70 ------ docs/basic-features/eslint.md | 49 ----- docs/manifest.json | 8 - .../lib/rules/no-html-link-for-pages.js | 22 +- packages/eslint-plugin-next/lib/utils/url.js | 14 -- packages/next/build/index.ts | 35 --- packages/next/lib/eslint/customFormatter.ts | 68 ------ packages/next/lib/verifyAndLint.ts | 141 ------------ .../next/next-server/server/config-shared.ts | 4 - packages/next/package.json | 6 +- packages/next/server/hot-reloader.ts | 1 - .../next/server/on-demand-entry-handler.ts | 12 - test-pnp.sh | 3 - test/integration/dist-dir/test/index.test.js | 11 +- .../custom-eslint-config/.eslintrc.json | 16 -- .../custom-eslint-config/next.config.js | 1 - .../custom-eslint-config/pages/index.js | 13 -- .../eslint/custom-next-config/.eslintrc.json | 14 -- .../eslint/custom-next-config/next.config.js | 6 - .../eslint/custom-next-config/pages/index.js | 13 -- .../pkg-json-eslint-config/next.config.js | 3 - .../pkg-json-eslint-config/package.json | 36 --- .../pkg-json-eslint-config/pages/index.js | 13 -- .../eslint/test/custom-eslint-config.test.js | 37 ---- .../eslint/test/custom-next-config.test.js | 55 ----- .../test/pkg-json-eslint-config.test.js | 44 ---- .../index-index/pages/index/index.js | 2 +- .../index-index/pages/index/index/index.js | 2 +- .../index-index/pages/index/project/index.js | 2 +- .../index-index/pages/index/user.js | 2 +- .../production-build-dir/next.config.js | 5 - .../production/pages/error-in-ssr-render.js | 3 +- .../tsconfig-verifier/pages/index.tsx | 4 +- .../webpack-require-hook/next.config.js | 3 - yarn.lock | 208 +----------------- 36 files changed, 25 insertions(+), 903 deletions(-) delete mode 100644 docs/api-reference/next.config.js/eslint-warnings-errors.md delete mode 100644 docs/basic-features/eslint.md delete mode 100644 packages/next/lib/eslint/customFormatter.ts delete mode 100644 packages/next/lib/verifyAndLint.ts delete mode 100644 test/integration/eslint/custom-eslint-config/.eslintrc.json delete mode 100644 test/integration/eslint/custom-eslint-config/next.config.js delete mode 100644 test/integration/eslint/custom-eslint-config/pages/index.js delete mode 100644 test/integration/eslint/custom-next-config/.eslintrc.json delete mode 100644 test/integration/eslint/custom-next-config/next.config.js delete mode 100644 test/integration/eslint/custom-next-config/pages/index.js delete mode 100644 test/integration/eslint/pkg-json-eslint-config/next.config.js delete mode 100644 test/integration/eslint/pkg-json-eslint-config/package.json delete mode 100644 test/integration/eslint/pkg-json-eslint-config/pages/index.js delete mode 100644 test/integration/eslint/test/custom-eslint-config.test.js delete mode 100644 test/integration/eslint/test/custom-next-config.test.js delete mode 100644 test/integration/eslint/test/pkg-json-eslint-config.test.js delete mode 100644 test/integration/production-build-dir/next.config.js diff --git a/.eslintignore b/.eslintignore index fa46bc2d129c5..37e0a229afb6d 100644 --- a/.eslintignore +++ b/.eslintignore @@ -2,7 +2,6 @@ node_modules **/.next/** **/_next/** **/dist/** -e2e-tests/** examples/with-typescript-eslint-jest/** examples/with-kea/** packages/next/bundles/webpack/packages/*.runtime.js @@ -17,5 +16,4 @@ packages/next-codemod/**/*.js packages/next-codemod/**/*.d.ts packages/next-env/**/*.d.ts test/integration/async-modules/** -test/integration/eslint/** test-timings.json \ No newline at end of file diff --git a/docs/api-reference/next.config.js/eslint-warnings-errors.md b/docs/api-reference/next.config.js/eslint-warnings-errors.md deleted file mode 100644 index d133724132165..0000000000000 --- a/docs/api-reference/next.config.js/eslint-warnings-errors.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -description: Learn how to opt-in and out of ESLint during development mode and production builds. ---- - -# ESLint Warnings and Errors - -## During builds - -Next.js fails your **production build** (`next build`) when ESLint errors are present in your -project. - -If you'd like Next.js to dangerously produce production code even when your application has errors, -you can disable ESLint running during the build process. - -> It's recommended to run ESLint as part of the production build process to ensure your application -> is resilient against runtime issues. - -Open `next.config.js` and disable the `build` option in the `eslint` config: - -```js -module.exports = { - eslint: { - // !! WARN !! - // Dangerously allow production builds to successfully complete even if - // your project has ESLint errors. - // !! WARN !! - build: false, - }, -} -``` - -## During development - -By default, Next.js does not run ESLint during **development** (`next dev`). - -If you would like Next.js to lint files separately in development mode, you can enable it in your -configuration. - -> Enabling ESLint during development mode will slow down how fast pages are compiled. Until this is -> optimized, we recommend that you [integrate ESLint in your code -> editor](https://eslint.org/docs/user-guide/integrations#editors). - -Open `next.config.js` and enable the `dev` option in the `eslint` config: - -```js -module.exports = { - eslint: { - // !! WARN !! - // This can slow down how long pages take to compile during development - // !! WARN !! - dev: true, - }, -} -``` - -## Related - -
- - Introduction to next.config.js: - Learn more about the configuration file used by Next.js. - -
- -
- - ESLint: - Learn more about how to use ESLint in Next.js. - -
diff --git a/docs/basic-features/eslint.md b/docs/basic-features/eslint.md deleted file mode 100644 index e3ffd4f86cfab..0000000000000 --- a/docs/basic-features/eslint.md +++ /dev/null @@ -1,49 +0,0 @@ ---- -description: Next.js uses ESLint to find and resolve issues affecting the user or developer experience. ---- - -# ESLint - -Next.js uses [ESLint](https://eslint.org/) to find and resolve issues affecting the user or -developer experience. A minimal set of Next.js rules are provided by default, but can be extended by -adding an `.eslintrc` file to your project. - -## Default configuration - -By default, Next.js provides a set of [recommended ESLint -rules](https://github.com/vercel/next.js/blob/canary/packages/eslint-plugin-next/lib/index.js#L10-L18) -that are automatically linted against as part of `next build`. If you would like to control which -ESLint rules are checked during builds, you will need to add an `.eslintrc` file to the root of your -project. - -Here's an example of an `.eslintrc.json` file: - -```json -{ - "extends": ["plugin:@next/next/recommended"], - "parser": "@babel/eslint-parser", - "parserOptions": { - "requireConfigFile": false, - "sourceType": "module", - "babelOptions": { - "presets": ["next/babel"] - } - } -} -``` - -- Extending the original base of rules (`plugin:@next/next/recommended`) is highly recommended to - catch and fix significant Next.js issues in your application. -- Including `@babel/eslint-parser` with the `next/babel` preset ensures that all language features - supported by Next.js will also be supported by ESLint. Although `@babel/eslint-parser` can parse - TypeScript, consider using - [`@typescript-eslint/parser`](https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/parser) - if you have TypeScript enabled in your application to check for type-specific linting rules. - -> If you add an `.eslintrc` file to your application and don't include -> `plugin:@next/next/recommended`in the config, its rules will not be checked during development or -> production builds. This is **not recommended**. - -If you want to enable ESLint to run during development, or disable it for production builds; refer -to the documentation for [ESLint Warnings and -Errors](/docs/api-reference/next.config.js/eslint-warnings-errors.md). diff --git a/docs/manifest.json b/docs/manifest.json index cd9010eb8bfcc..a9dcd38126b84 100644 --- a/docs/manifest.json +++ b/docs/manifest.json @@ -33,10 +33,6 @@ "title": "Fast Refresh", "path": "/docs/basic-features/fast-refresh.md" }, - { - "title": "ESLint", - "path": "/docs/basic-features/eslint.md" - }, { "title": "TypeScript", "path": "/docs/basic-features/typescript.md" @@ -340,10 +336,6 @@ "title": "Configuring onDemandEntries", "path": "/docs/api-reference/next.config.js/configuring-onDemandEntries.md" }, - { - "title": "ESLint Warnings and Errors", - "path": "/docs/api-reference/next.config.js/eslint-warnings-errors.md" - }, { "title": "Ignoring TypeScript Errors", "path": "/docs/api-reference/next.config.js/ignoring-typescript-errors.md" diff --git a/packages/eslint-plugin-next/lib/rules/no-html-link-for-pages.js b/packages/eslint-plugin-next/lib/rules/no-html-link-for-pages.js index b816a418b860e..947850a6f5afe 100644 --- a/packages/eslint-plugin-next/lib/rules/no-html-link-for-pages.js +++ b/packages/eslint-plugin-next/lib/rules/no-html-link-for-pages.js @@ -1,18 +1,10 @@ const path = require('path') const fs = require('fs') -const { - getUrlFromPagesDirectory, - normalizeURL, - execOnce, -} = require('../utils/url') - -const pagesDirWarning = execOnce((pagesDirs) => { - console.warn( - `Pages directory cannot be found at ${pagesDirs.join(' or ')}. ` + - `If using a custom path, please configure with the no-html-link-for-pages rule in your eslint config file` - ) -}) +const { getUrlFromPagesDirectory, normalizeURL } = require('../utils/url') +//------------------------------------------------------------------------------ +// Rule Definition +//------------------------------------------------------------------------------ module.exports = { meta: { docs: { @@ -34,8 +26,10 @@ module.exports = { ] const pagesDir = pagesDirs.find((dir) => fs.existsSync(dir)) if (!pagesDir) { - pagesDirWarning(pagesDirs) - return {} + throw new Error( + `Pages directory cannot be found at ${pagesDirs.join(' or ')}. ` + + `If using a custom path, please configure with the no-html-link-for-pages rule` + ) } const urls = getUrlFromPagesDirectory('/', pagesDir) diff --git a/packages/eslint-plugin-next/lib/utils/url.js b/packages/eslint-plugin-next/lib/utils/url.js index ae1163b47ff1d..4b3999b10f45d 100644 --- a/packages/eslint-plugin-next/lib/utils/url.js +++ b/packages/eslint-plugin-next/lib/utils/url.js @@ -76,21 +76,7 @@ function normalizeURL(url) { return url } -function execOnce(fn) { - let used = false - let result - - return (...args) => { - if (!used) { - used = true - result = fn(...args) - } - return result - } -} - module.exports = { getUrlFromPagesDirectory, normalizeURL, - execOnce, } diff --git a/packages/next/build/index.ts b/packages/next/build/index.ts index 575d74f69e9d1..22554b4e942d4 100644 --- a/packages/next/build/index.ts +++ b/packages/next/build/index.ts @@ -180,41 +180,6 @@ export default async function build( telemetry.record(events) ) - if (config.eslint?.build) { - await nextBuildSpan - .traceChild('verify-and-lint') - .traceAsyncFn(async () => { - const lintWorkers = new Worker( - require.resolve('../lib/verifyAndLint'), - { - numWorkers: config.experimental.cpus, - enableWorkerThreads: config.experimental.workerThreads, - } - ) as Worker & { - verifyAndLint: typeof import('../lib/verifyAndLint').verifyAndLint - } - - lintWorkers.getStdout().pipe(process.stdout) - lintWorkers.getStderr().pipe(process.stderr) - - const lintResults = await lintWorkers.verifyAndLint( - dir, - pagesDir, - null - ) - - if (lintResults.hasErrors) { - console.error(chalk.red('Failed to compile.')) - console.error(lintResults.results) - process.exit(1) - } else if (lintResults.hasMessages) { - console.log(lintResults.results) - } - - lintWorkers.end() - }) - } - const ignoreTypeScriptErrors = Boolean(config.typescript?.ignoreBuildErrors) await nextBuildSpan .traceChild('verify-typescript-setup') diff --git a/packages/next/lib/eslint/customFormatter.ts b/packages/next/lib/eslint/customFormatter.ts deleted file mode 100644 index 6fc55ef09b04d..0000000000000 --- a/packages/next/lib/eslint/customFormatter.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { ESLint, Linter } from 'eslint' - -import chalk from 'chalk' -import path from 'path' - -export enum MessageSeverity { - Warning = 1, - Error = 2, -} - -function formatMessage( - dir: string, - messages: Linter.LintMessage[], - filePath: string -): string | void { - let fileName = path.posix.normalize( - path.relative(dir, filePath).replace(/\\/g, '/') - ) - - if (!fileName.startsWith('.')) { - fileName = './' + fileName - } - - let output = '\n' + chalk.cyan(fileName) - - for (let i = 0; i < messages.length; i++) { - const { message, severity, line, column, ruleId } = messages[i] - - output = output + '\n' - - if (line && column) { - output = - output + - chalk.yellow(line.toString()) + - ':' + - chalk.yellow(column.toString()) + - ' ' - } - - if (severity === MessageSeverity.Warning) { - output += chalk.yellow.bold('Warning') + ': ' - } else { - output += chalk.red.bold('Error') + ': ' - } - - output += message - - if (ruleId) { - output += ' ' + chalk.gray.bold(ruleId) - } - } - - return output -} - -export function formatResults( - baseDir: string, - results: ESLint.LintResult[] -): string { - return ( - results - .filter(({ messages }) => messages?.length) - .map(({ messages, filePath }) => - formatMessage(baseDir, messages, filePath) - ) - .join('\n') + '\n' - ) -} diff --git a/packages/next/lib/verifyAndLint.ts b/packages/next/lib/verifyAndLint.ts deleted file mode 100644 index 997b77b94b107..0000000000000 --- a/packages/next/lib/verifyAndLint.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { ESLint } from 'eslint' -import { join } from 'path' - -import { formatResults } from './eslint/customFormatter' -import { fileExists } from './file-exists' -import * as log from '../build/output/log' - -import findUp from 'next/dist/compiled/find-up' - -type Config = { - plugins: string[] - rules: { [key: string]: Array } -} - -export async function verifyAndLint( - baseDir: string, - pagesDir: string, - pagePath: string | null -): Promise<{ - results: string - hasErrors: boolean - hasMessages: boolean -}> { - let options: ESLint.Options - - let pathNotExists = Boolean( - pagePath && !(await fileExists(join(pagesDir, pagePath))) - ) - - if (pathNotExists) - return { results: '', hasErrors: false, hasMessages: false } - - const eslintrcFile = await findUp( - [ - '.eslintrc.js', - '.eslintrc.yaml', - '.eslintrc.yml', - '.eslintrc.json', - '.eslintrc', - ], - { - cwd: baseDir, - } - ) - - const pagesDirRules = ['@next/next/no-html-link-for-pages'] - const pkgJsonPath = await findUp('package.json', { cwd: baseDir }) - const { eslintConfig = null } = !!pkgJsonPath - ? await import(pkgJsonPath!) - : {} - let pluginIsEnabled = false - - if (eslintrcFile) { - options = { - useEslintrc: true, - baseConfig: {}, - } - } else { - if (!eslintConfig) { - console.log() - log.info( - 'No ESLint configuration was detected, but checks from the Next.js ESLint plugin were included automatically (see https://nextjs.org/docs/basic-features/eslint).' - ) - pluginIsEnabled = true - } - - options = { - baseConfig: eslintConfig ?? { - extends: ['plugin:@next/next/recommended'], - parser: require.resolve('@babel/eslint-parser'), - parserOptions: { - requireConfigFile: false, - sourceType: 'module', - babelOptions: { - presets: ['next/babel'], - }, - }, - }, - useEslintrc: false, - } - } - - let eslint = new ESLint(options) - - // check both eslintrc and package.json config since - // eslint will load config from both - for (const configFile of [eslintrcFile, pkgJsonPath]) { - if (!configFile) continue - - const completeConfig: Config = await eslint.calculateConfigForFile( - configFile - ) - - if (completeConfig.plugins?.includes('@next/next')) { - pluginIsEnabled = true - break - } - } - - if (pluginIsEnabled) { - let updatedPagesDir = false - - for (const rule of pagesDirRules) { - if ( - !options.baseConfig!.rules?.[rule] && - !options.baseConfig!.rules?.[ - rule.replace('@next/next', '@next/babel-plugin-next') - ] - ) { - if (!options.baseConfig!.rules) { - options.baseConfig!.rules = {} - } - options.baseConfig!.rules[rule] = [1, pagesDir] - updatedPagesDir = true - } - } - - if (updatedPagesDir) { - eslint = new ESLint(options) - } - } else { - console.log() - log.warn( - `The Next.js ESLint plugin was not detected in ${ - eslintrcFile || pkgJsonPath - }. We recommend including it to prevent significant issues in your application (see https://nextjs.org/docs/basic-features/eslint).` - ) - } - - const results = await eslint.lintFiles([ - pagePath ? join(pagesDir, pagePath) : `${pagesDir}/**/*.{js,tsx}`, - ]) - - const errors = ESLint.getErrorResults(results) - - return { - results: formatResults(baseDir, results), - hasErrors: errors?.length > 0 && !pagePath, - hasMessages: results?.length > 0, - } -} diff --git a/packages/next/next-server/server/config-shared.ts b/packages/next/next-server/server/config-shared.ts index 2bddbbe45fc36..19b7df80da873 100644 --- a/packages/next/next-server/server/config-shared.ts +++ b/packages/next/next-server/server/config-shared.ts @@ -122,10 +122,6 @@ export const defaultConfig: NextConfig = { serverRuntimeConfig: {}, publicRuntimeConfig: {}, reactStrictMode: false, - eslint: { - dev: false, - build: false, - }, } export function normalizeConfig(phase: string, config: any) { diff --git a/packages/next/package.json b/packages/next/package.json index 91188ac14e299..bfe62e7a2f913 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -60,12 +60,9 @@ ] }, "dependencies": { - "@babel/core": "7.12.10", - "@babel/eslint-parser": "7.13.4", "@babel/runtime": "7.12.5", "@hapi/accept": "5.0.1", "@next/env": "10.1.1", - "@next/eslint-plugin-next": "10.1.1", "@next/polyfill-module": "10.1.1", "@next/react-dev-overlay": "10.1.1", "@next/react-refresh-utils": "10.1.1", @@ -83,7 +80,6 @@ "cssnano-simple": "1.2.2", "domain-browser": "4.19.0", "encoding": "0.1.13", - "eslint": "7.9.0", "etag": "1.8.1", "find-cache-dir": "3.3.1", "get-orientation": "1.1.2", @@ -136,6 +132,7 @@ "devDependencies": { "@ampproject/toolbox-optimizer": "2.7.1-alpha.0", "@babel/code-frame": "7.12.11", + "@babel/core": "7.12.10", "@babel/plugin-proposal-class-properties": "7.12.1", "@babel/plugin-proposal-export-namespace-from": "7.12.1", "@babel/plugin-proposal-numeric-separator": "7.12.7", @@ -166,7 +163,6 @@ "@types/cookie": "0.3.3", "@types/cross-spawn": "6.0.0", "@types/debug": "4.1.5", - "@types/eslint": "7.2.5", "@types/etag": "1.8.0", "@types/fresh": "0.5.0", "@types/json5": "0.0.30", diff --git a/packages/next/server/hot-reloader.ts b/packages/next/server/hot-reloader.ts index 8838a01db255b..c13db0cec19ae 100644 --- a/packages/next/server/hot-reloader.ts +++ b/packages/next/server/hot-reloader.ts @@ -512,7 +512,6 @@ export default class HotReloader { this.onDemandEntries = onDemandEntryHandler(this.watcher, multiCompiler, { pagesDir: this.pagesDir, pageExtensions: this.config.pageExtensions, - eslint: this.config.eslint?.dev, ...(this.config.onDemandEntries as { maxInactiveAge: number pagesBufferLength: number diff --git a/packages/next/server/on-demand-entry-handler.ts b/packages/next/server/on-demand-entry-handler.ts index bd918494f2574..d6bef0477fe58 100644 --- a/packages/next/server/on-demand-entry-handler.ts +++ b/packages/next/server/on-demand-entry-handler.ts @@ -4,7 +4,6 @@ import { join, posix } from 'path' import { parse } from 'url' import { webpack } from 'next/dist/compiled/webpack/webpack' import * as Log from '../build/output/log' -import { verifyAndLint } from '../lib/verifyAndLint' import { normalizePagePath, normalizePathSep, @@ -33,13 +32,11 @@ export default function onDemandEntryHandler( { pagesDir, pageExtensions, - eslint, maxInactiveAge, pagesBufferLength, }: { pagesDir: string pageExtensions: string[] - eslint: boolean maxInactiveAge: number pagesBufferLength: number } @@ -195,15 +192,6 @@ export default function onDemandEntryHandler( } } - // TODO: Move out of hot-reloader into a separate process - if (eslint) { - verifyAndLint(process.cwd(), pagesDir, pagePath).then( - ({ results, hasMessages }) => { - if (hasMessages) console.log(results) - } - ) - } - Log.event(`build page: ${normalizedPage}`) entries[normalizedPage] = { diff --git a/test-pnp.sh b/test-pnp.sh index 1bcc4a4016c74..8b5fd93beb57c 100755 --- a/test-pnp.sh +++ b/test-pnp.sh @@ -29,9 +29,6 @@ do cp -r "./examples/$testCase/." "./e2e-tests/$testCase" cd "./e2e-tests/$testCase" - # Ensure builds do not fail due to lint errors - echo "module.exports = { eslint: { build: false } }" > next.config.js - touch yarn.lock yarn set version berry diff --git a/test/integration/dist-dir/test/index.test.js b/test/integration/dist-dir/test/index.test.js index d9202d8d8d52c..8930f21ed0466 100644 --- a/test/integration/dist-dir/test/index.test.js +++ b/test/integration/dist-dir/test/index.test.js @@ -47,10 +47,7 @@ describe('distDir', () => { it('should throw error with invalid distDir', async () => { const origNextConfig = await fs.readFile(nextConfig, 'utf8') - await fs.writeFile( - nextConfig, - `module.exports = { distDir: '', eslint: { build: false } }` - ) + await fs.writeFile(nextConfig, `module.exports = { distDir: '' }`) const { stderr } = await nextBuild(appDir, [], { stderr: true }) await fs.writeFile(nextConfig, origNextConfig) @@ -61,12 +58,10 @@ describe('distDir', () => { it('should handle null/undefined distDir', async () => { const origNextConfig = await fs.readFile(nextConfig, 'utf8') - await fs.writeFile( - nextConfig, - `module.exports = { distDir: null, eslint: { build: false } }` - ) + await fs.writeFile(nextConfig, `module.exports = { distDir: null }`) const { stderr } = await nextBuild(appDir, [], { stderr: true }) await fs.writeFile(nextConfig, origNextConfig) + expect(stderr.length).toBe(0) }) }) diff --git a/test/integration/eslint/custom-eslint-config/.eslintrc.json b/test/integration/eslint/custom-eslint-config/.eslintrc.json deleted file mode 100644 index f0dc21af7d535..0000000000000 --- a/test/integration/eslint/custom-eslint-config/.eslintrc.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": ["plugin:@next/next/recommended"], - "rules": { - "@next/next/no-sync-scripts": "off", - "@next/next/no-css-tags": "warn", - "@next/next/no-html-link-for-pages": ["error", "./"] - }, - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module", - "ecmaFeatures": { - "jsx": true, - "modules": true - } - } -} diff --git a/test/integration/eslint/custom-eslint-config/next.config.js b/test/integration/eslint/custom-eslint-config/next.config.js deleted file mode 100644 index 0309ced17cfc6..0000000000000 --- a/test/integration/eslint/custom-eslint-config/next.config.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = { eslint: { build: true } } diff --git a/test/integration/eslint/custom-eslint-config/pages/index.js b/test/integration/eslint/custom-eslint-config/pages/index.js deleted file mode 100644 index 64a516a0323ab..0000000000000 --- a/test/integration/eslint/custom-eslint-config/pages/index.js +++ /dev/null @@ -1,13 +0,0 @@ -import { Head } from 'next/document' - -export default class Test extends Head { - render() { - return ( -
-

Hello title

- - -
- ) - } -} diff --git a/test/integration/eslint/custom-next-config/.eslintrc.json b/test/integration/eslint/custom-next-config/.eslintrc.json deleted file mode 100644 index 444bf63d9ee13..0000000000000 --- a/test/integration/eslint/custom-next-config/.eslintrc.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": ["plugin:@next/next/recommended"], - "rules": { - "@next/next/no-html-link-for-pages": ["error", "./"] - }, - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module", - "ecmaFeatures": { - "jsx": true, - "modules": true - } - } -} diff --git a/test/integration/eslint/custom-next-config/next.config.js b/test/integration/eslint/custom-next-config/next.config.js deleted file mode 100644 index d1567e6d0576d..0000000000000 --- a/test/integration/eslint/custom-next-config/next.config.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - eslint: { - dev: true, - build: false, - }, -} diff --git a/test/integration/eslint/custom-next-config/pages/index.js b/test/integration/eslint/custom-next-config/pages/index.js deleted file mode 100644 index 64a516a0323ab..0000000000000 --- a/test/integration/eslint/custom-next-config/pages/index.js +++ /dev/null @@ -1,13 +0,0 @@ -import { Head } from 'next/document' - -export default class Test extends Head { - render() { - return ( -
-

Hello title

- - -
- ) - } -} diff --git a/test/integration/eslint/pkg-json-eslint-config/next.config.js b/test/integration/eslint/pkg-json-eslint-config/next.config.js deleted file mode 100644 index cd08f4be97688..0000000000000 --- a/test/integration/eslint/pkg-json-eslint-config/next.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - eslint: { build: true }, -} diff --git a/test/integration/eslint/pkg-json-eslint-config/package.json b/test/integration/eslint/pkg-json-eslint-config/package.json deleted file mode 100644 index 4d09b24ceb474..0000000000000 --- a/test/integration/eslint/pkg-json-eslint-config/package.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "name": "hello-world", - "version": "1.0.0", - "scripts": { - "dev": "next", - "build": "next build", - "start": "next start" - }, - "dependencies": { - "next": "latest", - "react": "^16.13.1", - "react-dom": "^16.13.1" - }, - "license": "MIT", - "eslintConfig": { - "extends": [ - "plugin:@next/next/recommended" - ], - "rules": { - "@next/next/no-sync-scripts": "off", - "@next/next/no-css-tags": "warn", - "@next/next/no-html-link-for-pages": [ - "error", - "./" - ] - }, - "parserOptions": { - "ecmaVersion": 2018, - "sourceType": "module", - "ecmaFeatures": { - "jsx": true, - "modules": true - } - } - } -} diff --git a/test/integration/eslint/pkg-json-eslint-config/pages/index.js b/test/integration/eslint/pkg-json-eslint-config/pages/index.js deleted file mode 100644 index 64a516a0323ab..0000000000000 --- a/test/integration/eslint/pkg-json-eslint-config/pages/index.js +++ /dev/null @@ -1,13 +0,0 @@ -import { Head } from 'next/document' - -export default class Test extends Head { - render() { - return ( -
-

Hello title

- - -
- ) - } -} diff --git a/test/integration/eslint/test/custom-eslint-config.test.js b/test/integration/eslint/test/custom-eslint-config.test.js deleted file mode 100644 index bcfce446a5f50..0000000000000 --- a/test/integration/eslint/test/custom-eslint-config.test.js +++ /dev/null @@ -1,37 +0,0 @@ -import { join } from 'path' -import { nextBuild } from 'next-test-utils' -import { remove } from 'fs-extra' - -jest.setTimeout(1000 * 60 * 2) - -const appDir = join(__dirname, '../custom-eslint-config') - -describe('ESLint', () => { - let stdout - let code - - beforeAll(async () => { - await remove(join(appDir, '.next')) - ;({ code, stdout } = await nextBuild(appDir, [], { - stdout: true, - })) - }) - - it('should show warnings and errors based on custom eslint config', async () => { - expect(code).toBe(0) - expect(stdout).not.toContain( - 'No ESLint configuration was detected, but checks from the Next.js ESLint plugin were included automatically' - ) - expect(stdout).toContain('./pages/index.js') - expect(stdout).not.toContain( - "8:9 Warning: A synchronous script tag can impact your webpage's performance @next/next/no-sync-scripts" - ) - expect(stdout).toContain( - '9:9 Warning: In order to use external stylesheets use @import in the root stylesheet compiled with NextJS. This ensures proper priority to CSS when loading a webpage. @next/next/no-css-tags' - ) - expect(stdout).toContain( - '9:9 Warning: Stylesheet does not have an associated preload tag. This could potentially impact First paint. @next/next/missing-preload' - ) - expect(stdout).toContain('Compiled successfully') - }) -}) diff --git a/test/integration/eslint/test/custom-next-config.test.js b/test/integration/eslint/test/custom-next-config.test.js deleted file mode 100644 index 7daf4689de0a2..0000000000000 --- a/test/integration/eslint/test/custom-next-config.test.js +++ /dev/null @@ -1,55 +0,0 @@ -import { join } from 'path' -import { - launchApp, - renderViaHTTP, - killApp, - findPort, - nextBuild, -} from 'next-test-utils' - -jest.setTimeout(1000 * 60 * 2) - -const appDir = join(__dirname, '../custom-next-config') - -describe('ESLint', () => { - it('should show messages in dev mode as specified in next config', async () => { - let stdout - - const appPort = await findPort() - const app = await launchApp(appDir, appPort, { - onStdout(msg) { - stdout += msg || '' - }, - }) - await renderViaHTTP(appPort, '/') - await killApp(app) - expect(stdout).toContain('pages/index.js') - expect(stdout).toContain( - "8:9 Warning: A synchronous script tag can impact your webpage's performance @next/next/no-sync-scripts" - ) - expect(stdout).toContain( - '9:9 Warning: In order to use external stylesheets use @import in the root stylesheet compiled with NextJS. This ensures proper priority to CSS when loading a webpage. @next/next/no-css-tags' - ) - expect(stdout).toContain( - '9:9 Warning: Stylesheet does not have an associated preload tag. This could potentially impact First paint. @next/next/missing-preload' - ) - }) - - it('should not show messages in build mode as specified in next config', async () => { - const { code, stdout } = await nextBuild(appDir, [], { - stdout: true, - }) - expect(code).toBe(0) - expect(stdout).not.toContain('pages/index.js') - expect(stdout).not.toContain( - "8:9 Warning: A synchronous script tag can impact your webpage's performance @next/next/no-sync-scripts" - ) - expect(stdout).not.toContain( - '9:9 Warning: In order to use external stylesheets use @import in the root stylesheet compiled with NextJS. This ensures proper priority to CSS when loading a webpage. @next/next/no-css-tags' - ) - expect(stdout).not.toContain( - '9:9 Warning: Stylesheet does not have an associated preload tag. This could potentially impact First paint. @next/next/missing-preload' - ) - expect(stdout).toContain('Compiled successfully') - }) -}) diff --git a/test/integration/eslint/test/pkg-json-eslint-config.test.js b/test/integration/eslint/test/pkg-json-eslint-config.test.js deleted file mode 100644 index ac0069ee7b74c..0000000000000 --- a/test/integration/eslint/test/pkg-json-eslint-config.test.js +++ /dev/null @@ -1,44 +0,0 @@ -import { join } from 'path' -import { nextBuild } from 'next-test-utils' -import { remove } from 'fs-extra' - -jest.setTimeout(1000 * 60 * 2) - -const appDir = join(__dirname, '../pkg-json-eslint-config') - -describe('ESLint', () => { - let code - let output - - beforeAll(async () => { - await remove(join(appDir, '.next')) - let stderr - let stdout - ;({ code, stdout, stderr } = await nextBuild(appDir, [], { - stdout: true, - stderr: true, - })) - output = stderr + stdout - }) - - it('should show warnings and errors based on eslint config in package.json', async () => { - expect(code).toBe(0) - expect(output).not.toContain( - 'The Next.js ESLint plugin was not detected in' - ) - expect(output).not.toContain( - 'No ESLint configuration was detected, but checks from the Next.js ESLint plugin were included automatically' - ) - expect(output).toContain('./pages/index.js') - expect(output).not.toContain( - "8:9 Warning: A synchronous script tag can impact your webpage's performance @next/next/no-sync-scripts" - ) - expect(output).toContain( - '9:9 Warning: In order to use external stylesheets use @import in the root stylesheet compiled with NextJS. This ensures proper priority to CSS when loading a webpage. @next/next/no-css-tags' - ) - expect(output).toContain( - '9:9 Warning: Stylesheet does not have an associated preload tag. This could potentially impact First paint. @next/next/missing-preload' - ) - expect(output).toContain('Compiled successfully') - }) -}) diff --git a/test/integration/index-index/pages/index/index.js b/test/integration/index-index/pages/index/index.js index 6a83652f5ecf0..626b313025584 100644 --- a/test/integration/index-index/pages/index/index.js +++ b/test/integration/index-index/pages/index/index.js @@ -1,3 +1,3 @@ export default function Index() { - return
index > index
+ return
index > index
} diff --git a/test/integration/index-index/pages/index/index/index.js b/test/integration/index-index/pages/index/index/index.js index 5dfa7851c1148..639914d7c4bb1 100644 --- a/test/integration/index-index/pages/index/index/index.js +++ b/test/integration/index-index/pages/index/index/index.js @@ -1,3 +1,3 @@ export default function Index() { - return
index > index > index
+ return
index > index > index
} diff --git a/test/integration/index-index/pages/index/project/index.js b/test/integration/index-index/pages/index/project/index.js index 87892a4033906..b6b50016bf4e7 100644 --- a/test/integration/index-index/pages/index/project/index.js +++ b/test/integration/index-index/pages/index/project/index.js @@ -1,3 +1,3 @@ export default function Index() { - return
index > project
+ return
index > project
} diff --git a/test/integration/index-index/pages/index/user.js b/test/integration/index-index/pages/index/user.js index 398520816d1d9..b317488aaebf6 100644 --- a/test/integration/index-index/pages/index/user.js +++ b/test/integration/index-index/pages/index/user.js @@ -1,3 +1,3 @@ export default function Index() { - return
index > user
+ return
index > user
} diff --git a/test/integration/production-build-dir/next.config.js b/test/integration/production-build-dir/next.config.js deleted file mode 100644 index 397e034c301b9..0000000000000 --- a/test/integration/production-build-dir/next.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - eslint: { - build: false, - }, -} diff --git a/test/integration/production/pages/error-in-ssr-render.js b/test/integration/production/pages/error-in-ssr-render.js index c2477a38db1cf..863abf80fb1d8 100644 --- a/test/integration/production/pages/error-in-ssr-render.js +++ b/test/integration/production/pages/error-in-ssr-render.js @@ -1,11 +1,10 @@ -/* eslint-disable */ - import React from 'react' export default class ErrorInRenderPage extends React.Component { static async getInitialProps() { return {} } + // eslint-disable-next-line react/require-render-return render() { throw new Error('An Expected error occured') } diff --git a/test/integration/tsconfig-verifier/pages/index.tsx b/test/integration/tsconfig-verifier/pages/index.tsx index 47bd85b976b02..f8dc264a3716c 100644 --- a/test/integration/tsconfig-verifier/pages/index.tsx +++ b/test/integration/tsconfig-verifier/pages/index.tsx @@ -1,6 +1,6 @@ -/* eslint-disable */ - +// eslint-disable-next-line @typescript-eslint/no-unused-vars const blah: boolean = false +// eslint-disable-next-line @typescript-eslint/no-unused-vars const blah2 = import('../value').then((r) => r.default) export default () =>

Hello TypeScript

diff --git a/test/integration/webpack-require-hook/next.config.js b/test/integration/webpack-require-hook/next.config.js index 588fbfd05bb5a..01cbcf62c6cf7 100644 --- a/test/integration/webpack-require-hook/next.config.js +++ b/test/integration/webpack-require-hook/next.config.js @@ -11,7 +11,4 @@ module.exports = { throw new Error('Webpack require hook not applying') return config }, - eslint: { - build: false, - }, } diff --git a/yarn.lock b/yarn.lock index 121aa17f5f9b6..c644a3b045310 100644 --- a/yarn.lock +++ b/yarn.lock @@ -93,15 +93,6 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/eslint-parser@7.13.4": - version "7.13.4" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.13.4.tgz#dd9df3c70f44d2fb5a6519e8e10ca06c67dca43a" - integrity sha512-WfFEd89SzqmtYox8crTLJuEXyJolZY6Uu6iJpJmw4aMu50zHbYnxzxwuVkCt2cWygw+gLkUPTtAuox7eSnrL8g== - dependencies: - eslint-scope "5.1.0" - eslint-visitor-keys "^1.3.0" - semver "7.0.0" - "@babel/generator@^7.12.10", "@babel/generator@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.11.tgz#98a7df7b8c358c9a37ab07a24056853016aba3af" @@ -1171,22 +1162,6 @@ version "0.7.5" resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed" -"@eslint/eslintrc@^0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.1.3.tgz#7d1a2b2358552cc04834c0979bd4275362e37085" - integrity sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - lodash "^4.17.19" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - "@firebase/analytics-types@0.3.1": version "0.3.1" resolved "https://registry.yarnpkg.com/@firebase/analytics-types/-/analytics-types-0.3.1.tgz#3c5f5d71129c88295e17e914e34b391ffda1723c" @@ -2950,14 +2925,6 @@ version "1.0.0" resolved "https://registry.yarnpkg.com/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#1ee30d79544ca84d68d4b3cdb0af4f205663dd2d" -"@types/eslint@7.2.5": - version "7.2.5" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.5.tgz#92172ecf490c2fce4b076739693d75f30376d610" - integrity sha512-Dc6ar9x16BdaR3NSxSF7T4IjL9gxxViJq8RmFd+2UAyA+K6ck2W+gUwfgpG/y9TPyUuBL35109bbULpEynvltA== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - "@types/estree@*": version "0.0.45" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" @@ -3067,11 +3034,6 @@ dependencies: "@types/jest-diff" "*" -"@types/json-schema@*": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== - "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": version "7.0.6" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" @@ -3606,11 +3568,6 @@ acorn-jsx@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" -acorn-jsx@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== - acorn-walk@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" @@ -3628,11 +3585,6 @@ acorn@^7.1.0, acorn@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" -acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - acorn@^8.0.4: version "8.0.4" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.4.tgz#7a3ae4191466a6984eee0fe3407a4f3aa9db8354" @@ -3729,11 +3681,6 @@ anser@1.4.9: version "1.4.9" resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" -ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - ansi-escapes@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" @@ -5677,7 +5624,7 @@ cross-spawn@^5.0.1: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: +cross-spawn@^7.0.0, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -6117,7 +6064,7 @@ deep-extend@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" -deep-is@^0.1.3, deep-is@~0.1.3: +deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -6521,13 +6468,6 @@ enhanced-resolve@^4.3.0: memory-fs "^0.5.0" tapable "^1.0.0" -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - entities@^1.1.1, entities@~1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" @@ -6767,14 +6707,6 @@ eslint-plugin-react@7.19.0: string.prototype.matchall "^4.0.2" xregexp "^4.3.0" -eslint-scope@5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz#d0f971dfe59c69e0cada684b23d49dbf82600ce5" - integrity sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -6790,14 +6722,6 @@ eslint-scope@^5.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-scope@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - eslint-utils@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" @@ -6810,22 +6734,10 @@ eslint-utils@^2.0.0: dependencies: eslint-visitor-keys "^1.1.0" -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" -eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - eslint@6.8.0: version "6.8.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" @@ -6868,49 +6780,6 @@ eslint@6.8.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -eslint@7.9.0: - version "7.9.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.9.0.tgz#522aeccc5c3a19017cf0cb46ebfd660a79acf337" - integrity sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@eslint/eslintrc" "^0.1.3" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - eslint-scope "^5.1.0" - eslint-utils "^2.1.0" - eslint-visitor-keys "^1.3.0" - espree "^7.3.0" - esquery "^1.2.0" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash "^4.17.19" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - espree@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" @@ -6919,15 +6788,6 @@ espree@^6.1.2: acorn-jsx "^5.1.0" eslint-visitor-keys "^1.1.0" -espree@^7.3.0: - version "7.3.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" @@ -6938,31 +6798,17 @@ esquery@^1.0.1: dependencies: estraverse "^4.0.0" -esquery@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== - dependencies: - estraverse "^5.1.0" - esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" dependencies: estraverse "^4.1.0" -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" -estraverse@^5.1.0, estraverse@^5.2.0: +estraverse@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== @@ -7270,7 +7116,7 @@ fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: +fast-levenshtein@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" @@ -10012,14 +9858,6 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - libnpmaccess@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-4.0.1.tgz#17e842e03bef759854adf6eb6c2ede32e782639f" @@ -11646,18 +11484,6 @@ optionator@^0.8.1, optionator@^0.8.3: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" - prelude-ls "^1.2.1" - type-check "^0.4.0" - word-wrap "^1.2.3" - ora@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ora/-/ora-2.0.0.tgz#8ec3a37fa7bffb54a3a0c188a1f6798e7e1827cd" @@ -13000,11 +12826,6 @@ pre-commit@1.2.2: spawn-sync "^1.0.15" which "1.2.x" -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -13678,11 +13499,6 @@ regexpp@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.0.0.tgz#dd63982ee3300e67b41c1956f850aa680d9d330e" -regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== - regexpu-core@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" @@ -14330,7 +14146,7 @@ semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: +semver@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.3.2, semver@^7.3.4: version "7.3.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== @@ -15084,11 +14900,6 @@ strip-json-comments@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -15724,13 +15535,6 @@ tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" @@ -16436,7 +16240,7 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -word-wrap@^1.2.3, word-wrap@~1.2.3: +word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" From 1344e2dee20fb383cdee655608e7cedc87bef865 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 30 Mar 2021 10:31:45 +0200 Subject: [PATCH 02/36] v10.1.2-canary.0 --- lerna.json | 2 +- packages/create-next-app/package.json | 2 +- packages/eslint-plugin-next/package.json | 2 +- packages/next-bundle-analyzer/package.json | 2 +- packages/next-codemod/package.json | 2 +- packages/next-env/package.json | 2 +- packages/next-mdx/package.json | 2 +- packages/next-plugin-google-analytics/package.json | 2 +- packages/next-plugin-sentry/package.json | 2 +- packages/next-plugin-storybook/package.json | 2 +- packages/next-polyfill-module/package.json | 2 +- packages/next-polyfill-nomodule/package.json | 2 +- packages/next/package.json | 12 ++++++------ packages/react-dev-overlay/package.json | 2 +- packages/react-refresh-utils/package.json | 2 +- 15 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lerna.json b/lerna.json index d333494fc4a96..c82ec15bb2981 100644 --- a/lerna.json +++ b/lerna.json @@ -17,5 +17,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "10.1.1" + "version": "10.1.2-canary.0" } diff --git a/packages/create-next-app/package.json b/packages/create-next-app/package.json index 62f5e0acdc3a1..fd7f1c29a5f9a 100644 --- a/packages/create-next-app/package.json +++ b/packages/create-next-app/package.json @@ -1,6 +1,6 @@ { "name": "create-next-app", - "version": "10.1.1", + "version": "10.1.2-canary.0", "keywords": [ "react", "next", diff --git a/packages/eslint-plugin-next/package.json b/packages/eslint-plugin-next/package.json index e7922860f94c0..5de4172f602a6 100644 --- a/packages/eslint-plugin-next/package.json +++ b/packages/eslint-plugin-next/package.json @@ -1,6 +1,6 @@ { "name": "@next/eslint-plugin-next", - "version": "10.1.1", + "version": "10.1.2-canary.0", "description": "ESLint plugin for NextJS.", "main": "lib/index.js", "license": "MIT", diff --git a/packages/next-bundle-analyzer/package.json b/packages/next-bundle-analyzer/package.json index 0e387c4f5077c..431066ca7fd3e 100644 --- a/packages/next-bundle-analyzer/package.json +++ b/packages/next-bundle-analyzer/package.json @@ -1,6 +1,6 @@ { "name": "@next/bundle-analyzer", - "version": "10.1.1", + "version": "10.1.2-canary.0", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-codemod/package.json b/packages/next-codemod/package.json index 76a5509f2b36c..7100ee521b038 100644 --- a/packages/next-codemod/package.json +++ b/packages/next-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@next/codemod", - "version": "10.1.1", + "version": "10.1.2-canary.0", "license": "MIT", "dependencies": { "chalk": "4.1.0", diff --git a/packages/next-env/package.json b/packages/next-env/package.json index 94845d46afbba..75afce9afc833 100644 --- a/packages/next-env/package.json +++ b/packages/next-env/package.json @@ -1,6 +1,6 @@ { "name": "@next/env", - "version": "10.1.1", + "version": "10.1.2-canary.0", "keywords": [ "react", "next", diff --git a/packages/next-mdx/package.json b/packages/next-mdx/package.json index a69aaf9a82d80..0d3b1e1bc66f5 100644 --- a/packages/next-mdx/package.json +++ b/packages/next-mdx/package.json @@ -1,6 +1,6 @@ { "name": "@next/mdx", - "version": "10.1.1", + "version": "10.1.2-canary.0", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-plugin-google-analytics/package.json b/packages/next-plugin-google-analytics/package.json index 5cf7199289304..d1794e708dfda 100644 --- a/packages/next-plugin-google-analytics/package.json +++ b/packages/next-plugin-google-analytics/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-google-analytics", - "version": "10.1.1", + "version": "10.1.2-canary.0", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-google-analytics" diff --git a/packages/next-plugin-sentry/package.json b/packages/next-plugin-sentry/package.json index f45a60a56f612..ad73f4a341d1f 100644 --- a/packages/next-plugin-sentry/package.json +++ b/packages/next-plugin-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-sentry", - "version": "10.1.1", + "version": "10.1.2-canary.0", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-sentry" diff --git a/packages/next-plugin-storybook/package.json b/packages/next-plugin-storybook/package.json index 9d7f02207e1b8..138bd8830c6cc 100644 --- a/packages/next-plugin-storybook/package.json +++ b/packages/next-plugin-storybook/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-storybook", - "version": "10.1.1", + "version": "10.1.2-canary.0", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-storybook" diff --git a/packages/next-polyfill-module/package.json b/packages/next-polyfill-module/package.json index eb972dbfdc615..496a27f4bac58 100644 --- a/packages/next-polyfill-module/package.json +++ b/packages/next-polyfill-module/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-module", - "version": "10.1.1", + "version": "10.1.2-canary.0", "description": "A standard library polyfill for ES Modules supporting browsers (Edge 16+, Firefox 60+, Chrome 61+, Safari 10.1+)", "main": "dist/polyfill-module.js", "license": "MIT", diff --git a/packages/next-polyfill-nomodule/package.json b/packages/next-polyfill-nomodule/package.json index c360ece7c00ab..9f244df30b25b 100644 --- a/packages/next-polyfill-nomodule/package.json +++ b/packages/next-polyfill-nomodule/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-nomodule", - "version": "10.1.1", + "version": "10.1.2-canary.0", "description": "A polyfill for non-dead, nomodule browsers.", "main": "dist/polyfill-nomodule.js", "license": "MIT", diff --git a/packages/next/package.json b/packages/next/package.json index bfe62e7a2f913..f41ca4006876b 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "10.1.1", + "version": "10.1.2-canary.0", "description": "The React Framework", "main": "./dist/server/next.js", "license": "MIT", @@ -62,10 +62,10 @@ "dependencies": { "@babel/runtime": "7.12.5", "@hapi/accept": "5.0.1", - "@next/env": "10.1.1", - "@next/polyfill-module": "10.1.1", - "@next/react-dev-overlay": "10.1.1", - "@next/react-refresh-utils": "10.1.1", + "@next/env": "10.1.2-canary.0", + "@next/polyfill-module": "10.1.2-canary.0", + "@next/react-dev-overlay": "10.1.2-canary.0", + "@next/react-refresh-utils": "10.1.2-canary.0", "@opentelemetry/api": "0.14.0", "assert": "2.0.0", "ast-types": "0.13.2", @@ -146,7 +146,7 @@ "@babel/preset-react": "7.12.10", "@babel/preset-typescript": "7.12.7", "@babel/types": "7.12.12", - "@next/polyfill-nomodule": "10.1.1", + "@next/polyfill-nomodule": "10.1.2-canary.0", "@taskr/clear": "1.1.0", "@taskr/esnext": "1.1.0", "@taskr/watch": "1.1.0", diff --git a/packages/react-dev-overlay/package.json b/packages/react-dev-overlay/package.json index 213cdb58d4a13..98dcd1fc0ac93 100644 --- a/packages/react-dev-overlay/package.json +++ b/packages/react-dev-overlay/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-dev-overlay", - "version": "10.1.1", + "version": "10.1.2-canary.0", "description": "A development-only overlay for developing React applications.", "repository": { "url": "vercel/next.js", diff --git a/packages/react-refresh-utils/package.json b/packages/react-refresh-utils/package.json index fdfb998b995d4..c10d88a9b81e6 100644 --- a/packages/react-refresh-utils/package.json +++ b/packages/react-refresh-utils/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-refresh-utils", - "version": "10.1.1", + "version": "10.1.2-canary.0", "description": "An experimental package providing utilities for React Refresh.", "repository": { "url": "vercel/next.js", From 1ff6057b3af5a4d12303eef266ccda12c2af30ce Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Tue, 30 Mar 2021 10:32:36 +0200 Subject: [PATCH 03/36] v10.1.2 --- lerna.json | 2 +- packages/create-next-app/package.json | 2 +- packages/eslint-plugin-next/package.json | 2 +- packages/next-bundle-analyzer/package.json | 2 +- packages/next-codemod/package.json | 2 +- packages/next-env/package.json | 2 +- packages/next-mdx/package.json | 2 +- packages/next-plugin-google-analytics/package.json | 2 +- packages/next-plugin-sentry/package.json | 2 +- packages/next-plugin-storybook/package.json | 2 +- packages/next-polyfill-module/package.json | 2 +- packages/next-polyfill-nomodule/package.json | 2 +- packages/next/package.json | 12 ++++++------ packages/react-dev-overlay/package.json | 2 +- packages/react-refresh-utils/package.json | 2 +- 15 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lerna.json b/lerna.json index c82ec15bb2981..e266b2d6fddbd 100644 --- a/lerna.json +++ b/lerna.json @@ -17,5 +17,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "10.1.2-canary.0" + "version": "10.1.2" } diff --git a/packages/create-next-app/package.json b/packages/create-next-app/package.json index fd7f1c29a5f9a..ac336386a51f8 100644 --- a/packages/create-next-app/package.json +++ b/packages/create-next-app/package.json @@ -1,6 +1,6 @@ { "name": "create-next-app", - "version": "10.1.2-canary.0", + "version": "10.1.2", "keywords": [ "react", "next", diff --git a/packages/eslint-plugin-next/package.json b/packages/eslint-plugin-next/package.json index 5de4172f602a6..230eed176098e 100644 --- a/packages/eslint-plugin-next/package.json +++ b/packages/eslint-plugin-next/package.json @@ -1,6 +1,6 @@ { "name": "@next/eslint-plugin-next", - "version": "10.1.2-canary.0", + "version": "10.1.2", "description": "ESLint plugin for NextJS.", "main": "lib/index.js", "license": "MIT", diff --git a/packages/next-bundle-analyzer/package.json b/packages/next-bundle-analyzer/package.json index 431066ca7fd3e..a4f65ff5ffb37 100644 --- a/packages/next-bundle-analyzer/package.json +++ b/packages/next-bundle-analyzer/package.json @@ -1,6 +1,6 @@ { "name": "@next/bundle-analyzer", - "version": "10.1.2-canary.0", + "version": "10.1.2", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-codemod/package.json b/packages/next-codemod/package.json index 7100ee521b038..cf53b67fbd113 100644 --- a/packages/next-codemod/package.json +++ b/packages/next-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@next/codemod", - "version": "10.1.2-canary.0", + "version": "10.1.2", "license": "MIT", "dependencies": { "chalk": "4.1.0", diff --git a/packages/next-env/package.json b/packages/next-env/package.json index 75afce9afc833..0689676e578ef 100644 --- a/packages/next-env/package.json +++ b/packages/next-env/package.json @@ -1,6 +1,6 @@ { "name": "@next/env", - "version": "10.1.2-canary.0", + "version": "10.1.2", "keywords": [ "react", "next", diff --git a/packages/next-mdx/package.json b/packages/next-mdx/package.json index 0d3b1e1bc66f5..1240bf6d55b50 100644 --- a/packages/next-mdx/package.json +++ b/packages/next-mdx/package.json @@ -1,6 +1,6 @@ { "name": "@next/mdx", - "version": "10.1.2-canary.0", + "version": "10.1.2", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-plugin-google-analytics/package.json b/packages/next-plugin-google-analytics/package.json index d1794e708dfda..8c6ee4785a644 100644 --- a/packages/next-plugin-google-analytics/package.json +++ b/packages/next-plugin-google-analytics/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-google-analytics", - "version": "10.1.2-canary.0", + "version": "10.1.2", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-google-analytics" diff --git a/packages/next-plugin-sentry/package.json b/packages/next-plugin-sentry/package.json index ad73f4a341d1f..4d5a717b843bf 100644 --- a/packages/next-plugin-sentry/package.json +++ b/packages/next-plugin-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-sentry", - "version": "10.1.2-canary.0", + "version": "10.1.2", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-sentry" diff --git a/packages/next-plugin-storybook/package.json b/packages/next-plugin-storybook/package.json index 138bd8830c6cc..4bb236ce1189d 100644 --- a/packages/next-plugin-storybook/package.json +++ b/packages/next-plugin-storybook/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-storybook", - "version": "10.1.2-canary.0", + "version": "10.1.2", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-storybook" diff --git a/packages/next-polyfill-module/package.json b/packages/next-polyfill-module/package.json index 496a27f4bac58..bb17afdb78a53 100644 --- a/packages/next-polyfill-module/package.json +++ b/packages/next-polyfill-module/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-module", - "version": "10.1.2-canary.0", + "version": "10.1.2", "description": "A standard library polyfill for ES Modules supporting browsers (Edge 16+, Firefox 60+, Chrome 61+, Safari 10.1+)", "main": "dist/polyfill-module.js", "license": "MIT", diff --git a/packages/next-polyfill-nomodule/package.json b/packages/next-polyfill-nomodule/package.json index 9f244df30b25b..0382e6db7fc2c 100644 --- a/packages/next-polyfill-nomodule/package.json +++ b/packages/next-polyfill-nomodule/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-nomodule", - "version": "10.1.2-canary.0", + "version": "10.1.2", "description": "A polyfill for non-dead, nomodule browsers.", "main": "dist/polyfill-nomodule.js", "license": "MIT", diff --git a/packages/next/package.json b/packages/next/package.json index f41ca4006876b..824033a70b682 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "10.1.2-canary.0", + "version": "10.1.2", "description": "The React Framework", "main": "./dist/server/next.js", "license": "MIT", @@ -62,10 +62,10 @@ "dependencies": { "@babel/runtime": "7.12.5", "@hapi/accept": "5.0.1", - "@next/env": "10.1.2-canary.0", - "@next/polyfill-module": "10.1.2-canary.0", - "@next/react-dev-overlay": "10.1.2-canary.0", - "@next/react-refresh-utils": "10.1.2-canary.0", + "@next/env": "10.1.2", + "@next/polyfill-module": "10.1.2", + "@next/react-dev-overlay": "10.1.2", + "@next/react-refresh-utils": "10.1.2", "@opentelemetry/api": "0.14.0", "assert": "2.0.0", "ast-types": "0.13.2", @@ -146,7 +146,7 @@ "@babel/preset-react": "7.12.10", "@babel/preset-typescript": "7.12.7", "@babel/types": "7.12.12", - "@next/polyfill-nomodule": "10.1.2-canary.0", + "@next/polyfill-nomodule": "10.1.2", "@taskr/clear": "1.1.0", "@taskr/esnext": "1.1.0", "@taskr/watch": "1.1.0", diff --git a/packages/react-dev-overlay/package.json b/packages/react-dev-overlay/package.json index 98dcd1fc0ac93..5ad13749984b5 100644 --- a/packages/react-dev-overlay/package.json +++ b/packages/react-dev-overlay/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-dev-overlay", - "version": "10.1.2-canary.0", + "version": "10.1.2", "description": "A development-only overlay for developing React applications.", "repository": { "url": "vercel/next.js", diff --git a/packages/react-refresh-utils/package.json b/packages/react-refresh-utils/package.json index c10d88a9b81e6..ca9c0c7c6db6f 100644 --- a/packages/react-refresh-utils/package.json +++ b/packages/react-refresh-utils/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-refresh-utils", - "version": "10.1.2-canary.0", + "version": "10.1.2", "description": "An experimental package providing utilities for React Refresh.", "repository": { "url": "vercel/next.js", From 7adfce23abdfe76d4ded326b77bf3600705a1481 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Wed, 31 Mar 2021 16:24:42 +0800 Subject: [PATCH 04/36] Fix memory leak in image optimization (#23565) This RP fixes the problem that the image optimization API uses a large amount of memory, and is not correctly freed afterwards. There're multiple causes of this problem: ### 1. Too many WebAssembly instances are created We used to do all the image processing operations (decode, resize, rotate, encodeJpeg, encodePng, encodeWebp) inside each worker thread, where each operation creates at least one WASM instance, and we create `os.cpus().length - 1` workers by default. That means in the worst case, there will be `N*6` WASM instances created (N is the number of CPU cores minus one). This PR changes it to a pipeline-like architecture: there will be at most 6 workers, and the same type of operations will always be assigned to the same worker. With this change, 6 WASM instances will be created in the worst case. ### 2. WebAssembly memory can't be deallocated It's known that [WebAssembly can't simply deallocate its memory as of today](https://stackoverflow.com/a/51544868/2424786). And due to the implementation/design of the WASM modules that we are using, they're not very suitable for long-running cases and it's more like a one-off use. For each operation like resize, it will allocate **new memory** to store that data. So the memory will increase quickly as more images are processed. The fix is to get rid of `execOnce` for WASM module initializations, so each time a new WASM module will be created and the old module will be GC'd entirely as there's no reference to it. That's the only and easiest way to free the memory use of a WASM module AFAIK. ### 3. WebAssembly memory isn't correctly freed after finishing the operation `wasm-bindgen` generates code with global variables like `cachegetUint8Memory0` and `wasm` that always hold the WASM memory as a reference. We need to manually clean them up after finishing each operation. This PR ensures that these variables will be deleted so the memory overhead can go back to 0 when an operation is finished. ### 4. Memory leak inside event listeners `emscripten` generates code with global error listener registration (without cleaning them up): https://github.com/vercel/next.js/blob/99a4ea6/packages/next/next-server/server/lib/squoosh/webp/webp_node_dec.js#L39-L43 And the listener has references to the WASM instance directly or indirectly: https://github.com/vercel/next.js/blob/99a4ea6/packages/next/next-server/server/lib/squoosh/webp/webp_node_dec.js#L183-L192 (`e`, `y`, `r`). That means whenever a WASM module is created (emscripten), its memory will be kept by the global scope. And when we replace the WASM module with a new one, the newer will be added again and the old will still be referenced, which causes a leak. Since we're running them inside worker threads (which will retry on fail), this PR simply removes these listeners. ### Test Here're some statistics showing that these changes have improved the memory usage a lot (the app I'm using to test has one page of 20 high-res PNGs): Before this PR (`next@10.1.0`): Memory went from ~250MB to 3.2GB (peak: 3.5GB) and never decreased again. With fix 1 applied: Memory went from ~280MB to 1.5GB (peak: 2GB). With fix 1+2 applied: Memory went from ~280MB to 1.1GB (peak: 1.6GB). With fix 1+2+3+4 applied: It's back to normal; memory changed from ~300MB to ~480MB, peaked at 1.2GB. You can clearly see that GC is working correctly here. --- ## Bug - [x] Related issues #23189, #23436 - [ ] Integration tests added ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. ## Documentation / Examples - [ ] Make sure the linting passes --- .../next-server/server/lib/squoosh/codecs.ts | 28 +++++---- .../next-server/server/lib/squoosh/impl.ts | 59 ++++--------------- .../next-server/server/lib/squoosh/main.ts | 44 ++++++++++++-- .../lib/squoosh/mozjpeg/mozjpeg_node_dec.js | 6 -- .../lib/squoosh/mozjpeg/mozjpeg_node_enc.js | 6 -- .../server/lib/squoosh/png/squoosh_oxipng.js | 7 +++ .../server/lib/squoosh/png/squoosh_png.js | 8 +++ .../lib/squoosh/resize/squoosh_resize.js | 7 +++ .../server/lib/squoosh/webp/webp_node_dec.js | 6 -- .../server/lib/squoosh/webp/webp_node_enc.js | 6 -- 10 files changed, 87 insertions(+), 90 deletions(-) diff --git a/packages/next/next-server/server/lib/squoosh/codecs.ts b/packages/next/next-server/server/lib/squoosh/codecs.ts index 09974218952d1..b913fc4d3c455 100644 --- a/packages/next/next-server/server/lib/squoosh/codecs.ts +++ b/packages/next/next-server/server/lib/squoosh/codecs.ts @@ -1,7 +1,6 @@ import { promises as fsp } from 'fs' import * as path from 'path' import { instantiateEmscriptenWasm, pathify } from './emscripten-utils.js' -import { execOnce } from '../../../lib/utils.js' // MozJPEG // @ts-ignore @@ -23,25 +22,20 @@ const webpDecWasm = path.resolve(__dirname, './webp/webp_node_dec.wasm') // @ts-ignore import * as pngEncDec from './png/squoosh_png.js' const pngEncDecWasm = path.resolve(__dirname, './png/squoosh_png_bg.wasm') -const pngEncDecInit = execOnce(() => +const pngEncDecInit = () => pngEncDec.default(fsp.readFile(pathify(pngEncDecWasm))) -) // OxiPNG // @ts-ignore import * as oxipng from './png/squoosh_oxipng.js' const oxipngWasm = path.resolve(__dirname, './png/squoosh_oxipng_bg.wasm') -const oxipngInit = execOnce(() => - oxipng.default(fsp.readFile(pathify(oxipngWasm))) -) +const oxipngInit = () => oxipng.default(fsp.readFile(pathify(oxipngWasm))) // Resize // @ts-ignore import * as resize from './resize/squoosh_resize.js' const resizeWasm = path.resolve(__dirname, './resize/squoosh_resize_bg.wasm') -const resizeInit = execOnce(() => - resize.default(fsp.readFile(pathify(resizeWasm))) -) +const resizeInit = () => resize.default(fsp.readFile(pathify(resizeWasm))) // rotate const rotateWasm = path.resolve(__dirname, './rotate/rotate.wasm') @@ -128,7 +122,7 @@ export const preprocessors = { target_width: width, target_height: height, })) - return new ImageData( + const imageData = new ImageData( resize.resize( buffer, input_width, @@ -142,6 +136,8 @@ export const preprocessors = { width, height ) + resize.cleanup() + return imageData } }, defaultOptions: { @@ -270,7 +266,13 @@ export const codecs = { detectors: [/^\x89PNG\x0D\x0A\x1A\x0A/], dec: async () => { await pngEncDecInit() - return { decode: pngEncDec.decode } + return { + decode: (buffer: Buffer | Uint8Array): Buffer => { + const imageData = pngEncDec.decode(buffer) + pngEncDec.cleanup() + return imageData + }, + } as any }, enc: async () => { await pngEncDecInit() @@ -287,7 +289,9 @@ export const codecs = { width, height ) - return oxipng.optimise(simplePng, opts.level) + const imageData = oxipng.optimise(simplePng, opts.level) + oxipng.cleanup() + return imageData }, } }, diff --git a/packages/next/next-server/server/lib/squoosh/impl.ts b/packages/next/next-server/server/lib/squoosh/impl.ts index 2eee7996b383f..a814249ea89d3 100644 --- a/packages/next/next-server/server/lib/squoosh/impl.ts +++ b/packages/next/next-server/server/lib/squoosh/impl.ts @@ -1,47 +1,9 @@ import { codecs as supportedFormats, preprocessors } from './codecs' import ImageData from './image_data' -type RotateOperation = { - type: 'rotate' - numRotations: number -} -type ResizeOperation = { - type: 'resize' - width: number -} -export type Operation = RotateOperation | ResizeOperation -export type Encoding = 'jpeg' | 'png' | 'webp' - -export async function processBuffer( - buffer: Buffer | Uint8Array, - operations: Operation[], - encoding: Encoding, - quality: number -): Promise { - let imageData = await decodeBuffer(buffer) - for (const operation of operations) { - if (operation.type === 'rotate') { - imageData = await rotate(imageData, operation.numRotations) - } else if (operation.type === 'resize') { - if (imageData.width && imageData.width > operation.width) { - imageData = await resize(imageData, operation.width) - } - } - } - - switch (encoding) { - case 'jpeg': - return encodeJpeg(imageData, { quality }) - case 'webp': - return encodeWebp(imageData, { quality }) - case 'png': - return encodePng(imageData) - default: - throw Error(`Unsupported encoding format`) - } -} - -async function decodeBuffer(_buffer: Buffer | Uint8Array): Promise { +export async function decodeBuffer( + _buffer: Buffer | Uint8Array +): Promise { const buffer = Buffer.from(_buffer) const firstChunk = buffer.slice(0, 16) const firstChunkString = Array.from(firstChunk) @@ -54,11 +16,10 @@ async function decodeBuffer(_buffer: Buffer | Uint8Array): Promise { throw Error(`Buffer has an unsupported format`) } const d = await supportedFormats[key].dec() - const rgba = d.decode(new Uint8Array(buffer)) - return rgba + return d.decode(new Uint8Array(buffer)) } -async function rotate( +export async function rotate( image: ImageData, numRotations: number ): Promise { @@ -68,7 +29,7 @@ async function rotate( return await m(image.data, image.width, image.height, { numRotations }) } -async function resize(image: ImageData, width: number) { +export async function resize(image: ImageData, width: number) { image = ImageData.from(image) const p = preprocessors['resize'] @@ -79,7 +40,7 @@ async function resize(image: ImageData, width: number) { }) } -async function encodeJpeg( +export async function encodeJpeg( image: ImageData, { quality }: { quality: number } ): Promise { @@ -94,7 +55,7 @@ async function encodeJpeg( return Buffer.from(r) } -async function encodeWebp( +export async function encodeWebp( image: ImageData, { quality }: { quality: number } ): Promise { @@ -109,7 +70,9 @@ async function encodeWebp( return Buffer.from(r) } -async function encodePng(image: ImageData): Promise { +export async function encodePng( + image: ImageData +): Promise { image = ImageData.from(image) const e = supportedFormats['oxipng'] diff --git a/packages/next/next-server/server/lib/squoosh/main.ts b/packages/next/next-server/server/lib/squoosh/main.ts index 3334664bcd51d..8fbcb89212a47 100644 --- a/packages/next/next-server/server/lib/squoosh/main.ts +++ b/packages/next/next-server/server/lib/squoosh/main.ts @@ -1,17 +1,30 @@ import { Worker } from 'jest-worker' import * as path from 'path' import { execOnce } from '../../../lib/utils' -import { Operation, Encoding } from './impl' +import { cpus } from 'os' + +type RotateOperation = { + type: 'rotate' + numRotations: number +} +type ResizeOperation = { + type: 'resize' + width: number +} +export type Operation = RotateOperation | ResizeOperation +export type Encoding = 'jpeg' | 'png' | 'webp' const getWorker = execOnce( () => new Worker(path.resolve(__dirname, 'impl'), { enableWorkerThreads: true, + // There will be at most 6 workers needed since each worker will take + // at least 1 operation type. + numWorkers: Math.max(1, Math.min(cpus().length - 1, 6)), + computeWorkerKey: (method) => method, }) ) -export { Operation } - export async function processBuffer( buffer: Buffer, operations: Operation[], @@ -19,7 +32,26 @@ export async function processBuffer( quality: number ): Promise { const worker: typeof import('./impl') = getWorker() as any - return Buffer.from( - await worker.processBuffer(buffer, operations, encoding, quality) - ) + + let imageData = await worker.decodeBuffer(buffer) + for (const operation of operations) { + if (operation.type === 'rotate') { + imageData = await worker.rotate(imageData, operation.numRotations) + } else if (operation.type === 'resize') { + if (imageData.width && imageData.width > operation.width) { + imageData = await worker.resize(imageData, operation.width) + } + } + } + + switch (encoding) { + case 'jpeg': + return Buffer.from(await worker.encodeJpeg(imageData, { quality })) + case 'webp': + return Buffer.from(await worker.encodeWebp(imageData, { quality })) + case 'png': + return Buffer.from(await worker.encodePng(imageData)) + default: + throw Error(`Unsupported encoding format`) + } } diff --git a/packages/next/next-server/server/lib/squoosh/mozjpeg/mozjpeg_node_dec.js b/packages/next/next-server/server/lib/squoosh/mozjpeg/mozjpeg_node_dec.js index 2c8cf4b271920..77b5b6a4e8bfd 100644 --- a/packages/next/next-server/server/lib/squoosh/mozjpeg/mozjpeg_node_dec.js +++ b/packages/next/next-server/server/lib/squoosh/mozjpeg/mozjpeg_node_dec.js @@ -39,12 +39,6 @@ var Module = (function () { a.buffer || v('Assertion failed: undefined') return a } - 1 < process.argv.length && (ba = process.argv[1].replace(/\\/g, '/')) - process.argv.slice(2) - process.on('uncaughtException', function (a) { - if (!(a instanceof ja)) throw a - }) - process.on('unhandledRejection', v) ca = function (a) { process.exit(a) } diff --git a/packages/next/next-server/server/lib/squoosh/mozjpeg/mozjpeg_node_enc.js b/packages/next/next-server/server/lib/squoosh/mozjpeg/mozjpeg_node_enc.js index d6cb5e704a4c5..5ce398d70e87a 100644 --- a/packages/next/next-server/server/lib/squoosh/mozjpeg/mozjpeg_node_enc.js +++ b/packages/next/next-server/server/lib/squoosh/mozjpeg/mozjpeg_node_enc.js @@ -39,12 +39,6 @@ var Module = (function () { a.buffer || u('Assertion failed: undefined') return a } - 1 < process.argv.length && (da = process.argv[1].replace(/\\/g, '/')) - process.argv.slice(2) - process.on('uncaughtException', function (a) { - if (!(a instanceof la)) throw a - }) - process.on('unhandledRejection', u) ea = function (a) { process.exit(a) } diff --git a/packages/next/next-server/server/lib/squoosh/png/squoosh_oxipng.js b/packages/next/next-server/server/lib/squoosh/png/squoosh_oxipng.js index 2c6338aab9dd2..f2d8ccb9c99e9 100644 --- a/packages/next/next-server/server/lib/squoosh/png/squoosh_oxipng.js +++ b/packages/next/next-server/server/lib/squoosh/png/squoosh_oxipng.js @@ -127,3 +127,10 @@ async function init(input) { } export default init + +// Manually remove the wasm and memory references to trigger GC +export function cleanup() { + wasm = null + cachegetUint8Memory0 = null + cachegetInt32Memory0 = null +} diff --git a/packages/next/next-server/server/lib/squoosh/png/squoosh_png.js b/packages/next/next-server/server/lib/squoosh/png/squoosh_png.js index e190cdcad0275..2971ef3cce647 100644 --- a/packages/next/next-server/server/lib/squoosh/png/squoosh_png.js +++ b/packages/next/next-server/server/lib/squoosh/png/squoosh_png.js @@ -179,3 +179,11 @@ async function init(input) { } export default init + +// Manually remove the wasm and memory references to trigger GC +export function cleanup() { + wasm = null + cachegetUint8ClampedMemory0 = null + cachegetUint8Memory0 = null + cachegetInt32Memory0 = null +} diff --git a/packages/next/next-server/server/lib/squoosh/resize/squoosh_resize.js b/packages/next/next-server/server/lib/squoosh/resize/squoosh_resize.js index 0fd344efc8f91..f9553f3bd6b5a 100644 --- a/packages/next/next-server/server/lib/squoosh/resize/squoosh_resize.js +++ b/packages/next/next-server/server/lib/squoosh/resize/squoosh_resize.js @@ -130,3 +130,10 @@ async function init(input) { } export default init + +// Manually remove the wasm and memory references to trigger GC +export function cleanup() { + wasm = null + cachegetUint8Memory0 = null + cachegetInt32Memory0 = null +} diff --git a/packages/next/next-server/server/lib/squoosh/webp/webp_node_dec.js b/packages/next/next-server/server/lib/squoosh/webp/webp_node_dec.js index 04573485f2c5b..ba9858be369bc 100644 --- a/packages/next/next-server/server/lib/squoosh/webp/webp_node_dec.js +++ b/packages/next/next-server/server/lib/squoosh/webp/webp_node_dec.js @@ -35,12 +35,6 @@ var Module = (function () { a.buffer || x('Assertion failed: undefined') return a } - 1 < process.argv.length && process.argv[1].replace(/\\/g, '/') - process.argv.slice(2) - process.on('uncaughtException', function (a) { - throw a - }) - process.on('unhandledRejection', x) e.inspect = function () { return '[Emscripten Module object]' } diff --git a/packages/next/next-server/server/lib/squoosh/webp/webp_node_enc.js b/packages/next/next-server/server/lib/squoosh/webp/webp_node_enc.js index 8b8eebdee002c..dc6c7d2892a1c 100644 --- a/packages/next/next-server/server/lib/squoosh/webp/webp_node_enc.js +++ b/packages/next/next-server/server/lib/squoosh/webp/webp_node_enc.js @@ -35,12 +35,6 @@ var Module = (function () { a.buffer || u('Assertion failed: undefined') return a } - 1 < process.argv.length && process.argv[1].replace(/\\/g, '/') - process.argv.slice(2) - process.on('uncaughtException', function (a) { - throw a - }) - process.on('unhandledRejection', u) f.inspect = function () { return '[Emscripten Module object]' } From ce7f2b83299c7d8952feb1c62b90f8e4f2a3ddae Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Wed, 31 Mar 2021 10:27:33 +0200 Subject: [PATCH 05/36] v10.1.3-canary.0 --- lerna.json | 2 +- packages/create-next-app/package.json | 2 +- packages/eslint-plugin-next/package.json | 2 +- packages/next-bundle-analyzer/package.json | 2 +- packages/next-codemod/package.json | 2 +- packages/next-env/package.json | 2 +- packages/next-mdx/package.json | 2 +- packages/next-plugin-google-analytics/package.json | 2 +- packages/next-plugin-sentry/package.json | 2 +- packages/next-plugin-storybook/package.json | 2 +- packages/next-polyfill-module/package.json | 2 +- packages/next-polyfill-nomodule/package.json | 2 +- packages/next/package.json | 12 ++++++------ packages/react-dev-overlay/package.json | 2 +- packages/react-refresh-utils/package.json | 2 +- 15 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lerna.json b/lerna.json index e266b2d6fddbd..6f7264d1409b7 100644 --- a/lerna.json +++ b/lerna.json @@ -17,5 +17,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "10.1.2" + "version": "10.1.3-canary.0" } diff --git a/packages/create-next-app/package.json b/packages/create-next-app/package.json index ac336386a51f8..1184a8ba47a42 100644 --- a/packages/create-next-app/package.json +++ b/packages/create-next-app/package.json @@ -1,6 +1,6 @@ { "name": "create-next-app", - "version": "10.1.2", + "version": "10.1.3-canary.0", "keywords": [ "react", "next", diff --git a/packages/eslint-plugin-next/package.json b/packages/eslint-plugin-next/package.json index 230eed176098e..0a51e4b65c4bd 100644 --- a/packages/eslint-plugin-next/package.json +++ b/packages/eslint-plugin-next/package.json @@ -1,6 +1,6 @@ { "name": "@next/eslint-plugin-next", - "version": "10.1.2", + "version": "10.1.3-canary.0", "description": "ESLint plugin for NextJS.", "main": "lib/index.js", "license": "MIT", diff --git a/packages/next-bundle-analyzer/package.json b/packages/next-bundle-analyzer/package.json index a4f65ff5ffb37..176eb3c6a3338 100644 --- a/packages/next-bundle-analyzer/package.json +++ b/packages/next-bundle-analyzer/package.json @@ -1,6 +1,6 @@ { "name": "@next/bundle-analyzer", - "version": "10.1.2", + "version": "10.1.3-canary.0", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-codemod/package.json b/packages/next-codemod/package.json index cf53b67fbd113..9149dad64c674 100644 --- a/packages/next-codemod/package.json +++ b/packages/next-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@next/codemod", - "version": "10.1.2", + "version": "10.1.3-canary.0", "license": "MIT", "dependencies": { "chalk": "4.1.0", diff --git a/packages/next-env/package.json b/packages/next-env/package.json index 0689676e578ef..a89b4f17005f2 100644 --- a/packages/next-env/package.json +++ b/packages/next-env/package.json @@ -1,6 +1,6 @@ { "name": "@next/env", - "version": "10.1.2", + "version": "10.1.3-canary.0", "keywords": [ "react", "next", diff --git a/packages/next-mdx/package.json b/packages/next-mdx/package.json index 1240bf6d55b50..fca83c0185185 100644 --- a/packages/next-mdx/package.json +++ b/packages/next-mdx/package.json @@ -1,6 +1,6 @@ { "name": "@next/mdx", - "version": "10.1.2", + "version": "10.1.3-canary.0", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-plugin-google-analytics/package.json b/packages/next-plugin-google-analytics/package.json index 8c6ee4785a644..3ec8f5c7083db 100644 --- a/packages/next-plugin-google-analytics/package.json +++ b/packages/next-plugin-google-analytics/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-google-analytics", - "version": "10.1.2", + "version": "10.1.3-canary.0", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-google-analytics" diff --git a/packages/next-plugin-sentry/package.json b/packages/next-plugin-sentry/package.json index 4d5a717b843bf..c47caa6c1c8d9 100644 --- a/packages/next-plugin-sentry/package.json +++ b/packages/next-plugin-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-sentry", - "version": "10.1.2", + "version": "10.1.3-canary.0", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-sentry" diff --git a/packages/next-plugin-storybook/package.json b/packages/next-plugin-storybook/package.json index 4bb236ce1189d..7e5504a8a67a8 100644 --- a/packages/next-plugin-storybook/package.json +++ b/packages/next-plugin-storybook/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-storybook", - "version": "10.1.2", + "version": "10.1.3-canary.0", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-storybook" diff --git a/packages/next-polyfill-module/package.json b/packages/next-polyfill-module/package.json index bb17afdb78a53..7705eaa0e369b 100644 --- a/packages/next-polyfill-module/package.json +++ b/packages/next-polyfill-module/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-module", - "version": "10.1.2", + "version": "10.1.3-canary.0", "description": "A standard library polyfill for ES Modules supporting browsers (Edge 16+, Firefox 60+, Chrome 61+, Safari 10.1+)", "main": "dist/polyfill-module.js", "license": "MIT", diff --git a/packages/next-polyfill-nomodule/package.json b/packages/next-polyfill-nomodule/package.json index 0382e6db7fc2c..71d9d40263482 100644 --- a/packages/next-polyfill-nomodule/package.json +++ b/packages/next-polyfill-nomodule/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-nomodule", - "version": "10.1.2", + "version": "10.1.3-canary.0", "description": "A polyfill for non-dead, nomodule browsers.", "main": "dist/polyfill-nomodule.js", "license": "MIT", diff --git a/packages/next/package.json b/packages/next/package.json index 824033a70b682..cf6959257db65 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "10.1.2", + "version": "10.1.3-canary.0", "description": "The React Framework", "main": "./dist/server/next.js", "license": "MIT", @@ -62,10 +62,10 @@ "dependencies": { "@babel/runtime": "7.12.5", "@hapi/accept": "5.0.1", - "@next/env": "10.1.2", - "@next/polyfill-module": "10.1.2", - "@next/react-dev-overlay": "10.1.2", - "@next/react-refresh-utils": "10.1.2", + "@next/env": "10.1.3-canary.0", + "@next/polyfill-module": "10.1.3-canary.0", + "@next/react-dev-overlay": "10.1.3-canary.0", + "@next/react-refresh-utils": "10.1.3-canary.0", "@opentelemetry/api": "0.14.0", "assert": "2.0.0", "ast-types": "0.13.2", @@ -146,7 +146,7 @@ "@babel/preset-react": "7.12.10", "@babel/preset-typescript": "7.12.7", "@babel/types": "7.12.12", - "@next/polyfill-nomodule": "10.1.2", + "@next/polyfill-nomodule": "10.1.3-canary.0", "@taskr/clear": "1.1.0", "@taskr/esnext": "1.1.0", "@taskr/watch": "1.1.0", diff --git a/packages/react-dev-overlay/package.json b/packages/react-dev-overlay/package.json index 5ad13749984b5..160cecb010f56 100644 --- a/packages/react-dev-overlay/package.json +++ b/packages/react-dev-overlay/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-dev-overlay", - "version": "10.1.2", + "version": "10.1.3-canary.0", "description": "A development-only overlay for developing React applications.", "repository": { "url": "vercel/next.js", diff --git a/packages/react-refresh-utils/package.json b/packages/react-refresh-utils/package.json index ca9c0c7c6db6f..8445c76d26607 100644 --- a/packages/react-refresh-utils/package.json +++ b/packages/react-refresh-utils/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-refresh-utils", - "version": "10.1.2", + "version": "10.1.3-canary.0", "description": "An experimental package providing utilities for React Refresh.", "repository": { "url": "vercel/next.js", From 68fc4deaefb2a6e17c82dfa0c7586bdbe7aabb9d Mon Sep 17 00:00:00 2001 From: Justin Bennett Date: Wed, 31 Mar 2021 10:03:39 -0400 Subject: [PATCH 06/36] Remove redundant prefresh dependency in with-preact example (#23567) The package `next-plugin-preact` [already contains](https://github.com/preactjs/next-plugin-preact/blob/38cfb182ddd4720ac5f8ea885929e4c1423cc267/packages/next-plugin-preact/package.json#L25) the dependency `@prefresh/next` so it shouldn't be explicitly installed. ## Documentation / Examples - [x] Make sure the linting passes --- examples/using-preact/package.json | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/using-preact/package.json b/examples/using-preact/package.json index 65a9e3ab44f2b..6b1523bd0eaf5 100644 --- a/examples/using-preact/package.json +++ b/examples/using-preact/package.json @@ -8,7 +8,6 @@ }, "devDependencies": {}, "dependencies": { - "@prefresh/next": "^1.3.0", "next": "^10.0.0", "next-plugin-preact": "^3.0.3", "preact": "^10.5.5", From 0d5baf2c70eec21b92b75a2c2c2ea1fd9c3aa8c7 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Wed, 31 Mar 2021 18:37:44 +0200 Subject: [PATCH 07/36] Mark this.router protected (#23573) * Mark this.router protected Seems that some people (#23558) are using Next.js internals based on the typings that TS generates automatically even though these values are not documented / should not be used in applications. This ensures the router value on Server is not used by accident. * Mark all variables as protected https://github.com/vercel/next.js/issues/23349 * fix type error Co-authored-by: JJ Kasper --- .../next-server/server/image-optimizer.ts | 6 ++-- .../next/next-server/server/next-server.ts | 35 +++++++++++-------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/packages/next/next-server/server/image-optimizer.ts b/packages/next/next-server/server/image-optimizer.ts index eef496c15f6a4..8e6cf9888c7b3 100644 --- a/packages/next/next-server/server/image-optimizer.ts +++ b/packages/next/next-server/server/image-optimizer.ts @@ -8,6 +8,7 @@ import isAnimated from 'next/dist/compiled/is-animated' import { join } from 'path' import Stream from 'stream' import nodeUrl, { UrlWithParsedQuery } from 'url' +import { NextConfig } from '../../next-server/server/config-shared' import { fileExists } from '../../lib/file-exists' import { ImageConfig, imageConfigDefault } from './image-config' import { processBuffer, Operation } from './lib/squoosh/main' @@ -30,9 +31,10 @@ export async function imageOptimizer( server: Server, req: IncomingMessage, res: ServerResponse, - parsedUrl: UrlWithParsedQuery + parsedUrl: UrlWithParsedQuery, + nextConfig: NextConfig, + distDir: string ) { - const { nextConfig, distDir } = server const imageData: ImageConfig = nextConfig.images || imageConfigDefault const { deviceSizes = [], imageSizes = [], domains = [], loader } = imageData diff --git a/packages/next/next-server/server/next-server.ts b/packages/next/next-server/server/next-server.ts index 9f4bfa43030f8..ca02ba875a784 100644 --- a/packages/next/next-server/server/next-server.ts +++ b/packages/next/next-server/server/next-server.ts @@ -124,18 +124,18 @@ export type ServerConstructor = { } export default class Server { - dir: string - quiet: boolean - nextConfig: NextConfig - distDir: string - pagesDir?: string - publicDir: string - hasStaticDir: boolean - serverBuildDir: string - pagesManifest?: PagesManifest - buildId: string - minimalMode: boolean - renderOpts: { + protected dir: string + protected quiet: boolean + protected nextConfig: NextConfig + protected distDir: string + protected pagesDir?: string + protected publicDir: string + protected hasStaticDir: boolean + protected serverBuildDir: string + protected pagesManifest?: PagesManifest + protected buildId: string + protected minimalMode: boolean + protected renderOpts: { poweredByHeader: boolean buildId: string generateEtags: boolean @@ -161,7 +161,7 @@ export default class Server { private compression?: Middleware private onErrorMiddleware?: ({ err }: { err: Error }) => Promise private incrementalCache: IncrementalCache - router: Router + protected router: Router protected dynamicRoutes?: DynamicRoutes protected customRoutes: CustomRoutes @@ -784,7 +784,14 @@ export default class Server { type: 'route', name: '_next/image catchall', fn: (req, res, _params, parsedUrl) => - imageOptimizer(server, req, res, parsedUrl), + imageOptimizer( + server, + req, + res, + parsedUrl, + server.nextConfig, + server.distDir + ), }, { match: route('/_next/:path*'), From 65c22167c8b797ae8282c9c5301499301a54ff74 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 1 Apr 2021 04:15:28 -0500 Subject: [PATCH 08/36] Ensure has segments are allowed in destination (#23588) This ensures we gather segments from the experimental has field when validating segments used in the destination to prevent the invalid segments in the destination error from showing incorrectly. This usage has been added to the custom-routes test suite to ensure the segments are passed correctly from the has field. Fixes: https://github.com/vercel/next.js/issues/23415 ## Bug - [x] Related issues linked using `fixes #number` - [x] Integration tests added --- packages/next/lib/load-custom-routes.ts | 34 +++++++++++++++++-- .../lib/router/utils/prepare-destination.ts | 2 +- test/integration/custom-routes/next.config.js | 10 ++++++ .../custom-routes/test/index.test.js | 27 +++++++++++++++ .../invalid-custom-routes/test/index.test.js | 2 +- 5 files changed, 71 insertions(+), 4 deletions(-) diff --git a/packages/next/lib/load-custom-routes.ts b/packages/next/lib/load-custom-routes.ts index d518fe16e1523..45ec7d22fe36a 100644 --- a/packages/next/lib/load-custom-routes.ts +++ b/packages/next/lib/load-custom-routes.ts @@ -8,6 +8,7 @@ import { } from '../next-server/lib/constants' import { execOnce } from '../next-server/lib/utils' import * as Log from '../build/output/log' +import { getSafeParamName } from '../next-server/lib/router/utils/prepare-destination' export type RouteHas = | { @@ -325,6 +326,34 @@ function checkCustomRoutes( } sourceTokens = tokens } + const hasSegments = new Set() + + if (route.has) { + for (const hasItem of route.has) { + if (!hasItem.value && hasItem.key) { + hasSegments.add(hasItem.key) + } + + if (hasItem.value) { + const matcher = new RegExp(`^${hasItem.value}$`) + const matches = matcher.exec('') + + if (matches) { + if (matches.groups) { + Object.keys(matches.groups).forEach((groupKey) => { + const safeKey = getSafeParamName(groupKey) + + if (safeKey && matches.groups![groupKey]) { + hasSegments.add(safeKey) + } + }) + } else { + hasSegments.add(hasItem.key || 'host') + } + } + } + } + } // make sure no unnamed patterns are attempted to be used in the // destination as this can cause confusion and is not allowed @@ -369,7 +398,8 @@ function checkCustomRoutes( for (const token of destTokens!) { if ( typeof token === 'object' && - !sourceSegments.has(token.name) + !sourceSegments.has(token.name) && + !hasSegments.has(token.name as string) ) { invalidDestSegments.add(token.name) } @@ -377,7 +407,7 @@ function checkCustomRoutes( if (invalidDestSegments.size) { invalidParts.push( - `\`destination\` has segments not in \`source\` (${[ + `\`destination\` has segments not in \`source\` or \`has\` (${[ ...invalidDestSegments, ].join(', ')})` ) diff --git a/packages/next/next-server/lib/router/utils/prepare-destination.ts b/packages/next/next-server/lib/router/utils/prepare-destination.ts index 9421764487f14..3de8bd4d0f112 100644 --- a/packages/next/next-server/lib/router/utils/prepare-destination.ts +++ b/packages/next/next-server/lib/router/utils/prepare-destination.ts @@ -9,7 +9,7 @@ type Params = { [param: string]: any } // ensure only a-zA-Z are used for param names for proper interpolating // with path-to-regexp -const getSafeParamName = (paramName: string) => { +export const getSafeParamName = (paramName: string) => { let newParamName = '' for (let i = 0; i < paramName.length; i++) { diff --git a/test/integration/custom-routes/next.config.js b/test/integration/custom-routes/next.config.js index cb5c84a40ed0c..769dfa1fbe0bc 100644 --- a/test/integration/custom-routes/next.config.js +++ b/test/integration/custom-routes/next.config.js @@ -149,6 +149,16 @@ module.exports = { ], destination: '/with-params?host=1', }, + { + source: '/has-rewrite-5', + has: [ + { + type: 'query', + key: 'hasParam', + }, + ], + destination: '/:hasParam', + }, ], beforeFiles: [ { diff --git a/test/integration/custom-routes/test/index.test.js b/test/integration/custom-routes/test/index.test.js index 7d0e6a2932f3e..3fe63aa024ab5 100644 --- a/test/integration/custom-routes/test/index.test.js +++ b/test/integration/custom-routes/test/index.test.js @@ -692,6 +692,22 @@ const runTests = (isDev = false) => { expect(res2.status).toBe(404) }) + it('should pass has segment for rewrite correctly', async () => { + const res1 = await fetchViaHTTP(appPort, '/has-rewrite-5') + expect(res1.status).toBe(404) + + const res = await fetchViaHTTP(appPort, '/has-rewrite-5', { + hasParam: 'with-params', + }) + + expect(res.status).toBe(200) + const $ = cheerio.load(await res.text()) + + expect(JSON.parse($('#query').text())).toEqual({ + hasParam: 'with-params', + }) + }) + it('should match has rewrite correctly before files', async () => { const res1 = await fetchViaHTTP(appPort, '/hello') expect(res1.status).toBe(200) @@ -1509,6 +1525,17 @@ const runTests = (isDev = false) => { regex: '^\\/has-rewrite-4$', source: '/has-rewrite-4', }, + { + destination: '/:hasParam', + has: [ + { + key: 'hasParam', + type: 'query', + }, + ], + regex: normalizeRegEx('^\\/has-rewrite-5$'), + source: '/has-rewrite-5', + }, ], fallback: [], }, diff --git a/test/integration/invalid-custom-routes/test/index.test.js b/test/integration/invalid-custom-routes/test/index.test.js index d088bbf3848ec..e161fc11df13a 100644 --- a/test/integration/invalid-custom-routes/test/index.test.js +++ b/test/integration/invalid-custom-routes/test/index.test.js @@ -542,7 +542,7 @@ const runTests = () => { const stderr = await getStderr() expect(stderr).toContain( - `\`destination\` has segments not in \`source\` (id) for route {"source":"/feedback/:type","destination":"/feedback/:id"}` + `\`destination\` has segments not in \`source\` or \`has\` (id) for route {"source":"/feedback/:type","destination":"/feedback/:id"}` ) }) } From 2ed54cddfa213b4353696214994025792e27c64a Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Thu, 1 Apr 2021 23:16:26 +0800 Subject: [PATCH 09/36] Update decoder to correctly handle grayscale PNGs (#23393) This PR updates the Squoosh PNG decoder, which fixes #22929 in GoogleChromeLabs/squoosh#971. ## Bug - [x] Fixes #22929 - [x] Integration tests added ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. ## Documentation / Examples - [ ] Make sure the linting passes --- .../server/lib/squoosh/png/squoosh_png.js | 39 ++++++++++++------ .../lib/squoosh/png/squoosh_png_bg.wasm | Bin 127134 -> 123672 bytes .../image-optimizer/public/grayscale.png | Bin 0 -> 234 bytes .../image-optimizer/test/index.test.js | 20 +++++++++ 4 files changed, 47 insertions(+), 12 deletions(-) create mode 100644 test/integration/image-optimizer/public/grayscale.png diff --git a/packages/next/next-server/server/lib/squoosh/png/squoosh_png.js b/packages/next/next-server/server/lib/squoosh/png/squoosh_png.js index 2971ef3cce647..300c68daf6309 100644 --- a/packages/next/next-server/server/lib/squoosh/png/squoosh_png.js +++ b/packages/next/next-server/server/lib/squoosh/png/squoosh_png.js @@ -1,5 +1,29 @@ +import { TextDecoder } from '../text-decoder' + let wasm +let cachedTextDecoder = new TextDecoder('utf-8', { + ignoreBOM: true, + fatal: true, +}) + +cachedTextDecoder.decode() + +let cachegetUint8Memory0 = null +function getUint8Memory0() { + if ( + cachegetUint8Memory0 === null || + cachegetUint8Memory0.buffer !== wasm.memory.buffer + ) { + cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer) + } + return cachegetUint8Memory0 +} + +function getStringFromWasm0(ptr, len) { + return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)) +} + let cachegetUint8ClampedMemory0 = null function getUint8ClampedMemory0() { if ( @@ -30,17 +54,6 @@ function addHeapObject(obj) { return idx } -let cachegetUint8Memory0 = null -function getUint8Memory0() { - if ( - cachegetUint8Memory0 === null || - cachegetUint8Memory0.buffer !== wasm.memory.buffer - ) { - cachegetUint8Memory0 = new Uint8Array(wasm.memory.buffer) - } - return cachegetUint8Memory0 -} - let WASM_VECTOR_LEN = 0 function passArray8ToWasm0(arg, malloc) { @@ -161,7 +174,9 @@ async function init(input) { var ret = new ImageData(v0, arg2 >>> 0, arg3 >>> 0) return addHeapObject(ret) } - + imports.wbg.__wbindgen_throw = function (arg0, arg1) { + throw new Error(getStringFromWasm0(arg0, arg1)) + } if ( typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || diff --git a/packages/next/next-server/server/lib/squoosh/png/squoosh_png_bg.wasm b/packages/next/next-server/server/lib/squoosh/png/squoosh_png_bg.wasm index 65f76eaa1946c5d8d2bbfbdc3cc544bfc70d3bab..ef074fafe8b10e34c95cd0a66cec99ddf39ee726 100644 GIT binary patch delta 30811 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 delta 33435 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 TuT;zU`1}jCXaDq(m?{1b2qu%< diff --git a/test/integration/image-optimizer/public/grayscale.png b/test/integration/image-optimizer/public/grayscale.png new file mode 100644 index 0000000000000000000000000000000000000000..85c55456d8c7904da7b4b1766ed8814308601326 GIT binary patch literal 234 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|k0wldT1B8LpMo$;VkcwMxr{3mmHsEo!_N!AW z-0Y(wc9P@XVeJhGPros*iCMWadZE~fpInaZNBE1ZZ=T?c65}&jo*1~&Wn)mg>*YUx ziu&J{%(^ek8Qu6s*{Rv$N*~+H1Z`b)@mm%dvzu?UDch83=qnkCowXNT`11{m>(ad7 z+?$+TZ+==C-)uOsO!k%Q8kf_TIxY5DYQ(Xq9#xAwa{s3G4V%C0tKN8*2whCK|Gz%g ieckdy5&Zw2>|i#QkCA9Ev { + // https://github.com/vercel/next.js/issues/22929 + // A grayscaled PNG with transparent pixels. + const query = { url: '/grayscale.png', w: largeSize, q: 80 } + const opts = { headers: { accept: 'image/png' } } + const res = await fetchViaHTTP(appPort, '/_next/image', query, opts) + expect(res.status).toBe(200) + expect(res.headers.get('Content-Type')).toBe('image/png') + expect(res.headers.get('cache-control')).toBe( + 'public, max-age=0, must-revalidate' + ) + + const png = await res.buffer() + + // Read the color type byte (offset 9 + magic number 16). + // http://www.libpng.org/pub/png/spec/1.2/PNG-Chunks.html + const colorType = png.readUIntBE(25, 1) + expect(colorType).toBe(4) + }) + it("should error if the resource isn't a valid image", async () => { const query = { url: '/test.txt', w, q: 80 } const opts = { headers: { accept: 'image/webp' } } From ba81b6ab2a06a33971cbfc9d9ac207c73845ed2c Mon Sep 17 00:00:00 2001 From: Sam Robbins Date: Thu, 1 Apr 2021 17:33:30 +0100 Subject: [PATCH 10/36] Delete examples/with-style-sheet directory (#23609) The underlying package [style-sheet](https://github.com/giuseppeg/style-sheet) has been archived, and the example doesn't currently work, so I think it's better deleted. Closes part of issue #23607 ## Documentation / Examples - [x] Make sure the linting passes --- examples/with-style-sheet/.gitignore | 34 --------------- examples/with-style-sheet/README.md | 21 ---------- examples/with-style-sheet/babel.config.js | 23 ---------- examples/with-style-sheet/lib/styleSheet.js | 5 --- examples/with-style-sheet/next.config.js | 17 -------- examples/with-style-sheet/package.json | 19 --------- examples/with-style-sheet/pages/_document.js | 22 ---------- examples/with-style-sheet/pages/index.js | 44 -------------------- 8 files changed, 185 deletions(-) delete mode 100644 examples/with-style-sheet/.gitignore delete mode 100644 examples/with-style-sheet/README.md delete mode 100644 examples/with-style-sheet/babel.config.js delete mode 100644 examples/with-style-sheet/lib/styleSheet.js delete mode 100644 examples/with-style-sheet/next.config.js delete mode 100644 examples/with-style-sheet/package.json delete mode 100644 examples/with-style-sheet/pages/_document.js delete mode 100644 examples/with-style-sheet/pages/index.js diff --git a/examples/with-style-sheet/.gitignore b/examples/with-style-sheet/.gitignore deleted file mode 100644 index 1437c53f70bc2..0000000000000 --- a/examples/with-style-sheet/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env.local -.env.development.local -.env.test.local -.env.production.local - -# vercel -.vercel diff --git a/examples/with-style-sheet/README.md b/examples/with-style-sheet/README.md deleted file mode 100644 index 477752559793b..0000000000000 --- a/examples/with-style-sheet/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Using the style-sheet CSS in JS library and extract CSS to file. - -This example features an app using the [style-sheet](https://www.npmjs.com/package/style-sheet) CSS in JS library and demonstrates how it is possible to extract styles to file. - -## Deploy your own - -Deploy the example using [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example): - -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/vercel/next.js/tree/canary/examples/with-style-sheet&project-name=with-style-sheet&repository-name=with-style-sheet) - -## How to use - -Execute [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app) with [npm](https://docs.npmjs.com/cli/init) or [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/) to bootstrap the example: - -```bash -npx create-next-app --example with-style-sheet with-style-sheet-app -# or -yarn create next-app --example with-style-sheet with-style-sheet-app -``` - -Deploy it to the cloud with [Vercel](https://vercel.com/new?utm_source=github&utm_medium=readme&utm_campaign=next-example) ([Documentation](https://nextjs.org/docs/deployment)). diff --git a/examples/with-style-sheet/babel.config.js b/examples/with-style-sheet/babel.config.js deleted file mode 100644 index 72b38f5e4d0f1..0000000000000 --- a/examples/with-style-sheet/babel.config.js +++ /dev/null @@ -1,23 +0,0 @@ -const path = require('path') - -module.exports = { - presets: [ - [ - 'next/babel', - { - 'preset-react': { - pragma: 'createElement', - }, - }, - ], - ], - plugins: [ - [ - 'style-sheet/babel', - { - stylePropName: 'css', - stylePropPackageName: path.resolve('./lib/styleSheet.js'), - }, - ], - ], -} diff --git a/examples/with-style-sheet/lib/styleSheet.js b/examples/with-style-sheet/lib/styleSheet.js deleted file mode 100644 index 4fb959e8f36d7..0000000000000 --- a/examples/with-style-sheet/lib/styleSheet.js +++ /dev/null @@ -1,5 +0,0 @@ -const StyleSheet = require('style-sheet') -const setup = require('style-sheet/lib/cjs/createElement') - -const stylePropName = 'css' -module.exports.createElement = setup(StyleSheet, stylePropName) diff --git a/examples/with-style-sheet/next.config.js b/examples/with-style-sheet/next.config.js deleted file mode 100644 index 01bc4abe59861..0000000000000 --- a/examples/with-style-sheet/next.config.js +++ /dev/null @@ -1,17 +0,0 @@ -const getCss = require('style-sheet/babel').getCss -const { RawSource } = require('webpack-sources') - -class StyleSheetPlugin { - apply(compiler) { - compiler.hooks.emit.tap('StyleSheetPlugin', (compilation) => { - compilation.assets['static/bundle.css'] = new RawSource(getCss()) - }) - } -} - -module.exports = { - webpack: (config, options) => { - config.plugins.push(new StyleSheetPlugin()) - return config - }, -} diff --git a/examples/with-style-sheet/package.json b/examples/with-style-sheet/package.json deleted file mode 100644 index 67826c2e566e2..0000000000000 --- a/examples/with-style-sheet/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "with-style-sheet", - "version": "1.0.0", - "description": "This example features: style-sheet a CSS in JS library with static CSS extraction support.", - "main": "index.js", - "scripts": { - "dev": "next", - "build": "next build", - "start": "next start" - }, - "dependencies": { - "next": "latest", - "react": "^16.7.0", - "react-dom": "^16.7.0", - "style-sheet": "^4.0.4" - }, - "author": "Giuseppe Gurgone", - "license": "MIT" -} diff --git a/examples/with-style-sheet/pages/_document.js b/examples/with-style-sheet/pages/_document.js deleted file mode 100644 index dc72499d197a1..0000000000000 --- a/examples/with-style-sheet/pages/_document.js +++ /dev/null @@ -1,22 +0,0 @@ -import Document, { Html, Head, Main, NextScript } from 'next/document' - -export default class MyDocument extends Document { - render() { - return ( - - - - - - -
- - - - ) - } -} diff --git a/examples/with-style-sheet/pages/index.js b/examples/with-style-sheet/pages/index.js deleted file mode 100644 index a8f529f0bff1a..0000000000000 --- a/examples/with-style-sheet/pages/index.js +++ /dev/null @@ -1,44 +0,0 @@ -import { useState, useEffect } from 'react' -import { StyleSheet, StyleResolver } from 'style-sheet' -const cls = StyleResolver.resolve - -export default function Home() { - const [color, setColor] = useState('#111') - useEffect(() => { - setTimeout(() => { - setColor('#00f') - }, 2000) - }) - return ( -
-
- Hello from Next.js -
-
- ) -} - -const styles = StyleSheet.create({ - root: { - fontSize: 16, - fontFamily: 'sans-serif', - display: 'flex', - alignItems: 'center', - justifyContent: 'center', - minHeight: '100vh', - backgroundImage: - 'radial-gradient(circle, #D7D7D7, #D7D7D7 1px, #FFF 1px, #FFF)', - backgroundSize: '1em 1em', - }, - another: { - fontSize: 30, - }, - brand: { - fontWeight: 'bold', - }, -}) From bfd36bd227695cf93c91477e480b6b2d1e6a6f06 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 1 Apr 2021 11:48:49 -0500 Subject: [PATCH 11/36] Update custom-routes-proxying to use fallback rewrites (#23610) This updates to use the new `fallback` rewrites support instead of the previous no-op rewrite workaround. ## Documentation / Examples - [x] Make sure the linting passes --- .../custom-routes-proxying/next.config.js | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/examples/custom-routes-proxying/next.config.js b/examples/custom-routes-proxying/next.config.js index 34fbf87d7a25d..0ed1bef112c66 100644 --- a/examples/custom-routes-proxying/next.config.js +++ b/examples/custom-routes-proxying/next.config.js @@ -1,16 +1,12 @@ module.exports = { async rewrites() { - return [ - // we need to define a no-op rewrite to trigger checking - // all pages/static files before we attempt proxying - { - source: '/:path*', - destination: '/:path*', - }, - { - source: '/:path*', - destination: `https://custom-routes-proxying-endpoint.vercel.app/:path*`, - }, - ] + return { + fallback: [ + { + source: '/:path*', + destination: `https://custom-routes-proxying-endpoint.vercel.app/:path*`, + }, + ], + } }, } From 4de984ca232d63a59e320428719e13a7161aaf37 Mon Sep 17 00:00:00 2001 From: Sam Robbins Date: Thu, 1 Apr 2021 19:26:19 +0100 Subject: [PATCH 12/36] Update router.md to improve a11y (#23611) Code examples used `span`, change to use `button` for better accessibility ## Documentation / Examples - [x] Make sure the linting passes --- docs/api-reference/next/router.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/api-reference/next/router.md b/docs/api-reference/next/router.md index 08956aae35fca..b8cf2c7a6f8c7 100644 --- a/docs/api-reference/next/router.md +++ b/docs/api-reference/next/router.md @@ -99,7 +99,7 @@ import { useRouter } from 'next/router' export default function Page() { const router = useRouter() - return router.push('/post/abc')}>Click me + return } ``` @@ -137,7 +137,7 @@ export default function ReadMore({ post }) { const router = useRouter() return ( - { router.push({ pathname: '/post/[pid]', @@ -146,7 +146,7 @@ export default function ReadMore({ post }) { }} > Click here to read more - + ) } ``` @@ -171,7 +171,7 @@ import { useRouter } from 'next/router' export default function Page() { const router = useRouter() - return router.replace('/home')}>Click me + return } ``` @@ -282,7 +282,7 @@ import { useRouter } from 'next/router' export default function Page() { const router = useRouter() - return router.back()}>Click here to go back + return } ``` @@ -298,7 +298,7 @@ import { useRouter } from 'next/router' export default function Page() { const router = useRouter() - return router.reload()}>Click here to reload + return } ``` From 0ad805fee6d7fd1998060963c60e8fa67be81955 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Thu, 1 Apr 2021 21:25:57 +0200 Subject: [PATCH 13/36] update webpack to 5.30 (#23612) * has some memory usage improvements * after a while cache entries that are unused and already persistent to disk are removed from the memory cache * When are read again, they are restored from disk again * Should play well together with adding and removing pages due to on-demand-entries ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. ## Documentation / Examples - [ ] Make sure the linting passes --- packages/next/bundles/yarn.lock | 31 +- packages/next/compiled/webpack/bundle5.js | 607 +++++++++++++++++++--- 2 files changed, 546 insertions(+), 92 deletions(-) diff --git a/packages/next/bundles/yarn.lock b/packages/next/bundles/yarn.lock index fb1a795d84d7a..45b757c733d06 100644 --- a/packages/next/bundles/yarn.lock +++ b/packages/next/bundles/yarn.lock @@ -11,14 +11,19 @@ "@types/estree" "*" "@types/eslint@*": - version "7.2.7" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.7.tgz#f7ef1cf0dceab0ae6f9a976a0a9af14ab1baca26" - integrity sha512-EHXbc1z2GoQRqHaAT7+grxlTJ3WE2YNeD6jlpPoRc83cCoThRY+NUWjCUZaYmk51OICkPXn2hhphcWcWXgNW0Q== + version "7.2.8" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.8.tgz#45cd802380fcc352e5680e1781d43c50916f12ee" + integrity sha512-RTKvBsfz0T8CKOGZMfuluDNyMFHnu5lvNr4hWEsQeHXH6FcmIDIozOyWMh36nLGMwVd5UFNXC2xztA8lln22MQ== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^0.0.46": +"@types/estree@*": + version "0.0.47" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" + integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg== + +"@types/estree@^0.0.46": version "0.0.46" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== @@ -29,9 +34,9 @@ integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== "@types/node@*": - version "14.14.35" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.35.tgz#42c953a4e2b18ab931f72477e7012172f4ffa313" - integrity sha512-Lt+wj8NVPx0zUmUwumiVXapmaLUcAk3yPuHCFVXras9k5VT9TdhJqKqGVUQCD60OTMCl0qxJ57OiTL0Mic3Iag== + version "14.14.37" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e" + integrity sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw== "@webassemblyjs/ast@1.11.0": version "1.11.0" @@ -223,9 +228,9 @@ commander@^2.20.0: integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== electron-to-chromium@^1.3.634: - version "1.3.698" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.698.tgz#5de813960f23581a268718a0058683dffa15d221" - integrity sha512-VEXDzYblnlT+g8Q3gedwzgKOso1evkeJzV8lih7lV8mL8eAnGVnKyC3KsFT6S+R5PQO4ffdr1PI16/ElibY/kQ== + version "1.3.704" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.704.tgz#894205a237cbe0097d63da8f6d19e605dd13ab51" + integrity sha512-6cz0jvawlUe4h5AbfQWxPzb+8LzVyswGAWiGc32EJEmfj39HTQyNPkLXirc7+L4x5I6RgRkzua8Ryu5QZqc8cA== enhanced-resolve@^5.7.0: version "5.7.0" @@ -476,9 +481,9 @@ watchpack@^2.0.0: source-map "^0.6.1" "webpack5@npm:webpack@5": - version "5.28.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.28.0.tgz#0de8bcd706186b26da09d4d1e8cbd3e4025a7c2f" - integrity sha512-1xllYVmA4dIvRjHzwELgW4KjIU1fW4PEuEnjsylz7k7H5HgPOctIq7W1jrt3sKH9yG5d72//XWzsHhfoWvsQVg== + version "5.30.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.30.0.tgz#07d87c182a060e0c2491062f3dc0edc85a29d884" + integrity sha512-Zr9NIri5yzpfmaMea2lSMV1UygbW0zQsSlGLMgKUm63ACXg6alhd1u4v5UBSBjzYKXJN6BNMGVM7w165e7NxYA== dependencies: "@types/eslint-scope" "^3.7.0" "@types/estree" "^0.0.46" diff --git a/packages/next/compiled/webpack/bundle5.js b/packages/next/compiled/webpack/bundle5.js index 24bd6efa60a97..4f5ba40d47c9f 100644 --- a/packages/next/compiled/webpack/bundle5.js +++ b/packages/next/compiled/webpack/bundle5.js @@ -54,7 +54,7 @@ module.exports = JSON.parse("{\"name\":\"terser\",\"description\":\"JavaScript p /***/ (function(module) { "use strict"; -module.exports = {"i8":"5.28.0"}; +module.exports = {"i8":"5.30.0"}; /***/ }), @@ -62,7 +62,7 @@ module.exports = {"i8":"5.28.0"}; /***/ (function(module) { "use strict"; -module.exports = JSON.parse("{\"definitions\":{\"Amd\":{\"description\":\"Set the value of `require.amd` and `define.amd`. Or disable AMD support.\",\"anyOf\":[{\"description\":\"You can pass `false` to disable AMD support.\",\"enum\":[false]},{\"description\":\"You can pass an object to set the value of `require.amd` and `define.amd`.\",\"type\":\"object\"}]},\"AssetFilterItemTypes\":{\"description\":\"Filtering value, regexp or function.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\",\"absolutePath\":false},{\"instanceof\":\"Function\",\"tsType\":\"((name: string, asset: import('../lib/stats/DefaultStatsFactoryPlugin').StatsAsset) => boolean)\"}]},\"AssetFilterTypes\":{\"description\":\"Filtering modules.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Rule to filter.\",\"cli\":{\"helper\":true},\"oneOf\":[{\"$ref\":\"#/definitions/AssetFilterItemTypes\"}]}},{\"$ref\":\"#/definitions/AssetFilterItemTypes\"}]},\"AssetGeneratorDataUrl\":{\"description\":\"The options for data url generator.\",\"anyOf\":[{\"$ref\":\"#/definitions/AssetGeneratorDataUrlOptions\"},{\"$ref\":\"#/definitions/AssetGeneratorDataUrlFunction\"}]},\"AssetGeneratorDataUrlFunction\":{\"description\":\"Function that executes for module and should return an DataUrl string.\",\"instanceof\":\"Function\",\"tsType\":\"((source: string | Buffer, context: { filename: string, module: import('../lib/Module') }) => string)\"},\"AssetGeneratorDataUrlOptions\":{\"description\":\"Options object for data url generation.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"encoding\":{\"description\":\"Asset encoding (defaults to base64).\",\"enum\":[false,\"base64\"]},\"mimetype\":{\"description\":\"Asset mimetype (getting from file extension by default).\",\"type\":\"string\"}}},\"AssetGeneratorOptions\":{\"description\":\"Generator options for asset modules.\",\"type\":\"object\",\"implements\":[\"#/definitions/AssetInlineGeneratorOptions\",\"#/definitions/AssetResourceGeneratorOptions\"],\"additionalProperties\":false,\"properties\":{\"dataUrl\":{\"$ref\":\"#/definitions/AssetGeneratorDataUrl\"},\"emit\":{\"description\":\"Emit an output asset from this asset module. This can be set to 'false' to omit emitting e. g. for SSR.\",\"type\":\"boolean\"},\"filename\":{\"$ref\":\"#/definitions/FilenameTemplate\"},\"publicPath\":{\"$ref\":\"#/definitions/RawPublicPath\"}}},\"AssetInlineGeneratorOptions\":{\"description\":\"Generator options for asset/inline modules.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"dataUrl\":{\"$ref\":\"#/definitions/AssetGeneratorDataUrl\"}}},\"AssetModuleFilename\":{\"description\":\"The filename of asset modules as relative path inside the 'output.path' directory.\",\"anyOf\":[{\"type\":\"string\",\"absolutePath\":false},{\"instanceof\":\"Function\",\"tsType\":\"((pathData: import(\\\"../lib/Compilation\\\").PathData, assetInfo?: import(\\\"../lib/Compilation\\\").AssetInfo) => string)\"}]},\"AssetParserDataUrlFunction\":{\"description\":\"Function that executes for module and should return whenever asset should be inlined as DataUrl.\",\"instanceof\":\"Function\",\"tsType\":\"((source: string | Buffer, context: { filename: string, module: import('../lib/Module') }) => boolean)\"},\"AssetParserDataUrlOptions\":{\"description\":\"Options object for DataUrl condition.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"maxSize\":{\"description\":\"Maximum size of asset that should be inline as modules. Default: 8kb.\",\"type\":\"number\"}}},\"AssetParserOptions\":{\"description\":\"Parser options for asset modules.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"dataUrlCondition\":{\"description\":\"The condition for inlining the asset as DataUrl.\",\"anyOf\":[{\"$ref\":\"#/definitions/AssetParserDataUrlOptions\"},{\"$ref\":\"#/definitions/AssetParserDataUrlFunction\"}]}}},\"AssetResourceGeneratorOptions\":{\"description\":\"Generator options for asset/resource modules.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"emit\":{\"description\":\"Emit an output asset from this asset module. This can be set to 'false' to omit emitting e. g. for SSR.\",\"type\":\"boolean\"},\"filename\":{\"$ref\":\"#/definitions/FilenameTemplate\"},\"publicPath\":{\"$ref\":\"#/definitions/RawPublicPath\"}}},\"AuxiliaryComment\":{\"description\":\"Add a comment in the UMD wrapper.\",\"anyOf\":[{\"description\":\"Append the same comment above each import style.\",\"type\":\"string\"},{\"$ref\":\"#/definitions/LibraryCustomUmdCommentObject\"}]},\"Bail\":{\"description\":\"Report the first error as a hard error instead of tolerating it.\",\"type\":\"boolean\"},\"CacheOptions\":{\"description\":\"Cache generated modules and chunks to improve performance for multiple incremental builds.\",\"anyOf\":[{\"description\":\"Enable in memory caching.\",\"enum\":[true]},{\"$ref\":\"#/definitions/CacheOptionsNormalized\"}]},\"CacheOptionsNormalized\":{\"description\":\"Cache generated modules and chunks to improve performance for multiple incremental builds.\",\"anyOf\":[{\"description\":\"Disable caching.\",\"enum\":[false]},{\"$ref\":\"#/definitions/MemoryCacheOptions\"},{\"$ref\":\"#/definitions/FileCacheOptions\"}]},\"Charset\":{\"description\":\"Add charset attribute for script tag.\",\"type\":\"boolean\"},\"ChunkFilename\":{\"description\":\"Specifies the filename template of output files of non-initial chunks on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.\",\"oneOf\":[{\"$ref\":\"#/definitions/FilenameTemplate\"}]},\"ChunkFormat\":{\"description\":\"The format of chunks (formats included by default are 'array-push' (web/WebWorker), 'commonjs' (node.js), but others might be added by plugins).\",\"anyOf\":[{\"enum\":[\"array-push\",\"commonjs\",false]},{\"type\":\"string\"}]},\"ChunkLoadTimeout\":{\"description\":\"Number of milliseconds before chunk request expires.\",\"type\":\"number\"},\"ChunkLoading\":{\"description\":\"The method of loading chunks (methods included by default are 'jsonp' (web), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).\",\"anyOf\":[{\"enum\":[false]},{\"$ref\":\"#/definitions/ChunkLoadingType\"}]},\"ChunkLoadingGlobal\":{\"description\":\"The global variable used by webpack for loading of chunks.\",\"type\":\"string\"},\"ChunkLoadingType\":{\"description\":\"The method of loading chunks (methods included by default are 'jsonp' (web), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).\",\"anyOf\":[{\"enum\":[\"jsonp\",\"import-scripts\",\"require\",\"async-node\"]},{\"type\":\"string\"}]},\"Clean\":{\"description\":\"Clean the output directory before emit.\",\"anyOf\":[{\"type\":\"boolean\"},{\"$ref\":\"#/definitions/CleanOptions\"}]},\"CleanOptions\":{\"description\":\"Advanced options for cleaning assets.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"dry\":{\"description\":\"Log the assets that should be removed instead of deleting them.\",\"type\":\"boolean\"},\"keep\":{\"description\":\"Keep these assets.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\",\"absolutePath\":false},{\"instanceof\":\"Function\",\"tsType\":\"((filename: string) => boolean)\"}]}}},\"CompareBeforeEmit\":{\"description\":\"Check if to be emitted file already exists and have the same content before writing to output filesystem.\",\"type\":\"boolean\"},\"Context\":{\"description\":\"The base directory (absolute path!) for resolving the `entry` option. If `output.pathinfo` is set, the included pathinfo is shortened to this directory.\",\"type\":\"string\",\"absolutePath\":true},\"CrossOriginLoading\":{\"description\":\"This option enables cross-origin loading of chunks.\",\"enum\":[false,\"anonymous\",\"use-credentials\"]},\"Dependencies\":{\"description\":\"References to other configurations to depend on.\",\"type\":\"array\",\"items\":{\"description\":\"References to another configuration to depend on.\",\"type\":\"string\"}},\"DevServer\":{\"description\":\"Options for the webpack-dev-server.\",\"type\":\"object\"},\"DevTool\":{\"description\":\"A developer tool to enhance debugging (false | eval | [inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map).\",\"anyOf\":[{\"enum\":[false,\"eval\"]},{\"type\":\"string\",\"pattern\":\"^(inline-|hidden-|eval-)?(nosources-)?(cheap-(module-)?)?source-map$\"}]},\"DevtoolFallbackModuleFilenameTemplate\":{\"description\":\"Similar to `output.devtoolModuleFilenameTemplate`, but used in the case of duplicate module identifiers.\",\"anyOf\":[{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"DevtoolModuleFilenameTemplate\":{\"description\":\"Filename template string of function for the sources array in a generated SourceMap.\",\"anyOf\":[{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"DevtoolNamespace\":{\"description\":\"Module namespace to use when interpolating filename template string for the sources array in a generated SourceMap. Defaults to `output.library` if not set. It's useful for avoiding runtime collisions in sourcemaps from multiple webpack projects built as libraries.\",\"type\":\"string\"},\"EmptyGeneratorOptions\":{\"description\":\"No generator options are supported for this module type.\",\"type\":\"object\",\"additionalProperties\":false},\"EmptyParserOptions\":{\"description\":\"No parser options are supported for this module type.\",\"type\":\"object\",\"additionalProperties\":false},\"EnabledChunkLoadingTypes\":{\"description\":\"List of chunk loading types enabled for use by entry points.\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ChunkLoadingType\"}},\"EnabledLibraryTypes\":{\"description\":\"List of library types enabled for use by entry points.\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/LibraryType\"}},\"EnabledWasmLoadingTypes\":{\"description\":\"List of wasm loading types enabled for use by entry points.\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/WasmLoadingType\"}},\"Entry\":{\"description\":\"The entry point(s) of the compilation.\",\"anyOf\":[{\"$ref\":\"#/definitions/EntryDynamic\"},{\"$ref\":\"#/definitions/EntryStatic\"}]},\"EntryDescription\":{\"description\":\"An object with entry point description.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"chunkLoading\":{\"$ref\":\"#/definitions/ChunkLoading\"},\"dependOn\":{\"description\":\"The entrypoints that the current entrypoint depend on. They must be loaded when this entrypoint is loaded.\",\"anyOf\":[{\"description\":\"The entrypoints that the current entrypoint depend on. They must be loaded when this entrypoint is loaded.\",\"type\":\"array\",\"items\":{\"description\":\"An entrypoint that the current entrypoint depend on. It must be loaded when this entrypoint is loaded.\",\"type\":\"string\",\"minLength\":1},\"minItems\":1,\"uniqueItems\":true},{\"description\":\"An entrypoint that the current entrypoint depend on. It must be loaded when this entrypoint is loaded.\",\"type\":\"string\",\"minLength\":1}]},\"filename\":{\"$ref\":\"#/definitions/EntryFilename\"},\"import\":{\"$ref\":\"#/definitions/EntryItem\"},\"layer\":{\"$ref\":\"#/definitions/Layer\"},\"library\":{\"$ref\":\"#/definitions/LibraryOptions\"},\"runtime\":{\"$ref\":\"#/definitions/EntryRuntime\"},\"wasmLoading\":{\"$ref\":\"#/definitions/WasmLoading\"}},\"required\":[\"import\"]},\"EntryDescriptionNormalized\":{\"description\":\"An object with entry point description.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"chunkLoading\":{\"$ref\":\"#/definitions/ChunkLoading\"},\"dependOn\":{\"description\":\"The entrypoints that the current entrypoint depend on. They must be loaded when this entrypoint is loaded.\",\"type\":\"array\",\"items\":{\"description\":\"An entrypoint that the current entrypoint depend on. It must be loaded when this entrypoint is loaded.\",\"type\":\"string\",\"minLength\":1},\"minItems\":1,\"uniqueItems\":true},\"filename\":{\"$ref\":\"#/definitions/Filename\"},\"import\":{\"description\":\"Module(s) that are loaded upon startup. The last one is exported.\",\"type\":\"array\",\"items\":{\"description\":\"Module that is loaded upon startup. Only the last one is exported.\",\"type\":\"string\",\"minLength\":1},\"minItems\":1,\"uniqueItems\":true},\"layer\":{\"$ref\":\"#/definitions/Layer\"},\"library\":{\"$ref\":\"#/definitions/LibraryOptions\"},\"runtime\":{\"$ref\":\"#/definitions/EntryRuntime\"},\"wasmLoading\":{\"$ref\":\"#/definitions/WasmLoading\"}}},\"EntryDynamic\":{\"description\":\"A Function returning an entry object, an entry string, an entry array or a promise to these things.\",\"instanceof\":\"Function\",\"tsType\":\"(() => EntryStatic | Promise)\"},\"EntryDynamicNormalized\":{\"description\":\"A Function returning a Promise resolving to a normalized entry.\",\"instanceof\":\"Function\",\"tsType\":\"(() => Promise)\"},\"EntryFilename\":{\"description\":\"Specifies the filename of the output file on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.\",\"oneOf\":[{\"$ref\":\"#/definitions/FilenameTemplate\"}]},\"EntryItem\":{\"description\":\"Module(s) that are loaded upon startup.\",\"anyOf\":[{\"description\":\"All modules are loaded upon startup. The last one is exported.\",\"type\":\"array\",\"items\":{\"description\":\"A module that is loaded upon startup. Only the last one is exported.\",\"type\":\"string\",\"minLength\":1},\"minItems\":1,\"uniqueItems\":true},{\"description\":\"The string is resolved to a module which is loaded upon startup.\",\"type\":\"string\",\"minLength\":1}]},\"EntryNormalized\":{\"description\":\"The entry point(s) of the compilation.\",\"anyOf\":[{\"$ref\":\"#/definitions/EntryDynamicNormalized\"},{\"$ref\":\"#/definitions/EntryStaticNormalized\"}]},\"EntryObject\":{\"description\":\"Multiple entry bundles are created. The key is the entry name. The value can be a string, an array or an entry description object.\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"An entry point with name.\",\"anyOf\":[{\"$ref\":\"#/definitions/EntryItem\"},{\"$ref\":\"#/definitions/EntryDescription\"}]}},\"EntryRuntime\":{\"description\":\"The name of the runtime chunk. If set a runtime chunk with this name is created or an existing entrypoint is used as runtime.\",\"type\":\"string\",\"minLength\":1},\"EntryStatic\":{\"description\":\"A static entry description.\",\"anyOf\":[{\"$ref\":\"#/definitions/EntryObject\"},{\"$ref\":\"#/definitions/EntryUnnamed\"}]},\"EntryStaticNormalized\":{\"description\":\"Multiple entry bundles are created. The key is the entry name. The value is an entry description object.\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"An object with entry point description.\",\"oneOf\":[{\"$ref\":\"#/definitions/EntryDescriptionNormalized\"}]}},\"EntryUnnamed\":{\"description\":\"An entry point without name.\",\"oneOf\":[{\"$ref\":\"#/definitions/EntryItem\"}]},\"Environment\":{\"description\":\"The abilities of the environment where the webpack generated code should run.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"arrowFunction\":{\"description\":\"The environment supports arrow functions ('() => { ... }').\",\"type\":\"boolean\"},\"bigIntLiteral\":{\"description\":\"The environment supports BigInt as literal (123n).\",\"type\":\"boolean\"},\"const\":{\"description\":\"The environment supports const and let for variable declarations.\",\"type\":\"boolean\"},\"destructuring\":{\"description\":\"The environment supports destructuring ('{ a, b } = obj').\",\"type\":\"boolean\"},\"dynamicImport\":{\"description\":\"The environment supports an async import() function to import EcmaScript modules.\",\"type\":\"boolean\"},\"forOf\":{\"description\":\"The environment supports 'for of' iteration ('for (const x of array) { ... }').\",\"type\":\"boolean\"},\"module\":{\"description\":\"The environment supports EcmaScript Module syntax to import EcmaScript modules (import ... from '...').\",\"type\":\"boolean\"}}},\"Experiments\":{\"description\":\"Enables/Disables experiments (experimental features with relax SemVer compatibility).\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"asset\":{\"description\":\"Allow module type 'asset' to generate assets.\",\"type\":\"boolean\"},\"asyncWebAssembly\":{\"description\":\"Support WebAssembly as asynchronous EcmaScript Module.\",\"type\":\"boolean\"},\"layers\":{\"description\":\"Enable module and chunk layers.\",\"type\":\"boolean\"},\"lazyCompilation\":{\"description\":\"Compile entrypoints and import()s only when they are accessed.\",\"anyOf\":[{\"type\":\"boolean\"},{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"backend\":{\"description\":\"A custom backend.\",\"instanceof\":\"Function\",\"tsType\":\"(((compiler: import('../lib/Compiler'), client: string, callback: (err?: Error, api?: any) => void) => void) | ((compiler: import('../lib/Compiler'), client: string) => Promise))\"},\"client\":{\"description\":\"A custom client.\",\"type\":\"string\"},\"entries\":{\"description\":\"Enable/disable lazy compilation for entries.\",\"type\":\"boolean\"},\"imports\":{\"description\":\"Enable/disable lazy compilation for import() modules.\",\"type\":\"boolean\"},\"test\":{\"description\":\"Specify which entrypoints or import()ed modules should be lazily compiled. This is matched with the imported module and not the entrypoint name.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"((module: import('../lib/Module')) => boolean)\"}]}}}]},\"outputModule\":{\"description\":\"Allow output javascript files as module source type.\",\"type\":\"boolean\"},\"syncWebAssembly\":{\"description\":\"Support WebAssembly as synchronous EcmaScript Module (outdated).\",\"type\":\"boolean\"},\"topLevelAwait\":{\"description\":\"Allow using top-level-await in EcmaScript Modules.\",\"type\":\"boolean\"}}},\"ExternalItem\":{\"description\":\"Specify dependency that shouldn't be resolved by webpack, but should become dependencies of the resulting bundle. The kind of the dependency depends on `output.libraryTarget`.\",\"anyOf\":[{\"description\":\"Every matched dependency becomes external.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"description\":\"An exact matched dependency becomes external. The same string is used as external dependency.\",\"type\":\"string\"},{\"description\":\"If an dependency matches exactly a property of the object, the property value is used as dependency.\",\"type\":\"object\",\"additionalProperties\":{\"$ref\":\"#/definitions/ExternalItemValue\"},\"properties\":{\"byLayer\":{\"description\":\"Specify externals depending on the layer.\",\"anyOf\":[{\"type\":\"object\",\"additionalProperties\":{\"$ref\":\"#/definitions/ExternalItem\"}},{\"instanceof\":\"Function\",\"tsType\":\"((layer: string | null) => ExternalItem)\"}]}}},{\"description\":\"The function is called on each dependency (`function(context, request, callback(err, result))`).\",\"instanceof\":\"Function\",\"tsType\":\"(((data: ExternalItemFunctionData, callback: (err?: Error, result?: ExternalItemValue) => void) => void) | ((data: ExternalItemFunctionData) => Promise))\"}]},\"ExternalItemFunctionData\":{\"description\":\"Data object passed as argument when a function is set for 'externals'.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"context\":{\"description\":\"The directory in which the request is placed.\",\"type\":\"string\"},\"contextInfo\":{\"description\":\"Contextual information.\",\"type\":\"object\",\"tsType\":\"import('../lib/ModuleFactory').ModuleFactoryCreateDataContextInfo\"},\"getResolve\":{\"description\":\"Get a resolve function with the current resolver options.\",\"instanceof\":\"Function\",\"tsType\":\"((options?: ResolveOptions) => ((context: string, request: string, callback: (err?: Error, result?: string) => void) => void) | ((context: string, request: string) => Promise))\"},\"request\":{\"description\":\"The request as written by the user in the require/import expression/statement.\",\"type\":\"string\"}}},\"ExternalItemValue\":{\"description\":\"The dependency used for the external.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"A part of the target of the external.\",\"type\":\"string\",\"minLength\":1}},{\"description\":\"`true`: The dependency name is used as target of the external.\",\"type\":\"boolean\"},{\"description\":\"The target of the external.\",\"type\":\"string\"},{\"type\":\"object\"}]},\"Externals\":{\"description\":\"Specify dependencies that shouldn't be resolved by webpack, but should become dependencies of the resulting bundle. The kind of the dependency depends on `output.libraryTarget`.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ExternalItem\"}},{\"$ref\":\"#/definitions/ExternalItem\"}]},\"ExternalsPresets\":{\"description\":\"Enable presets of externals for specific targets.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"electron\":{\"description\":\"Treat common electron built-in modules in main and preload context like 'electron', 'ipc' or 'shell' as external and load them via require() when used.\",\"type\":\"boolean\"},\"electronMain\":{\"description\":\"Treat electron built-in modules in the main context like 'app', 'ipc-main' or 'shell' as external and load them via require() when used.\",\"type\":\"boolean\"},\"electronPreload\":{\"description\":\"Treat electron built-in modules in the preload context like 'web-frame', 'ipc-renderer' or 'shell' as external and load them via require() when used.\",\"type\":\"boolean\"},\"electronRenderer\":{\"description\":\"Treat electron built-in modules in the renderer context like 'web-frame', 'ipc-renderer' or 'shell' as external and load them via require() when used.\",\"type\":\"boolean\"},\"node\":{\"description\":\"Treat node.js built-in modules like fs, path or vm as external and load them via require() when used.\",\"type\":\"boolean\"},\"nwjs\":{\"description\":\"Treat NW.js legacy nw.gui module as external and load it via require() when used.\",\"type\":\"boolean\"},\"web\":{\"description\":\"Treat references to 'http(s)://...' and 'std:...' as external and load them via import when used (Note that this changes execution order as externals are executed before any other code in the chunk).\",\"type\":\"boolean\"},\"webAsync\":{\"description\":\"Treat references to 'http(s)://...' and 'std:...' as external and load them via async import() when used (Note that this external type is an async module, which has various effects on the execution).\",\"type\":\"boolean\"}}},\"ExternalsType\":{\"description\":\"Specifies the default type of externals ('amd*', 'umd*', 'system' and 'jsonp' depend on output.libraryTarget set to the same value).\",\"enum\":[\"var\",\"module\",\"assign\",\"this\",\"window\",\"self\",\"global\",\"commonjs\",\"commonjs2\",\"commonjs-module\",\"amd\",\"amd-require\",\"umd\",\"umd2\",\"jsonp\",\"system\",\"promise\",\"import\",\"script\"]},\"FileCacheOptions\":{\"description\":\"Options object for persistent file-based caching.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"buildDependencies\":{\"description\":\"Dependencies the build depends on (in multiple categories, default categories: 'defaultWebpack').\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"List of dependencies the build depends on.\",\"type\":\"array\",\"items\":{\"description\":\"Request to a dependency (resolved as directory relative to the context directory).\",\"type\":\"string\",\"minLength\":1}}},\"cacheDirectory\":{\"description\":\"Base directory for the cache (defaults to node_modules/.cache/webpack).\",\"type\":\"string\",\"absolutePath\":true},\"cacheLocation\":{\"description\":\"Locations for the cache (defaults to cacheDirectory / name).\",\"type\":\"string\",\"absolutePath\":true},\"hashAlgorithm\":{\"description\":\"Algorithm used for generation the hash (see node.js crypto package).\",\"type\":\"string\"},\"idleTimeout\":{\"description\":\"Time in ms after which idle period the cache storing should happen (only for store: 'pack' or 'idle').\",\"type\":\"number\",\"minimum\":0},\"idleTimeoutForInitialStore\":{\"description\":\"Time in ms after which idle period the initial cache storing should happen (only for store: 'pack' or 'idle').\",\"type\":\"number\",\"minimum\":0},\"immutablePaths\":{\"description\":\"List of paths that are managed by a package manager and contain a version or hash in its path so all files are immutable.\",\"type\":\"array\",\"items\":{\"description\":\"A path to a immutable directory (usually a package manager cache directory).\",\"type\":\"string\",\"absolutePath\":true,\"minLength\":1}},\"managedPaths\":{\"description\":\"List of paths that are managed by a package manager and can be trusted to not be modified otherwise.\",\"type\":\"array\",\"items\":{\"description\":\"A path to a managed directory (usually a node_modules directory).\",\"type\":\"string\",\"absolutePath\":true,\"minLength\":1}},\"name\":{\"description\":\"Name for the cache. Different names will lead to different coexisting caches.\",\"type\":\"string\"},\"store\":{\"description\":\"When to store data to the filesystem. (pack: Store data when compiler is idle in a single file).\",\"enum\":[\"pack\"]},\"type\":{\"description\":\"Filesystem caching.\",\"enum\":[\"filesystem\"]},\"version\":{\"description\":\"Version of the cache data. Different versions won't allow to reuse the cache and override existing content. Update the version when config changed in a way which doesn't allow to reuse cache. This will invalidate the cache.\",\"type\":\"string\"}},\"required\":[\"type\"]},\"Filename\":{\"description\":\"Specifies the filename of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.\",\"oneOf\":[{\"$ref\":\"#/definitions/FilenameTemplate\"}]},\"FilenameTemplate\":{\"description\":\"Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.\",\"anyOf\":[{\"type\":\"string\",\"absolutePath\":false,\"minLength\":1},{\"instanceof\":\"Function\",\"tsType\":\"((pathData: import(\\\"../lib/Compilation\\\").PathData, assetInfo?: import(\\\"../lib/Compilation\\\").AssetInfo) => string)\"}]},\"FilterItemTypes\":{\"description\":\"Filtering value, regexp or function.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\",\"absolutePath\":false},{\"instanceof\":\"Function\",\"tsType\":\"((value: string) => boolean)\"}]},\"FilterTypes\":{\"description\":\"Filtering values.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Rule to filter.\",\"cli\":{\"helper\":true},\"oneOf\":[{\"$ref\":\"#/definitions/FilterItemTypes\"}]}},{\"$ref\":\"#/definitions/FilterItemTypes\"}]},\"GeneratorOptionsByModuleType\":{\"description\":\"Specify options for each generator.\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"Options for generating.\",\"type\":\"object\",\"additionalProperties\":true},\"properties\":{\"asset\":{\"$ref\":\"#/definitions/AssetGeneratorOptions\"},\"asset/inline\":{\"$ref\":\"#/definitions/AssetInlineGeneratorOptions\"},\"asset/resource\":{\"$ref\":\"#/definitions/AssetResourceGeneratorOptions\"},\"javascript\":{\"$ref\":\"#/definitions/EmptyGeneratorOptions\"},\"javascript/auto\":{\"$ref\":\"#/definitions/EmptyGeneratorOptions\"},\"javascript/dynamic\":{\"$ref\":\"#/definitions/EmptyGeneratorOptions\"},\"javascript/esm\":{\"$ref\":\"#/definitions/EmptyGeneratorOptions\"}}},\"GlobalObject\":{\"description\":\"An expression which is used to address the global object/scope in runtime code.\",\"type\":\"string\",\"minLength\":1},\"HashDigest\":{\"description\":\"Digest type used for the hash.\",\"type\":\"string\"},\"HashDigestLength\":{\"description\":\"Number of chars which are used for the hash.\",\"type\":\"number\",\"minimum\":1},\"HashFunction\":{\"description\":\"Algorithm used for generation the hash (see node.js crypto package).\",\"anyOf\":[{\"type\":\"string\",\"minLength\":1},{\"instanceof\":\"Function\",\"tsType\":\"typeof import('../lib/util/Hash')\"}]},\"HashSalt\":{\"description\":\"Any string which is added to the hash to salt it.\",\"type\":\"string\",\"minLength\":1},\"HotUpdateChunkFilename\":{\"description\":\"The filename of the Hot Update Chunks. They are inside the output.path directory.\",\"type\":\"string\",\"absolutePath\":false},\"HotUpdateGlobal\":{\"description\":\"The global variable used by webpack for loading of hot update chunks.\",\"type\":\"string\"},\"HotUpdateMainFilename\":{\"description\":\"The filename of the Hot Update Main File. It is inside the 'output.path' directory.\",\"type\":\"string\",\"absolutePath\":false},\"IgnoreWarnings\":{\"description\":\"Ignore specific warnings.\",\"type\":\"array\",\"items\":{\"description\":\"Ignore specific warnings.\",\"anyOf\":[{\"description\":\"A RegExp to select the warning message.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"file\":{\"description\":\"A RegExp to select the origin file for the warning.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},\"message\":{\"description\":\"A RegExp to select the warning message.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},\"module\":{\"description\":\"A RegExp to select the origin module for the warning.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"}}},{\"description\":\"A custom function to select warnings based on the raw warning instance.\",\"instanceof\":\"Function\",\"tsType\":\"((warning: import('../lib/WebpackError'), compilation: import('../lib/Compilation')) => boolean)\"}]}},\"IgnoreWarningsNormalized\":{\"description\":\"Ignore specific warnings.\",\"type\":\"array\",\"items\":{\"description\":\"A function to select warnings based on the raw warning instance.\",\"instanceof\":\"Function\",\"tsType\":\"((warning: import('../lib/WebpackError'), compilation: import('../lib/Compilation')) => boolean)\"}},\"Iife\":{\"description\":\"Wrap javascript code into IIFE's to avoid leaking into global scope.\",\"type\":\"boolean\"},\"ImportFunctionName\":{\"description\":\"The name of the native import() function (can be exchanged for a polyfill).\",\"type\":\"string\"},\"ImportMetaName\":{\"description\":\"The name of the native import.meta object (can be exchanged for a polyfill).\",\"type\":\"string\"},\"InfrastructureLogging\":{\"description\":\"Options for infrastructure level logging.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"debug\":{\"description\":\"Enable debug logging for specific loggers.\",\"anyOf\":[{\"description\":\"Enable/Disable debug logging for all loggers.\",\"type\":\"boolean\"},{\"$ref\":\"#/definitions/FilterTypes\"}]},\"level\":{\"description\":\"Log level.\",\"enum\":[\"none\",\"error\",\"warn\",\"info\",\"log\",\"verbose\"]}}},\"JavascriptParserOptions\":{\"description\":\"Parser options for javascript modules.\",\"type\":\"object\",\"additionalProperties\":true,\"properties\":{\"amd\":{\"$ref\":\"#/definitions/Amd\"},\"browserify\":{\"description\":\"Enable/disable special handling for browserify bundles.\",\"type\":\"boolean\"},\"commonjs\":{\"description\":\"Enable/disable parsing of CommonJs syntax.\",\"type\":\"boolean\"},\"commonjsMagicComments\":{\"description\":\"Enable/disable parsing of magic comments in CommonJs syntax.\",\"type\":\"boolean\"},\"exprContextCritical\":{\"description\":\"Enable warnings for full dynamic dependencies.\",\"type\":\"boolean\"},\"exprContextRecursive\":{\"description\":\"Enable recursive directory lookup for full dynamic dependencies.\",\"type\":\"boolean\"},\"exprContextRegExp\":{\"description\":\"Sets the default regular expression for full dynamic dependencies.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"boolean\"}]},\"exprContextRequest\":{\"description\":\"Set the default request for full dynamic dependencies.\",\"type\":\"string\"},\"harmony\":{\"description\":\"Enable/disable parsing of EcmaScript Modules syntax.\",\"type\":\"boolean\"},\"import\":{\"description\":\"Enable/disable parsing of import() syntax.\",\"type\":\"boolean\"},\"node\":{\"$ref\":\"#/definitions/Node\"},\"requireContext\":{\"description\":\"Enable/disable parsing of require.context syntax.\",\"type\":\"boolean\"},\"requireEnsure\":{\"description\":\"Enable/disable parsing of require.ensure syntax.\",\"type\":\"boolean\"},\"requireInclude\":{\"description\":\"Enable/disable parsing of require.include syntax.\",\"type\":\"boolean\"},\"requireJs\":{\"description\":\"Enable/disable parsing of require.js special syntax like require.config, requirejs.config, require.version and requirejs.onError.\",\"type\":\"boolean\"},\"strictExportPresence\":{\"description\":\"Emit errors instead of warnings when imported names don't exist in imported module.\",\"type\":\"boolean\"},\"strictThisContextOnImports\":{\"description\":\"Handle the this context correctly according to the spec for namespace objects.\",\"type\":\"boolean\"},\"system\":{\"description\":\"Enable/disable parsing of System.js special syntax like System.import, System.get, System.set and System.register.\",\"type\":\"boolean\"},\"unknownContextCritical\":{\"description\":\"Enable warnings when using the require function in a not statically analyse-able way.\",\"type\":\"boolean\"},\"unknownContextRecursive\":{\"description\":\"Enable recursive directory lookup when using the require function in a not statically analyse-able way.\",\"type\":\"boolean\"},\"unknownContextRegExp\":{\"description\":\"Sets the regular expression when using the require function in a not statically analyse-able way.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"boolean\"}]},\"unknownContextRequest\":{\"description\":\"Sets the request when using the require function in a not statically analyse-able way.\",\"type\":\"string\"},\"url\":{\"description\":\"Enable/disable parsing of new URL() syntax.\",\"anyOf\":[{\"enum\":[\"relative\"]},{\"type\":\"boolean\"}]},\"worker\":{\"description\":\"Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Specify a syntax that should be parsed as WebWorker reference. 'Abc' handles 'new Abc()', 'Abc from xyz' handles 'import { Abc } from \\\"xyz\\\"; new Abc()', 'abc()' handles 'abc()', and combinations are also possible.\",\"type\":\"string\",\"minLength\":1}},{\"type\":\"boolean\"}]},\"wrappedContextCritical\":{\"description\":\"Enable warnings for partial dynamic dependencies.\",\"type\":\"boolean\"},\"wrappedContextRecursive\":{\"description\":\"Enable recursive directory lookup for partial dynamic dependencies.\",\"type\":\"boolean\"},\"wrappedContextRegExp\":{\"description\":\"Set the inner regular expression for partial dynamic dependencies.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"}}},\"Layer\":{\"description\":\"Specifies the layer in which modules of this entrypoint are placed.\",\"anyOf\":[{\"enum\":[null]},{\"type\":\"string\",\"minLength\":1}]},\"Library\":{\"description\":\"Make the output files a library, exporting the exports of the entry point.\",\"anyOf\":[{\"$ref\":\"#/definitions/LibraryName\"},{\"$ref\":\"#/definitions/LibraryOptions\"}]},\"LibraryCustomUmdCommentObject\":{\"description\":\"Set explicit comments for `commonjs`, `commonjs2`, `amd`, and `root`.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"amd\":{\"description\":\"Set comment for `amd` section in UMD.\",\"type\":\"string\"},\"commonjs\":{\"description\":\"Set comment for `commonjs` (exports) section in UMD.\",\"type\":\"string\"},\"commonjs2\":{\"description\":\"Set comment for `commonjs2` (module.exports) section in UMD.\",\"type\":\"string\"},\"root\":{\"description\":\"Set comment for `root` (global variable) section in UMD.\",\"type\":\"string\"}}},\"LibraryCustomUmdObject\":{\"description\":\"Description object for all UMD variants of the library name.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"amd\":{\"description\":\"Name of the exposed AMD library in the UMD.\",\"type\":\"string\",\"minLength\":1},\"commonjs\":{\"description\":\"Name of the exposed commonjs export in the UMD.\",\"type\":\"string\",\"minLength\":1},\"root\":{\"description\":\"Name of the property exposed globally by a UMD library.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Part of the name of the property exposed globally by a UMD library.\",\"type\":\"string\",\"minLength\":1}},{\"type\":\"string\",\"minLength\":1}]}}},\"LibraryExport\":{\"description\":\"Specify which export should be exposed as library.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Part of the export that should be exposed as library.\",\"type\":\"string\",\"minLength\":1}},{\"type\":\"string\",\"minLength\":1}]},\"LibraryName\":{\"description\":\"The name of the library (some types allow unnamed libraries too).\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"A part of the library name.\",\"type\":\"string\",\"minLength\":1},\"minItems\":1},{\"type\":\"string\",\"minLength\":1},{\"$ref\":\"#/definitions/LibraryCustomUmdObject\"}]},\"LibraryOptions\":{\"description\":\"Options for library.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"auxiliaryComment\":{\"$ref\":\"#/definitions/AuxiliaryComment\"},\"export\":{\"$ref\":\"#/definitions/LibraryExport\"},\"name\":{\"$ref\":\"#/definitions/LibraryName\"},\"type\":{\"$ref\":\"#/definitions/LibraryType\"},\"umdNamedDefine\":{\"$ref\":\"#/definitions/UmdNamedDefine\"}},\"required\":[\"type\"]},\"LibraryType\":{\"description\":\"Type of library (types included by default are 'var', 'module', 'assign', 'assign-properties', 'this', 'window', 'self', 'global', 'commonjs', 'commonjs2', 'commonjs-module', 'amd', 'amd-require', 'umd', 'umd2', 'jsonp', 'system', but others might be added by plugins).\",\"anyOf\":[{\"enum\":[\"var\",\"module\",\"assign\",\"assign-properties\",\"this\",\"window\",\"self\",\"global\",\"commonjs\",\"commonjs2\",\"commonjs-module\",\"amd\",\"amd-require\",\"umd\",\"umd2\",\"jsonp\",\"system\"]},{\"type\":\"string\"}]},\"Loader\":{\"description\":\"Custom values available in the loader context.\",\"type\":\"object\"},\"MemoryCacheOptions\":{\"description\":\"Options object for in-memory caching.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"type\":{\"description\":\"In memory caching.\",\"enum\":[\"memory\"]}},\"required\":[\"type\"]},\"Mode\":{\"description\":\"Enable production optimizations or development hints.\",\"enum\":[\"development\",\"production\",\"none\"]},\"ModuleFilterItemTypes\":{\"description\":\"Filtering value, regexp or function.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\",\"absolutePath\":false},{\"instanceof\":\"Function\",\"tsType\":\"((name: string, module: import('../lib/stats/DefaultStatsFactoryPlugin').StatsModule, type: 'module' | 'chunk' | 'root-of-chunk' | 'nested') => boolean)\"}]},\"ModuleFilterTypes\":{\"description\":\"Filtering modules.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Rule to filter.\",\"cli\":{\"helper\":true},\"oneOf\":[{\"$ref\":\"#/definitions/ModuleFilterItemTypes\"}]}},{\"$ref\":\"#/definitions/ModuleFilterItemTypes\"}]},\"ModuleOptions\":{\"description\":\"Options affecting the normal modules (`NormalModuleFactory`).\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"defaultRules\":{\"description\":\"An array of rules applied by default for modules.\",\"cli\":{\"exclude\":true},\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetRules\"}]},\"exprContextCritical\":{\"description\":\"Enable warnings for full dynamic dependencies.\",\"type\":\"boolean\"},\"exprContextRecursive\":{\"description\":\"Enable recursive directory lookup for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRecursive'.\",\"type\":\"boolean\"},\"exprContextRegExp\":{\"description\":\"Sets the default regular expression for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRegExp'.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"boolean\"}]},\"exprContextRequest\":{\"description\":\"Set the default request for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRequest'.\",\"type\":\"string\"},\"generator\":{\"$ref\":\"#/definitions/GeneratorOptionsByModuleType\"},\"noParse\":{\"$ref\":\"#/definitions/NoParse\"},\"parser\":{\"$ref\":\"#/definitions/ParserOptionsByModuleType\"},\"rules\":{\"description\":\"An array of rules applied for modules.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetRules\"}]},\"strictExportPresence\":{\"description\":\"Emit errors instead of warnings when imported names don't exist in imported module. Deprecated: This option has moved to 'module.parser.javascript.strictExportPresence'.\",\"type\":\"boolean\"},\"strictThisContextOnImports\":{\"description\":\"Handle the this context correctly according to the spec for namespace objects. Deprecated: This option has moved to 'module.parser.javascript.strictThisContextOnImports'.\",\"type\":\"boolean\"},\"unknownContextCritical\":{\"description\":\"Enable warnings when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextCritical'.\",\"type\":\"boolean\"},\"unknownContextRecursive\":{\"description\":\"Enable recursive directory lookup when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRecursive'.\",\"type\":\"boolean\"},\"unknownContextRegExp\":{\"description\":\"Sets the regular expression when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRegExp'.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"boolean\"}]},\"unknownContextRequest\":{\"description\":\"Sets the request when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRequest'.\",\"type\":\"string\"},\"unsafeCache\":{\"description\":\"Cache the resolving of module requests.\",\"anyOf\":[{\"type\":\"boolean\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"wrappedContextCritical\":{\"description\":\"Enable warnings for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextCritical'.\",\"type\":\"boolean\"},\"wrappedContextRecursive\":{\"description\":\"Enable recursive directory lookup for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextRecursive'.\",\"type\":\"boolean\"},\"wrappedContextRegExp\":{\"description\":\"Set the inner regular expression for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextRegExp'.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"}}},\"ModuleOptionsNormalized\":{\"description\":\"Options affecting the normal modules (`NormalModuleFactory`).\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"defaultRules\":{\"description\":\"An array of rules applied by default for modules.\",\"cli\":{\"exclude\":true},\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetRules\"}]},\"generator\":{\"$ref\":\"#/definitions/GeneratorOptionsByModuleType\"},\"noParse\":{\"$ref\":\"#/definitions/NoParse\"},\"parser\":{\"$ref\":\"#/definitions/ParserOptionsByModuleType\"},\"rules\":{\"description\":\"An array of rules applied for modules.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetRules\"}]},\"unsafeCache\":{\"description\":\"Cache the resolving of module requests.\",\"anyOf\":[{\"type\":\"boolean\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]}},\"required\":[\"defaultRules\",\"generator\",\"parser\",\"rules\"]},\"Name\":{\"description\":\"Name of the configuration. Used when loading multiple configurations.\",\"type\":\"string\"},\"NoParse\":{\"description\":\"Don't parse files matching. It's matched against the full resolved request.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Don't parse files matching. It's matched against the full resolved request.\",\"anyOf\":[{\"description\":\"A regular expression, when matched the module is not parsed.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"description\":\"An absolute path, when the module starts with this path it is not parsed.\",\"type\":\"string\",\"absolutePath\":true},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"minItems\":1},{\"description\":\"A regular expression, when matched the module is not parsed.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"description\":\"An absolute path, when the module starts with this path it is not parsed.\",\"type\":\"string\",\"absolutePath\":true},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"Node\":{\"description\":\"Include polyfills or mocks for various node stuff.\",\"anyOf\":[{\"enum\":[false]},{\"$ref\":\"#/definitions/NodeOptions\"}]},\"NodeOptions\":{\"description\":\"Options object for node compatibility features.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"__dirname\":{\"description\":\"Include a polyfill for the '__dirname' variable.\",\"enum\":[false,true,\"mock\",\"eval-only\"]},\"__filename\":{\"description\":\"Include a polyfill for the '__filename' variable.\",\"enum\":[false,true,\"mock\",\"eval-only\"]},\"global\":{\"description\":\"Include a polyfill for the 'global' variable.\",\"type\":\"boolean\"}}},\"Optimization\":{\"description\":\"Enables/Disables integrated optimizations.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"checkWasmTypes\":{\"description\":\"Check for incompatible wasm types when importing/exporting from/to ESM.\",\"type\":\"boolean\"},\"chunkIds\":{\"description\":\"Define the algorithm to choose chunk ids (named: readable ids for better debugging, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, total-size: numeric ids focused on minimal total download size, false: no algorithm used, as custom one can be provided via plugin).\",\"enum\":[\"natural\",\"named\",\"deterministic\",\"size\",\"total-size\",false]},\"concatenateModules\":{\"description\":\"Concatenate modules when possible to generate less modules, more efficient code and enable more optimizations by the minimizer.\",\"type\":\"boolean\"},\"emitOnErrors\":{\"description\":\"Emit assets even when errors occur. Critical errors are emitted into the generated code and will cause errors at runtime.\",\"type\":\"boolean\"},\"flagIncludedChunks\":{\"description\":\"Also flag chunks as loaded which contain a subset of the modules.\",\"type\":\"boolean\"},\"innerGraph\":{\"description\":\"Creates a module-internal dependency graph for top level symbols, exports and imports, to improve unused exports detection.\",\"type\":\"boolean\"},\"mangleExports\":{\"description\":\"Rename exports when possible to generate shorter code (depends on optimization.usedExports and optimization.providedExports, true/\\\"deterministic\\\": generate short deterministic names optimized for caching, \\\"size\\\": generate the shortest possible names).\",\"anyOf\":[{\"enum\":[\"size\",\"deterministic\"]},{\"type\":\"boolean\"}]},\"mangleWasmImports\":{\"description\":\"Reduce size of WASM by changing imports to shorter strings.\",\"type\":\"boolean\"},\"mergeDuplicateChunks\":{\"description\":\"Merge chunks which contain the same modules.\",\"type\":\"boolean\"},\"minimize\":{\"description\":\"Enable minimizing the output. Uses optimization.minimizer.\",\"type\":\"boolean\"},\"minimizer\":{\"description\":\"Minimizer(s) to use for minimizing the output.\",\"type\":\"array\",\"cli\":{\"exclude\":true},\"items\":{\"description\":\"Plugin of type object or instanceof Function.\",\"anyOf\":[{\"enum\":[\"...\"]},{\"$ref\":\"#/definitions/WebpackPluginInstance\"},{\"$ref\":\"#/definitions/WebpackPluginFunction\"}]}},\"moduleIds\":{\"description\":\"Define the algorithm to choose module ids (natural: numeric ids in order of usage, named: readable ids for better debugging, hashed: (deprecated) short hashes as ids for better long term caching, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, false: no algorithm used, as custom one can be provided via plugin).\",\"enum\":[\"natural\",\"named\",\"hashed\",\"deterministic\",\"size\",false]},\"noEmitOnErrors\":{\"description\":\"Avoid emitting assets when errors occur (deprecated: use 'emitOnErrors' instead).\",\"type\":\"boolean\",\"cli\":{\"exclude\":true}},\"nodeEnv\":{\"description\":\"Set process.env.NODE_ENV to a specific value.\",\"anyOf\":[{\"enum\":[false]},{\"type\":\"string\"}]},\"portableRecords\":{\"description\":\"Generate records with relative paths to be able to move the context folder.\",\"type\":\"boolean\"},\"providedExports\":{\"description\":\"Figure out which exports are provided by modules to generate more efficient code.\",\"type\":\"boolean\"},\"realContentHash\":{\"description\":\"Use real [contenthash] based on final content of the assets.\",\"type\":\"boolean\"},\"removeAvailableModules\":{\"description\":\"Removes modules from chunks when these modules are already included in all parents.\",\"type\":\"boolean\"},\"removeEmptyChunks\":{\"description\":\"Remove chunks which are empty.\",\"type\":\"boolean\"},\"runtimeChunk\":{\"$ref\":\"#/definitions/OptimizationRuntimeChunk\"},\"sideEffects\":{\"description\":\"Skip over modules which contain no side effects when exports are not used (false: disabled, 'flag': only use manually placed side effects flag, true: also analyse source code for side effects).\",\"anyOf\":[{\"enum\":[\"flag\"]},{\"type\":\"boolean\"}]},\"splitChunks\":{\"description\":\"Optimize duplication and caching by splitting chunks by shared modules and cache group.\",\"anyOf\":[{\"enum\":[false]},{\"$ref\":\"#/definitions/OptimizationSplitChunksOptions\"}]},\"usedExports\":{\"description\":\"Figure out which exports are used by modules to mangle export names, omit unused exports and generate more efficient code (true: analyse used exports for each runtime, \\\"global\\\": analyse exports globally for all runtimes combined).\",\"anyOf\":[{\"enum\":[\"global\"]},{\"type\":\"boolean\"}]}}},\"OptimizationRuntimeChunk\":{\"description\":\"Create an additional chunk which contains only the webpack runtime and chunk hash maps.\",\"anyOf\":[{\"enum\":[\"single\",\"multiple\"]},{\"type\":\"boolean\"},{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"name\":{\"description\":\"The name or name factory for the runtime chunks.\",\"anyOf\":[{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]}}}]},\"OptimizationRuntimeChunkNormalized\":{\"description\":\"Create an additional chunk which contains only the webpack runtime and chunk hash maps.\",\"anyOf\":[{\"enum\":[false]},{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"name\":{\"description\":\"The name factory for the runtime chunks.\",\"instanceof\":\"Function\",\"tsType\":\"Function\"}}}]},\"OptimizationSplitChunksCacheGroup\":{\"description\":\"Options object for describing behavior of a cache group selecting modules that should be cached together.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"automaticNameDelimiter\":{\"description\":\"Sets the name delimiter for created chunks.\",\"type\":\"string\",\"minLength\":1},\"chunks\":{\"description\":\"Select chunks for determining cache group content (defaults to \\\"initial\\\", \\\"initial\\\" and \\\"all\\\" requires adding these chunks to the HTML).\",\"anyOf\":[{\"enum\":[\"initial\",\"async\",\"all\"]},{\"instanceof\":\"Function\",\"tsType\":\"((chunk: import('../lib/Chunk')) => boolean)\"}]},\"enforce\":{\"description\":\"Ignore minimum size, minimum chunks and maximum requests and always create chunks for this cache group.\",\"type\":\"boolean\"},\"enforceSizeThreshold\":{\"description\":\"Size threshold at which splitting is enforced and other restrictions (minRemainingSize, maxAsyncRequests, maxInitialRequests) are ignored.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"filename\":{\"description\":\"Sets the template for the filename for created chunks.\",\"anyOf\":[{\"type\":\"string\",\"absolutePath\":false,\"minLength\":1},{\"instanceof\":\"Function\",\"tsType\":\"((pathData: import(\\\"../lib/Compilation\\\").PathData, assetInfo?: import(\\\"../lib/Compilation\\\").AssetInfo) => string)\"}]},\"idHint\":{\"description\":\"Sets the hint for chunk id.\",\"type\":\"string\"},\"layer\":{\"description\":\"Assign modules to a cache group by module layer.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"maxAsyncRequests\":{\"description\":\"Maximum number of requests which are accepted for on-demand loading.\",\"type\":\"number\",\"minimum\":1},\"maxAsyncSize\":{\"description\":\"Maximal size hint for the on-demand chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"maxInitialRequests\":{\"description\":\"Maximum number of initial chunks which are accepted for an entry point.\",\"type\":\"number\",\"minimum\":1},\"maxInitialSize\":{\"description\":\"Maximal size hint for the initial chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"maxSize\":{\"description\":\"Maximal size hint for the created chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"minChunks\":{\"description\":\"Minimum number of times a module has to be duplicated until it's considered for splitting.\",\"type\":\"number\",\"minimum\":1},\"minRemainingSize\":{\"description\":\"Minimal size for the chunks the stay after moving the modules to a new chunk.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"minSize\":{\"description\":\"Minimal size for the created chunk.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"name\":{\"description\":\"Give chunks for this cache group a name (chunks with equal name are merged).\",\"anyOf\":[{\"enum\":[false]},{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"priority\":{\"description\":\"Priority of this cache group.\",\"type\":\"number\"},\"reuseExistingChunk\":{\"description\":\"Try to reuse existing chunk (with name) when it has matching modules.\",\"type\":\"boolean\"},\"test\":{\"description\":\"Assign modules to a cache group by module name.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"type\":{\"description\":\"Assign modules to a cache group by module type.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"usedExports\":{\"description\":\"Compare used exports when checking common modules. Modules will only be put in the same chunk when exports are equal.\",\"type\":\"boolean\"}}},\"OptimizationSplitChunksGetCacheGroups\":{\"description\":\"A function returning cache groups.\",\"instanceof\":\"Function\",\"tsType\":\"((module: import('../lib/Module')) => OptimizationSplitChunksCacheGroup | OptimizationSplitChunksCacheGroup[] | void)\"},\"OptimizationSplitChunksOptions\":{\"description\":\"Options object for splitting chunks into smaller chunks.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"automaticNameDelimiter\":{\"description\":\"Sets the name delimiter for created chunks.\",\"type\":\"string\",\"minLength\":1},\"cacheGroups\":{\"description\":\"Assign modules to a cache group (modules from different cache groups are tried to keep in separate chunks, default categories: 'default', 'defaultVendors').\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"Configuration for a cache group.\",\"anyOf\":[{\"enum\":[false]},{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"},{\"$ref\":\"#/definitions/OptimizationSplitChunksCacheGroup\"}]},\"not\":{\"description\":\"Using the cacheGroup shorthand syntax with a cache group named 'test' is a potential config error\\nDid you intent to define a cache group with a test instead?\\ncacheGroups: {\\n : {\\n test: ...\\n }\\n}.\",\"type\":\"object\",\"additionalProperties\":true,\"properties\":{\"test\":{\"description\":\"The test property is a cache group name, but using the test option of the cache group could be intended instead.\",\"anyOf\":[{\"instanceof\":\"Function\",\"tsType\":\"Function\"},{\"type\":\"string\"},{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"}]}},\"required\":[\"test\"]}},\"chunks\":{\"description\":\"Select chunks for determining shared modules (defaults to \\\"async\\\", \\\"initial\\\" and \\\"all\\\" requires adding these chunks to the HTML).\",\"anyOf\":[{\"enum\":[\"initial\",\"async\",\"all\"]},{\"instanceof\":\"Function\",\"tsType\":\"((chunk: import('../lib/Chunk')) => boolean)\"}]},\"defaultSizeTypes\":{\"description\":\"Sets the size types which are used when a number is used for sizes.\",\"type\":\"array\",\"items\":{\"description\":\"Size type, like 'javascript', 'webassembly'.\",\"type\":\"string\"},\"minLength\":1},\"enforceSizeThreshold\":{\"description\":\"Size threshold at which splitting is enforced and other restrictions (minRemainingSize, maxAsyncRequests, maxInitialRequests) are ignored.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"fallbackCacheGroup\":{\"description\":\"Options for modules not selected by any other cache group.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"automaticNameDelimiter\":{\"description\":\"Sets the name delimiter for created chunks.\",\"type\":\"string\",\"minLength\":1},\"maxAsyncSize\":{\"description\":\"Maximal size hint for the on-demand chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"maxInitialSize\":{\"description\":\"Maximal size hint for the initial chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"maxSize\":{\"description\":\"Maximal size hint for the created chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"minSize\":{\"description\":\"Minimal size for the created chunk.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]}}},\"filename\":{\"description\":\"Sets the template for the filename for created chunks.\",\"anyOf\":[{\"type\":\"string\",\"absolutePath\":false,\"minLength\":1},{\"instanceof\":\"Function\",\"tsType\":\"((pathData: import(\\\"../lib/Compilation\\\").PathData, assetInfo?: import(\\\"../lib/Compilation\\\").AssetInfo) => string)\"}]},\"hidePathInfo\":{\"description\":\"Prevents exposing path info when creating names for parts splitted by maxSize.\",\"type\":\"boolean\"},\"maxAsyncRequests\":{\"description\":\"Maximum number of requests which are accepted for on-demand loading.\",\"type\":\"number\",\"minimum\":1},\"maxAsyncSize\":{\"description\":\"Maximal size hint for the on-demand chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"maxInitialRequests\":{\"description\":\"Maximum number of initial chunks which are accepted for an entry point.\",\"type\":\"number\",\"minimum\":1},\"maxInitialSize\":{\"description\":\"Maximal size hint for the initial chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"maxSize\":{\"description\":\"Maximal size hint for the created chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"minChunks\":{\"description\":\"Minimum number of times a module has to be duplicated until it's considered for splitting.\",\"type\":\"number\",\"minimum\":1},\"minRemainingSize\":{\"description\":\"Minimal size for the chunks the stay after moving the modules to a new chunk.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"minSize\":{\"description\":\"Minimal size for the created chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"name\":{\"description\":\"Give chunks created a name (chunks with equal name are merged).\",\"anyOf\":[{\"enum\":[false]},{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"usedExports\":{\"description\":\"Compare used exports when checking common modules. Modules will only be put in the same chunk when exports are equal.\",\"type\":\"boolean\"}}},\"OptimizationSplitChunksSizes\":{\"description\":\"Size description for limits.\",\"anyOf\":[{\"description\":\"Size of the javascript part of the chunk.\",\"type\":\"number\",\"minimum\":0},{\"description\":\"Specify size limits per size type.\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"Size of the part of the chunk with the type of the key.\",\"type\":\"number\"}}]},\"Output\":{\"description\":\"Options affecting the output of the compilation. `output` options tell webpack how to write the compiled files to disk.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"assetModuleFilename\":{\"$ref\":\"#/definitions/AssetModuleFilename\"},\"auxiliaryComment\":{\"cli\":{\"exclude\":true},\"oneOf\":[{\"$ref\":\"#/definitions/AuxiliaryComment\"}]},\"charset\":{\"$ref\":\"#/definitions/Charset\"},\"chunkFilename\":{\"$ref\":\"#/definitions/ChunkFilename\"},\"chunkFormat\":{\"$ref\":\"#/definitions/ChunkFormat\"},\"chunkLoadTimeout\":{\"$ref\":\"#/definitions/ChunkLoadTimeout\"},\"chunkLoading\":{\"$ref\":\"#/definitions/ChunkLoading\"},\"chunkLoadingGlobal\":{\"$ref\":\"#/definitions/ChunkLoadingGlobal\"},\"clean\":{\"$ref\":\"#/definitions/Clean\"},\"compareBeforeEmit\":{\"$ref\":\"#/definitions/CompareBeforeEmit\"},\"crossOriginLoading\":{\"$ref\":\"#/definitions/CrossOriginLoading\"},\"devtoolFallbackModuleFilenameTemplate\":{\"$ref\":\"#/definitions/DevtoolFallbackModuleFilenameTemplate\"},\"devtoolModuleFilenameTemplate\":{\"$ref\":\"#/definitions/DevtoolModuleFilenameTemplate\"},\"devtoolNamespace\":{\"$ref\":\"#/definitions/DevtoolNamespace\"},\"enabledChunkLoadingTypes\":{\"$ref\":\"#/definitions/EnabledChunkLoadingTypes\"},\"enabledLibraryTypes\":{\"$ref\":\"#/definitions/EnabledLibraryTypes\"},\"enabledWasmLoadingTypes\":{\"$ref\":\"#/definitions/EnabledWasmLoadingTypes\"},\"environment\":{\"$ref\":\"#/definitions/Environment\"},\"filename\":{\"$ref\":\"#/definitions/Filename\"},\"globalObject\":{\"$ref\":\"#/definitions/GlobalObject\"},\"hashDigest\":{\"$ref\":\"#/definitions/HashDigest\"},\"hashDigestLength\":{\"$ref\":\"#/definitions/HashDigestLength\"},\"hashFunction\":{\"$ref\":\"#/definitions/HashFunction\"},\"hashSalt\":{\"$ref\":\"#/definitions/HashSalt\"},\"hotUpdateChunkFilename\":{\"$ref\":\"#/definitions/HotUpdateChunkFilename\"},\"hotUpdateGlobal\":{\"$ref\":\"#/definitions/HotUpdateGlobal\"},\"hotUpdateMainFilename\":{\"$ref\":\"#/definitions/HotUpdateMainFilename\"},\"iife\":{\"$ref\":\"#/definitions/Iife\"},\"importFunctionName\":{\"$ref\":\"#/definitions/ImportFunctionName\"},\"importMetaName\":{\"$ref\":\"#/definitions/ImportMetaName\"},\"library\":{\"$ref\":\"#/definitions/Library\"},\"libraryExport\":{\"cli\":{\"exclude\":true},\"oneOf\":[{\"$ref\":\"#/definitions/LibraryExport\"}]},\"libraryTarget\":{\"cli\":{\"exclude\":true},\"oneOf\":[{\"$ref\":\"#/definitions/LibraryType\"}]},\"module\":{\"$ref\":\"#/definitions/OutputModule\"},\"path\":{\"$ref\":\"#/definitions/Path\"},\"pathinfo\":{\"$ref\":\"#/definitions/Pathinfo\"},\"publicPath\":{\"$ref\":\"#/definitions/PublicPath\"},\"scriptType\":{\"$ref\":\"#/definitions/ScriptType\"},\"sourceMapFilename\":{\"$ref\":\"#/definitions/SourceMapFilename\"},\"sourcePrefix\":{\"$ref\":\"#/definitions/SourcePrefix\"},\"strictModuleErrorHandling\":{\"$ref\":\"#/definitions/StrictModuleErrorHandling\"},\"strictModuleExceptionHandling\":{\"$ref\":\"#/definitions/StrictModuleExceptionHandling\"},\"umdNamedDefine\":{\"cli\":{\"exclude\":true},\"oneOf\":[{\"$ref\":\"#/definitions/UmdNamedDefine\"}]},\"uniqueName\":{\"$ref\":\"#/definitions/UniqueName\"},\"wasmLoading\":{\"$ref\":\"#/definitions/WasmLoading\"},\"webassemblyModuleFilename\":{\"$ref\":\"#/definitions/WebassemblyModuleFilename\"},\"workerChunkLoading\":{\"$ref\":\"#/definitions/ChunkLoading\"},\"workerWasmLoading\":{\"$ref\":\"#/definitions/WasmLoading\"}}},\"OutputModule\":{\"description\":\"Output javascript files as module source type.\",\"type\":\"boolean\"},\"OutputNormalized\":{\"description\":\"Normalized options affecting the output of the compilation. `output` options tell webpack how to write the compiled files to disk.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"assetModuleFilename\":{\"$ref\":\"#/definitions/AssetModuleFilename\"},\"charset\":{\"$ref\":\"#/definitions/Charset\"},\"chunkFilename\":{\"$ref\":\"#/definitions/ChunkFilename\"},\"chunkFormat\":{\"$ref\":\"#/definitions/ChunkFormat\"},\"chunkLoadTimeout\":{\"$ref\":\"#/definitions/ChunkLoadTimeout\"},\"chunkLoading\":{\"$ref\":\"#/definitions/ChunkLoading\"},\"chunkLoadingGlobal\":{\"$ref\":\"#/definitions/ChunkLoadingGlobal\"},\"clean\":{\"$ref\":\"#/definitions/Clean\"},\"compareBeforeEmit\":{\"$ref\":\"#/definitions/CompareBeforeEmit\"},\"crossOriginLoading\":{\"$ref\":\"#/definitions/CrossOriginLoading\"},\"devtoolFallbackModuleFilenameTemplate\":{\"$ref\":\"#/definitions/DevtoolFallbackModuleFilenameTemplate\"},\"devtoolModuleFilenameTemplate\":{\"$ref\":\"#/definitions/DevtoolModuleFilenameTemplate\"},\"devtoolNamespace\":{\"$ref\":\"#/definitions/DevtoolNamespace\"},\"enabledChunkLoadingTypes\":{\"$ref\":\"#/definitions/EnabledChunkLoadingTypes\"},\"enabledLibraryTypes\":{\"$ref\":\"#/definitions/EnabledLibraryTypes\"},\"enabledWasmLoadingTypes\":{\"$ref\":\"#/definitions/EnabledWasmLoadingTypes\"},\"environment\":{\"$ref\":\"#/definitions/Environment\"},\"filename\":{\"$ref\":\"#/definitions/Filename\"},\"globalObject\":{\"$ref\":\"#/definitions/GlobalObject\"},\"hashDigest\":{\"$ref\":\"#/definitions/HashDigest\"},\"hashDigestLength\":{\"$ref\":\"#/definitions/HashDigestLength\"},\"hashFunction\":{\"$ref\":\"#/definitions/HashFunction\"},\"hashSalt\":{\"$ref\":\"#/definitions/HashSalt\"},\"hotUpdateChunkFilename\":{\"$ref\":\"#/definitions/HotUpdateChunkFilename\"},\"hotUpdateGlobal\":{\"$ref\":\"#/definitions/HotUpdateGlobal\"},\"hotUpdateMainFilename\":{\"$ref\":\"#/definitions/HotUpdateMainFilename\"},\"iife\":{\"$ref\":\"#/definitions/Iife\"},\"importFunctionName\":{\"$ref\":\"#/definitions/ImportFunctionName\"},\"importMetaName\":{\"$ref\":\"#/definitions/ImportMetaName\"},\"library\":{\"$ref\":\"#/definitions/LibraryOptions\"},\"module\":{\"$ref\":\"#/definitions/OutputModule\"},\"path\":{\"$ref\":\"#/definitions/Path\"},\"pathinfo\":{\"$ref\":\"#/definitions/Pathinfo\"},\"publicPath\":{\"$ref\":\"#/definitions/PublicPath\"},\"scriptType\":{\"$ref\":\"#/definitions/ScriptType\"},\"sourceMapFilename\":{\"$ref\":\"#/definitions/SourceMapFilename\"},\"sourcePrefix\":{\"$ref\":\"#/definitions/SourcePrefix\"},\"strictModuleErrorHandling\":{\"$ref\":\"#/definitions/StrictModuleErrorHandling\"},\"strictModuleExceptionHandling\":{\"$ref\":\"#/definitions/StrictModuleExceptionHandling\"},\"uniqueName\":{\"$ref\":\"#/definitions/UniqueName\"},\"wasmLoading\":{\"$ref\":\"#/definitions/WasmLoading\"},\"webassemblyModuleFilename\":{\"$ref\":\"#/definitions/WebassemblyModuleFilename\"},\"workerChunkLoading\":{\"$ref\":\"#/definitions/ChunkLoading\"},\"workerWasmLoading\":{\"$ref\":\"#/definitions/WasmLoading\"}}},\"Parallelism\":{\"description\":\"The number of parallel processed modules in the compilation.\",\"type\":\"number\",\"minimum\":1},\"ParserOptionsByModuleType\":{\"description\":\"Specify options for each parser.\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"Options for parsing.\",\"type\":\"object\",\"additionalProperties\":true},\"properties\":{\"asset\":{\"$ref\":\"#/definitions/AssetParserOptions\"},\"asset/inline\":{\"$ref\":\"#/definitions/EmptyParserOptions\"},\"asset/resource\":{\"$ref\":\"#/definitions/EmptyParserOptions\"},\"asset/source\":{\"$ref\":\"#/definitions/EmptyParserOptions\"},\"javascript\":{\"$ref\":\"#/definitions/JavascriptParserOptions\"},\"javascript/auto\":{\"$ref\":\"#/definitions/JavascriptParserOptions\"},\"javascript/dynamic\":{\"$ref\":\"#/definitions/JavascriptParserOptions\"},\"javascript/esm\":{\"$ref\":\"#/definitions/JavascriptParserOptions\"}}},\"Path\":{\"description\":\"The output directory as **absolute path** (required).\",\"type\":\"string\",\"absolutePath\":true},\"Pathinfo\":{\"description\":\"Include comments with information about the modules.\",\"anyOf\":[{\"enum\":[\"verbose\"]},{\"type\":\"boolean\"}]},\"Performance\":{\"description\":\"Configuration for web performance recommendations.\",\"anyOf\":[{\"enum\":[false]},{\"$ref\":\"#/definitions/PerformanceOptions\"}]},\"PerformanceOptions\":{\"description\":\"Configuration object for web performance recommendations.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"assetFilter\":{\"description\":\"Filter function to select assets that are checked.\",\"instanceof\":\"Function\",\"tsType\":\"Function\"},\"hints\":{\"description\":\"Sets the format of the hints: warnings, errors or nothing at all.\",\"enum\":[false,\"warning\",\"error\"]},\"maxAssetSize\":{\"description\":\"File size limit (in bytes) when exceeded, that webpack will provide performance hints.\",\"type\":\"number\"},\"maxEntrypointSize\":{\"description\":\"Total size of an entry point (in bytes).\",\"type\":\"number\"}}},\"Plugins\":{\"description\":\"Add additional plugins to the compiler.\",\"type\":\"array\",\"items\":{\"description\":\"Plugin of type object or instanceof Function.\",\"anyOf\":[{\"$ref\":\"#/definitions/WebpackPluginInstance\"},{\"$ref\":\"#/definitions/WebpackPluginFunction\"}]}},\"Profile\":{\"description\":\"Capture timing information for each module.\",\"type\":\"boolean\"},\"PublicPath\":{\"description\":\"The 'publicPath' specifies the public URL address of the output files when referenced in a browser.\",\"anyOf\":[{\"enum\":[\"auto\"]},{\"$ref\":\"#/definitions/RawPublicPath\"}]},\"RawPublicPath\":{\"description\":\"The 'publicPath' specifies the public URL address of the output files when referenced in a browser.\",\"anyOf\":[{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"((pathData: import(\\\"../lib/Compilation\\\").PathData, assetInfo?: import(\\\"../lib/Compilation\\\").AssetInfo) => string)\"}]},\"RecordsInputPath\":{\"description\":\"Store compiler state to a json file.\",\"anyOf\":[{\"enum\":[false]},{\"type\":\"string\",\"absolutePath\":true}]},\"RecordsOutputPath\":{\"description\":\"Load compiler state from a json file.\",\"anyOf\":[{\"enum\":[false]},{\"type\":\"string\",\"absolutePath\":true}]},\"RecordsPath\":{\"description\":\"Store/Load compiler state from/to a json file. This will result in persistent ids of modules and chunks. An absolute path is expected. `recordsPath` is used for `recordsInputPath` and `recordsOutputPath` if they left undefined.\",\"anyOf\":[{\"enum\":[false]},{\"type\":\"string\",\"absolutePath\":true}]},\"Resolve\":{\"description\":\"Options for the resolver.\",\"oneOf\":[{\"$ref\":\"#/definitions/ResolveOptions\"}]},\"ResolveAlias\":{\"description\":\"Redirect module requests.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Alias configuration.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"alias\":{\"description\":\"New request.\",\"anyOf\":[{\"description\":\"Multiple alternative requests.\",\"type\":\"array\",\"items\":{\"description\":\"One choice of request.\",\"type\":\"string\",\"minLength\":1}},{\"description\":\"Ignore request (replace with empty module).\",\"enum\":[false]},{\"description\":\"New request.\",\"type\":\"string\",\"minLength\":1}]},\"name\":{\"description\":\"Request to be redirected.\",\"type\":\"string\"},\"onlyModule\":{\"description\":\"Redirect only exact matching request.\",\"type\":\"boolean\"}},\"required\":[\"alias\",\"name\"]}},{\"type\":\"object\",\"additionalProperties\":{\"description\":\"New request.\",\"anyOf\":[{\"description\":\"Multiple alternative requests.\",\"type\":\"array\",\"items\":{\"description\":\"One choice of request.\",\"type\":\"string\",\"minLength\":1}},{\"description\":\"Ignore request (replace with empty module).\",\"enum\":[false]},{\"description\":\"New request.\",\"type\":\"string\",\"minLength\":1}]}}]},\"ResolveLoader\":{\"description\":\"Options for the resolver when resolving loaders.\",\"oneOf\":[{\"$ref\":\"#/definitions/ResolveOptions\"}]},\"ResolveOptions\":{\"description\":\"Options object for resolving requests.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"alias\":{\"$ref\":\"#/definitions/ResolveAlias\"},\"aliasFields\":{\"description\":\"Fields in the description file (usually package.json) which are used to redirect requests inside the module.\",\"type\":\"array\",\"items\":{\"description\":\"Field in the description file (usually package.json) which are used to redirect requests inside the module.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Part of the field path in the description file (usually package.json) which are used to redirect requests inside the module.\",\"type\":\"string\",\"minLength\":1}},{\"type\":\"string\",\"minLength\":1}]}},\"byDependency\":{\"description\":\"Extra resolve options per dependency category. Typical categories are \\\"commonjs\\\", \\\"amd\\\", \\\"esm\\\".\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"Options object for resolving requests.\",\"oneOf\":[{\"$ref\":\"#/definitions/ResolveOptions\"}]}},\"cache\":{\"description\":\"Enable caching of successfully resolved requests (cache entries are revalidated).\",\"type\":\"boolean\"},\"cachePredicate\":{\"description\":\"Predicate function to decide which requests should be cached.\",\"instanceof\":\"Function\",\"tsType\":\"((request: import('enhanced-resolve').ResolveRequest) => boolean)\"},\"cacheWithContext\":{\"description\":\"Include the context information in the cache identifier when caching.\",\"type\":\"boolean\"},\"conditionNames\":{\"description\":\"Condition names for exports field entry point.\",\"type\":\"array\",\"items\":{\"description\":\"Condition names for exports field entry point.\",\"type\":\"string\"}},\"descriptionFiles\":{\"description\":\"Filenames used to find a description file (like a package.json).\",\"type\":\"array\",\"items\":{\"description\":\"Filename used to find a description file (like a package.json).\",\"type\":\"string\",\"minLength\":1}},\"enforceExtension\":{\"description\":\"Enforce the resolver to use one of the extensions from the extensions option (User must specify requests without extension).\",\"type\":\"boolean\"},\"exportsFields\":{\"description\":\"Field names from the description file (usually package.json) which are used to provide entry points of a package.\",\"type\":\"array\",\"items\":{\"description\":\"Field name from the description file (usually package.json) which is used to provide entry points of a package.\",\"type\":\"string\"}},\"extensions\":{\"description\":\"Extensions added to the request when trying to find the file.\",\"type\":\"array\",\"items\":{\"description\":\"Extension added to the request when trying to find the file.\",\"type\":\"string\",\"minLength\":1}},\"fallback\":{\"description\":\"Redirect module requests when normal resolving fails.\",\"oneOf\":[{\"$ref\":\"#/definitions/ResolveAlias\"}]},\"fileSystem\":{\"description\":\"Filesystem for the resolver.\",\"tsType\":\"(import('../lib/util/fs').InputFileSystem)\"},\"fullySpecified\":{\"description\":\"Treats the request specified by the user as fully specified, meaning no extensions are added and the mainFiles in directories are not resolved (This doesn't affect requests from mainFields, aliasFields or aliases).\",\"type\":\"boolean\"},\"importsFields\":{\"description\":\"Field names from the description file (usually package.json) which are used to provide internal request of a package (requests starting with # are considered as internal).\",\"type\":\"array\",\"items\":{\"description\":\"Field name from the description file (usually package.json) which is used to provide internal request of a package (requests starting with # are considered as internal).\",\"type\":\"string\"}},\"mainFields\":{\"description\":\"Field names from the description file (package.json) which are used to find the default entry point.\",\"type\":\"array\",\"items\":{\"description\":\"Field name from the description file (package.json) which are used to find the default entry point.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Part of the field path from the description file (package.json) which are used to find the default entry point.\",\"type\":\"string\",\"minLength\":1}},{\"type\":\"string\",\"minLength\":1}]}},\"mainFiles\":{\"description\":\"Filenames used to find the default entry point if there is no description file or main field.\",\"type\":\"array\",\"items\":{\"description\":\"Filename used to find the default entry point if there is no description file or main field.\",\"type\":\"string\",\"minLength\":1}},\"modules\":{\"description\":\"Folder names or directory paths where to find modules.\",\"type\":\"array\",\"items\":{\"description\":\"Folder name or directory path where to find modules.\",\"type\":\"string\",\"minLength\":1}},\"plugins\":{\"description\":\"Plugins for the resolver.\",\"type\":\"array\",\"cli\":{\"exclude\":true},\"items\":{\"description\":\"Plugin of type object or instanceof Function.\",\"anyOf\":[{\"enum\":[\"...\"]},{\"$ref\":\"#/definitions/ResolvePluginInstance\"}]}},\"preferAbsolute\":{\"description\":\"Prefer to resolve server-relative URLs (starting with '/') as absolute paths before falling back to resolve in 'resolve.roots'.\",\"type\":\"boolean\"},\"preferRelative\":{\"description\":\"Prefer to resolve module requests as relative request and fallback to resolving as module.\",\"type\":\"boolean\"},\"resolver\":{\"description\":\"Custom resolver.\",\"tsType\":\"(import('enhanced-resolve').Resolver)\"},\"restrictions\":{\"description\":\"A list of resolve restrictions. Resolve results must fulfill all of these restrictions to resolve successfully. Other resolve paths are taken when restrictions are not met.\",\"type\":\"array\",\"items\":{\"description\":\"Resolve restriction. Resolve result must fulfill this restriction.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\",\"absolutePath\":true,\"minLength\":1}]}},\"roots\":{\"description\":\"A list of directories in which requests that are server-relative URLs (starting with '/') are resolved.\",\"type\":\"array\",\"items\":{\"description\":\"Directory in which requests that are server-relative URLs (starting with '/') are resolved.\",\"type\":\"string\"}},\"symlinks\":{\"description\":\"Enable resolving symlinks to the original location.\",\"type\":\"boolean\"},\"unsafeCache\":{\"description\":\"Enable caching of successfully resolved requests (cache entries are not revalidated).\",\"anyOf\":[{\"type\":\"boolean\"},{\"type\":\"object\",\"additionalProperties\":true}]},\"useSyncFileSystemCalls\":{\"description\":\"Use synchronous filesystem calls for the resolver.\",\"type\":\"boolean\"}}},\"ResolvePluginInstance\":{\"description\":\"Plugin instance.\",\"type\":\"object\",\"additionalProperties\":true,\"properties\":{\"apply\":{\"description\":\"The run point of the plugin, required method.\",\"instanceof\":\"Function\",\"tsType\":\"(resolver: import('enhanced-resolve').Resolver) => void\"}},\"required\":[\"apply\"]},\"RuleSetCondition\":{\"description\":\"A condition matcher.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\"},{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"and\":{\"description\":\"Logical AND.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditions\"}]},\"not\":{\"description\":\"Logical NOT.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditions\"}]},\"or\":{\"description\":\"Logical OR.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditions\"}]}}},{\"instanceof\":\"Function\",\"tsType\":\"((value: string) => boolean)\"},{\"$ref\":\"#/definitions/RuleSetConditions\"}]},\"RuleSetConditionAbsolute\":{\"description\":\"A condition matcher matching an absolute path.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\",\"absolutePath\":true},{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"and\":{\"description\":\"Logical AND.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionsAbsolute\"}]},\"not\":{\"description\":\"Logical NOT.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionsAbsolute\"}]},\"or\":{\"description\":\"Logical OR.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionsAbsolute\"}]}}},{\"instanceof\":\"Function\",\"tsType\":\"((value: string) => boolean)\"},{\"$ref\":\"#/definitions/RuleSetConditionsAbsolute\"}]},\"RuleSetConditionOrConditions\":{\"description\":\"One or multiple rule conditions.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"$ref\":\"#/definitions/RuleSetCondition\"},{\"$ref\":\"#/definitions/RuleSetConditions\"}]},\"RuleSetConditionOrConditionsAbsolute\":{\"description\":\"One or multiple rule conditions matching an absolute path.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"$ref\":\"#/definitions/RuleSetConditionAbsolute\"},{\"$ref\":\"#/definitions/RuleSetConditionsAbsolute\"}]},\"RuleSetConditions\":{\"description\":\"A list of rule conditions.\",\"type\":\"array\",\"items\":{\"description\":\"A rule condition.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetCondition\"}]}},\"RuleSetConditionsAbsolute\":{\"description\":\"A list of rule conditions matching an absolute path.\",\"type\":\"array\",\"items\":{\"description\":\"A rule condition matching an absolute path.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionAbsolute\"}]}},\"RuleSetLoader\":{\"description\":\"A loader request.\",\"type\":\"string\",\"minLength\":1},\"RuleSetLoaderOptions\":{\"description\":\"Options passed to a loader.\",\"anyOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"RuleSetRule\":{\"description\":\"A rule description with conditions and effects for modules.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"compiler\":{\"description\":\"Match the child compiler name.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditions\"}]},\"dependency\":{\"description\":\"Match dependency type.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditions\"}]},\"descriptionData\":{\"description\":\"Match values of properties in the description file (usually package.json).\",\"type\":\"object\",\"additionalProperties\":{\"$ref\":\"#/definitions/RuleSetConditionOrConditions\"}},\"enforce\":{\"description\":\"Enforce this rule as pre or post step.\",\"enum\":[\"pre\",\"post\"]},\"exclude\":{\"description\":\"Shortcut for resource.exclude.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditionsAbsolute\"}]},\"generator\":{\"description\":\"The options for the module generator.\",\"type\":\"object\"},\"include\":{\"description\":\"Shortcut for resource.include.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditionsAbsolute\"}]},\"issuer\":{\"description\":\"Match the issuer of the module (The module pointing to this module).\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditionsAbsolute\"}]},\"issuerLayer\":{\"description\":\"Match layer of the issuer of this module (The module pointing to this module).\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditions\"}]},\"layer\":{\"description\":\"Specifies the layer in which the module should be placed in.\",\"type\":\"string\"},\"loader\":{\"description\":\"Shortcut for use.loader.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetLoader\"}]},\"mimetype\":{\"description\":\"Match module mimetype when load from Data URI.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditions\"}]},\"oneOf\":{\"description\":\"Only execute the first matching rule in this array.\",\"type\":\"array\",\"items\":{\"description\":\"A rule.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetRule\"}]}},\"options\":{\"description\":\"Shortcut for use.options.\",\"cli\":{\"exclude\":true},\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetLoaderOptions\"}]},\"parser\":{\"description\":\"Options for parsing.\",\"type\":\"object\",\"additionalProperties\":true},\"realResource\":{\"description\":\"Match the real resource path of the module.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditionsAbsolute\"}]},\"resolve\":{\"description\":\"Options for the resolver.\",\"type\":\"object\",\"oneOf\":[{\"$ref\":\"#/definitions/ResolveOptions\"}]},\"resource\":{\"description\":\"Match the resource path of the module.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditionsAbsolute\"}]},\"resourceFragment\":{\"description\":\"Match the resource fragment of the module.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditions\"}]},\"resourceQuery\":{\"description\":\"Match the resource query of the module.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditions\"}]},\"rules\":{\"description\":\"Match and execute these rules when this rule is matched.\",\"type\":\"array\",\"items\":{\"description\":\"A rule.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetRule\"}]}},\"sideEffects\":{\"description\":\"Flags a module as with or without side effects.\",\"type\":\"boolean\"},\"test\":{\"description\":\"Shortcut for resource.test.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditionsAbsolute\"}]},\"type\":{\"description\":\"Module type to use for the module.\",\"type\":\"string\"},\"use\":{\"description\":\"Modifiers applied to the module when rule is matched.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetUse\"}]}}},\"RuleSetRules\":{\"description\":\"A list of rules.\",\"type\":\"array\",\"items\":{\"description\":\"A rule.\",\"anyOf\":[{\"cli\":{\"exclude\":true},\"enum\":[\"...\"]},{\"$ref\":\"#/definitions/RuleSetRule\"}]}},\"RuleSetUse\":{\"description\":\"A list of descriptions of loaders applied.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"An use item.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetUseItem\"}]}},{\"instanceof\":\"Function\",\"tsType\":\"((data: { resource: string, realResource: string, resourceQuery: string, issuer: string, compiler: string }) => RuleSetUseItem[])\"},{\"$ref\":\"#/definitions/RuleSetUseItem\"}]},\"RuleSetUseItem\":{\"description\":\"A description of an applied loader.\",\"anyOf\":[{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"ident\":{\"description\":\"Unique loader options identifier.\",\"type\":\"string\"},\"loader\":{\"description\":\"Loader name.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetLoader\"}]},\"options\":{\"description\":\"Loader options.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetLoaderOptions\"}]}}},{\"instanceof\":\"Function\",\"tsType\":\"((data: object) => RuleSetUseItem|RuleSetUseItem[])\"},{\"$ref\":\"#/definitions/RuleSetLoader\"}]},\"ScriptType\":{\"description\":\"This option enables loading async chunks via a custom script type, such as script type=\\\"module\\\".\",\"enum\":[false,\"text/javascript\",\"module\"]},\"SnapshotOptions\":{\"description\":\"Options affecting how file system snapshots are created and validated.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"buildDependencies\":{\"description\":\"Options for snapshotting build dependencies to determine if the whole cache need to be invalidated.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"hash\":{\"description\":\"Use hashes of the content of the files/directories to determine invalidation.\",\"type\":\"boolean\"},\"timestamp\":{\"description\":\"Use timestamps of the files/directories to determine invalidation.\",\"type\":\"boolean\"}}},\"immutablePaths\":{\"description\":\"List of paths that are managed by a package manager and contain a version or hash in its path so all files are immutable.\",\"type\":\"array\",\"items\":{\"description\":\"A path to a immutable directory (usually a package manager cache directory).\",\"type\":\"string\",\"absolutePath\":true,\"minLength\":1}},\"managedPaths\":{\"description\":\"List of paths that are managed by a package manager and can be trusted to not be modified otherwise.\",\"type\":\"array\",\"items\":{\"description\":\"A path to a managed directory (usually a node_modules directory).\",\"type\":\"string\",\"absolutePath\":true,\"minLength\":1}},\"module\":{\"description\":\"Options for snapshotting dependencies of modules to determine if they need to be built again.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"hash\":{\"description\":\"Use hashes of the content of the files/directories to determine invalidation.\",\"type\":\"boolean\"},\"timestamp\":{\"description\":\"Use timestamps of the files/directories to determine invalidation.\",\"type\":\"boolean\"}}},\"resolve\":{\"description\":\"Options for snapshotting dependencies of request resolving to determine if requests need to be re-resolved.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"hash\":{\"description\":\"Use hashes of the content of the files/directories to determine invalidation.\",\"type\":\"boolean\"},\"timestamp\":{\"description\":\"Use timestamps of the files/directories to determine invalidation.\",\"type\":\"boolean\"}}},\"resolveBuildDependencies\":{\"description\":\"Options for snapshotting the resolving of build dependencies to determine if the build dependencies need to be re-resolved.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"hash\":{\"description\":\"Use hashes of the content of the files/directories to determine invalidation.\",\"type\":\"boolean\"},\"timestamp\":{\"description\":\"Use timestamps of the files/directories to determine invalidation.\",\"type\":\"boolean\"}}}}},\"SourceMapFilename\":{\"description\":\"The filename of the SourceMaps for the JavaScript files. They are inside the 'output.path' directory.\",\"type\":\"string\",\"absolutePath\":false},\"SourcePrefix\":{\"description\":\"Prefixes every line of the source in the bundle with this string.\",\"type\":\"string\"},\"StatsOptions\":{\"description\":\"Stats options object.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"all\":{\"description\":\"Fallback value for stats options when an option is not defined (has precedence over local webpack defaults).\",\"type\":\"boolean\"},\"assets\":{\"description\":\"Add assets information.\",\"type\":\"boolean\"},\"assetsSort\":{\"description\":\"Sort the assets by that field.\",\"type\":\"string\"},\"assetsSpace\":{\"description\":\"Space to display assets (groups will be collapsed to fit this space).\",\"type\":\"number\"},\"builtAt\":{\"description\":\"Add built at time information.\",\"type\":\"boolean\"},\"cached\":{\"description\":\"Add information about cached (not built) modules (deprecated: use 'cachedModules' instead).\",\"type\":\"boolean\"},\"cachedAssets\":{\"description\":\"Show cached assets (setting this to `false` only shows emitted files).\",\"type\":\"boolean\"},\"cachedModules\":{\"description\":\"Add information about cached (not built) modules.\",\"type\":\"boolean\"},\"children\":{\"description\":\"Add children information.\",\"type\":\"boolean\"},\"chunkGroupAuxiliary\":{\"description\":\"Display auxiliary assets in chunk groups.\",\"type\":\"boolean\"},\"chunkGroupChildren\":{\"description\":\"Display children of chunk groups.\",\"type\":\"boolean\"},\"chunkGroupMaxAssets\":{\"description\":\"Limit of assets displayed in chunk groups.\",\"type\":\"number\"},\"chunkGroups\":{\"description\":\"Display all chunk groups with the corresponding bundles.\",\"type\":\"boolean\"},\"chunkModules\":{\"description\":\"Add built modules information to chunk information.\",\"type\":\"boolean\"},\"chunkModulesSpace\":{\"description\":\"Space to display chunk modules (groups will be collapsed to fit this space, value is in number of modules/group).\",\"type\":\"number\"},\"chunkOrigins\":{\"description\":\"Add the origins of chunks and chunk merging info.\",\"type\":\"boolean\"},\"chunkRelations\":{\"description\":\"Add information about parent, children and sibling chunks to chunk information.\",\"type\":\"boolean\"},\"chunks\":{\"description\":\"Add chunk information.\",\"type\":\"boolean\"},\"chunksSort\":{\"description\":\"Sort the chunks by that field.\",\"type\":\"string\"},\"colors\":{\"description\":\"Enables/Disables colorful output.\",\"anyOf\":[{\"description\":\"Enables/Disables colorful output.\",\"type\":\"boolean\"},{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"bold\":{\"description\":\"Custom color for bold text.\",\"type\":\"string\"},\"cyan\":{\"description\":\"Custom color for cyan text.\",\"type\":\"string\"},\"green\":{\"description\":\"Custom color for green text.\",\"type\":\"string\"},\"magenta\":{\"description\":\"Custom color for magenta text.\",\"type\":\"string\"},\"red\":{\"description\":\"Custom color for red text.\",\"type\":\"string\"},\"yellow\":{\"description\":\"Custom color for yellow text.\",\"type\":\"string\"}}}]},\"context\":{\"description\":\"Context directory for request shortening.\",\"type\":\"string\",\"absolutePath\":true},\"dependentModules\":{\"description\":\"Show chunk modules that are dependencies of other modules of the chunk.\",\"type\":\"boolean\"},\"depth\":{\"description\":\"Add module depth in module graph.\",\"type\":\"boolean\"},\"entrypoints\":{\"description\":\"Display the entry points with the corresponding bundles.\",\"anyOf\":[{\"enum\":[\"auto\"]},{\"type\":\"boolean\"}]},\"env\":{\"description\":\"Add --env information.\",\"type\":\"boolean\"},\"errorDetails\":{\"description\":\"Add details to errors (like resolving log).\",\"anyOf\":[{\"enum\":[\"auto\"]},{\"type\":\"boolean\"}]},\"errorStack\":{\"description\":\"Add internal stack trace to errors.\",\"type\":\"boolean\"},\"errors\":{\"description\":\"Add errors.\",\"type\":\"boolean\"},\"errorsCount\":{\"description\":\"Add errors count.\",\"type\":\"boolean\"},\"exclude\":{\"description\":\"Please use excludeModules instead.\",\"cli\":{\"exclude\":true},\"anyOf\":[{\"type\":\"boolean\"},{\"$ref\":\"#/definitions/ModuleFilterTypes\"}]},\"excludeAssets\":{\"description\":\"Suppress assets that match the specified filters. Filters can be Strings, RegExps or Functions.\",\"oneOf\":[{\"$ref\":\"#/definitions/AssetFilterTypes\"}]},\"excludeModules\":{\"description\":\"Suppress modules that match the specified filters. Filters can be Strings, RegExps, Booleans or Functions.\",\"anyOf\":[{\"type\":\"boolean\"},{\"$ref\":\"#/definitions/ModuleFilterTypes\"}]},\"groupAssetsByChunk\":{\"description\":\"Group assets by how their are related to chunks.\",\"type\":\"boolean\"},\"groupAssetsByEmitStatus\":{\"description\":\"Group assets by their status (emitted, compared for emit or cached).\",\"type\":\"boolean\"},\"groupAssetsByExtension\":{\"description\":\"Group assets by their extension.\",\"type\":\"boolean\"},\"groupAssetsByInfo\":{\"description\":\"Group assets by their asset info (immutable, development, hotModuleReplacement, etc).\",\"type\":\"boolean\"},\"groupAssetsByPath\":{\"description\":\"Group assets by their path.\",\"type\":\"boolean\"},\"groupModulesByAttributes\":{\"description\":\"Group modules by their attributes (errors, warnings, assets, optional, orphan, or dependent).\",\"type\":\"boolean\"},\"groupModulesByCacheStatus\":{\"description\":\"Group modules by their status (cached or built and cacheable).\",\"type\":\"boolean\"},\"groupModulesByExtension\":{\"description\":\"Group modules by their extension.\",\"type\":\"boolean\"},\"groupModulesByLayer\":{\"description\":\"Group modules by their layer.\",\"type\":\"boolean\"},\"groupModulesByPath\":{\"description\":\"Group modules by their path.\",\"type\":\"boolean\"},\"hash\":{\"description\":\"Add the hash of the compilation.\",\"type\":\"boolean\"},\"ids\":{\"description\":\"Add ids.\",\"type\":\"boolean\"},\"logging\":{\"description\":\"Add logging output.\",\"anyOf\":[{\"description\":\"Specify log level of logging output.\",\"enum\":[\"none\",\"error\",\"warn\",\"info\",\"log\",\"verbose\"]},{\"description\":\"Enable/disable logging output (`true`: shows normal logging output, loglevel: log).\",\"type\":\"boolean\"}]},\"loggingDebug\":{\"description\":\"Include debug logging of specified loggers (i. e. for plugins or loaders). Filters can be Strings, RegExps or Functions.\",\"anyOf\":[{\"description\":\"Enable/Disable debug logging for all loggers.\",\"type\":\"boolean\"},{\"$ref\":\"#/definitions/FilterTypes\"}]},\"loggingTrace\":{\"description\":\"Add stack traces to logging output.\",\"type\":\"boolean\"},\"moduleAssets\":{\"description\":\"Add information about assets inside modules.\",\"type\":\"boolean\"},\"moduleTrace\":{\"description\":\"Add dependencies and origin of warnings/errors.\",\"type\":\"boolean\"},\"modules\":{\"description\":\"Add built modules information.\",\"type\":\"boolean\"},\"modulesSort\":{\"description\":\"Sort the modules by that field.\",\"type\":\"string\"},\"modulesSpace\":{\"description\":\"Space to display modules (groups will be collapsed to fit this space, value is in number of modules/groups).\",\"type\":\"number\"},\"nestedModules\":{\"description\":\"Add information about modules nested in other modules (like with module concatenation).\",\"type\":\"boolean\"},\"nestedModulesSpace\":{\"description\":\"Space to display modules nested within other modules (groups will be collapsed to fit this space, value is in number of modules/group).\",\"type\":\"number\"},\"optimizationBailout\":{\"description\":\"Show reasons why optimization bailed out for modules.\",\"type\":\"boolean\"},\"orphanModules\":{\"description\":\"Add information about orphan modules.\",\"type\":\"boolean\"},\"outputPath\":{\"description\":\"Add output path information.\",\"type\":\"boolean\"},\"performance\":{\"description\":\"Add performance hint flags.\",\"type\":\"boolean\"},\"preset\":{\"description\":\"Preset for the default values.\",\"anyOf\":[{\"type\":\"boolean\"},{\"type\":\"string\"}]},\"providedExports\":{\"description\":\"Show exports provided by modules.\",\"type\":\"boolean\"},\"publicPath\":{\"description\":\"Add public path information.\",\"type\":\"boolean\"},\"reasons\":{\"description\":\"Add information about the reasons why modules are included.\",\"type\":\"boolean\"},\"relatedAssets\":{\"description\":\"Add information about assets that are related to other assets (like SourceMaps for assets).\",\"type\":\"boolean\"},\"runtime\":{\"description\":\"Add information about runtime modules (deprecated: use 'runtimeModules' instead).\",\"type\":\"boolean\"},\"runtimeModules\":{\"description\":\"Add information about runtime modules.\",\"type\":\"boolean\"},\"source\":{\"description\":\"Add the source code of modules.\",\"type\":\"boolean\"},\"timings\":{\"description\":\"Add timing information.\",\"type\":\"boolean\"},\"usedExports\":{\"description\":\"Show exports used by modules.\",\"type\":\"boolean\"},\"version\":{\"description\":\"Add webpack version information.\",\"type\":\"boolean\"},\"warnings\":{\"description\":\"Add warnings.\",\"type\":\"boolean\"},\"warningsCount\":{\"description\":\"Add warnings count.\",\"type\":\"boolean\"},\"warningsFilter\":{\"description\":\"Suppress listing warnings that match the specified filters (they will still be counted). Filters can be Strings, RegExps or Functions.\",\"oneOf\":[{\"$ref\":\"#/definitions/WarningFilterTypes\"}]}}},\"StatsValue\":{\"description\":\"Stats options object or preset name.\",\"anyOf\":[{\"enum\":[\"none\",\"summary\",\"errors-only\",\"errors-warnings\",\"minimal\",\"normal\",\"detailed\",\"verbose\"]},{\"type\":\"boolean\"},{\"$ref\":\"#/definitions/StatsOptions\"}]},\"StrictModuleErrorHandling\":{\"description\":\"Handles error in module loading correctly at a performance cost. This will handle module error compatible with the EcmaScript Modules spec.\",\"type\":\"boolean\"},\"StrictModuleExceptionHandling\":{\"description\":\"Handles exceptions in module loading correctly at a performance cost (Deprecated). This will handle module error compatible with the Node.js CommonJS way.\",\"type\":\"boolean\"},\"Target\":{\"description\":\"Environment to build for. An array of environments to build for all of them when possible.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Environment to build for.\",\"type\":\"string\",\"minLength\":1},\"minItems\":1},{\"enum\":[false]},{\"type\":\"string\",\"minLength\":1}]},\"UmdNamedDefine\":{\"description\":\"If `output.libraryTarget` is set to umd and `output.library` is set, setting this to true will name the AMD module.\",\"type\":\"boolean\"},\"UniqueName\":{\"description\":\"A unique name of the webpack build to avoid multiple webpack runtimes to conflict when using globals.\",\"type\":\"string\",\"minLength\":1},\"WarningFilterItemTypes\":{\"description\":\"Filtering value, regexp or function.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\",\"absolutePath\":false},{\"instanceof\":\"Function\",\"tsType\":\"((warning: import('../lib/stats/DefaultStatsFactoryPlugin').StatsError, value: string) => boolean)\"}]},\"WarningFilterTypes\":{\"description\":\"Filtering warnings.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Rule to filter.\",\"cli\":{\"helper\":true},\"oneOf\":[{\"$ref\":\"#/definitions/WarningFilterItemTypes\"}]}},{\"$ref\":\"#/definitions/WarningFilterItemTypes\"}]},\"WasmLoading\":{\"description\":\"The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).\",\"anyOf\":[{\"enum\":[false]},{\"$ref\":\"#/definitions/WasmLoadingType\"}]},\"WasmLoadingType\":{\"description\":\"The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).\",\"anyOf\":[{\"enum\":[\"fetch-streaming\",\"fetch\",\"async-node\"]},{\"type\":\"string\"}]},\"Watch\":{\"description\":\"Enter watch mode, which rebuilds on file change.\",\"type\":\"boolean\"},\"WatchOptions\":{\"description\":\"Options for the watcher.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"aggregateTimeout\":{\"description\":\"Delay the rebuilt after the first change. Value is a time in ms.\",\"type\":\"number\"},\"followSymlinks\":{\"description\":\"Resolve symlinks and watch symlink and real file. This is usually not needed as webpack already resolves symlinks ('resolve.symlinks').\",\"type\":\"boolean\"},\"ignored\":{\"description\":\"Ignore some files from watching (glob pattern or regexp).\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"A glob pattern for files that should be ignored from watching.\",\"type\":\"string\",\"minLength\":1}},{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"description\":\"A single glob pattern for files that should be ignored from watching.\",\"type\":\"string\",\"minLength\":1}]},\"poll\":{\"description\":\"Enable polling mode for watching.\",\"anyOf\":[{\"description\":\"`number`: use polling with specified interval.\",\"type\":\"number\"},{\"description\":\"`true`: use polling.\",\"type\":\"boolean\"}]},\"stdin\":{\"description\":\"Stop watching when stdin stream has ended.\",\"type\":\"boolean\"}}},\"WebassemblyModuleFilename\":{\"description\":\"The filename of WebAssembly modules as relative path inside the 'output.path' directory.\",\"type\":\"string\",\"absolutePath\":false},\"WebpackOptionsNormalized\":{\"description\":\"Normalized webpack options object.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"amd\":{\"$ref\":\"#/definitions/Amd\"},\"bail\":{\"$ref\":\"#/definitions/Bail\"},\"cache\":{\"$ref\":\"#/definitions/CacheOptionsNormalized\"},\"context\":{\"$ref\":\"#/definitions/Context\"},\"dependencies\":{\"$ref\":\"#/definitions/Dependencies\"},\"devServer\":{\"$ref\":\"#/definitions/DevServer\"},\"devtool\":{\"$ref\":\"#/definitions/DevTool\"},\"entry\":{\"$ref\":\"#/definitions/EntryNormalized\"},\"experiments\":{\"$ref\":\"#/definitions/Experiments\"},\"externals\":{\"$ref\":\"#/definitions/Externals\"},\"externalsPresets\":{\"$ref\":\"#/definitions/ExternalsPresets\"},\"externalsType\":{\"$ref\":\"#/definitions/ExternalsType\"},\"ignoreWarnings\":{\"$ref\":\"#/definitions/IgnoreWarningsNormalized\"},\"infrastructureLogging\":{\"$ref\":\"#/definitions/InfrastructureLogging\"},\"loader\":{\"$ref\":\"#/definitions/Loader\"},\"mode\":{\"$ref\":\"#/definitions/Mode\"},\"module\":{\"$ref\":\"#/definitions/ModuleOptionsNormalized\"},\"name\":{\"$ref\":\"#/definitions/Name\"},\"node\":{\"$ref\":\"#/definitions/Node\"},\"optimization\":{\"$ref\":\"#/definitions/Optimization\"},\"output\":{\"$ref\":\"#/definitions/OutputNormalized\"},\"parallelism\":{\"$ref\":\"#/definitions/Parallelism\"},\"performance\":{\"$ref\":\"#/definitions/Performance\"},\"plugins\":{\"$ref\":\"#/definitions/Plugins\"},\"profile\":{\"$ref\":\"#/definitions/Profile\"},\"recordsInputPath\":{\"$ref\":\"#/definitions/RecordsInputPath\"},\"recordsOutputPath\":{\"$ref\":\"#/definitions/RecordsOutputPath\"},\"resolve\":{\"$ref\":\"#/definitions/Resolve\"},\"resolveLoader\":{\"$ref\":\"#/definitions/ResolveLoader\"},\"snapshot\":{\"$ref\":\"#/definitions/SnapshotOptions\"},\"stats\":{\"$ref\":\"#/definitions/StatsValue\"},\"target\":{\"$ref\":\"#/definitions/Target\"},\"watch\":{\"$ref\":\"#/definitions/Watch\"},\"watchOptions\":{\"$ref\":\"#/definitions/WatchOptions\"}},\"required\":[\"cache\",\"snapshot\",\"entry\",\"experiments\",\"externals\",\"externalsPresets\",\"infrastructureLogging\",\"module\",\"node\",\"optimization\",\"output\",\"plugins\",\"resolve\",\"resolveLoader\",\"stats\",\"watchOptions\"]},\"WebpackPluginFunction\":{\"description\":\"Function acting as plugin.\",\"instanceof\":\"Function\",\"tsType\":\"(this: import('../lib/Compiler'), compiler: import('../lib/Compiler')) => void\"},\"WebpackPluginInstance\":{\"description\":\"Plugin instance.\",\"type\":\"object\",\"additionalProperties\":true,\"properties\":{\"apply\":{\"description\":\"The run point of the plugin, required method.\",\"instanceof\":\"Function\",\"tsType\":\"(compiler: import('../lib/Compiler')) => void\"}},\"required\":[\"apply\"]}},\"description\":\"Options object as provided by the user.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"amd\":{\"$ref\":\"#/definitions/Amd\"},\"bail\":{\"$ref\":\"#/definitions/Bail\"},\"cache\":{\"$ref\":\"#/definitions/CacheOptions\"},\"context\":{\"$ref\":\"#/definitions/Context\"},\"dependencies\":{\"$ref\":\"#/definitions/Dependencies\"},\"devServer\":{\"$ref\":\"#/definitions/DevServer\"},\"devtool\":{\"$ref\":\"#/definitions/DevTool\"},\"entry\":{\"$ref\":\"#/definitions/Entry\"},\"experiments\":{\"$ref\":\"#/definitions/Experiments\"},\"externals\":{\"$ref\":\"#/definitions/Externals\"},\"externalsPresets\":{\"$ref\":\"#/definitions/ExternalsPresets\"},\"externalsType\":{\"$ref\":\"#/definitions/ExternalsType\"},\"ignoreWarnings\":{\"$ref\":\"#/definitions/IgnoreWarnings\"},\"infrastructureLogging\":{\"$ref\":\"#/definitions/InfrastructureLogging\"},\"loader\":{\"$ref\":\"#/definitions/Loader\"},\"mode\":{\"$ref\":\"#/definitions/Mode\"},\"module\":{\"$ref\":\"#/definitions/ModuleOptions\"},\"name\":{\"$ref\":\"#/definitions/Name\"},\"node\":{\"$ref\":\"#/definitions/Node\"},\"optimization\":{\"$ref\":\"#/definitions/Optimization\"},\"output\":{\"$ref\":\"#/definitions/Output\"},\"parallelism\":{\"$ref\":\"#/definitions/Parallelism\"},\"performance\":{\"$ref\":\"#/definitions/Performance\"},\"plugins\":{\"$ref\":\"#/definitions/Plugins\"},\"profile\":{\"$ref\":\"#/definitions/Profile\"},\"recordsInputPath\":{\"$ref\":\"#/definitions/RecordsInputPath\"},\"recordsOutputPath\":{\"$ref\":\"#/definitions/RecordsOutputPath\"},\"recordsPath\":{\"$ref\":\"#/definitions/RecordsPath\"},\"resolve\":{\"$ref\":\"#/definitions/Resolve\"},\"resolveLoader\":{\"$ref\":\"#/definitions/ResolveLoader\"},\"snapshot\":{\"$ref\":\"#/definitions/SnapshotOptions\"},\"stats\":{\"$ref\":\"#/definitions/StatsValue\"},\"target\":{\"$ref\":\"#/definitions/Target\"},\"watch\":{\"$ref\":\"#/definitions/Watch\"},\"watchOptions\":{\"$ref\":\"#/definitions/WatchOptions\"}}}"); +module.exports = JSON.parse("{\"definitions\":{\"Amd\":{\"description\":\"Set the value of `require.amd` and `define.amd`. Or disable AMD support.\",\"anyOf\":[{\"description\":\"You can pass `false` to disable AMD support.\",\"enum\":[false]},{\"description\":\"You can pass an object to set the value of `require.amd` and `define.amd`.\",\"type\":\"object\"}]},\"AssetFilterItemTypes\":{\"description\":\"Filtering value, regexp or function.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\",\"absolutePath\":false},{\"instanceof\":\"Function\",\"tsType\":\"((name: string, asset: import('../lib/stats/DefaultStatsFactoryPlugin').StatsAsset) => boolean)\"}]},\"AssetFilterTypes\":{\"description\":\"Filtering modules.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Rule to filter.\",\"cli\":{\"helper\":true},\"oneOf\":[{\"$ref\":\"#/definitions/AssetFilterItemTypes\"}]}},{\"$ref\":\"#/definitions/AssetFilterItemTypes\"}]},\"AssetGeneratorDataUrl\":{\"description\":\"The options for data url generator.\",\"anyOf\":[{\"$ref\":\"#/definitions/AssetGeneratorDataUrlOptions\"},{\"$ref\":\"#/definitions/AssetGeneratorDataUrlFunction\"}]},\"AssetGeneratorDataUrlFunction\":{\"description\":\"Function that executes for module and should return an DataUrl string.\",\"instanceof\":\"Function\",\"tsType\":\"((source: string | Buffer, context: { filename: string, module: import('../lib/Module') }) => string)\"},\"AssetGeneratorDataUrlOptions\":{\"description\":\"Options object for data url generation.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"encoding\":{\"description\":\"Asset encoding (defaults to base64).\",\"enum\":[false,\"base64\"]},\"mimetype\":{\"description\":\"Asset mimetype (getting from file extension by default).\",\"type\":\"string\"}}},\"AssetGeneratorOptions\":{\"description\":\"Generator options for asset modules.\",\"type\":\"object\",\"implements\":[\"#/definitions/AssetInlineGeneratorOptions\",\"#/definitions/AssetResourceGeneratorOptions\"],\"additionalProperties\":false,\"properties\":{\"dataUrl\":{\"$ref\":\"#/definitions/AssetGeneratorDataUrl\"},\"emit\":{\"description\":\"Emit an output asset from this asset module. This can be set to 'false' to omit emitting e. g. for SSR.\",\"type\":\"boolean\"},\"filename\":{\"$ref\":\"#/definitions/FilenameTemplate\"},\"publicPath\":{\"$ref\":\"#/definitions/RawPublicPath\"}}},\"AssetInlineGeneratorOptions\":{\"description\":\"Generator options for asset/inline modules.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"dataUrl\":{\"$ref\":\"#/definitions/AssetGeneratorDataUrl\"}}},\"AssetModuleFilename\":{\"description\":\"The filename of asset modules as relative path inside the 'output.path' directory.\",\"anyOf\":[{\"type\":\"string\",\"absolutePath\":false},{\"instanceof\":\"Function\",\"tsType\":\"((pathData: import(\\\"../lib/Compilation\\\").PathData, assetInfo?: import(\\\"../lib/Compilation\\\").AssetInfo) => string)\"}]},\"AssetParserDataUrlFunction\":{\"description\":\"Function that executes for module and should return whenever asset should be inlined as DataUrl.\",\"instanceof\":\"Function\",\"tsType\":\"((source: string | Buffer, context: { filename: string, module: import('../lib/Module') }) => boolean)\"},\"AssetParserDataUrlOptions\":{\"description\":\"Options object for DataUrl condition.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"maxSize\":{\"description\":\"Maximum size of asset that should be inline as modules. Default: 8kb.\",\"type\":\"number\"}}},\"AssetParserOptions\":{\"description\":\"Parser options for asset modules.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"dataUrlCondition\":{\"description\":\"The condition for inlining the asset as DataUrl.\",\"anyOf\":[{\"$ref\":\"#/definitions/AssetParserDataUrlOptions\"},{\"$ref\":\"#/definitions/AssetParserDataUrlFunction\"}]}}},\"AssetResourceGeneratorOptions\":{\"description\":\"Generator options for asset/resource modules.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"emit\":{\"description\":\"Emit an output asset from this asset module. This can be set to 'false' to omit emitting e. g. for SSR.\",\"type\":\"boolean\"},\"filename\":{\"$ref\":\"#/definitions/FilenameTemplate\"},\"publicPath\":{\"$ref\":\"#/definitions/RawPublicPath\"}}},\"AuxiliaryComment\":{\"description\":\"Add a comment in the UMD wrapper.\",\"anyOf\":[{\"description\":\"Append the same comment above each import style.\",\"type\":\"string\"},{\"$ref\":\"#/definitions/LibraryCustomUmdCommentObject\"}]},\"Bail\":{\"description\":\"Report the first error as a hard error instead of tolerating it.\",\"type\":\"boolean\"},\"CacheOptions\":{\"description\":\"Cache generated modules and chunks to improve performance for multiple incremental builds.\",\"anyOf\":[{\"description\":\"Enable in memory caching.\",\"enum\":[true]},{\"$ref\":\"#/definitions/CacheOptionsNormalized\"}]},\"CacheOptionsNormalized\":{\"description\":\"Cache generated modules and chunks to improve performance for multiple incremental builds.\",\"anyOf\":[{\"description\":\"Disable caching.\",\"enum\":[false]},{\"$ref\":\"#/definitions/MemoryCacheOptions\"},{\"$ref\":\"#/definitions/FileCacheOptions\"}]},\"Charset\":{\"description\":\"Add charset attribute for script tag.\",\"type\":\"boolean\"},\"ChunkFilename\":{\"description\":\"Specifies the filename template of output files of non-initial chunks on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.\",\"oneOf\":[{\"$ref\":\"#/definitions/FilenameTemplate\"}]},\"ChunkFormat\":{\"description\":\"The format of chunks (formats included by default are 'array-push' (web/WebWorker), 'commonjs' (node.js), but others might be added by plugins).\",\"anyOf\":[{\"enum\":[\"array-push\",\"commonjs\",false]},{\"type\":\"string\"}]},\"ChunkLoadTimeout\":{\"description\":\"Number of milliseconds before chunk request expires.\",\"type\":\"number\"},\"ChunkLoading\":{\"description\":\"The method of loading chunks (methods included by default are 'jsonp' (web), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).\",\"anyOf\":[{\"enum\":[false]},{\"$ref\":\"#/definitions/ChunkLoadingType\"}]},\"ChunkLoadingGlobal\":{\"description\":\"The global variable used by webpack for loading of chunks.\",\"type\":\"string\"},\"ChunkLoadingType\":{\"description\":\"The method of loading chunks (methods included by default are 'jsonp' (web), 'importScripts' (WebWorker), 'require' (sync node.js), 'async-node' (async node.js), but others might be added by plugins).\",\"anyOf\":[{\"enum\":[\"jsonp\",\"import-scripts\",\"require\",\"async-node\"]},{\"type\":\"string\"}]},\"Clean\":{\"description\":\"Clean the output directory before emit.\",\"anyOf\":[{\"type\":\"boolean\"},{\"$ref\":\"#/definitions/CleanOptions\"}]},\"CleanOptions\":{\"description\":\"Advanced options for cleaning assets.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"dry\":{\"description\":\"Log the assets that should be removed instead of deleting them.\",\"type\":\"boolean\"},\"keep\":{\"description\":\"Keep these assets.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\",\"absolutePath\":false},{\"instanceof\":\"Function\",\"tsType\":\"((filename: string) => boolean)\"}]}}},\"CompareBeforeEmit\":{\"description\":\"Check if to be emitted file already exists and have the same content before writing to output filesystem.\",\"type\":\"boolean\"},\"Context\":{\"description\":\"The base directory (absolute path!) for resolving the `entry` option. If `output.pathinfo` is set, the included pathinfo is shortened to this directory.\",\"type\":\"string\",\"absolutePath\":true},\"CrossOriginLoading\":{\"description\":\"This option enables cross-origin loading of chunks.\",\"enum\":[false,\"anonymous\",\"use-credentials\"]},\"Dependencies\":{\"description\":\"References to other configurations to depend on.\",\"type\":\"array\",\"items\":{\"description\":\"References to another configuration to depend on.\",\"type\":\"string\"}},\"DevServer\":{\"description\":\"Options for the webpack-dev-server.\",\"type\":\"object\"},\"DevTool\":{\"description\":\"A developer tool to enhance debugging (false | eval | [inline-|hidden-|eval-][nosources-][cheap-[module-]]source-map).\",\"anyOf\":[{\"enum\":[false,\"eval\"]},{\"type\":\"string\",\"pattern\":\"^(inline-|hidden-|eval-)?(nosources-)?(cheap-(module-)?)?source-map$\"}]},\"DevtoolFallbackModuleFilenameTemplate\":{\"description\":\"Similar to `output.devtoolModuleFilenameTemplate`, but used in the case of duplicate module identifiers.\",\"anyOf\":[{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"DevtoolModuleFilenameTemplate\":{\"description\":\"Filename template string of function for the sources array in a generated SourceMap.\",\"anyOf\":[{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"DevtoolNamespace\":{\"description\":\"Module namespace to use when interpolating filename template string for the sources array in a generated SourceMap. Defaults to `output.library` if not set. It's useful for avoiding runtime collisions in sourcemaps from multiple webpack projects built as libraries.\",\"type\":\"string\"},\"EmptyGeneratorOptions\":{\"description\":\"No generator options are supported for this module type.\",\"type\":\"object\",\"additionalProperties\":false},\"EmptyParserOptions\":{\"description\":\"No parser options are supported for this module type.\",\"type\":\"object\",\"additionalProperties\":false},\"EnabledChunkLoadingTypes\":{\"description\":\"List of chunk loading types enabled for use by entry points.\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ChunkLoadingType\"}},\"EnabledLibraryTypes\":{\"description\":\"List of library types enabled for use by entry points.\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/LibraryType\"}},\"EnabledWasmLoadingTypes\":{\"description\":\"List of wasm loading types enabled for use by entry points.\",\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/WasmLoadingType\"}},\"Entry\":{\"description\":\"The entry point(s) of the compilation.\",\"anyOf\":[{\"$ref\":\"#/definitions/EntryDynamic\"},{\"$ref\":\"#/definitions/EntryStatic\"}]},\"EntryDescription\":{\"description\":\"An object with entry point description.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"chunkLoading\":{\"$ref\":\"#/definitions/ChunkLoading\"},\"dependOn\":{\"description\":\"The entrypoints that the current entrypoint depend on. They must be loaded when this entrypoint is loaded.\",\"anyOf\":[{\"description\":\"The entrypoints that the current entrypoint depend on. They must be loaded when this entrypoint is loaded.\",\"type\":\"array\",\"items\":{\"description\":\"An entrypoint that the current entrypoint depend on. It must be loaded when this entrypoint is loaded.\",\"type\":\"string\",\"minLength\":1},\"minItems\":1,\"uniqueItems\":true},{\"description\":\"An entrypoint that the current entrypoint depend on. It must be loaded when this entrypoint is loaded.\",\"type\":\"string\",\"minLength\":1}]},\"filename\":{\"$ref\":\"#/definitions/EntryFilename\"},\"import\":{\"$ref\":\"#/definitions/EntryItem\"},\"layer\":{\"$ref\":\"#/definitions/Layer\"},\"library\":{\"$ref\":\"#/definitions/LibraryOptions\"},\"runtime\":{\"$ref\":\"#/definitions/EntryRuntime\"},\"wasmLoading\":{\"$ref\":\"#/definitions/WasmLoading\"}},\"required\":[\"import\"]},\"EntryDescriptionNormalized\":{\"description\":\"An object with entry point description.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"chunkLoading\":{\"$ref\":\"#/definitions/ChunkLoading\"},\"dependOn\":{\"description\":\"The entrypoints that the current entrypoint depend on. They must be loaded when this entrypoint is loaded.\",\"type\":\"array\",\"items\":{\"description\":\"An entrypoint that the current entrypoint depend on. It must be loaded when this entrypoint is loaded.\",\"type\":\"string\",\"minLength\":1},\"minItems\":1,\"uniqueItems\":true},\"filename\":{\"$ref\":\"#/definitions/Filename\"},\"import\":{\"description\":\"Module(s) that are loaded upon startup. The last one is exported.\",\"type\":\"array\",\"items\":{\"description\":\"Module that is loaded upon startup. Only the last one is exported.\",\"type\":\"string\",\"minLength\":1},\"minItems\":1,\"uniqueItems\":true},\"layer\":{\"$ref\":\"#/definitions/Layer\"},\"library\":{\"$ref\":\"#/definitions/LibraryOptions\"},\"runtime\":{\"$ref\":\"#/definitions/EntryRuntime\"},\"wasmLoading\":{\"$ref\":\"#/definitions/WasmLoading\"}}},\"EntryDynamic\":{\"description\":\"A Function returning an entry object, an entry string, an entry array or a promise to these things.\",\"instanceof\":\"Function\",\"tsType\":\"(() => EntryStatic | Promise)\"},\"EntryDynamicNormalized\":{\"description\":\"A Function returning a Promise resolving to a normalized entry.\",\"instanceof\":\"Function\",\"tsType\":\"(() => Promise)\"},\"EntryFilename\":{\"description\":\"Specifies the filename of the output file on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.\",\"oneOf\":[{\"$ref\":\"#/definitions/FilenameTemplate\"}]},\"EntryItem\":{\"description\":\"Module(s) that are loaded upon startup.\",\"anyOf\":[{\"description\":\"All modules are loaded upon startup. The last one is exported.\",\"type\":\"array\",\"items\":{\"description\":\"A module that is loaded upon startup. Only the last one is exported.\",\"type\":\"string\",\"minLength\":1},\"minItems\":1,\"uniqueItems\":true},{\"description\":\"The string is resolved to a module which is loaded upon startup.\",\"type\":\"string\",\"minLength\":1}]},\"EntryNormalized\":{\"description\":\"The entry point(s) of the compilation.\",\"anyOf\":[{\"$ref\":\"#/definitions/EntryDynamicNormalized\"},{\"$ref\":\"#/definitions/EntryStaticNormalized\"}]},\"EntryObject\":{\"description\":\"Multiple entry bundles are created. The key is the entry name. The value can be a string, an array or an entry description object.\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"An entry point with name.\",\"anyOf\":[{\"$ref\":\"#/definitions/EntryItem\"},{\"$ref\":\"#/definitions/EntryDescription\"}]}},\"EntryRuntime\":{\"description\":\"The name of the runtime chunk. If set a runtime chunk with this name is created or an existing entrypoint is used as runtime.\",\"type\":\"string\",\"minLength\":1},\"EntryStatic\":{\"description\":\"A static entry description.\",\"anyOf\":[{\"$ref\":\"#/definitions/EntryObject\"},{\"$ref\":\"#/definitions/EntryUnnamed\"}]},\"EntryStaticNormalized\":{\"description\":\"Multiple entry bundles are created. The key is the entry name. The value is an entry description object.\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"An object with entry point description.\",\"oneOf\":[{\"$ref\":\"#/definitions/EntryDescriptionNormalized\"}]}},\"EntryUnnamed\":{\"description\":\"An entry point without name.\",\"oneOf\":[{\"$ref\":\"#/definitions/EntryItem\"}]},\"Environment\":{\"description\":\"The abilities of the environment where the webpack generated code should run.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"arrowFunction\":{\"description\":\"The environment supports arrow functions ('() => { ... }').\",\"type\":\"boolean\"},\"bigIntLiteral\":{\"description\":\"The environment supports BigInt as literal (123n).\",\"type\":\"boolean\"},\"const\":{\"description\":\"The environment supports const and let for variable declarations.\",\"type\":\"boolean\"},\"destructuring\":{\"description\":\"The environment supports destructuring ('{ a, b } = obj').\",\"type\":\"boolean\"},\"dynamicImport\":{\"description\":\"The environment supports an async import() function to import EcmaScript modules.\",\"type\":\"boolean\"},\"forOf\":{\"description\":\"The environment supports 'for of' iteration ('for (const x of array) { ... }').\",\"type\":\"boolean\"},\"module\":{\"description\":\"The environment supports EcmaScript Module syntax to import EcmaScript modules (import ... from '...').\",\"type\":\"boolean\"}}},\"Experiments\":{\"description\":\"Enables/Disables experiments (experimental features with relax SemVer compatibility).\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"asset\":{\"description\":\"Allow module type 'asset' to generate assets.\",\"type\":\"boolean\"},\"asyncWebAssembly\":{\"description\":\"Support WebAssembly as asynchronous EcmaScript Module.\",\"type\":\"boolean\"},\"layers\":{\"description\":\"Enable module and chunk layers.\",\"type\":\"boolean\"},\"lazyCompilation\":{\"description\":\"Compile entrypoints and import()s only when they are accessed.\",\"anyOf\":[{\"type\":\"boolean\"},{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"backend\":{\"description\":\"A custom backend.\",\"instanceof\":\"Function\",\"tsType\":\"(((compiler: import('../lib/Compiler'), client: string, callback: (err?: Error, api?: any) => void) => void) | ((compiler: import('../lib/Compiler'), client: string) => Promise))\"},\"client\":{\"description\":\"A custom client.\",\"type\":\"string\"},\"entries\":{\"description\":\"Enable/disable lazy compilation for entries.\",\"type\":\"boolean\"},\"imports\":{\"description\":\"Enable/disable lazy compilation for import() modules.\",\"type\":\"boolean\"},\"test\":{\"description\":\"Specify which entrypoints or import()ed modules should be lazily compiled. This is matched with the imported module and not the entrypoint name.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"((module: import('../lib/Module')) => boolean)\"}]}}}]},\"outputModule\":{\"description\":\"Allow output javascript files as module source type.\",\"type\":\"boolean\"},\"syncWebAssembly\":{\"description\":\"Support WebAssembly as synchronous EcmaScript Module (outdated).\",\"type\":\"boolean\"},\"topLevelAwait\":{\"description\":\"Allow using top-level-await in EcmaScript Modules.\",\"type\":\"boolean\"}}},\"ExternalItem\":{\"description\":\"Specify dependency that shouldn't be resolved by webpack, but should become dependencies of the resulting bundle. The kind of the dependency depends on `output.libraryTarget`.\",\"anyOf\":[{\"description\":\"Every matched dependency becomes external.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"description\":\"An exact matched dependency becomes external. The same string is used as external dependency.\",\"type\":\"string\"},{\"description\":\"If an dependency matches exactly a property of the object, the property value is used as dependency.\",\"type\":\"object\",\"additionalProperties\":{\"$ref\":\"#/definitions/ExternalItemValue\"},\"properties\":{\"byLayer\":{\"description\":\"Specify externals depending on the layer.\",\"anyOf\":[{\"type\":\"object\",\"additionalProperties\":{\"$ref\":\"#/definitions/ExternalItem\"}},{\"instanceof\":\"Function\",\"tsType\":\"((layer: string | null) => ExternalItem)\"}]}}},{\"description\":\"The function is called on each dependency (`function(context, request, callback(err, result))`).\",\"instanceof\":\"Function\",\"tsType\":\"(((data: ExternalItemFunctionData, callback: (err?: Error, result?: ExternalItemValue) => void) => void) | ((data: ExternalItemFunctionData) => Promise))\"}]},\"ExternalItemFunctionData\":{\"description\":\"Data object passed as argument when a function is set for 'externals'.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"context\":{\"description\":\"The directory in which the request is placed.\",\"type\":\"string\"},\"contextInfo\":{\"description\":\"Contextual information.\",\"type\":\"object\",\"tsType\":\"import('../lib/ModuleFactory').ModuleFactoryCreateDataContextInfo\"},\"getResolve\":{\"description\":\"Get a resolve function with the current resolver options.\",\"instanceof\":\"Function\",\"tsType\":\"((options?: ResolveOptions) => ((context: string, request: string, callback: (err?: Error, result?: string) => void) => void) | ((context: string, request: string) => Promise))\"},\"request\":{\"description\":\"The request as written by the user in the require/import expression/statement.\",\"type\":\"string\"}}},\"ExternalItemValue\":{\"description\":\"The dependency used for the external.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"A part of the target of the external.\",\"type\":\"string\",\"minLength\":1}},{\"description\":\"`true`: The dependency name is used as target of the external.\",\"type\":\"boolean\"},{\"description\":\"The target of the external.\",\"type\":\"string\"},{\"type\":\"object\"}]},\"Externals\":{\"description\":\"Specify dependencies that shouldn't be resolved by webpack, but should become dependencies of the resulting bundle. The kind of the dependency depends on `output.libraryTarget`.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"$ref\":\"#/definitions/ExternalItem\"}},{\"$ref\":\"#/definitions/ExternalItem\"}]},\"ExternalsPresets\":{\"description\":\"Enable presets of externals for specific targets.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"electron\":{\"description\":\"Treat common electron built-in modules in main and preload context like 'electron', 'ipc' or 'shell' as external and load them via require() when used.\",\"type\":\"boolean\"},\"electronMain\":{\"description\":\"Treat electron built-in modules in the main context like 'app', 'ipc-main' or 'shell' as external and load them via require() when used.\",\"type\":\"boolean\"},\"electronPreload\":{\"description\":\"Treat electron built-in modules in the preload context like 'web-frame', 'ipc-renderer' or 'shell' as external and load them via require() when used.\",\"type\":\"boolean\"},\"electronRenderer\":{\"description\":\"Treat electron built-in modules in the renderer context like 'web-frame', 'ipc-renderer' or 'shell' as external and load them via require() when used.\",\"type\":\"boolean\"},\"node\":{\"description\":\"Treat node.js built-in modules like fs, path or vm as external and load them via require() when used.\",\"type\":\"boolean\"},\"nwjs\":{\"description\":\"Treat NW.js legacy nw.gui module as external and load it via require() when used.\",\"type\":\"boolean\"},\"web\":{\"description\":\"Treat references to 'http(s)://...' and 'std:...' as external and load them via import when used (Note that this changes execution order as externals are executed before any other code in the chunk).\",\"type\":\"boolean\"},\"webAsync\":{\"description\":\"Treat references to 'http(s)://...' and 'std:...' as external and load them via async import() when used (Note that this external type is an async module, which has various effects on the execution).\",\"type\":\"boolean\"}}},\"ExternalsType\":{\"description\":\"Specifies the default type of externals ('amd*', 'umd*', 'system' and 'jsonp' depend on output.libraryTarget set to the same value).\",\"enum\":[\"var\",\"module\",\"assign\",\"this\",\"window\",\"self\",\"global\",\"commonjs\",\"commonjs2\",\"commonjs-module\",\"amd\",\"amd-require\",\"umd\",\"umd2\",\"jsonp\",\"system\",\"promise\",\"import\",\"script\"]},\"FileCacheOptions\":{\"description\":\"Options object for persistent file-based caching.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"buildDependencies\":{\"description\":\"Dependencies the build depends on (in multiple categories, default categories: 'defaultWebpack').\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"List of dependencies the build depends on.\",\"type\":\"array\",\"items\":{\"description\":\"Request to a dependency (resolved as directory relative to the context directory).\",\"type\":\"string\",\"minLength\":1}}},\"cacheDirectory\":{\"description\":\"Base directory for the cache (defaults to node_modules/.cache/webpack).\",\"type\":\"string\",\"absolutePath\":true},\"cacheLocation\":{\"description\":\"Locations for the cache (defaults to cacheDirectory / name).\",\"type\":\"string\",\"absolutePath\":true},\"hashAlgorithm\":{\"description\":\"Algorithm used for generation the hash (see node.js crypto package).\",\"type\":\"string\"},\"idleTimeout\":{\"description\":\"Time in ms after which idle period the cache storing should happen (only for store: 'pack' or 'idle').\",\"type\":\"number\",\"minimum\":0},\"idleTimeoutForInitialStore\":{\"description\":\"Time in ms after which idle period the initial cache storing should happen (only for store: 'pack' or 'idle').\",\"type\":\"number\",\"minimum\":0},\"immutablePaths\":{\"description\":\"List of paths that are managed by a package manager and contain a version or hash in its path so all files are immutable.\",\"type\":\"array\",\"items\":{\"description\":\"A path to a immutable directory (usually a package manager cache directory).\",\"type\":\"string\",\"absolutePath\":true,\"minLength\":1}},\"managedPaths\":{\"description\":\"List of paths that are managed by a package manager and can be trusted to not be modified otherwise.\",\"type\":\"array\",\"items\":{\"description\":\"A path to a managed directory (usually a node_modules directory).\",\"type\":\"string\",\"absolutePath\":true,\"minLength\":1}},\"maxAge\":{\"description\":\"Time for which unused cache entries stay in the filesystem cache at minimum (in milliseconds).\",\"type\":\"number\",\"minimum\":0},\"maxMemoryGenerations\":{\"description\":\"Number of generations unused cache entries stay in memory cache at minimum (0 = no memory cache used, 1 = may be removed after unused for a single compilation, ..., Infinity: kept forever). Cache entries will be deserialized from disk when removed from memory cache.\",\"type\":\"number\",\"minimum\":0},\"name\":{\"description\":\"Name for the cache. Different names will lead to different coexisting caches.\",\"type\":\"string\"},\"store\":{\"description\":\"When to store data to the filesystem. (pack: Store data when compiler is idle in a single file).\",\"enum\":[\"pack\"]},\"type\":{\"description\":\"Filesystem caching.\",\"enum\":[\"filesystem\"]},\"version\":{\"description\":\"Version of the cache data. Different versions won't allow to reuse the cache and override existing content. Update the version when config changed in a way which doesn't allow to reuse cache. This will invalidate the cache.\",\"type\":\"string\"}},\"required\":[\"type\"]},\"Filename\":{\"description\":\"Specifies the filename of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.\",\"oneOf\":[{\"$ref\":\"#/definitions/FilenameTemplate\"}]},\"FilenameTemplate\":{\"description\":\"Specifies the filename template of output files on disk. You must **not** specify an absolute path here, but the path may contain folders separated by '/'! The specified path is joined with the value of the 'output.path' option to determine the location on disk.\",\"anyOf\":[{\"type\":\"string\",\"absolutePath\":false,\"minLength\":1},{\"instanceof\":\"Function\",\"tsType\":\"((pathData: import(\\\"../lib/Compilation\\\").PathData, assetInfo?: import(\\\"../lib/Compilation\\\").AssetInfo) => string)\"}]},\"FilterItemTypes\":{\"description\":\"Filtering value, regexp or function.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\",\"absolutePath\":false},{\"instanceof\":\"Function\",\"tsType\":\"((value: string) => boolean)\"}]},\"FilterTypes\":{\"description\":\"Filtering values.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Rule to filter.\",\"cli\":{\"helper\":true},\"oneOf\":[{\"$ref\":\"#/definitions/FilterItemTypes\"}]}},{\"$ref\":\"#/definitions/FilterItemTypes\"}]},\"GeneratorOptionsByModuleType\":{\"description\":\"Specify options for each generator.\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"Options for generating.\",\"type\":\"object\",\"additionalProperties\":true},\"properties\":{\"asset\":{\"$ref\":\"#/definitions/AssetGeneratorOptions\"},\"asset/inline\":{\"$ref\":\"#/definitions/AssetInlineGeneratorOptions\"},\"asset/resource\":{\"$ref\":\"#/definitions/AssetResourceGeneratorOptions\"},\"javascript\":{\"$ref\":\"#/definitions/EmptyGeneratorOptions\"},\"javascript/auto\":{\"$ref\":\"#/definitions/EmptyGeneratorOptions\"},\"javascript/dynamic\":{\"$ref\":\"#/definitions/EmptyGeneratorOptions\"},\"javascript/esm\":{\"$ref\":\"#/definitions/EmptyGeneratorOptions\"}}},\"GlobalObject\":{\"description\":\"An expression which is used to address the global object/scope in runtime code.\",\"type\":\"string\",\"minLength\":1},\"HashDigest\":{\"description\":\"Digest type used for the hash.\",\"type\":\"string\"},\"HashDigestLength\":{\"description\":\"Number of chars which are used for the hash.\",\"type\":\"number\",\"minimum\":1},\"HashFunction\":{\"description\":\"Algorithm used for generation the hash (see node.js crypto package).\",\"anyOf\":[{\"type\":\"string\",\"minLength\":1},{\"instanceof\":\"Function\",\"tsType\":\"typeof import('../lib/util/Hash')\"}]},\"HashSalt\":{\"description\":\"Any string which is added to the hash to salt it.\",\"type\":\"string\",\"minLength\":1},\"HotUpdateChunkFilename\":{\"description\":\"The filename of the Hot Update Chunks. They are inside the output.path directory.\",\"type\":\"string\",\"absolutePath\":false},\"HotUpdateGlobal\":{\"description\":\"The global variable used by webpack for loading of hot update chunks.\",\"type\":\"string\"},\"HotUpdateMainFilename\":{\"description\":\"The filename of the Hot Update Main File. It is inside the 'output.path' directory.\",\"type\":\"string\",\"absolutePath\":false},\"IgnoreWarnings\":{\"description\":\"Ignore specific warnings.\",\"type\":\"array\",\"items\":{\"description\":\"Ignore specific warnings.\",\"anyOf\":[{\"description\":\"A RegExp to select the warning message.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"file\":{\"description\":\"A RegExp to select the origin file for the warning.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},\"message\":{\"description\":\"A RegExp to select the warning message.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},\"module\":{\"description\":\"A RegExp to select the origin module for the warning.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"}}},{\"description\":\"A custom function to select warnings based on the raw warning instance.\",\"instanceof\":\"Function\",\"tsType\":\"((warning: import('../lib/WebpackError'), compilation: import('../lib/Compilation')) => boolean)\"}]}},\"IgnoreWarningsNormalized\":{\"description\":\"Ignore specific warnings.\",\"type\":\"array\",\"items\":{\"description\":\"A function to select warnings based on the raw warning instance.\",\"instanceof\":\"Function\",\"tsType\":\"((warning: import('../lib/WebpackError'), compilation: import('../lib/Compilation')) => boolean)\"}},\"Iife\":{\"description\":\"Wrap javascript code into IIFE's to avoid leaking into global scope.\",\"type\":\"boolean\"},\"ImportFunctionName\":{\"description\":\"The name of the native import() function (can be exchanged for a polyfill).\",\"type\":\"string\"},\"ImportMetaName\":{\"description\":\"The name of the native import.meta object (can be exchanged for a polyfill).\",\"type\":\"string\"},\"InfrastructureLogging\":{\"description\":\"Options for infrastructure level logging.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"debug\":{\"description\":\"Enable debug logging for specific loggers.\",\"anyOf\":[{\"description\":\"Enable/Disable debug logging for all loggers.\",\"type\":\"boolean\"},{\"$ref\":\"#/definitions/FilterTypes\"}]},\"level\":{\"description\":\"Log level.\",\"enum\":[\"none\",\"error\",\"warn\",\"info\",\"log\",\"verbose\"]}}},\"JavascriptParserOptions\":{\"description\":\"Parser options for javascript modules.\",\"type\":\"object\",\"additionalProperties\":true,\"properties\":{\"amd\":{\"$ref\":\"#/definitions/Amd\"},\"browserify\":{\"description\":\"Enable/disable special handling for browserify bundles.\",\"type\":\"boolean\"},\"commonjs\":{\"description\":\"Enable/disable parsing of CommonJs syntax.\",\"type\":\"boolean\"},\"commonjsMagicComments\":{\"description\":\"Enable/disable parsing of magic comments in CommonJs syntax.\",\"type\":\"boolean\"},\"exprContextCritical\":{\"description\":\"Enable warnings for full dynamic dependencies.\",\"type\":\"boolean\"},\"exprContextRecursive\":{\"description\":\"Enable recursive directory lookup for full dynamic dependencies.\",\"type\":\"boolean\"},\"exprContextRegExp\":{\"description\":\"Sets the default regular expression for full dynamic dependencies.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"boolean\"}]},\"exprContextRequest\":{\"description\":\"Set the default request for full dynamic dependencies.\",\"type\":\"string\"},\"harmony\":{\"description\":\"Enable/disable parsing of EcmaScript Modules syntax.\",\"type\":\"boolean\"},\"import\":{\"description\":\"Enable/disable parsing of import() syntax.\",\"type\":\"boolean\"},\"node\":{\"$ref\":\"#/definitions/Node\"},\"requireContext\":{\"description\":\"Enable/disable parsing of require.context syntax.\",\"type\":\"boolean\"},\"requireEnsure\":{\"description\":\"Enable/disable parsing of require.ensure syntax.\",\"type\":\"boolean\"},\"requireInclude\":{\"description\":\"Enable/disable parsing of require.include syntax.\",\"type\":\"boolean\"},\"requireJs\":{\"description\":\"Enable/disable parsing of require.js special syntax like require.config, requirejs.config, require.version and requirejs.onError.\",\"type\":\"boolean\"},\"strictExportPresence\":{\"description\":\"Emit errors instead of warnings when imported names don't exist in imported module.\",\"type\":\"boolean\"},\"strictThisContextOnImports\":{\"description\":\"Handle the this context correctly according to the spec for namespace objects.\",\"type\":\"boolean\"},\"system\":{\"description\":\"Enable/disable parsing of System.js special syntax like System.import, System.get, System.set and System.register.\",\"type\":\"boolean\"},\"unknownContextCritical\":{\"description\":\"Enable warnings when using the require function in a not statically analyse-able way.\",\"type\":\"boolean\"},\"unknownContextRecursive\":{\"description\":\"Enable recursive directory lookup when using the require function in a not statically analyse-able way.\",\"type\":\"boolean\"},\"unknownContextRegExp\":{\"description\":\"Sets the regular expression when using the require function in a not statically analyse-able way.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"boolean\"}]},\"unknownContextRequest\":{\"description\":\"Sets the request when using the require function in a not statically analyse-able way.\",\"type\":\"string\"},\"url\":{\"description\":\"Enable/disable parsing of new URL() syntax.\",\"anyOf\":[{\"enum\":[\"relative\"]},{\"type\":\"boolean\"}]},\"worker\":{\"description\":\"Disable or configure parsing of WebWorker syntax like new Worker() or navigator.serviceWorker.register().\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Specify a syntax that should be parsed as WebWorker reference. 'Abc' handles 'new Abc()', 'Abc from xyz' handles 'import { Abc } from \\\"xyz\\\"; new Abc()', 'abc()' handles 'abc()', and combinations are also possible.\",\"type\":\"string\",\"minLength\":1}},{\"type\":\"boolean\"}]},\"wrappedContextCritical\":{\"description\":\"Enable warnings for partial dynamic dependencies.\",\"type\":\"boolean\"},\"wrappedContextRecursive\":{\"description\":\"Enable recursive directory lookup for partial dynamic dependencies.\",\"type\":\"boolean\"},\"wrappedContextRegExp\":{\"description\":\"Set the inner regular expression for partial dynamic dependencies.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"}}},\"Layer\":{\"description\":\"Specifies the layer in which modules of this entrypoint are placed.\",\"anyOf\":[{\"enum\":[null]},{\"type\":\"string\",\"minLength\":1}]},\"Library\":{\"description\":\"Make the output files a library, exporting the exports of the entry point.\",\"anyOf\":[{\"$ref\":\"#/definitions/LibraryName\"},{\"$ref\":\"#/definitions/LibraryOptions\"}]},\"LibraryCustomUmdCommentObject\":{\"description\":\"Set explicit comments for `commonjs`, `commonjs2`, `amd`, and `root`.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"amd\":{\"description\":\"Set comment for `amd` section in UMD.\",\"type\":\"string\"},\"commonjs\":{\"description\":\"Set comment for `commonjs` (exports) section in UMD.\",\"type\":\"string\"},\"commonjs2\":{\"description\":\"Set comment for `commonjs2` (module.exports) section in UMD.\",\"type\":\"string\"},\"root\":{\"description\":\"Set comment for `root` (global variable) section in UMD.\",\"type\":\"string\"}}},\"LibraryCustomUmdObject\":{\"description\":\"Description object for all UMD variants of the library name.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"amd\":{\"description\":\"Name of the exposed AMD library in the UMD.\",\"type\":\"string\",\"minLength\":1},\"commonjs\":{\"description\":\"Name of the exposed commonjs export in the UMD.\",\"type\":\"string\",\"minLength\":1},\"root\":{\"description\":\"Name of the property exposed globally by a UMD library.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Part of the name of the property exposed globally by a UMD library.\",\"type\":\"string\",\"minLength\":1}},{\"type\":\"string\",\"minLength\":1}]}}},\"LibraryExport\":{\"description\":\"Specify which export should be exposed as library.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Part of the export that should be exposed as library.\",\"type\":\"string\",\"minLength\":1}},{\"type\":\"string\",\"minLength\":1}]},\"LibraryName\":{\"description\":\"The name of the library (some types allow unnamed libraries too).\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"A part of the library name.\",\"type\":\"string\",\"minLength\":1},\"minItems\":1},{\"type\":\"string\",\"minLength\":1},{\"$ref\":\"#/definitions/LibraryCustomUmdObject\"}]},\"LibraryOptions\":{\"description\":\"Options for library.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"auxiliaryComment\":{\"$ref\":\"#/definitions/AuxiliaryComment\"},\"export\":{\"$ref\":\"#/definitions/LibraryExport\"},\"name\":{\"$ref\":\"#/definitions/LibraryName\"},\"type\":{\"$ref\":\"#/definitions/LibraryType\"},\"umdNamedDefine\":{\"$ref\":\"#/definitions/UmdNamedDefine\"}},\"required\":[\"type\"]},\"LibraryType\":{\"description\":\"Type of library (types included by default are 'var', 'module', 'assign', 'assign-properties', 'this', 'window', 'self', 'global', 'commonjs', 'commonjs2', 'commonjs-module', 'amd', 'amd-require', 'umd', 'umd2', 'jsonp', 'system', but others might be added by plugins).\",\"anyOf\":[{\"enum\":[\"var\",\"module\",\"assign\",\"assign-properties\",\"this\",\"window\",\"self\",\"global\",\"commonjs\",\"commonjs2\",\"commonjs-module\",\"amd\",\"amd-require\",\"umd\",\"umd2\",\"jsonp\",\"system\"]},{\"type\":\"string\"}]},\"Loader\":{\"description\":\"Custom values available in the loader context.\",\"type\":\"object\"},\"MemoryCacheOptions\":{\"description\":\"Options object for in-memory caching.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"maxGenerations\":{\"description\":\"Number of generations unused cache entries stay in memory cache at minimum (1 = may be removed after unused for a single compilation, ..., Infinity: kept forever).\",\"type\":\"number\",\"minimum\":1},\"type\":{\"description\":\"In memory caching.\",\"enum\":[\"memory\"]}},\"required\":[\"type\"]},\"Mode\":{\"description\":\"Enable production optimizations or development hints.\",\"enum\":[\"development\",\"production\",\"none\"]},\"ModuleFilterItemTypes\":{\"description\":\"Filtering value, regexp or function.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\",\"absolutePath\":false},{\"instanceof\":\"Function\",\"tsType\":\"((name: string, module: import('../lib/stats/DefaultStatsFactoryPlugin').StatsModule, type: 'module' | 'chunk' | 'root-of-chunk' | 'nested') => boolean)\"}]},\"ModuleFilterTypes\":{\"description\":\"Filtering modules.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Rule to filter.\",\"cli\":{\"helper\":true},\"oneOf\":[{\"$ref\":\"#/definitions/ModuleFilterItemTypes\"}]}},{\"$ref\":\"#/definitions/ModuleFilterItemTypes\"}]},\"ModuleOptions\":{\"description\":\"Options affecting the normal modules (`NormalModuleFactory`).\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"defaultRules\":{\"description\":\"An array of rules applied by default for modules.\",\"cli\":{\"exclude\":true},\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetRules\"}]},\"exprContextCritical\":{\"description\":\"Enable warnings for full dynamic dependencies.\",\"type\":\"boolean\"},\"exprContextRecursive\":{\"description\":\"Enable recursive directory lookup for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRecursive'.\",\"type\":\"boolean\"},\"exprContextRegExp\":{\"description\":\"Sets the default regular expression for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRegExp'.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"boolean\"}]},\"exprContextRequest\":{\"description\":\"Set the default request for full dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.exprContextRequest'.\",\"type\":\"string\"},\"generator\":{\"$ref\":\"#/definitions/GeneratorOptionsByModuleType\"},\"noParse\":{\"$ref\":\"#/definitions/NoParse\"},\"parser\":{\"$ref\":\"#/definitions/ParserOptionsByModuleType\"},\"rules\":{\"description\":\"An array of rules applied for modules.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetRules\"}]},\"strictExportPresence\":{\"description\":\"Emit errors instead of warnings when imported names don't exist in imported module. Deprecated: This option has moved to 'module.parser.javascript.strictExportPresence'.\",\"type\":\"boolean\"},\"strictThisContextOnImports\":{\"description\":\"Handle the this context correctly according to the spec for namespace objects. Deprecated: This option has moved to 'module.parser.javascript.strictThisContextOnImports'.\",\"type\":\"boolean\"},\"unknownContextCritical\":{\"description\":\"Enable warnings when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextCritical'.\",\"type\":\"boolean\"},\"unknownContextRecursive\":{\"description\":\"Enable recursive directory lookup when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRecursive'.\",\"type\":\"boolean\"},\"unknownContextRegExp\":{\"description\":\"Sets the regular expression when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRegExp'.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"boolean\"}]},\"unknownContextRequest\":{\"description\":\"Sets the request when using the require function in a not statically analyse-able way. Deprecated: This option has moved to 'module.parser.javascript.unknownContextRequest'.\",\"type\":\"string\"},\"unsafeCache\":{\"description\":\"Cache the resolving of module requests.\",\"anyOf\":[{\"type\":\"boolean\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"wrappedContextCritical\":{\"description\":\"Enable warnings for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextCritical'.\",\"type\":\"boolean\"},\"wrappedContextRecursive\":{\"description\":\"Enable recursive directory lookup for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextRecursive'.\",\"type\":\"boolean\"},\"wrappedContextRegExp\":{\"description\":\"Set the inner regular expression for partial dynamic dependencies. Deprecated: This option has moved to 'module.parser.javascript.wrappedContextRegExp'.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"}}},\"ModuleOptionsNormalized\":{\"description\":\"Options affecting the normal modules (`NormalModuleFactory`).\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"defaultRules\":{\"description\":\"An array of rules applied by default for modules.\",\"cli\":{\"exclude\":true},\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetRules\"}]},\"generator\":{\"$ref\":\"#/definitions/GeneratorOptionsByModuleType\"},\"noParse\":{\"$ref\":\"#/definitions/NoParse\"},\"parser\":{\"$ref\":\"#/definitions/ParserOptionsByModuleType\"},\"rules\":{\"description\":\"An array of rules applied for modules.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetRules\"}]},\"unsafeCache\":{\"description\":\"Cache the resolving of module requests.\",\"anyOf\":[{\"type\":\"boolean\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]}},\"required\":[\"defaultRules\",\"generator\",\"parser\",\"rules\"]},\"Name\":{\"description\":\"Name of the configuration. Used when loading multiple configurations.\",\"type\":\"string\"},\"NoParse\":{\"description\":\"Don't parse files matching. It's matched against the full resolved request.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Don't parse files matching. It's matched against the full resolved request.\",\"anyOf\":[{\"description\":\"A regular expression, when matched the module is not parsed.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"description\":\"An absolute path, when the module starts with this path it is not parsed.\",\"type\":\"string\",\"absolutePath\":true},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"minItems\":1},{\"description\":\"A regular expression, when matched the module is not parsed.\",\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"description\":\"An absolute path, when the module starts with this path it is not parsed.\",\"type\":\"string\",\"absolutePath\":true},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"Node\":{\"description\":\"Include polyfills or mocks for various node stuff.\",\"anyOf\":[{\"enum\":[false]},{\"$ref\":\"#/definitions/NodeOptions\"}]},\"NodeOptions\":{\"description\":\"Options object for node compatibility features.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"__dirname\":{\"description\":\"Include a polyfill for the '__dirname' variable.\",\"enum\":[false,true,\"mock\",\"eval-only\"]},\"__filename\":{\"description\":\"Include a polyfill for the '__filename' variable.\",\"enum\":[false,true,\"mock\",\"eval-only\"]},\"global\":{\"description\":\"Include a polyfill for the 'global' variable.\",\"type\":\"boolean\"}}},\"Optimization\":{\"description\":\"Enables/Disables integrated optimizations.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"checkWasmTypes\":{\"description\":\"Check for incompatible wasm types when importing/exporting from/to ESM.\",\"type\":\"boolean\"},\"chunkIds\":{\"description\":\"Define the algorithm to choose chunk ids (named: readable ids for better debugging, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, total-size: numeric ids focused on minimal total download size, false: no algorithm used, as custom one can be provided via plugin).\",\"enum\":[\"natural\",\"named\",\"deterministic\",\"size\",\"total-size\",false]},\"concatenateModules\":{\"description\":\"Concatenate modules when possible to generate less modules, more efficient code and enable more optimizations by the minimizer.\",\"type\":\"boolean\"},\"emitOnErrors\":{\"description\":\"Emit assets even when errors occur. Critical errors are emitted into the generated code and will cause errors at runtime.\",\"type\":\"boolean\"},\"flagIncludedChunks\":{\"description\":\"Also flag chunks as loaded which contain a subset of the modules.\",\"type\":\"boolean\"},\"innerGraph\":{\"description\":\"Creates a module-internal dependency graph for top level symbols, exports and imports, to improve unused exports detection.\",\"type\":\"boolean\"},\"mangleExports\":{\"description\":\"Rename exports when possible to generate shorter code (depends on optimization.usedExports and optimization.providedExports, true/\\\"deterministic\\\": generate short deterministic names optimized for caching, \\\"size\\\": generate the shortest possible names).\",\"anyOf\":[{\"enum\":[\"size\",\"deterministic\"]},{\"type\":\"boolean\"}]},\"mangleWasmImports\":{\"description\":\"Reduce size of WASM by changing imports to shorter strings.\",\"type\":\"boolean\"},\"mergeDuplicateChunks\":{\"description\":\"Merge chunks which contain the same modules.\",\"type\":\"boolean\"},\"minimize\":{\"description\":\"Enable minimizing the output. Uses optimization.minimizer.\",\"type\":\"boolean\"},\"minimizer\":{\"description\":\"Minimizer(s) to use for minimizing the output.\",\"type\":\"array\",\"cli\":{\"exclude\":true},\"items\":{\"description\":\"Plugin of type object or instanceof Function.\",\"anyOf\":[{\"enum\":[\"...\"]},{\"$ref\":\"#/definitions/WebpackPluginInstance\"},{\"$ref\":\"#/definitions/WebpackPluginFunction\"}]}},\"moduleIds\":{\"description\":\"Define the algorithm to choose module ids (natural: numeric ids in order of usage, named: readable ids for better debugging, hashed: (deprecated) short hashes as ids for better long term caching, deterministic: numeric hash ids for better long term caching, size: numeric ids focused on minimal initial download size, false: no algorithm used, as custom one can be provided via plugin).\",\"enum\":[\"natural\",\"named\",\"hashed\",\"deterministic\",\"size\",false]},\"noEmitOnErrors\":{\"description\":\"Avoid emitting assets when errors occur (deprecated: use 'emitOnErrors' instead).\",\"type\":\"boolean\",\"cli\":{\"exclude\":true}},\"nodeEnv\":{\"description\":\"Set process.env.NODE_ENV to a specific value.\",\"anyOf\":[{\"enum\":[false]},{\"type\":\"string\"}]},\"portableRecords\":{\"description\":\"Generate records with relative paths to be able to move the context folder.\",\"type\":\"boolean\"},\"providedExports\":{\"description\":\"Figure out which exports are provided by modules to generate more efficient code.\",\"type\":\"boolean\"},\"realContentHash\":{\"description\":\"Use real [contenthash] based on final content of the assets.\",\"type\":\"boolean\"},\"removeAvailableModules\":{\"description\":\"Removes modules from chunks when these modules are already included in all parents.\",\"type\":\"boolean\"},\"removeEmptyChunks\":{\"description\":\"Remove chunks which are empty.\",\"type\":\"boolean\"},\"runtimeChunk\":{\"$ref\":\"#/definitions/OptimizationRuntimeChunk\"},\"sideEffects\":{\"description\":\"Skip over modules which contain no side effects when exports are not used (false: disabled, 'flag': only use manually placed side effects flag, true: also analyse source code for side effects).\",\"anyOf\":[{\"enum\":[\"flag\"]},{\"type\":\"boolean\"}]},\"splitChunks\":{\"description\":\"Optimize duplication and caching by splitting chunks by shared modules and cache group.\",\"anyOf\":[{\"enum\":[false]},{\"$ref\":\"#/definitions/OptimizationSplitChunksOptions\"}]},\"usedExports\":{\"description\":\"Figure out which exports are used by modules to mangle export names, omit unused exports and generate more efficient code (true: analyse used exports for each runtime, \\\"global\\\": analyse exports globally for all runtimes combined).\",\"anyOf\":[{\"enum\":[\"global\"]},{\"type\":\"boolean\"}]}}},\"OptimizationRuntimeChunk\":{\"description\":\"Create an additional chunk which contains only the webpack runtime and chunk hash maps.\",\"anyOf\":[{\"enum\":[\"single\",\"multiple\"]},{\"type\":\"boolean\"},{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"name\":{\"description\":\"The name or name factory for the runtime chunks.\",\"anyOf\":[{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]}}}]},\"OptimizationRuntimeChunkNormalized\":{\"description\":\"Create an additional chunk which contains only the webpack runtime and chunk hash maps.\",\"anyOf\":[{\"enum\":[false]},{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"name\":{\"description\":\"The name factory for the runtime chunks.\",\"instanceof\":\"Function\",\"tsType\":\"Function\"}}}]},\"OptimizationSplitChunksCacheGroup\":{\"description\":\"Options object for describing behavior of a cache group selecting modules that should be cached together.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"automaticNameDelimiter\":{\"description\":\"Sets the name delimiter for created chunks.\",\"type\":\"string\",\"minLength\":1},\"chunks\":{\"description\":\"Select chunks for determining cache group content (defaults to \\\"initial\\\", \\\"initial\\\" and \\\"all\\\" requires adding these chunks to the HTML).\",\"anyOf\":[{\"enum\":[\"initial\",\"async\",\"all\"]},{\"instanceof\":\"Function\",\"tsType\":\"((chunk: import('../lib/Chunk')) => boolean)\"}]},\"enforce\":{\"description\":\"Ignore minimum size, minimum chunks and maximum requests and always create chunks for this cache group.\",\"type\":\"boolean\"},\"enforceSizeThreshold\":{\"description\":\"Size threshold at which splitting is enforced and other restrictions (minRemainingSize, maxAsyncRequests, maxInitialRequests) are ignored.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"filename\":{\"description\":\"Sets the template for the filename for created chunks.\",\"anyOf\":[{\"type\":\"string\",\"absolutePath\":false,\"minLength\":1},{\"instanceof\":\"Function\",\"tsType\":\"((pathData: import(\\\"../lib/Compilation\\\").PathData, assetInfo?: import(\\\"../lib/Compilation\\\").AssetInfo) => string)\"}]},\"idHint\":{\"description\":\"Sets the hint for chunk id.\",\"type\":\"string\"},\"layer\":{\"description\":\"Assign modules to a cache group by module layer.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"maxAsyncRequests\":{\"description\":\"Maximum number of requests which are accepted for on-demand loading.\",\"type\":\"number\",\"minimum\":1},\"maxAsyncSize\":{\"description\":\"Maximal size hint for the on-demand chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"maxInitialRequests\":{\"description\":\"Maximum number of initial chunks which are accepted for an entry point.\",\"type\":\"number\",\"minimum\":1},\"maxInitialSize\":{\"description\":\"Maximal size hint for the initial chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"maxSize\":{\"description\":\"Maximal size hint for the created chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"minChunks\":{\"description\":\"Minimum number of times a module has to be duplicated until it's considered for splitting.\",\"type\":\"number\",\"minimum\":1},\"minRemainingSize\":{\"description\":\"Minimal size for the chunks the stay after moving the modules to a new chunk.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"minSize\":{\"description\":\"Minimal size for the created chunk.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"name\":{\"description\":\"Give chunks for this cache group a name (chunks with equal name are merged).\",\"anyOf\":[{\"enum\":[false]},{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"priority\":{\"description\":\"Priority of this cache group.\",\"type\":\"number\"},\"reuseExistingChunk\":{\"description\":\"Try to reuse existing chunk (with name) when it has matching modules.\",\"type\":\"boolean\"},\"test\":{\"description\":\"Assign modules to a cache group by module name.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"type\":{\"description\":\"Assign modules to a cache group by module type.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"usedExports\":{\"description\":\"Compare used exports when checking common modules. Modules will only be put in the same chunk when exports are equal.\",\"type\":\"boolean\"}}},\"OptimizationSplitChunksGetCacheGroups\":{\"description\":\"A function returning cache groups.\",\"instanceof\":\"Function\",\"tsType\":\"((module: import('../lib/Module')) => OptimizationSplitChunksCacheGroup | OptimizationSplitChunksCacheGroup[] | void)\"},\"OptimizationSplitChunksOptions\":{\"description\":\"Options object for splitting chunks into smaller chunks.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"automaticNameDelimiter\":{\"description\":\"Sets the name delimiter for created chunks.\",\"type\":\"string\",\"minLength\":1},\"cacheGroups\":{\"description\":\"Assign modules to a cache group (modules from different cache groups are tried to keep in separate chunks, default categories: 'default', 'defaultVendors').\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"Configuration for a cache group.\",\"anyOf\":[{\"enum\":[false]},{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"},{\"$ref\":\"#/definitions/OptimizationSplitChunksCacheGroup\"}]},\"not\":{\"description\":\"Using the cacheGroup shorthand syntax with a cache group named 'test' is a potential config error\\nDid you intent to define a cache group with a test instead?\\ncacheGroups: {\\n : {\\n test: ...\\n }\\n}.\",\"type\":\"object\",\"additionalProperties\":true,\"properties\":{\"test\":{\"description\":\"The test property is a cache group name, but using the test option of the cache group could be intended instead.\",\"anyOf\":[{\"instanceof\":\"Function\",\"tsType\":\"Function\"},{\"type\":\"string\"},{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"}]}},\"required\":[\"test\"]}},\"chunks\":{\"description\":\"Select chunks for determining shared modules (defaults to \\\"async\\\", \\\"initial\\\" and \\\"all\\\" requires adding these chunks to the HTML).\",\"anyOf\":[{\"enum\":[\"initial\",\"async\",\"all\"]},{\"instanceof\":\"Function\",\"tsType\":\"((chunk: import('../lib/Chunk')) => boolean)\"}]},\"defaultSizeTypes\":{\"description\":\"Sets the size types which are used when a number is used for sizes.\",\"type\":\"array\",\"items\":{\"description\":\"Size type, like 'javascript', 'webassembly'.\",\"type\":\"string\"},\"minLength\":1},\"enforceSizeThreshold\":{\"description\":\"Size threshold at which splitting is enforced and other restrictions (minRemainingSize, maxAsyncRequests, maxInitialRequests) are ignored.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"fallbackCacheGroup\":{\"description\":\"Options for modules not selected by any other cache group.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"automaticNameDelimiter\":{\"description\":\"Sets the name delimiter for created chunks.\",\"type\":\"string\",\"minLength\":1},\"maxAsyncSize\":{\"description\":\"Maximal size hint for the on-demand chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"maxInitialSize\":{\"description\":\"Maximal size hint for the initial chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"maxSize\":{\"description\":\"Maximal size hint for the created chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"minSize\":{\"description\":\"Minimal size for the created chunk.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]}}},\"filename\":{\"description\":\"Sets the template for the filename for created chunks.\",\"anyOf\":[{\"type\":\"string\",\"absolutePath\":false,\"minLength\":1},{\"instanceof\":\"Function\",\"tsType\":\"((pathData: import(\\\"../lib/Compilation\\\").PathData, assetInfo?: import(\\\"../lib/Compilation\\\").AssetInfo) => string)\"}]},\"hidePathInfo\":{\"description\":\"Prevents exposing path info when creating names for parts splitted by maxSize.\",\"type\":\"boolean\"},\"maxAsyncRequests\":{\"description\":\"Maximum number of requests which are accepted for on-demand loading.\",\"type\":\"number\",\"minimum\":1},\"maxAsyncSize\":{\"description\":\"Maximal size hint for the on-demand chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"maxInitialRequests\":{\"description\":\"Maximum number of initial chunks which are accepted for an entry point.\",\"type\":\"number\",\"minimum\":1},\"maxInitialSize\":{\"description\":\"Maximal size hint for the initial chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"maxSize\":{\"description\":\"Maximal size hint for the created chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"minChunks\":{\"description\":\"Minimum number of times a module has to be duplicated until it's considered for splitting.\",\"type\":\"number\",\"minimum\":1},\"minRemainingSize\":{\"description\":\"Minimal size for the chunks the stay after moving the modules to a new chunk.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"minSize\":{\"description\":\"Minimal size for the created chunks.\",\"oneOf\":[{\"$ref\":\"#/definitions/OptimizationSplitChunksSizes\"}]},\"name\":{\"description\":\"Give chunks created a name (chunks with equal name are merged).\",\"anyOf\":[{\"enum\":[false]},{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"Function\"}]},\"usedExports\":{\"description\":\"Compare used exports when checking common modules. Modules will only be put in the same chunk when exports are equal.\",\"type\":\"boolean\"}}},\"OptimizationSplitChunksSizes\":{\"description\":\"Size description for limits.\",\"anyOf\":[{\"description\":\"Size of the javascript part of the chunk.\",\"type\":\"number\",\"minimum\":0},{\"description\":\"Specify size limits per size type.\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"Size of the part of the chunk with the type of the key.\",\"type\":\"number\"}}]},\"Output\":{\"description\":\"Options affecting the output of the compilation. `output` options tell webpack how to write the compiled files to disk.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"assetModuleFilename\":{\"$ref\":\"#/definitions/AssetModuleFilename\"},\"auxiliaryComment\":{\"cli\":{\"exclude\":true},\"oneOf\":[{\"$ref\":\"#/definitions/AuxiliaryComment\"}]},\"charset\":{\"$ref\":\"#/definitions/Charset\"},\"chunkFilename\":{\"$ref\":\"#/definitions/ChunkFilename\"},\"chunkFormat\":{\"$ref\":\"#/definitions/ChunkFormat\"},\"chunkLoadTimeout\":{\"$ref\":\"#/definitions/ChunkLoadTimeout\"},\"chunkLoading\":{\"$ref\":\"#/definitions/ChunkLoading\"},\"chunkLoadingGlobal\":{\"$ref\":\"#/definitions/ChunkLoadingGlobal\"},\"clean\":{\"$ref\":\"#/definitions/Clean\"},\"compareBeforeEmit\":{\"$ref\":\"#/definitions/CompareBeforeEmit\"},\"crossOriginLoading\":{\"$ref\":\"#/definitions/CrossOriginLoading\"},\"devtoolFallbackModuleFilenameTemplate\":{\"$ref\":\"#/definitions/DevtoolFallbackModuleFilenameTemplate\"},\"devtoolModuleFilenameTemplate\":{\"$ref\":\"#/definitions/DevtoolModuleFilenameTemplate\"},\"devtoolNamespace\":{\"$ref\":\"#/definitions/DevtoolNamespace\"},\"enabledChunkLoadingTypes\":{\"$ref\":\"#/definitions/EnabledChunkLoadingTypes\"},\"enabledLibraryTypes\":{\"$ref\":\"#/definitions/EnabledLibraryTypes\"},\"enabledWasmLoadingTypes\":{\"$ref\":\"#/definitions/EnabledWasmLoadingTypes\"},\"environment\":{\"$ref\":\"#/definitions/Environment\"},\"filename\":{\"$ref\":\"#/definitions/Filename\"},\"globalObject\":{\"$ref\":\"#/definitions/GlobalObject\"},\"hashDigest\":{\"$ref\":\"#/definitions/HashDigest\"},\"hashDigestLength\":{\"$ref\":\"#/definitions/HashDigestLength\"},\"hashFunction\":{\"$ref\":\"#/definitions/HashFunction\"},\"hashSalt\":{\"$ref\":\"#/definitions/HashSalt\"},\"hotUpdateChunkFilename\":{\"$ref\":\"#/definitions/HotUpdateChunkFilename\"},\"hotUpdateGlobal\":{\"$ref\":\"#/definitions/HotUpdateGlobal\"},\"hotUpdateMainFilename\":{\"$ref\":\"#/definitions/HotUpdateMainFilename\"},\"iife\":{\"$ref\":\"#/definitions/Iife\"},\"importFunctionName\":{\"$ref\":\"#/definitions/ImportFunctionName\"},\"importMetaName\":{\"$ref\":\"#/definitions/ImportMetaName\"},\"library\":{\"$ref\":\"#/definitions/Library\"},\"libraryExport\":{\"cli\":{\"exclude\":true},\"oneOf\":[{\"$ref\":\"#/definitions/LibraryExport\"}]},\"libraryTarget\":{\"cli\":{\"exclude\":true},\"oneOf\":[{\"$ref\":\"#/definitions/LibraryType\"}]},\"module\":{\"$ref\":\"#/definitions/OutputModule\"},\"path\":{\"$ref\":\"#/definitions/Path\"},\"pathinfo\":{\"$ref\":\"#/definitions/Pathinfo\"},\"publicPath\":{\"$ref\":\"#/definitions/PublicPath\"},\"scriptType\":{\"$ref\":\"#/definitions/ScriptType\"},\"sourceMapFilename\":{\"$ref\":\"#/definitions/SourceMapFilename\"},\"sourcePrefix\":{\"$ref\":\"#/definitions/SourcePrefix\"},\"strictModuleErrorHandling\":{\"$ref\":\"#/definitions/StrictModuleErrorHandling\"},\"strictModuleExceptionHandling\":{\"$ref\":\"#/definitions/StrictModuleExceptionHandling\"},\"umdNamedDefine\":{\"cli\":{\"exclude\":true},\"oneOf\":[{\"$ref\":\"#/definitions/UmdNamedDefine\"}]},\"uniqueName\":{\"$ref\":\"#/definitions/UniqueName\"},\"wasmLoading\":{\"$ref\":\"#/definitions/WasmLoading\"},\"webassemblyModuleFilename\":{\"$ref\":\"#/definitions/WebassemblyModuleFilename\"},\"workerChunkLoading\":{\"$ref\":\"#/definitions/ChunkLoading\"},\"workerWasmLoading\":{\"$ref\":\"#/definitions/WasmLoading\"}}},\"OutputModule\":{\"description\":\"Output javascript files as module source type.\",\"type\":\"boolean\"},\"OutputNormalized\":{\"description\":\"Normalized options affecting the output of the compilation. `output` options tell webpack how to write the compiled files to disk.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"assetModuleFilename\":{\"$ref\":\"#/definitions/AssetModuleFilename\"},\"charset\":{\"$ref\":\"#/definitions/Charset\"},\"chunkFilename\":{\"$ref\":\"#/definitions/ChunkFilename\"},\"chunkFormat\":{\"$ref\":\"#/definitions/ChunkFormat\"},\"chunkLoadTimeout\":{\"$ref\":\"#/definitions/ChunkLoadTimeout\"},\"chunkLoading\":{\"$ref\":\"#/definitions/ChunkLoading\"},\"chunkLoadingGlobal\":{\"$ref\":\"#/definitions/ChunkLoadingGlobal\"},\"clean\":{\"$ref\":\"#/definitions/Clean\"},\"compareBeforeEmit\":{\"$ref\":\"#/definitions/CompareBeforeEmit\"},\"crossOriginLoading\":{\"$ref\":\"#/definitions/CrossOriginLoading\"},\"devtoolFallbackModuleFilenameTemplate\":{\"$ref\":\"#/definitions/DevtoolFallbackModuleFilenameTemplate\"},\"devtoolModuleFilenameTemplate\":{\"$ref\":\"#/definitions/DevtoolModuleFilenameTemplate\"},\"devtoolNamespace\":{\"$ref\":\"#/definitions/DevtoolNamespace\"},\"enabledChunkLoadingTypes\":{\"$ref\":\"#/definitions/EnabledChunkLoadingTypes\"},\"enabledLibraryTypes\":{\"$ref\":\"#/definitions/EnabledLibraryTypes\"},\"enabledWasmLoadingTypes\":{\"$ref\":\"#/definitions/EnabledWasmLoadingTypes\"},\"environment\":{\"$ref\":\"#/definitions/Environment\"},\"filename\":{\"$ref\":\"#/definitions/Filename\"},\"globalObject\":{\"$ref\":\"#/definitions/GlobalObject\"},\"hashDigest\":{\"$ref\":\"#/definitions/HashDigest\"},\"hashDigestLength\":{\"$ref\":\"#/definitions/HashDigestLength\"},\"hashFunction\":{\"$ref\":\"#/definitions/HashFunction\"},\"hashSalt\":{\"$ref\":\"#/definitions/HashSalt\"},\"hotUpdateChunkFilename\":{\"$ref\":\"#/definitions/HotUpdateChunkFilename\"},\"hotUpdateGlobal\":{\"$ref\":\"#/definitions/HotUpdateGlobal\"},\"hotUpdateMainFilename\":{\"$ref\":\"#/definitions/HotUpdateMainFilename\"},\"iife\":{\"$ref\":\"#/definitions/Iife\"},\"importFunctionName\":{\"$ref\":\"#/definitions/ImportFunctionName\"},\"importMetaName\":{\"$ref\":\"#/definitions/ImportMetaName\"},\"library\":{\"$ref\":\"#/definitions/LibraryOptions\"},\"module\":{\"$ref\":\"#/definitions/OutputModule\"},\"path\":{\"$ref\":\"#/definitions/Path\"},\"pathinfo\":{\"$ref\":\"#/definitions/Pathinfo\"},\"publicPath\":{\"$ref\":\"#/definitions/PublicPath\"},\"scriptType\":{\"$ref\":\"#/definitions/ScriptType\"},\"sourceMapFilename\":{\"$ref\":\"#/definitions/SourceMapFilename\"},\"sourcePrefix\":{\"$ref\":\"#/definitions/SourcePrefix\"},\"strictModuleErrorHandling\":{\"$ref\":\"#/definitions/StrictModuleErrorHandling\"},\"strictModuleExceptionHandling\":{\"$ref\":\"#/definitions/StrictModuleExceptionHandling\"},\"uniqueName\":{\"$ref\":\"#/definitions/UniqueName\"},\"wasmLoading\":{\"$ref\":\"#/definitions/WasmLoading\"},\"webassemblyModuleFilename\":{\"$ref\":\"#/definitions/WebassemblyModuleFilename\"},\"workerChunkLoading\":{\"$ref\":\"#/definitions/ChunkLoading\"},\"workerWasmLoading\":{\"$ref\":\"#/definitions/WasmLoading\"}}},\"Parallelism\":{\"description\":\"The number of parallel processed modules in the compilation.\",\"type\":\"number\",\"minimum\":1},\"ParserOptionsByModuleType\":{\"description\":\"Specify options for each parser.\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"Options for parsing.\",\"type\":\"object\",\"additionalProperties\":true},\"properties\":{\"asset\":{\"$ref\":\"#/definitions/AssetParserOptions\"},\"asset/inline\":{\"$ref\":\"#/definitions/EmptyParserOptions\"},\"asset/resource\":{\"$ref\":\"#/definitions/EmptyParserOptions\"},\"asset/source\":{\"$ref\":\"#/definitions/EmptyParserOptions\"},\"javascript\":{\"$ref\":\"#/definitions/JavascriptParserOptions\"},\"javascript/auto\":{\"$ref\":\"#/definitions/JavascriptParserOptions\"},\"javascript/dynamic\":{\"$ref\":\"#/definitions/JavascriptParserOptions\"},\"javascript/esm\":{\"$ref\":\"#/definitions/JavascriptParserOptions\"}}},\"Path\":{\"description\":\"The output directory as **absolute path** (required).\",\"type\":\"string\",\"absolutePath\":true},\"Pathinfo\":{\"description\":\"Include comments with information about the modules.\",\"anyOf\":[{\"enum\":[\"verbose\"]},{\"type\":\"boolean\"}]},\"Performance\":{\"description\":\"Configuration for web performance recommendations.\",\"anyOf\":[{\"enum\":[false]},{\"$ref\":\"#/definitions/PerformanceOptions\"}]},\"PerformanceOptions\":{\"description\":\"Configuration object for web performance recommendations.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"assetFilter\":{\"description\":\"Filter function to select assets that are checked.\",\"instanceof\":\"Function\",\"tsType\":\"Function\"},\"hints\":{\"description\":\"Sets the format of the hints: warnings, errors or nothing at all.\",\"enum\":[false,\"warning\",\"error\"]},\"maxAssetSize\":{\"description\":\"File size limit (in bytes) when exceeded, that webpack will provide performance hints.\",\"type\":\"number\"},\"maxEntrypointSize\":{\"description\":\"Total size of an entry point (in bytes).\",\"type\":\"number\"}}},\"Plugins\":{\"description\":\"Add additional plugins to the compiler.\",\"type\":\"array\",\"items\":{\"description\":\"Plugin of type object or instanceof Function.\",\"anyOf\":[{\"$ref\":\"#/definitions/WebpackPluginInstance\"},{\"$ref\":\"#/definitions/WebpackPluginFunction\"}]}},\"Profile\":{\"description\":\"Capture timing information for each module.\",\"type\":\"boolean\"},\"PublicPath\":{\"description\":\"The 'publicPath' specifies the public URL address of the output files when referenced in a browser.\",\"anyOf\":[{\"enum\":[\"auto\"]},{\"$ref\":\"#/definitions/RawPublicPath\"}]},\"RawPublicPath\":{\"description\":\"The 'publicPath' specifies the public URL address of the output files when referenced in a browser.\",\"anyOf\":[{\"type\":\"string\"},{\"instanceof\":\"Function\",\"tsType\":\"((pathData: import(\\\"../lib/Compilation\\\").PathData, assetInfo?: import(\\\"../lib/Compilation\\\").AssetInfo) => string)\"}]},\"RecordsInputPath\":{\"description\":\"Store compiler state to a json file.\",\"anyOf\":[{\"enum\":[false]},{\"type\":\"string\",\"absolutePath\":true}]},\"RecordsOutputPath\":{\"description\":\"Load compiler state from a json file.\",\"anyOf\":[{\"enum\":[false]},{\"type\":\"string\",\"absolutePath\":true}]},\"RecordsPath\":{\"description\":\"Store/Load compiler state from/to a json file. This will result in persistent ids of modules and chunks. An absolute path is expected. `recordsPath` is used for `recordsInputPath` and `recordsOutputPath` if they left undefined.\",\"anyOf\":[{\"enum\":[false]},{\"type\":\"string\",\"absolutePath\":true}]},\"Resolve\":{\"description\":\"Options for the resolver.\",\"oneOf\":[{\"$ref\":\"#/definitions/ResolveOptions\"}]},\"ResolveAlias\":{\"description\":\"Redirect module requests.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Alias configuration.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"alias\":{\"description\":\"New request.\",\"anyOf\":[{\"description\":\"Multiple alternative requests.\",\"type\":\"array\",\"items\":{\"description\":\"One choice of request.\",\"type\":\"string\",\"minLength\":1}},{\"description\":\"Ignore request (replace with empty module).\",\"enum\":[false]},{\"description\":\"New request.\",\"type\":\"string\",\"minLength\":1}]},\"name\":{\"description\":\"Request to be redirected.\",\"type\":\"string\"},\"onlyModule\":{\"description\":\"Redirect only exact matching request.\",\"type\":\"boolean\"}},\"required\":[\"alias\",\"name\"]}},{\"type\":\"object\",\"additionalProperties\":{\"description\":\"New request.\",\"anyOf\":[{\"description\":\"Multiple alternative requests.\",\"type\":\"array\",\"items\":{\"description\":\"One choice of request.\",\"type\":\"string\",\"minLength\":1}},{\"description\":\"Ignore request (replace with empty module).\",\"enum\":[false]},{\"description\":\"New request.\",\"type\":\"string\",\"minLength\":1}]}}]},\"ResolveLoader\":{\"description\":\"Options for the resolver when resolving loaders.\",\"oneOf\":[{\"$ref\":\"#/definitions/ResolveOptions\"}]},\"ResolveOptions\":{\"description\":\"Options object for resolving requests.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"alias\":{\"$ref\":\"#/definitions/ResolveAlias\"},\"aliasFields\":{\"description\":\"Fields in the description file (usually package.json) which are used to redirect requests inside the module.\",\"type\":\"array\",\"items\":{\"description\":\"Field in the description file (usually package.json) which are used to redirect requests inside the module.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Part of the field path in the description file (usually package.json) which are used to redirect requests inside the module.\",\"type\":\"string\",\"minLength\":1}},{\"type\":\"string\",\"minLength\":1}]}},\"byDependency\":{\"description\":\"Extra resolve options per dependency category. Typical categories are \\\"commonjs\\\", \\\"amd\\\", \\\"esm\\\".\",\"type\":\"object\",\"additionalProperties\":{\"description\":\"Options object for resolving requests.\",\"oneOf\":[{\"$ref\":\"#/definitions/ResolveOptions\"}]}},\"cache\":{\"description\":\"Enable caching of successfully resolved requests (cache entries are revalidated).\",\"type\":\"boolean\"},\"cachePredicate\":{\"description\":\"Predicate function to decide which requests should be cached.\",\"instanceof\":\"Function\",\"tsType\":\"((request: import('enhanced-resolve').ResolveRequest) => boolean)\"},\"cacheWithContext\":{\"description\":\"Include the context information in the cache identifier when caching.\",\"type\":\"boolean\"},\"conditionNames\":{\"description\":\"Condition names for exports field entry point.\",\"type\":\"array\",\"items\":{\"description\":\"Condition names for exports field entry point.\",\"type\":\"string\"}},\"descriptionFiles\":{\"description\":\"Filenames used to find a description file (like a package.json).\",\"type\":\"array\",\"items\":{\"description\":\"Filename used to find a description file (like a package.json).\",\"type\":\"string\",\"minLength\":1}},\"enforceExtension\":{\"description\":\"Enforce the resolver to use one of the extensions from the extensions option (User must specify requests without extension).\",\"type\":\"boolean\"},\"exportsFields\":{\"description\":\"Field names from the description file (usually package.json) which are used to provide entry points of a package.\",\"type\":\"array\",\"items\":{\"description\":\"Field name from the description file (usually package.json) which is used to provide entry points of a package.\",\"type\":\"string\"}},\"extensions\":{\"description\":\"Extensions added to the request when trying to find the file.\",\"type\":\"array\",\"items\":{\"description\":\"Extension added to the request when trying to find the file.\",\"type\":\"string\",\"minLength\":1}},\"fallback\":{\"description\":\"Redirect module requests when normal resolving fails.\",\"oneOf\":[{\"$ref\":\"#/definitions/ResolveAlias\"}]},\"fileSystem\":{\"description\":\"Filesystem for the resolver.\",\"tsType\":\"(import('../lib/util/fs').InputFileSystem)\"},\"fullySpecified\":{\"description\":\"Treats the request specified by the user as fully specified, meaning no extensions are added and the mainFiles in directories are not resolved (This doesn't affect requests from mainFields, aliasFields or aliases).\",\"type\":\"boolean\"},\"importsFields\":{\"description\":\"Field names from the description file (usually package.json) which are used to provide internal request of a package (requests starting with # are considered as internal).\",\"type\":\"array\",\"items\":{\"description\":\"Field name from the description file (usually package.json) which is used to provide internal request of a package (requests starting with # are considered as internal).\",\"type\":\"string\"}},\"mainFields\":{\"description\":\"Field names from the description file (package.json) which are used to find the default entry point.\",\"type\":\"array\",\"items\":{\"description\":\"Field name from the description file (package.json) which are used to find the default entry point.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Part of the field path from the description file (package.json) which are used to find the default entry point.\",\"type\":\"string\",\"minLength\":1}},{\"type\":\"string\",\"minLength\":1}]}},\"mainFiles\":{\"description\":\"Filenames used to find the default entry point if there is no description file or main field.\",\"type\":\"array\",\"items\":{\"description\":\"Filename used to find the default entry point if there is no description file or main field.\",\"type\":\"string\",\"minLength\":1}},\"modules\":{\"description\":\"Folder names or directory paths where to find modules.\",\"type\":\"array\",\"items\":{\"description\":\"Folder name or directory path where to find modules.\",\"type\":\"string\",\"minLength\":1}},\"plugins\":{\"description\":\"Plugins for the resolver.\",\"type\":\"array\",\"cli\":{\"exclude\":true},\"items\":{\"description\":\"Plugin of type object or instanceof Function.\",\"anyOf\":[{\"enum\":[\"...\"]},{\"$ref\":\"#/definitions/ResolvePluginInstance\"}]}},\"preferAbsolute\":{\"description\":\"Prefer to resolve server-relative URLs (starting with '/') as absolute paths before falling back to resolve in 'resolve.roots'.\",\"type\":\"boolean\"},\"preferRelative\":{\"description\":\"Prefer to resolve module requests as relative request and fallback to resolving as module.\",\"type\":\"boolean\"},\"resolver\":{\"description\":\"Custom resolver.\",\"tsType\":\"(import('enhanced-resolve').Resolver)\"},\"restrictions\":{\"description\":\"A list of resolve restrictions. Resolve results must fulfill all of these restrictions to resolve successfully. Other resolve paths are taken when restrictions are not met.\",\"type\":\"array\",\"items\":{\"description\":\"Resolve restriction. Resolve result must fulfill this restriction.\",\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\",\"absolutePath\":true,\"minLength\":1}]}},\"roots\":{\"description\":\"A list of directories in which requests that are server-relative URLs (starting with '/') are resolved.\",\"type\":\"array\",\"items\":{\"description\":\"Directory in which requests that are server-relative URLs (starting with '/') are resolved.\",\"type\":\"string\"}},\"symlinks\":{\"description\":\"Enable resolving symlinks to the original location.\",\"type\":\"boolean\"},\"unsafeCache\":{\"description\":\"Enable caching of successfully resolved requests (cache entries are not revalidated).\",\"anyOf\":[{\"type\":\"boolean\"},{\"type\":\"object\",\"additionalProperties\":true}]},\"useSyncFileSystemCalls\":{\"description\":\"Use synchronous filesystem calls for the resolver.\",\"type\":\"boolean\"}}},\"ResolvePluginInstance\":{\"description\":\"Plugin instance.\",\"type\":\"object\",\"additionalProperties\":true,\"properties\":{\"apply\":{\"description\":\"The run point of the plugin, required method.\",\"instanceof\":\"Function\",\"tsType\":\"(resolver: import('enhanced-resolve').Resolver) => void\"}},\"required\":[\"apply\"]},\"RuleSetCondition\":{\"description\":\"A condition matcher.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\"},{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"and\":{\"description\":\"Logical AND.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditions\"}]},\"not\":{\"description\":\"Logical NOT.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditions\"}]},\"or\":{\"description\":\"Logical OR.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditions\"}]}}},{\"instanceof\":\"Function\",\"tsType\":\"((value: string) => boolean)\"},{\"$ref\":\"#/definitions/RuleSetConditions\"}]},\"RuleSetConditionAbsolute\":{\"description\":\"A condition matcher matching an absolute path.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\",\"absolutePath\":true},{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"and\":{\"description\":\"Logical AND.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionsAbsolute\"}]},\"not\":{\"description\":\"Logical NOT.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionsAbsolute\"}]},\"or\":{\"description\":\"Logical OR.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionsAbsolute\"}]}}},{\"instanceof\":\"Function\",\"tsType\":\"((value: string) => boolean)\"},{\"$ref\":\"#/definitions/RuleSetConditionsAbsolute\"}]},\"RuleSetConditionOrConditions\":{\"description\":\"One or multiple rule conditions.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"$ref\":\"#/definitions/RuleSetCondition\"},{\"$ref\":\"#/definitions/RuleSetConditions\"}]},\"RuleSetConditionOrConditionsAbsolute\":{\"description\":\"One or multiple rule conditions matching an absolute path.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"$ref\":\"#/definitions/RuleSetConditionAbsolute\"},{\"$ref\":\"#/definitions/RuleSetConditionsAbsolute\"}]},\"RuleSetConditions\":{\"description\":\"A list of rule conditions.\",\"type\":\"array\",\"items\":{\"description\":\"A rule condition.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetCondition\"}]}},\"RuleSetConditionsAbsolute\":{\"description\":\"A list of rule conditions matching an absolute path.\",\"type\":\"array\",\"items\":{\"description\":\"A rule condition matching an absolute path.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionAbsolute\"}]}},\"RuleSetLoader\":{\"description\":\"A loader request.\",\"type\":\"string\",\"minLength\":1},\"RuleSetLoaderOptions\":{\"description\":\"Options passed to a loader.\",\"anyOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"RuleSetRule\":{\"description\":\"A rule description with conditions and effects for modules.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"compiler\":{\"description\":\"Match the child compiler name.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditions\"}]},\"dependency\":{\"description\":\"Match dependency type.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditions\"}]},\"descriptionData\":{\"description\":\"Match values of properties in the description file (usually package.json).\",\"type\":\"object\",\"additionalProperties\":{\"$ref\":\"#/definitions/RuleSetConditionOrConditions\"}},\"enforce\":{\"description\":\"Enforce this rule as pre or post step.\",\"enum\":[\"pre\",\"post\"]},\"exclude\":{\"description\":\"Shortcut for resource.exclude.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditionsAbsolute\"}]},\"generator\":{\"description\":\"The options for the module generator.\",\"type\":\"object\"},\"include\":{\"description\":\"Shortcut for resource.include.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditionsAbsolute\"}]},\"issuer\":{\"description\":\"Match the issuer of the module (The module pointing to this module).\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditionsAbsolute\"}]},\"issuerLayer\":{\"description\":\"Match layer of the issuer of this module (The module pointing to this module).\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditions\"}]},\"layer\":{\"description\":\"Specifies the layer in which the module should be placed in.\",\"type\":\"string\"},\"loader\":{\"description\":\"Shortcut for use.loader.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetLoader\"}]},\"mimetype\":{\"description\":\"Match module mimetype when load from Data URI.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditions\"}]},\"oneOf\":{\"description\":\"Only execute the first matching rule in this array.\",\"type\":\"array\",\"items\":{\"description\":\"A rule.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetRule\"}]}},\"options\":{\"description\":\"Shortcut for use.options.\",\"cli\":{\"exclude\":true},\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetLoaderOptions\"}]},\"parser\":{\"description\":\"Options for parsing.\",\"type\":\"object\",\"additionalProperties\":true},\"realResource\":{\"description\":\"Match the real resource path of the module.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditionsAbsolute\"}]},\"resolve\":{\"description\":\"Options for the resolver.\",\"type\":\"object\",\"oneOf\":[{\"$ref\":\"#/definitions/ResolveOptions\"}]},\"resource\":{\"description\":\"Match the resource path of the module.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditionsAbsolute\"}]},\"resourceFragment\":{\"description\":\"Match the resource fragment of the module.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditions\"}]},\"resourceQuery\":{\"description\":\"Match the resource query of the module.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditions\"}]},\"rules\":{\"description\":\"Match and execute these rules when this rule is matched.\",\"type\":\"array\",\"items\":{\"description\":\"A rule.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetRule\"}]}},\"sideEffects\":{\"description\":\"Flags a module as with or without side effects.\",\"type\":\"boolean\"},\"test\":{\"description\":\"Shortcut for resource.test.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetConditionOrConditionsAbsolute\"}]},\"type\":{\"description\":\"Module type to use for the module.\",\"type\":\"string\"},\"use\":{\"description\":\"Modifiers applied to the module when rule is matched.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetUse\"}]}}},\"RuleSetRules\":{\"description\":\"A list of rules.\",\"type\":\"array\",\"items\":{\"description\":\"A rule.\",\"anyOf\":[{\"cli\":{\"exclude\":true},\"enum\":[\"...\"]},{\"$ref\":\"#/definitions/RuleSetRule\"}]}},\"RuleSetUse\":{\"description\":\"A list of descriptions of loaders applied.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"An use item.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetUseItem\"}]}},{\"instanceof\":\"Function\",\"tsType\":\"((data: { resource: string, realResource: string, resourceQuery: string, issuer: string, compiler: string }) => RuleSetUseItem[])\"},{\"$ref\":\"#/definitions/RuleSetUseItem\"}]},\"RuleSetUseItem\":{\"description\":\"A description of an applied loader.\",\"anyOf\":[{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"ident\":{\"description\":\"Unique loader options identifier.\",\"type\":\"string\"},\"loader\":{\"description\":\"Loader name.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetLoader\"}]},\"options\":{\"description\":\"Loader options.\",\"oneOf\":[{\"$ref\":\"#/definitions/RuleSetLoaderOptions\"}]}}},{\"instanceof\":\"Function\",\"tsType\":\"((data: object) => RuleSetUseItem|RuleSetUseItem[])\"},{\"$ref\":\"#/definitions/RuleSetLoader\"}]},\"ScriptType\":{\"description\":\"This option enables loading async chunks via a custom script type, such as script type=\\\"module\\\".\",\"enum\":[false,\"text/javascript\",\"module\"]},\"SnapshotOptions\":{\"description\":\"Options affecting how file system snapshots are created and validated.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"buildDependencies\":{\"description\":\"Options for snapshotting build dependencies to determine if the whole cache need to be invalidated.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"hash\":{\"description\":\"Use hashes of the content of the files/directories to determine invalidation.\",\"type\":\"boolean\"},\"timestamp\":{\"description\":\"Use timestamps of the files/directories to determine invalidation.\",\"type\":\"boolean\"}}},\"immutablePaths\":{\"description\":\"List of paths that are managed by a package manager and contain a version or hash in its path so all files are immutable.\",\"type\":\"array\",\"items\":{\"description\":\"A path to a immutable directory (usually a package manager cache directory).\",\"type\":\"string\",\"absolutePath\":true,\"minLength\":1}},\"managedPaths\":{\"description\":\"List of paths that are managed by a package manager and can be trusted to not be modified otherwise.\",\"type\":\"array\",\"items\":{\"description\":\"A path to a managed directory (usually a node_modules directory).\",\"type\":\"string\",\"absolutePath\":true,\"minLength\":1}},\"module\":{\"description\":\"Options for snapshotting dependencies of modules to determine if they need to be built again.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"hash\":{\"description\":\"Use hashes of the content of the files/directories to determine invalidation.\",\"type\":\"boolean\"},\"timestamp\":{\"description\":\"Use timestamps of the files/directories to determine invalidation.\",\"type\":\"boolean\"}}},\"resolve\":{\"description\":\"Options for snapshotting dependencies of request resolving to determine if requests need to be re-resolved.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"hash\":{\"description\":\"Use hashes of the content of the files/directories to determine invalidation.\",\"type\":\"boolean\"},\"timestamp\":{\"description\":\"Use timestamps of the files/directories to determine invalidation.\",\"type\":\"boolean\"}}},\"resolveBuildDependencies\":{\"description\":\"Options for snapshotting the resolving of build dependencies to determine if the build dependencies need to be re-resolved.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"hash\":{\"description\":\"Use hashes of the content of the files/directories to determine invalidation.\",\"type\":\"boolean\"},\"timestamp\":{\"description\":\"Use timestamps of the files/directories to determine invalidation.\",\"type\":\"boolean\"}}}}},\"SourceMapFilename\":{\"description\":\"The filename of the SourceMaps for the JavaScript files. They are inside the 'output.path' directory.\",\"type\":\"string\",\"absolutePath\":false},\"SourcePrefix\":{\"description\":\"Prefixes every line of the source in the bundle with this string.\",\"type\":\"string\"},\"StatsOptions\":{\"description\":\"Stats options object.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"all\":{\"description\":\"Fallback value for stats options when an option is not defined (has precedence over local webpack defaults).\",\"type\":\"boolean\"},\"assets\":{\"description\":\"Add assets information.\",\"type\":\"boolean\"},\"assetsSort\":{\"description\":\"Sort the assets by that field.\",\"type\":\"string\"},\"assetsSpace\":{\"description\":\"Space to display assets (groups will be collapsed to fit this space).\",\"type\":\"number\"},\"builtAt\":{\"description\":\"Add built at time information.\",\"type\":\"boolean\"},\"cached\":{\"description\":\"Add information about cached (not built) modules (deprecated: use 'cachedModules' instead).\",\"type\":\"boolean\"},\"cachedAssets\":{\"description\":\"Show cached assets (setting this to `false` only shows emitted files).\",\"type\":\"boolean\"},\"cachedModules\":{\"description\":\"Add information about cached (not built) modules.\",\"type\":\"boolean\"},\"children\":{\"description\":\"Add children information.\",\"type\":\"boolean\"},\"chunkGroupAuxiliary\":{\"description\":\"Display auxiliary assets in chunk groups.\",\"type\":\"boolean\"},\"chunkGroupChildren\":{\"description\":\"Display children of chunk groups.\",\"type\":\"boolean\"},\"chunkGroupMaxAssets\":{\"description\":\"Limit of assets displayed in chunk groups.\",\"type\":\"number\"},\"chunkGroups\":{\"description\":\"Display all chunk groups with the corresponding bundles.\",\"type\":\"boolean\"},\"chunkModules\":{\"description\":\"Add built modules information to chunk information.\",\"type\":\"boolean\"},\"chunkModulesSpace\":{\"description\":\"Space to display chunk modules (groups will be collapsed to fit this space, value is in number of modules/group).\",\"type\":\"number\"},\"chunkOrigins\":{\"description\":\"Add the origins of chunks and chunk merging info.\",\"type\":\"boolean\"},\"chunkRelations\":{\"description\":\"Add information about parent, children and sibling chunks to chunk information.\",\"type\":\"boolean\"},\"chunks\":{\"description\":\"Add chunk information.\",\"type\":\"boolean\"},\"chunksSort\":{\"description\":\"Sort the chunks by that field.\",\"type\":\"string\"},\"colors\":{\"description\":\"Enables/Disables colorful output.\",\"anyOf\":[{\"description\":\"Enables/Disables colorful output.\",\"type\":\"boolean\"},{\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"bold\":{\"description\":\"Custom color for bold text.\",\"type\":\"string\"},\"cyan\":{\"description\":\"Custom color for cyan text.\",\"type\":\"string\"},\"green\":{\"description\":\"Custom color for green text.\",\"type\":\"string\"},\"magenta\":{\"description\":\"Custom color for magenta text.\",\"type\":\"string\"},\"red\":{\"description\":\"Custom color for red text.\",\"type\":\"string\"},\"yellow\":{\"description\":\"Custom color for yellow text.\",\"type\":\"string\"}}}]},\"context\":{\"description\":\"Context directory for request shortening.\",\"type\":\"string\",\"absolutePath\":true},\"dependentModules\":{\"description\":\"Show chunk modules that are dependencies of other modules of the chunk.\",\"type\":\"boolean\"},\"depth\":{\"description\":\"Add module depth in module graph.\",\"type\":\"boolean\"},\"entrypoints\":{\"description\":\"Display the entry points with the corresponding bundles.\",\"anyOf\":[{\"enum\":[\"auto\"]},{\"type\":\"boolean\"}]},\"env\":{\"description\":\"Add --env information.\",\"type\":\"boolean\"},\"errorDetails\":{\"description\":\"Add details to errors (like resolving log).\",\"anyOf\":[{\"enum\":[\"auto\"]},{\"type\":\"boolean\"}]},\"errorStack\":{\"description\":\"Add internal stack trace to errors.\",\"type\":\"boolean\"},\"errors\":{\"description\":\"Add errors.\",\"type\":\"boolean\"},\"errorsCount\":{\"description\":\"Add errors count.\",\"type\":\"boolean\"},\"exclude\":{\"description\":\"Please use excludeModules instead.\",\"cli\":{\"exclude\":true},\"anyOf\":[{\"type\":\"boolean\"},{\"$ref\":\"#/definitions/ModuleFilterTypes\"}]},\"excludeAssets\":{\"description\":\"Suppress assets that match the specified filters. Filters can be Strings, RegExps or Functions.\",\"oneOf\":[{\"$ref\":\"#/definitions/AssetFilterTypes\"}]},\"excludeModules\":{\"description\":\"Suppress modules that match the specified filters. Filters can be Strings, RegExps, Booleans or Functions.\",\"anyOf\":[{\"type\":\"boolean\"},{\"$ref\":\"#/definitions/ModuleFilterTypes\"}]},\"groupAssetsByChunk\":{\"description\":\"Group assets by how their are related to chunks.\",\"type\":\"boolean\"},\"groupAssetsByEmitStatus\":{\"description\":\"Group assets by their status (emitted, compared for emit or cached).\",\"type\":\"boolean\"},\"groupAssetsByExtension\":{\"description\":\"Group assets by their extension.\",\"type\":\"boolean\"},\"groupAssetsByInfo\":{\"description\":\"Group assets by their asset info (immutable, development, hotModuleReplacement, etc).\",\"type\":\"boolean\"},\"groupAssetsByPath\":{\"description\":\"Group assets by their path.\",\"type\":\"boolean\"},\"groupModulesByAttributes\":{\"description\":\"Group modules by their attributes (errors, warnings, assets, optional, orphan, or dependent).\",\"type\":\"boolean\"},\"groupModulesByCacheStatus\":{\"description\":\"Group modules by their status (cached or built and cacheable).\",\"type\":\"boolean\"},\"groupModulesByExtension\":{\"description\":\"Group modules by their extension.\",\"type\":\"boolean\"},\"groupModulesByLayer\":{\"description\":\"Group modules by their layer.\",\"type\":\"boolean\"},\"groupModulesByPath\":{\"description\":\"Group modules by their path.\",\"type\":\"boolean\"},\"groupModulesByType\":{\"description\":\"Group modules by their type.\",\"type\":\"boolean\"},\"hash\":{\"description\":\"Add the hash of the compilation.\",\"type\":\"boolean\"},\"ids\":{\"description\":\"Add ids.\",\"type\":\"boolean\"},\"logging\":{\"description\":\"Add logging output.\",\"anyOf\":[{\"description\":\"Specify log level of logging output.\",\"enum\":[\"none\",\"error\",\"warn\",\"info\",\"log\",\"verbose\"]},{\"description\":\"Enable/disable logging output (`true`: shows normal logging output, loglevel: log).\",\"type\":\"boolean\"}]},\"loggingDebug\":{\"description\":\"Include debug logging of specified loggers (i. e. for plugins or loaders). Filters can be Strings, RegExps or Functions.\",\"anyOf\":[{\"description\":\"Enable/Disable debug logging for all loggers.\",\"type\":\"boolean\"},{\"$ref\":\"#/definitions/FilterTypes\"}]},\"loggingTrace\":{\"description\":\"Add stack traces to logging output.\",\"type\":\"boolean\"},\"moduleAssets\":{\"description\":\"Add information about assets inside modules.\",\"type\":\"boolean\"},\"moduleTrace\":{\"description\":\"Add dependencies and origin of warnings/errors.\",\"type\":\"boolean\"},\"modules\":{\"description\":\"Add built modules information.\",\"type\":\"boolean\"},\"modulesSort\":{\"description\":\"Sort the modules by that field.\",\"type\":\"string\"},\"modulesSpace\":{\"description\":\"Space to display modules (groups will be collapsed to fit this space, value is in number of modules/groups).\",\"type\":\"number\"},\"nestedModules\":{\"description\":\"Add information about modules nested in other modules (like with module concatenation).\",\"type\":\"boolean\"},\"nestedModulesSpace\":{\"description\":\"Space to display modules nested within other modules (groups will be collapsed to fit this space, value is in number of modules/group).\",\"type\":\"number\"},\"optimizationBailout\":{\"description\":\"Show reasons why optimization bailed out for modules.\",\"type\":\"boolean\"},\"orphanModules\":{\"description\":\"Add information about orphan modules.\",\"type\":\"boolean\"},\"outputPath\":{\"description\":\"Add output path information.\",\"type\":\"boolean\"},\"performance\":{\"description\":\"Add performance hint flags.\",\"type\":\"boolean\"},\"preset\":{\"description\":\"Preset for the default values.\",\"anyOf\":[{\"type\":\"boolean\"},{\"type\":\"string\"}]},\"providedExports\":{\"description\":\"Show exports provided by modules.\",\"type\":\"boolean\"},\"publicPath\":{\"description\":\"Add public path information.\",\"type\":\"boolean\"},\"reasons\":{\"description\":\"Add information about the reasons why modules are included.\",\"type\":\"boolean\"},\"relatedAssets\":{\"description\":\"Add information about assets that are related to other assets (like SourceMaps for assets).\",\"type\":\"boolean\"},\"runtime\":{\"description\":\"Add information about runtime modules (deprecated: use 'runtimeModules' instead).\",\"type\":\"boolean\"},\"runtimeModules\":{\"description\":\"Add information about runtime modules.\",\"type\":\"boolean\"},\"source\":{\"description\":\"Add the source code of modules.\",\"type\":\"boolean\"},\"timings\":{\"description\":\"Add timing information.\",\"type\":\"boolean\"},\"usedExports\":{\"description\":\"Show exports used by modules.\",\"type\":\"boolean\"},\"version\":{\"description\":\"Add webpack version information.\",\"type\":\"boolean\"},\"warnings\":{\"description\":\"Add warnings.\",\"type\":\"boolean\"},\"warningsCount\":{\"description\":\"Add warnings count.\",\"type\":\"boolean\"},\"warningsFilter\":{\"description\":\"Suppress listing warnings that match the specified filters (they will still be counted). Filters can be Strings, RegExps or Functions.\",\"oneOf\":[{\"$ref\":\"#/definitions/WarningFilterTypes\"}]}}},\"StatsValue\":{\"description\":\"Stats options object or preset name.\",\"anyOf\":[{\"enum\":[\"none\",\"summary\",\"errors-only\",\"errors-warnings\",\"minimal\",\"normal\",\"detailed\",\"verbose\"]},{\"type\":\"boolean\"},{\"$ref\":\"#/definitions/StatsOptions\"}]},\"StrictModuleErrorHandling\":{\"description\":\"Handles error in module loading correctly at a performance cost. This will handle module error compatible with the EcmaScript Modules spec.\",\"type\":\"boolean\"},\"StrictModuleExceptionHandling\":{\"description\":\"Handles exceptions in module loading correctly at a performance cost (Deprecated). This will handle module error compatible with the Node.js CommonJS way.\",\"type\":\"boolean\"},\"Target\":{\"description\":\"Environment to build for. An array of environments to build for all of them when possible.\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Environment to build for.\",\"type\":\"string\",\"minLength\":1},\"minItems\":1},{\"enum\":[false]},{\"type\":\"string\",\"minLength\":1}]},\"UmdNamedDefine\":{\"description\":\"If `output.libraryTarget` is set to umd and `output.library` is set, setting this to true will name the AMD module.\",\"type\":\"boolean\"},\"UniqueName\":{\"description\":\"A unique name of the webpack build to avoid multiple webpack runtimes to conflict when using globals.\",\"type\":\"string\",\"minLength\":1},\"WarningFilterItemTypes\":{\"description\":\"Filtering value, regexp or function.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"type\":\"string\",\"absolutePath\":false},{\"instanceof\":\"Function\",\"tsType\":\"((warning: import('../lib/stats/DefaultStatsFactoryPlugin').StatsError, value: string) => boolean)\"}]},\"WarningFilterTypes\":{\"description\":\"Filtering warnings.\",\"cli\":{\"helper\":true},\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"Rule to filter.\",\"cli\":{\"helper\":true},\"oneOf\":[{\"$ref\":\"#/definitions/WarningFilterItemTypes\"}]}},{\"$ref\":\"#/definitions/WarningFilterItemTypes\"}]},\"WasmLoading\":{\"description\":\"The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).\",\"anyOf\":[{\"enum\":[false]},{\"$ref\":\"#/definitions/WasmLoadingType\"}]},\"WasmLoadingType\":{\"description\":\"The method of loading WebAssembly Modules (methods included by default are 'fetch' (web/WebWorker), 'async-node' (node.js), but others might be added by plugins).\",\"anyOf\":[{\"enum\":[\"fetch-streaming\",\"fetch\",\"async-node\"]},{\"type\":\"string\"}]},\"Watch\":{\"description\":\"Enter watch mode, which rebuilds on file change.\",\"type\":\"boolean\"},\"WatchOptions\":{\"description\":\"Options for the watcher.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"aggregateTimeout\":{\"description\":\"Delay the rebuilt after the first change. Value is a time in ms.\",\"type\":\"number\"},\"followSymlinks\":{\"description\":\"Resolve symlinks and watch symlink and real file. This is usually not needed as webpack already resolves symlinks ('resolve.symlinks').\",\"type\":\"boolean\"},\"ignored\":{\"description\":\"Ignore some files from watching (glob pattern or regexp).\",\"anyOf\":[{\"type\":\"array\",\"items\":{\"description\":\"A glob pattern for files that should be ignored from watching.\",\"type\":\"string\",\"minLength\":1}},{\"instanceof\":\"RegExp\",\"tsType\":\"RegExp\"},{\"description\":\"A single glob pattern for files that should be ignored from watching.\",\"type\":\"string\",\"minLength\":1}]},\"poll\":{\"description\":\"Enable polling mode for watching.\",\"anyOf\":[{\"description\":\"`number`: use polling with specified interval.\",\"type\":\"number\"},{\"description\":\"`true`: use polling.\",\"type\":\"boolean\"}]},\"stdin\":{\"description\":\"Stop watching when stdin stream has ended.\",\"type\":\"boolean\"}}},\"WebassemblyModuleFilename\":{\"description\":\"The filename of WebAssembly modules as relative path inside the 'output.path' directory.\",\"type\":\"string\",\"absolutePath\":false},\"WebpackOptionsNormalized\":{\"description\":\"Normalized webpack options object.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"amd\":{\"$ref\":\"#/definitions/Amd\"},\"bail\":{\"$ref\":\"#/definitions/Bail\"},\"cache\":{\"$ref\":\"#/definitions/CacheOptionsNormalized\"},\"context\":{\"$ref\":\"#/definitions/Context\"},\"dependencies\":{\"$ref\":\"#/definitions/Dependencies\"},\"devServer\":{\"$ref\":\"#/definitions/DevServer\"},\"devtool\":{\"$ref\":\"#/definitions/DevTool\"},\"entry\":{\"$ref\":\"#/definitions/EntryNormalized\"},\"experiments\":{\"$ref\":\"#/definitions/Experiments\"},\"externals\":{\"$ref\":\"#/definitions/Externals\"},\"externalsPresets\":{\"$ref\":\"#/definitions/ExternalsPresets\"},\"externalsType\":{\"$ref\":\"#/definitions/ExternalsType\"},\"ignoreWarnings\":{\"$ref\":\"#/definitions/IgnoreWarningsNormalized\"},\"infrastructureLogging\":{\"$ref\":\"#/definitions/InfrastructureLogging\"},\"loader\":{\"$ref\":\"#/definitions/Loader\"},\"mode\":{\"$ref\":\"#/definitions/Mode\"},\"module\":{\"$ref\":\"#/definitions/ModuleOptionsNormalized\"},\"name\":{\"$ref\":\"#/definitions/Name\"},\"node\":{\"$ref\":\"#/definitions/Node\"},\"optimization\":{\"$ref\":\"#/definitions/Optimization\"},\"output\":{\"$ref\":\"#/definitions/OutputNormalized\"},\"parallelism\":{\"$ref\":\"#/definitions/Parallelism\"},\"performance\":{\"$ref\":\"#/definitions/Performance\"},\"plugins\":{\"$ref\":\"#/definitions/Plugins\"},\"profile\":{\"$ref\":\"#/definitions/Profile\"},\"recordsInputPath\":{\"$ref\":\"#/definitions/RecordsInputPath\"},\"recordsOutputPath\":{\"$ref\":\"#/definitions/RecordsOutputPath\"},\"resolve\":{\"$ref\":\"#/definitions/Resolve\"},\"resolveLoader\":{\"$ref\":\"#/definitions/ResolveLoader\"},\"snapshot\":{\"$ref\":\"#/definitions/SnapshotOptions\"},\"stats\":{\"$ref\":\"#/definitions/StatsValue\"},\"target\":{\"$ref\":\"#/definitions/Target\"},\"watch\":{\"$ref\":\"#/definitions/Watch\"},\"watchOptions\":{\"$ref\":\"#/definitions/WatchOptions\"}},\"required\":[\"cache\",\"snapshot\",\"entry\",\"experiments\",\"externals\",\"externalsPresets\",\"infrastructureLogging\",\"module\",\"node\",\"optimization\",\"output\",\"plugins\",\"resolve\",\"resolveLoader\",\"stats\",\"watchOptions\"]},\"WebpackPluginFunction\":{\"description\":\"Function acting as plugin.\",\"instanceof\":\"Function\",\"tsType\":\"(this: import('../lib/Compiler'), compiler: import('../lib/Compiler')) => void\"},\"WebpackPluginInstance\":{\"description\":\"Plugin instance.\",\"type\":\"object\",\"additionalProperties\":true,\"properties\":{\"apply\":{\"description\":\"The run point of the plugin, required method.\",\"instanceof\":\"Function\",\"tsType\":\"(compiler: import('../lib/Compiler')) => void\"}},\"required\":[\"apply\"]}},\"description\":\"Options object as provided by the user.\",\"type\":\"object\",\"additionalProperties\":false,\"properties\":{\"amd\":{\"$ref\":\"#/definitions/Amd\"},\"bail\":{\"$ref\":\"#/definitions/Bail\"},\"cache\":{\"$ref\":\"#/definitions/CacheOptions\"},\"context\":{\"$ref\":\"#/definitions/Context\"},\"dependencies\":{\"$ref\":\"#/definitions/Dependencies\"},\"devServer\":{\"$ref\":\"#/definitions/DevServer\"},\"devtool\":{\"$ref\":\"#/definitions/DevTool\"},\"entry\":{\"$ref\":\"#/definitions/Entry\"},\"experiments\":{\"$ref\":\"#/definitions/Experiments\"},\"externals\":{\"$ref\":\"#/definitions/Externals\"},\"externalsPresets\":{\"$ref\":\"#/definitions/ExternalsPresets\"},\"externalsType\":{\"$ref\":\"#/definitions/ExternalsType\"},\"ignoreWarnings\":{\"$ref\":\"#/definitions/IgnoreWarnings\"},\"infrastructureLogging\":{\"$ref\":\"#/definitions/InfrastructureLogging\"},\"loader\":{\"$ref\":\"#/definitions/Loader\"},\"mode\":{\"$ref\":\"#/definitions/Mode\"},\"module\":{\"$ref\":\"#/definitions/ModuleOptions\"},\"name\":{\"$ref\":\"#/definitions/Name\"},\"node\":{\"$ref\":\"#/definitions/Node\"},\"optimization\":{\"$ref\":\"#/definitions/Optimization\"},\"output\":{\"$ref\":\"#/definitions/Output\"},\"parallelism\":{\"$ref\":\"#/definitions/Parallelism\"},\"performance\":{\"$ref\":\"#/definitions/Performance\"},\"plugins\":{\"$ref\":\"#/definitions/Plugins\"},\"profile\":{\"$ref\":\"#/definitions/Profile\"},\"recordsInputPath\":{\"$ref\":\"#/definitions/RecordsInputPath\"},\"recordsOutputPath\":{\"$ref\":\"#/definitions/RecordsOutputPath\"},\"recordsPath\":{\"$ref\":\"#/definitions/RecordsPath\"},\"resolve\":{\"$ref\":\"#/definitions/Resolve\"},\"resolveLoader\":{\"$ref\":\"#/definitions/ResolveLoader\"},\"snapshot\":{\"$ref\":\"#/definitions/SnapshotOptions\"},\"stats\":{\"$ref\":\"#/definitions/StatsValue\"},\"target\":{\"$ref\":\"#/definitions/Target\"},\"watch\":{\"$ref\":\"#/definitions/Watch\"},\"watchOptions\":{\"$ref\":\"#/definitions/WatchOptions\"}}}"); /***/ }), @@ -41270,6 +41270,10 @@ ${other}`); close(callback) { this.hooks.shutdown.callAsync(err => { if (err) return callback(err); + // Get rid of reference to last compilation to avoid leaking memory + // We can't run this._cleanupLastCompilation() as the Stats to this compilation + // might be still in use. We try to get rid for the reference to the cache instead. + this._lastCompilation = undefined; this.cache.shutdown(callback); }); } @@ -45092,7 +45096,9 @@ class Dependency { } } +/** @type {string[][]} */ Dependency.NO_EXPORTS_REFERENCED = []; +/** @type {string[][]} */ Dependency.EXPORTS_OBJECT_REFERENCED = [[]]; Object.defineProperty(Dependency.prototype, "module", { @@ -49378,6 +49384,14 @@ class SnapshotOptimization { } times referenced)`; } + clear() { + this._map.clear(); + this._statItemsShared = 0; + this._statItemsUnshared = 0; + this._statSharedSnapshots = 0; + this._statReusedSharedSnapshots = 0; + } + storeUnsharedSnapshot(snapshot, locations) { if (locations === undefined) return; const optimizationEntry = { @@ -49950,6 +49964,42 @@ class FileSystemInfo { } } + clear() { + this._remainingLogs = this.logger ? 40 : 0; + if (this._loggedPaths !== undefined) this._loggedPaths.clear(); + + this._snapshotCache = new WeakMap(); + this._fileTimestampsOptimization.clear(); + this._fileHashesOptimization.clear(); + this._fileTshsOptimization.clear(); + this._contextTimestampsOptimization.clear(); + this._contextHashesOptimization.clear(); + this._contextTshsOptimization.clear(); + this._missingExistenceOptimization.clear(); + this._managedItemInfoOptimization.clear(); + this._managedFilesOptimization.clear(); + this._managedContextsOptimization.clear(); + this._managedMissingOptimization.clear(); + this._fileTimestamps.clear(); + this._fileHashes.clear(); + this._fileTshs.clear(); + this._contextTimestamps.clear(); + this._contextHashes.clear(); + this._contextTshs.clear(); + this._managedItems.clear(); + this._managedItems.clear(); + + this._cachedDeprecatedFileTimestamps = undefined; + this._cachedDeprecatedContextTimestamps = undefined; + + this._statCreatedSnapshots = 0; + this._statTestedSnapshotsCached = 0; + this._statTestedSnapshotsNotCached = 0; + this._statTestedChildrenCached = 0; + this._statTestedChildrenNotCached = 0; + this._statTestedEntries = 0; + } + /** * @param {Map} map timestamps * @returns {void} @@ -50073,15 +50123,58 @@ class FileSystemInfo { contextDependencies: resolveDirectories, missingDependencies: resolveMissing }; + const expectedToString = expected => { + return expected ? ` (expected ${expected})` : ""; + }; + const jobToString = job => { + switch (job.type) { + case RBDT_RESOLVE_CJS: + return `resolve commonjs ${job.path}${expectedToString( + job.expected + )}`; + case RBDT_RESOLVE_ESM: + return `resolve esm ${job.path}${expectedToString(job.expected)}`; + case RBDT_RESOLVE_DIRECTORY: + return `resolve directory ${job.path}`; + case RBDT_RESOLVE_CJS_FILE: + return `resolve commonjs file ${job.path}${expectedToString( + job.expected + )}`; + case RBDT_RESOLVE_ESM_FILE: + return `resolve esm file ${job.path}${expectedToString( + job.expected + )}`; + case RBDT_DIRECTORY: + return `directory ${job.path}`; + case RBDT_FILE: + return `file ${job.path}`; + case RBDT_DIRECTORY_DEPENDENCIES: + return `directory dependencies ${job.path}`; + case RBDT_FILE_DEPENDENCIES: + return `file dependencies ${job.path}`; + } + return `unknown ${job.type} ${job.path}`; + }; + const pathToString = job => { + let result = ` at ${jobToString(job)}`; + job = job.issuer; + while (job !== undefined) { + result += `\n at ${jobToString(job)}`; + job = job.issuer; + } + return result; + }; processAsyncTree( Array.from(deps, dep => ({ type: RBDT_RESOLVE_CJS, context, path: dep, - expected: undefined + expected: undefined, + issuer: undefined })), 20, - ({ type, context, path, expected }, push, callback) => { + (job, push, callback) => { + const { type, context, path, expected } = job; const resolveDirectory = path => { const key = `d\n${context}\n${path}`; if (resolveResults.has(key)) { @@ -50105,7 +50198,8 @@ class FileSystemInfo { type: RBDT_DIRECTORY, context: undefined, path: result, - expected: undefined + expected: undefined, + issuer: job }); callback(); }); @@ -50123,7 +50217,9 @@ class FileSystemInfo { } else { invalidResolveResults.add(key); this.logger.debug( - `Resolving '${path}' in ${context} for build dependencies doesn't lead to expected result '${expected}', but to '${result}' instead. Resolving dependencies are ignored for this path.` + `Resolving '${path}' in ${context} for build dependencies doesn't lead to expected result '${expected}', but to '${result}' instead. Resolving dependencies are ignored for this path.\n${pathToString( + job + )}` ); } } else { @@ -50135,7 +50231,9 @@ class FileSystemInfo { ) { return callback(); } - err.message += `\nwhile resolving '${path}' in ${context} as file`; + err.message += `\nwhile resolving '${path}' in ${context} as file\n${pathToString( + job + )}`; return callback(err); } resolveResults.set(key, result); @@ -50143,7 +50241,8 @@ class FileSystemInfo { type: RBDT_FILE, context: undefined, path: result, - expected: undefined + expected: undefined, + issuer: job }); } callback(); @@ -50199,7 +50298,8 @@ class FileSystemInfo { type: RBDT_FILE_DEPENDENCIES, context: undefined, path: realPath, - expected: undefined + expected: undefined, + issuer: job }); callback(); }); @@ -50224,7 +50324,8 @@ class FileSystemInfo { type: RBDT_DIRECTORY_DEPENDENCIES, context: undefined, path: realPath, - expected: undefined + expected: undefined, + issuer: job }); callback(); }); @@ -50247,7 +50348,8 @@ class FileSystemInfo { type: RBDT_FILE, context: undefined, path: childPath, - expected: undefined + expected: undefined, + issuer: job }); const context = dirname(this.fs, path); for (const modulePath of module.paths) { @@ -50259,7 +50361,8 @@ class FileSystemInfo { type: RBDT_RESOLVE_CJS_FILE, context, path: request, - expected: child.filename + expected: child.filename, + issuer: job }); continue children; } @@ -50272,7 +50375,8 @@ class FileSystemInfo { type: RBDT_RESOLVE_CJS_FILE, context, path: request, - expected: child.filename + expected: child.filename, + issuer: job }); } } @@ -50317,7 +50421,8 @@ class FileSystemInfo { type: RBDT_RESOLVE_ESM_FILE, context, path: dependency, - expected: undefined + expected: undefined, + issuer: job }); } catch (e) { this.logger.warn( @@ -50327,6 +50432,7 @@ class FileSystemInfo { )})'.\n` + "Build dependencies behind this expression are ignored and might cause incorrect cache invalidation." ); + this.logger.debug(pathToString(job)); this.logger.debug(e.stack); } } @@ -50334,6 +50440,7 @@ class FileSystemInfo { this.logger.warn( `Parsing of ${path} for build dependencies failed and all dependencies of this file are ignored, which might cause incorrect cache invalidation..` ); + this.logger.debug(pathToString(job)); this.logger.debug(e.stack); } process.nextTick(callback); @@ -50344,6 +50451,7 @@ class FileSystemInfo { this.logger.log( `Assuming ${path} has no dependencies as we were unable to assign it to any module system.` ); + this.logger.debug(pathToString(job)); } process.nextTick(callback); break; @@ -50364,7 +50472,8 @@ class FileSystemInfo { type: RBDT_DIRECTORY_DEPENDENCIES, context: undefined, path: parent, - expected: undefined + expected: undefined, + issuer: job }); } callback(); @@ -50386,7 +50495,8 @@ class FileSystemInfo { type: RBDT_RESOLVE_DIRECTORY, context: packagePath, path: dep, - expected: undefined + expected: undefined, + issuer: job }); } } @@ -60167,6 +60277,9 @@ class NormalModule extends Module { } }, (err, result) => { + // Cleanup loaderContext to avoid leaking memory in ICs + loaderContext._compilation = loaderContext._compiler = loaderContext._module = loaderContext.fs = undefined; + if (!result) { return processResult( err || new Error("No result from loader-runner processing"), @@ -68284,9 +68397,17 @@ class WebpackOptionsApply extends OptionsApply { const cacheOptions = options.cache; switch (cacheOptions.type) { case "memory": { - //@ts-expect-error https://github.com/microsoft/TypeScript/issues/41697 - const MemoryCachePlugin = __webpack_require__(80662); - new MemoryCachePlugin().apply(compiler); + if (isFinite(cacheOptions.maxGenerations)) { + //@ts-expect-error https://github.com/microsoft/TypeScript/issues/41697 + const MemoryWithGcCachePlugin = __webpack_require__(23886); + new MemoryWithGcCachePlugin({ + maxGenerations: cacheOptions.maxGenerations + }).apply(compiler); + } else { + //@ts-expect-error https://github.com/microsoft/TypeScript/issues/41697 + const MemoryCachePlugin = __webpack_require__(80662); + new MemoryCachePlugin().apply(compiler); + } break; } case "filesystem": { @@ -68295,9 +68416,17 @@ class WebpackOptionsApply extends OptionsApply { const list = cacheOptions.buildDependencies[key]; new AddBuildDependenciesPlugin(list).apply(compiler); } - //@ts-expect-error https://github.com/microsoft/TypeScript/issues/41697 - const MemoryCachePlugin = __webpack_require__(80662); - new MemoryCachePlugin().apply(compiler); + if (!isFinite(cacheOptions.maxMemoryGenerations)) { + //@ts-expect-error https://github.com/microsoft/TypeScript/issues/41697 + const MemoryCachePlugin = __webpack_require__(80662); + new MemoryCachePlugin().apply(compiler); + } else if (cacheOptions.maxMemoryGenerations !== 0) { + //@ts-expect-error https://github.com/microsoft/TypeScript/issues/41697 + const MemoryWithGcCachePlugin = __webpack_require__(23886); + new MemoryWithGcCachePlugin({ + maxGenerations: cacheOptions.maxMemoryGenerations + }).apply(compiler); + } switch (cacheOptions.store) { case "pack": { const IdleFileCachePlugin = __webpack_require__(67462); @@ -68312,7 +68441,8 @@ class WebpackOptionsApply extends OptionsApply { logger: compiler.getInfrastructureLogger( "webpack.cache.PackFileCacheStrategy" ), - snapshot: options.snapshot + snapshot: options.snapshot, + maxAge: cacheOptions.maxAge }), cacheOptions.idleTimeout, cacheOptions.idleTimeoutForInitialStore @@ -70659,7 +70789,7 @@ class IdleFileCachePlugin { * @returns {void} */ apply(compiler) { - const strategy = this.strategy; + let strategy = this.strategy; const idleTimeout = this.idleTimeout; const idleTimeoutForInitialStore = Math.min( idleTimeout, @@ -70683,20 +70813,27 @@ class IdleFileCachePlugin { compiler.cache.hooks.get.tapPromise( { name: "IdleFileCachePlugin", stage: Cache.STAGE_DISK }, (identifier, etag, gotHandlers) => { - return strategy.restore(identifier, etag).then(cacheEntry => { - if (cacheEntry === undefined) { - gotHandlers.push((result, callback) => { - if (result !== undefined) { - pendingIdleTasks.set(identifier, () => - strategy.store(identifier, etag, result) - ); - } - callback(); - }); - } else { - return cacheEntry; - } - }); + const restore = () => + strategy.restore(identifier, etag).then(cacheEntry => { + if (cacheEntry === undefined) { + gotHandlers.push((result, callback) => { + if (result !== undefined) { + pendingIdleTasks.set(identifier, () => + strategy.store(identifier, etag, result) + ); + } + callback(); + }); + } else { + return cacheEntry; + } + }); + const pendingTask = pendingIdleTasks.get(identifier); + if (pendingTask !== undefined) { + pendingIdleTasks.delete(identifier); + return pendingTask().then(restore); + } + return restore(); } ); @@ -70730,7 +70867,10 @@ class IdleFileCachePlugin { reportProgress(1, `stored`); }); } - return currentIdlePromise; + return currentIdlePromise.then(() => { + // Reset strategy + if (strategy.clear) strategy.clear(); + }); } ); @@ -70853,11 +70993,154 @@ class MemoryCachePlugin { }); } ); + compiler.cache.hooks.shutdown.tap( + { name: "MemoryCachePlugin", stage: Cache.STAGE_MEMORY }, + () => { + cache.clear(); + } + ); } } module.exports = MemoryCachePlugin; +/***/ }), + +/***/ 23886: +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ + + + +const Cache = __webpack_require__(18338); + +/** @typedef {import("webpack-sources").Source} Source */ +/** @typedef {import("../Cache").Etag} Etag */ +/** @typedef {import("../Compiler")} Compiler */ +/** @typedef {import("../Module")} Module */ + +class MemoryWithGcCachePlugin { + constructor({ maxGenerations }) { + this._maxGenerations = maxGenerations; + } + /** + * Apply the plugin + * @param {Compiler} compiler the compiler instance + * @returns {void} + */ + apply(compiler) { + const maxGenerations = this._maxGenerations; + /** @type {Map} */ + const cache = new Map(); + /** @type {Map} */ + const oldCache = new Map(); + let generation = 0; + let cachePosition = 0; + const logger = compiler.getInfrastructureLogger("MemoryWithGcCachePlugin"); + compiler.hooks.afterDone.tap("MemoryWithGcCachePlugin", () => { + generation++; + let clearedEntries = 0; + let lastClearedIdentifier; + for (const [identifier, entry] of oldCache) { + if (entry.until > generation) break; + + oldCache.delete(identifier); + if (cache.get(identifier) === undefined) { + cache.delete(identifier); + clearedEntries++; + lastClearedIdentifier = identifier; + } + } + if (clearedEntries > 0 || oldCache.size > 0) { + logger.log( + `${cache.size - oldCache.size} active entries, ${ + oldCache.size + } recently unused cached entries${ + clearedEntries > 0 + ? `, ${clearedEntries} old unused cache entries removed e. g. ${lastClearedIdentifier}` + : "" + }` + ); + } + let i = (cache.size / maxGenerations) | 0; + let j = cachePosition >= cache.size ? 0 : cachePosition; + cachePosition = j + i; + for (const [identifier, entry] of cache) { + if (j !== 0) { + j--; + continue; + } + if (entry !== undefined) { + // We don't delete the cache entry, but set it to undefined instead + // This reserves the location in the data table and avoids rehashing + // when constantly adding and removing entries. + // It will be deleted when removed from oldCache. + cache.set(identifier, undefined); + oldCache.delete(identifier); + oldCache.set(identifier, { + entry, + until: generation + maxGenerations + }); + if (i-- === 0) break; + } + } + }); + compiler.cache.hooks.store.tap( + { name: "MemoryWithGcCachePlugin", stage: Cache.STAGE_MEMORY }, + (identifier, etag, data) => { + cache.set(identifier, { etag, data }); + } + ); + compiler.cache.hooks.get.tap( + { name: "MemoryWithGcCachePlugin", stage: Cache.STAGE_MEMORY }, + (identifier, etag, gotHandlers) => { + const cacheEntry = cache.get(identifier); + if (cacheEntry === null) { + return null; + } else if (cacheEntry !== undefined) { + return cacheEntry.etag === etag ? cacheEntry.data : null; + } + const oldCacheEntry = oldCache.get(identifier); + if (oldCacheEntry !== undefined) { + const cacheEntry = oldCacheEntry.entry; + if (cacheEntry === null) { + oldCache.delete(identifier); + cache.set(identifier, cacheEntry); + return null; + } else { + if (cacheEntry.etag !== etag) return null; + oldCache.delete(identifier); + cache.set(identifier, cacheEntry); + return cacheEntry.data; + } + } + gotHandlers.push((result, callback) => { + if (result === undefined) { + cache.set(identifier, null); + } else { + cache.set(identifier, { etag, data: result }); + } + return callback(); + }); + } + ); + compiler.cache.hooks.shutdown.tap( + { name: "MemoryWithGcCachePlugin", stage: Cache.STAGE_MEMORY }, + () => { + cache.clear(); + oldCache.clear(); + } + ); + } +} +module.exports = MemoryWithGcCachePlugin; + + /***/ }), /***/ 19780: @@ -70941,7 +71224,6 @@ makeSerializable( const MIN_CONTENT_SIZE = 1024 * 1024; // 1 MB const CONTENT_COUNT_TO_MERGE = 10; -const MAX_AGE = 1000 * 60 * 60 * 24 * 60; // 1 month const MAX_ITEMS_IN_FRESH_PACK = 50000; class PackItemInfo { @@ -70960,7 +71242,7 @@ class PackItemInfo { } class Pack { - constructor(logger) { + constructor(logger, maxAge) { /** @type {Map} */ this.itemInfo = new Map(); /** @type {string[]} */ @@ -70971,6 +71253,7 @@ class Pack { this.content = []; this.invalid = false; this.logger = logger; + this.maxAge = maxAge; } /** @@ -71033,6 +71316,21 @@ class Pack { } } + getContentStats() { + let count = 0; + let size = 0; + for (const content of this.content) { + if (content !== undefined) { + count++; + const s = content.getSize(); + if (s > 0) { + size += s; + } + } + } + return { count, size }; + } + /** * @returns {number} new location of data entries */ @@ -71048,7 +71346,7 @@ class Pack { const now = Date.now(); for (const identifier of items) { const info = this.itemInfo.get(identifier); - if (now - info.lastAccess > MAX_AGE) { + if (now - info.lastAccess > this.maxAge) { this.itemInfo.delete(identifier); items.delete(identifier); usedItems.delete(identifier); @@ -71060,9 +71358,10 @@ class Pack { } if (count > 0) { this.logger.log( - "Garbage Collected %d old items at pack %d e. g. %s", + "Garbage Collected %d old items at pack %d (%d items remaining) e. g. %s", count, newLoc, + items.size, lastGC ); } @@ -71292,10 +71591,45 @@ class Pack { } } + /** + * Find the content with the oldest item and run GC on that. + * Only runs for one content to avoid large invalidation. + */ + _gcOldestContent() { + /** @type {PackItemInfo} */ + let oldest = undefined; + for (const info of this.itemInfo.values()) { + if (oldest === undefined || info.lastAccess < oldest.lastAccess) { + oldest = info; + } + } + if (Date.now() - oldest.lastAccess > this.maxAge) { + const loc = oldest.location; + if (loc < 0) return; + const content = this.content[loc]; + const items = new Set(content.items); + const usedItems = new Set(content.used); + this._gcAndUpdateLocation(items, usedItems, loc); + + this.content[loc] = + items.size > 0 + ? new PackContent(items, usedItems, async () => { + await content.unpack(); + const map = new Map(); + for (const identifier of items) { + map.set(identifier, content.content.get(identifier)); + } + return new PackContentItems(map); + }) + : undefined; + } + } + serialize({ write, writeSeparate }) { this._persistFreshContent(); this._optimizeSmallContent(); this._optimizeUnusedContent(); + this._gcOldestContent(); for (const identifier of this.itemInfo.keys()) { write(identifier); } @@ -71593,6 +71927,7 @@ class PackFileCacheStrategy { * @param {string} options.version version identifier * @param {Logger} options.logger a logger * @param {SnapshotOptions} options.snapshot options regarding snapshotting + * @param {number} options.maxAge max age of cache items */ constructor({ compiler, @@ -71601,7 +71936,8 @@ class PackFileCacheStrategy { cacheLocation, version, logger, - snapshot + snapshot, + maxAge }) { this.fileSerializer = createFileSerializer(fs); this.fileSystemInfo = new FileSystemInfo(fs, { @@ -71614,6 +71950,7 @@ class PackFileCacheStrategy { this.cacheLocation = cacheLocation; this.version = version; this.logger = logger; + this.maxAge = maxAge; this.snapshot = snapshot; /** @type {Set} */ this.buildDependencies = new Set(); @@ -71627,6 +71964,14 @@ class PackFileCacheStrategy { this.buildSnapshot = undefined; /** @type {Promise} */ this.packPromise = this._openPack(); + this.storePromise = Promise.resolve(); + } + + _getPack() { + if (this.packPromise === undefined) { + this.packPromise = this.storePromise.then(() => this._openPack()); + } + return this.packPromise; } /** @@ -71765,6 +72110,7 @@ class PackFileCacheStrategy { }) .then(pack => { if (pack) { + pack.maxAge = this.maxAge; this.buildSnapshot = buildSnapshot; if (buildDependencies) this.buildDependencies = buildDependencies; if (newBuildDependencies) @@ -71773,14 +72119,14 @@ class PackFileCacheStrategy { this.resolveBuildDependenciesSnapshot = resolveBuildDependenciesSnapshot; return pack; } - return new Pack(logger); + return new Pack(logger, this.maxAge); }) .catch(err => { this.logger.warn( `Restoring pack from ${cacheLocation}.pack failed: ${err}` ); this.logger.debug(err.stack); - return new Pack(logger); + return new Pack(logger, this.maxAge); }); } @@ -71791,7 +72137,7 @@ class PackFileCacheStrategy { * @returns {Promise} promise */ store(identifier, etag, data) { - return this.packPromise.then(pack => { + return this._getPack().then(pack => { pack.set(identifier, etag === null ? null : etag.toString(), data); }); } @@ -71802,7 +72148,7 @@ class PackFileCacheStrategy { * @returns {Promise} promise to the cached content */ restore(identifier, etag) { - return this.packPromise + return this._getPack() .then(pack => pack.get(identifier, etag === null ? null : etag.toString()) ) @@ -71821,8 +72167,11 @@ class PackFileCacheStrategy { } afterAllStored() { + const packPromise = this.packPromise; + if (packPromise === undefined) return Promise.resolve(); const reportProgress = ProgressPlugin.getReporter(this.compiler); - return this.packPromise + this.packPromise = undefined; + return (this.storePromise = packPromise .then(pack => { if (!pack.invalid) return; this.logger.log(`Storing pack...`); @@ -71966,7 +72315,13 @@ class PackFileCacheStrategy { } this.newBuildDependencies.clear(); this.logger.timeEnd(`store pack`); - this.logger.log(`Stored pack`); + const stats = pack.getContentStats(); + this.logger.log( + "Stored pack (%d items, %d files, %d MiB)", + pack.itemInfo.size, + stats.count, + Math.round(stats.size / 1024 / 1024) + ); }) .catch(err => { this.logger.timeEnd(`store pack`); @@ -71978,7 +72333,17 @@ class PackFileCacheStrategy { .catch(err => { this.logger.warn(`Caching failed for pack: ${err}`); this.logger.debug(err.stack); - }); + })); + } + + clear() { + this.fileSystemInfo.clear(); + this.buildDependencies.clear(); + this.newBuildDependencies.clear(); + this.resolveBuildDependenciesSnapshot = undefined; + this.resolveResults = undefined; + this.buildSnapshot = undefined; + this.packPromise = undefined; } } @@ -73529,7 +73894,8 @@ const applyWebpackOptionsDefaults = options => { ); applyCacheDefaults(options.cache, { name: name || "default", - mode: mode || "production" + mode: mode || "production", + development }); const cache = !!options.cache; @@ -73619,9 +73985,10 @@ const applyExperimentsDefaults = experiments => { * @param {Object} options options * @param {string} options.name name * @param {string} options.mode mode + * @param {boolean} options.development is development mode * @returns {void} */ -const applyCacheDefaults = (cache, { name, mode }) => { +const applyCacheDefaults = (cache, { name, mode, development }) => { if (cache === false) return; switch (cache.type) { case "filesystem": @@ -73659,10 +74026,15 @@ const applyCacheDefaults = (cache, { name, mode }) => { D(cache, "store", "pack"); D(cache, "idleTimeout", 60000); D(cache, "idleTimeoutForInitialStore", 0); + D(cache, "maxMemoryGenerations", development ? 10 : Infinity); + D(cache, "maxAge", 1000 * 60 * 60 * 24 * 60); // 1 month D(cache.buildDependencies, "defaultWebpack", [ path.resolve(__dirname, "..") + path.sep ]); break; + case "memory": + D(cache, "maxGenerations", Infinity); + break; } }; @@ -74572,13 +74944,16 @@ const getNormalizedWebpackOptions = config => { if (cache === false) return false; if (cache === true) { return { - type: "memory" + type: "memory", + maxGenerations: undefined }; } switch (cache.type) { case "filesystem": return { type: "filesystem", + maxMemoryGenerations: cache.maxMemoryGenerations, + maxAge: cache.maxAge, buildDependencies: cloneObject(cache.buildDependencies), cacheDirectory: cache.cacheDirectory, cacheLocation: cache.cacheLocation, @@ -74592,7 +74967,8 @@ const getNormalizedWebpackOptions = config => { case undefined: case "memory": return { - type: "memory" + type: "memory", + maxGenerations: cache.maxGenerations }; default: // @ts-expect-error Property 'type' does not exist on type 'never'. ts(2339) @@ -92362,7 +92738,20 @@ const memoize = __webpack_require__(18003); /** @typedef {import("./MultiStats")} MultiStats */ /** @typedef {import("./Parser").ParserState} ParserState */ /** @typedef {import("./Watching")} Watching */ +/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsAsset} StatsAsset */ +/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsChunk} StatsChunk */ +/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsChunkGroup} StatsChunkGroup */ +/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsChunkOrigin} StatsChunkOrigin */ /** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsCompilation} StatsCompilation */ +/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsError} StatsError */ +/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsLogging} StatsLogging */ +/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsLoggingEntry} StatsLoggingEntry */ +/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsModule} StatsModule */ +/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsModuleIssuer} StatsModuleIssuer */ +/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsModuleReason} StatsModuleReason */ +/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsModuleTraceDependency} StatsModuleTraceDependency */ +/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsModuleTraceItem} StatsModuleTraceItem */ +/** @typedef {import("./stats/DefaultStatsFactoryPlugin").StatsProfile} StatsProfile */ /** * @template {Function} T @@ -92435,6 +92824,9 @@ module.exports = mergeExports(fn, { get AutomaticPrefetchPlugin() { return __webpack_require__(42257); }, + get AsyncDependenciesBlock() { + return __webpack_require__(72624); + }, get BannerPlugin() { return __webpack_require__(44732); }, @@ -92639,6 +93031,18 @@ module.exports = mergeExports(fn, { } }, + dependencies: { + get ModuleDependency() { + return __webpack_require__(5462); + }, + get ConstDependency() { + return __webpack_require__(9364); + }, + get NullDependency() { + return __webpack_require__(47454); + } + }, + ids: { get ChunkModuleIdRangePlugin() { return __webpack_require__(82909); @@ -96204,6 +96608,10 @@ class JavascriptParser extends Parser { .setRange(expr.range); } }); + this.hooks.finish.tap("JavascriptParser", () => { + // Cleanup for GC + cachedExpression = cachedInfo = undefined; + }); }; tapEvaluateWithVariableInfo("Identifier", expr => { const info = this.getVariableInfo( @@ -115877,13 +116285,13 @@ class ObjectMiddleware extends SerializerMiddleware { */ serialize(data, context) { /** @type {any[]} */ - const result = [CURRENT_VERSION]; + let result = [CURRENT_VERSION]; let currentPos = 0; - const referenceable = new Map(); + let referenceable = new Map(); const addReferenceable = item => { referenceable.set(item, currentPos++); }; - const bufferDedupeMap = new Map(); + let bufferDedupeMap = new Map(); const dedupeBuffer = buf => { const len = buf.length; const entry = bufferDedupeMap.get(len); @@ -115946,7 +116354,7 @@ class ObjectMiddleware extends SerializerMiddleware { } }; let currentPosTypeLookup = 0; - const objectTypeLookup = new Map(); + let objectTypeLookup = new Map(); const cycleStack = new Set(); const stackToString = item => { const arr = Array.from(cycleStack); @@ -115994,7 +116402,7 @@ class ObjectMiddleware extends SerializerMiddleware { .join(" -> "); }; let hasDebugInfoAttached; - const ctx = { + let ctx = { write(value, key) { try { process(value); @@ -116148,13 +116556,18 @@ class ObjectMiddleware extends SerializerMiddleware { for (const item of data) { process(item); } + return result; } catch (e) { if (e === NOT_SERIALIZABLE) return null; throw e; + } finally { + // Get rid of these references to avoid leaking memory + // This happens because the optimized code v8 generates + // is optimized for our "ctx.write" method so it will reference + // it from e. g. Dependency.prototype.serialize -(IC)-> ctx.write + data = result = referenceable = bufferDedupeMap = objectTypeLookup = ctx = undefined; } - - return result; } /** @@ -116182,8 +116595,8 @@ class ObjectMiddleware extends SerializerMiddleware { }; let currentPosTypeLookup = 0; let objectTypeLookup = []; - const result = []; - const ctx = { + let result = []; + let ctx = { read() { return decodeValue(); }, @@ -116310,16 +116723,18 @@ class ObjectMiddleware extends SerializerMiddleware { } }; - while (currentDataPos < data.length) { - result.push(decodeValue()); + try { + while (currentDataPos < data.length) { + result.push(decodeValue()); + } + return result; + } finally { + // Get rid of these references to avoid leaking memory + // This happens because the optimized code v8 generates + // is optimized for our "ctx.read" method so it will reference + // it from e. g. Dependency.prototype.deserialize -(IC)-> ctx.read + result = referenceable = data = objectTypeLookup = ctx = undefined; } - - // Help the GC, as functions above might be cached in inline caches - referenceable = undefined; - objectTypeLookup = undefined; - data = undefined; - - return result; } } @@ -118979,9 +119394,9 @@ const { makePathsRelative, parseResource } = __webpack_require__(47779); * @property {string=} loc * @property {string|number=} chunkId * @property {string|number=} moduleId - * @property {any=} moduleTrace + * @property {StatsModuleTraceItem[]=} moduleTrace * @property {any=} details - * @property {any=} stack + * @property {string=} stack */ /** @typedef {Asset & { type: string, related: PreprocessedAsset[] }} PreprocessedAsset */ @@ -127199,6 +127614,7 @@ class Group { lastNode = node; } } + if (resultNodes.length === this.nodes.length) return undefined; this.nodes = newNodes; this.similarities = newSimilarities; this.size = sumSize(newNodes); @@ -127279,14 +127695,15 @@ module.exports = ({ maxSize, minSize, items, getSize, getKey }) => { if (initialNodes.length > 0) { const initialGroup = new Group(initialNodes, getSimilarities(initialNodes)); - const removeProblematicNodes = group => { - const problemTypes = getTooSmallTypes(group.size, minSize); + const removeProblematicNodes = (group, consideredSize = group.size) => { + const problemTypes = getTooSmallTypes(consideredSize, minSize); if (problemTypes.size > 0) { // We hit an edge case where the working set is already smaller than minSize // We merge problematic nodes with the smallest result node to keep minSize intact const problemNodes = group.popNodes( n => getNumberOfMatchingSizeTypes(n.size, problemTypes) > 0 ); + if (problemNodes === undefined) return false; // Only merge it with result nodes that have the problematic size type const possibleResultGroups = result.filter( n => getNumberOfMatchingSizeTypes(n.size, problemTypes) > 0 @@ -127360,7 +127777,31 @@ module.exports = ({ maxSize, minSize, items, getSize, getKey }) => { right--; } + // left v v right + // [ O O O ] O O O [ O O O ] + // ^^^^^^^^^ leftSize + // rightSize ^^^^^^^^^ + // leftSize > minSize + // rightSize > minSize + + // Perfect split: [ O O O ] [ O O O ] + // right === left - 1 + if (left - 1 > right) { + // We try to remove some problematic nodes to "fix" that + let prevSize; + if (right < group.nodes.length - left) { + subtractSizeFrom(rightSize, group.nodes[right + 1].size); + prevSize = rightSize; + } else { + subtractSizeFrom(leftSize, group.nodes[left - 1].size); + prevSize = leftSize; + } + if (removeProblematicNodes(group, prevSize)) { + // This changed something, so we try this group again + queue.push(group); + continue; + } // can't split group while holding minSize // because minSize is preferred of maxSize we return // the problematic nodes as result here even while it's too big @@ -127378,7 +127819,13 @@ module.exports = ({ maxSize, minSize, items, getSize, getKey }) => { let bestSimilarity = Infinity; let pos = left; let rightSize = sumSize(group.nodes.slice(pos)); - while (pos <= right) { + + // pos v v right + // [ O O O ] O O O [ O O O ] + // ^^^^^^^^^ leftSize + // rightSize ^^^^^^^^^^^^^^^ + + while (pos <= right + 1) { const similarity = group.similarities[pos - 1]; if ( similarity < bestSimilarity && @@ -127393,7 +127840,9 @@ module.exports = ({ maxSize, minSize, items, getSize, getKey }) => { pos++; } if (best < 0) { - // can't split group while holding minSize + // This can't happen + // but if that assumption is wrong + // fallback to a big group result.push(group); continue; } From 95b98396222f3765796c6ba5b7b144b937de0dcb Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 1 Apr 2021 15:15:29 -0500 Subject: [PATCH 14/36] v10.1.3-canary.1 --- lerna.json | 2 +- packages/create-next-app/package.json | 2 +- packages/eslint-plugin-next/package.json | 2 +- packages/next-bundle-analyzer/package.json | 2 +- packages/next-codemod/package.json | 2 +- packages/next-env/package.json | 2 +- packages/next-mdx/package.json | 2 +- packages/next-plugin-google-analytics/package.json | 2 +- packages/next-plugin-sentry/package.json | 2 +- packages/next-plugin-storybook/package.json | 2 +- packages/next-polyfill-module/package.json | 2 +- packages/next-polyfill-nomodule/package.json | 2 +- packages/next/package.json | 12 ++++++------ packages/react-dev-overlay/package.json | 2 +- packages/react-refresh-utils/package.json | 2 +- 15 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lerna.json b/lerna.json index 6f7264d1409b7..be85b4ea98e73 100644 --- a/lerna.json +++ b/lerna.json @@ -17,5 +17,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "10.1.3-canary.0" + "version": "10.1.3-canary.1" } diff --git a/packages/create-next-app/package.json b/packages/create-next-app/package.json index 1184a8ba47a42..72f542b8753c4 100644 --- a/packages/create-next-app/package.json +++ b/packages/create-next-app/package.json @@ -1,6 +1,6 @@ { "name": "create-next-app", - "version": "10.1.3-canary.0", + "version": "10.1.3-canary.1", "keywords": [ "react", "next", diff --git a/packages/eslint-plugin-next/package.json b/packages/eslint-plugin-next/package.json index 0a51e4b65c4bd..92f097c1aebf0 100644 --- a/packages/eslint-plugin-next/package.json +++ b/packages/eslint-plugin-next/package.json @@ -1,6 +1,6 @@ { "name": "@next/eslint-plugin-next", - "version": "10.1.3-canary.0", + "version": "10.1.3-canary.1", "description": "ESLint plugin for NextJS.", "main": "lib/index.js", "license": "MIT", diff --git a/packages/next-bundle-analyzer/package.json b/packages/next-bundle-analyzer/package.json index 176eb3c6a3338..e155ed153adee 100644 --- a/packages/next-bundle-analyzer/package.json +++ b/packages/next-bundle-analyzer/package.json @@ -1,6 +1,6 @@ { "name": "@next/bundle-analyzer", - "version": "10.1.3-canary.0", + "version": "10.1.3-canary.1", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-codemod/package.json b/packages/next-codemod/package.json index 9149dad64c674..5313f31882b5b 100644 --- a/packages/next-codemod/package.json +++ b/packages/next-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@next/codemod", - "version": "10.1.3-canary.0", + "version": "10.1.3-canary.1", "license": "MIT", "dependencies": { "chalk": "4.1.0", diff --git a/packages/next-env/package.json b/packages/next-env/package.json index a89b4f17005f2..5cdd4df68596f 100644 --- a/packages/next-env/package.json +++ b/packages/next-env/package.json @@ -1,6 +1,6 @@ { "name": "@next/env", - "version": "10.1.3-canary.0", + "version": "10.1.3-canary.1", "keywords": [ "react", "next", diff --git a/packages/next-mdx/package.json b/packages/next-mdx/package.json index fca83c0185185..991529a9150e1 100644 --- a/packages/next-mdx/package.json +++ b/packages/next-mdx/package.json @@ -1,6 +1,6 @@ { "name": "@next/mdx", - "version": "10.1.3-canary.0", + "version": "10.1.3-canary.1", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-plugin-google-analytics/package.json b/packages/next-plugin-google-analytics/package.json index 3ec8f5c7083db..f996adee584be 100644 --- a/packages/next-plugin-google-analytics/package.json +++ b/packages/next-plugin-google-analytics/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-google-analytics", - "version": "10.1.3-canary.0", + "version": "10.1.3-canary.1", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-google-analytics" diff --git a/packages/next-plugin-sentry/package.json b/packages/next-plugin-sentry/package.json index c47caa6c1c8d9..8d56178544a63 100644 --- a/packages/next-plugin-sentry/package.json +++ b/packages/next-plugin-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-sentry", - "version": "10.1.3-canary.0", + "version": "10.1.3-canary.1", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-sentry" diff --git a/packages/next-plugin-storybook/package.json b/packages/next-plugin-storybook/package.json index 7e5504a8a67a8..c3e5391bb2071 100644 --- a/packages/next-plugin-storybook/package.json +++ b/packages/next-plugin-storybook/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-storybook", - "version": "10.1.3-canary.0", + "version": "10.1.3-canary.1", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-storybook" diff --git a/packages/next-polyfill-module/package.json b/packages/next-polyfill-module/package.json index 7705eaa0e369b..f500b4ee9f712 100644 --- a/packages/next-polyfill-module/package.json +++ b/packages/next-polyfill-module/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-module", - "version": "10.1.3-canary.0", + "version": "10.1.3-canary.1", "description": "A standard library polyfill for ES Modules supporting browsers (Edge 16+, Firefox 60+, Chrome 61+, Safari 10.1+)", "main": "dist/polyfill-module.js", "license": "MIT", diff --git a/packages/next-polyfill-nomodule/package.json b/packages/next-polyfill-nomodule/package.json index 71d9d40263482..1ad63de8ab1f8 100644 --- a/packages/next-polyfill-nomodule/package.json +++ b/packages/next-polyfill-nomodule/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-nomodule", - "version": "10.1.3-canary.0", + "version": "10.1.3-canary.1", "description": "A polyfill for non-dead, nomodule browsers.", "main": "dist/polyfill-nomodule.js", "license": "MIT", diff --git a/packages/next/package.json b/packages/next/package.json index cf6959257db65..1f4e2d06dd81d 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "10.1.3-canary.0", + "version": "10.1.3-canary.1", "description": "The React Framework", "main": "./dist/server/next.js", "license": "MIT", @@ -62,10 +62,10 @@ "dependencies": { "@babel/runtime": "7.12.5", "@hapi/accept": "5.0.1", - "@next/env": "10.1.3-canary.0", - "@next/polyfill-module": "10.1.3-canary.0", - "@next/react-dev-overlay": "10.1.3-canary.0", - "@next/react-refresh-utils": "10.1.3-canary.0", + "@next/env": "10.1.3-canary.1", + "@next/polyfill-module": "10.1.3-canary.1", + "@next/react-dev-overlay": "10.1.3-canary.1", + "@next/react-refresh-utils": "10.1.3-canary.1", "@opentelemetry/api": "0.14.0", "assert": "2.0.0", "ast-types": "0.13.2", @@ -146,7 +146,7 @@ "@babel/preset-react": "7.12.10", "@babel/preset-typescript": "7.12.7", "@babel/types": "7.12.12", - "@next/polyfill-nomodule": "10.1.3-canary.0", + "@next/polyfill-nomodule": "10.1.3-canary.1", "@taskr/clear": "1.1.0", "@taskr/esnext": "1.1.0", "@taskr/watch": "1.1.0", diff --git a/packages/react-dev-overlay/package.json b/packages/react-dev-overlay/package.json index 160cecb010f56..c80f4bc31ddc6 100644 --- a/packages/react-dev-overlay/package.json +++ b/packages/react-dev-overlay/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-dev-overlay", - "version": "10.1.3-canary.0", + "version": "10.1.3-canary.1", "description": "A development-only overlay for developing React applications.", "repository": { "url": "vercel/next.js", diff --git a/packages/react-refresh-utils/package.json b/packages/react-refresh-utils/package.json index 8445c76d26607..532a80ef7ce19 100644 --- a/packages/react-refresh-utils/package.json +++ b/packages/react-refresh-utils/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-refresh-utils", - "version": "10.1.3-canary.0", + "version": "10.1.3-canary.1", "description": "An experimental package providing utilities for React Refresh.", "repository": { "url": "vercel/next.js", From af3315b14d2704a58edffbf8c0c7cf4de9b44380 Mon Sep 17 00:00:00 2001 From: Gerald Monaco Date: Thu, 1 Apr 2021 18:21:15 -0700 Subject: [PATCH 15/36] Clean up RenderOptsPartial (#23614) * Remove autoExport from RenderOpts * Remove ampMode from RenderOpts * Stop passing inAmpMode and hybridAmp * Unset nextExport when falsy --- packages/next/export/worker.ts | 35 +++++++++++++++------ packages/next/next-server/server/render.tsx | 16 +++------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/packages/next/export/worker.ts b/packages/next/export/worker.ts index 27da634b5cacf..e3668a16ccb9d 100644 --- a/packages/next/export/worker.ts +++ b/packages/next/export/worker.ts @@ -17,6 +17,7 @@ import { requireFontManifest } from '../next-server/server/require' import { FontManifest } from '../next-server/server/font-utils' import { normalizeLocalePath } from '../next-server/lib/i18n/normalize-locale-path' import { trace } from '../telemetry/trace' +import { isInAmpMode } from '../next-server/lib/amp' const envConfig = require('../next-server/lib/runtime-config') @@ -67,8 +68,6 @@ interface RenderOpts { ampPath?: string ampValidatorPath?: string ampSkipValidation?: boolean - hybridAmp?: boolean - inAmpMode?: boolean optimizeFonts?: boolean optimizeImages?: boolean optimizeCss?: any @@ -215,6 +214,8 @@ export default async function exportPage({ let html let curRenderOpts: RenderOpts = {} let renderMethod = renderToHTML + let inAmpMode = false, + hybridAmp = false const renderedDuringBuild = (getStaticProps: any) => { return !buildExport && getStaticProps && !isDynamicRoute(path) @@ -229,11 +230,18 @@ export default async function exportPage({ ...query, }, }) - const { Component: mod, getServerSideProps } = await loadComponents( - distDir, - page, - serverless - ) + const { + Component: mod, + getServerSideProps, + pageConfig, + } = await loadComponents(distDir, page, serverless) + const ampState = { + ampFirst: pageConfig?.amp === true, + hasQuery: Boolean(query.amp), + hybrid: pageConfig?.amp === 'hybrid', + } + inAmpMode = isInAmpMode(ampState) + hybridAmp = ampState.hybrid if (getServerSideProps) { throw new Error( @@ -292,6 +300,13 @@ export default async function exportPage({ } } else { const components = await loadComponents(distDir, page, serverless) + const ampState = { + ampFirst: components.pageConfig?.amp === true, + hasQuery: Boolean(query.amp), + hybrid: components.pageConfig?.amp === 'hybrid', + } + inAmpMode = isInAmpMode(ampState) + hybridAmp = ampState.hybrid if (components.getServerSideProps) { throw new Error( @@ -371,11 +386,11 @@ export default async function exportPage({ } } - if (curRenderOpts.inAmpMode && !curRenderOpts.ampSkipValidation) { + if (inAmpMode && !curRenderOpts.ampSkipValidation) { if (!results.ssgNotFound) { await validateAmp(html, path, curRenderOpts.ampValidatorPath) } - } else if (curRenderOpts.hybridAmp) { + } else if (hybridAmp) { // we need to render the AMP version let ampHtmlFilename = `${ampPath}${sep}index.html` if (!subFolders) { @@ -433,7 +448,7 @@ export default async function exportPage({ 'utf8' ) - if (curRenderOpts.hybridAmp) { + if (hybridAmp) { await promises.writeFile( dataFile.replace(/\.json$/, '.amp.json'), JSON.stringify((curRenderOpts as any).pageData), diff --git a/packages/next/next-server/server/render.tsx b/packages/next/next-server/server/render.tsx index 9052e38e59fcc..32106aa967b4f 100644 --- a/packages/next/next-server/server/render.tsx +++ b/packages/next/next-server/server/render.tsx @@ -165,13 +165,9 @@ export type RenderOptsPartial = { runtimeConfig?: { [key: string]: any } assetPrefix?: string err?: Error | null - autoExport?: boolean nextExport?: boolean dev?: boolean - ampMode?: any ampPath?: string - inAmpMode?: boolean - hybridAmp?: boolean ErrorDebug?: React.ComponentType<{ error: Error }> ampValidator?: (html: string, pathname: string) => Promise ampSkipValidation?: boolean @@ -261,6 +257,7 @@ function renderDocument( devOnlyCacheBusterQueryString: string scriptLoader: any isPreview?: boolean + autoExport?: boolean } ): string { return ( @@ -533,7 +530,6 @@ export async function renderToHTML( req.url!.endsWith('/') && pathname !== '/' && !pageIsDynamic ? '/' : '' }` req.url = pathname - renderOpts.nextExport = true } if (pathname === '/404' && (hasPageGetInitialProps || getServerSideProps)) { @@ -550,8 +546,6 @@ export async function renderToHTML( ) } } - if (isAutoExport) renderOpts.autoExport = true - if (isSSG) renderOpts.nextExport = false await Loadable.preloadAll() // Make sure all dynamic imports are loaded @@ -1038,11 +1032,9 @@ export async function renderToHTML( const dynamicImportsIds = [...dynamicImportIdsSet] const hybridAmp = ampState.hybrid - // update renderOpts so export knows current state - renderOpts.inAmpMode = inAmpMode - renderOpts.hybridAmp = hybridAmp - const docComponentsRendered: DocumentProps['docComponentsRendered'] = {} + const nextExport = + !isSSG && (renderOpts.nextExport || (dev && (isAutoExport || isFallback))) let html = renderDocument(Document, { ...renderOpts, @@ -1078,6 +1070,8 @@ export async function renderToHTML( devOnlyCacheBusterQueryString, scriptLoader, isPreview: isPreview === true ? true : undefined, + autoExport: isAutoExport === true ? true : undefined, + nextExport: nextExport === true ? true : undefined, }) if (process.env.NODE_ENV !== 'production') { From 6e51f2a8163034314d564450ae5f9e8705beb62b Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Fri, 2 Apr 2021 12:22:15 +0200 Subject: [PATCH 16/36] v10.1.3-canary.2 --- lerna.json | 2 +- packages/create-next-app/package.json | 2 +- packages/eslint-plugin-next/package.json | 2 +- packages/next-bundle-analyzer/package.json | 2 +- packages/next-codemod/package.json | 2 +- packages/next-env/package.json | 2 +- packages/next-mdx/package.json | 2 +- packages/next-plugin-google-analytics/package.json | 2 +- packages/next-plugin-sentry/package.json | 2 +- packages/next-plugin-storybook/package.json | 2 +- packages/next-polyfill-module/package.json | 2 +- packages/next-polyfill-nomodule/package.json | 2 +- packages/next/package.json | 12 ++++++------ packages/react-dev-overlay/package.json | 2 +- packages/react-refresh-utils/package.json | 2 +- 15 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lerna.json b/lerna.json index be85b4ea98e73..153b3ba534b2c 100644 --- a/lerna.json +++ b/lerna.json @@ -17,5 +17,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "10.1.3-canary.1" + "version": "10.1.3-canary.2" } diff --git a/packages/create-next-app/package.json b/packages/create-next-app/package.json index 72f542b8753c4..e3668bffd9fd9 100644 --- a/packages/create-next-app/package.json +++ b/packages/create-next-app/package.json @@ -1,6 +1,6 @@ { "name": "create-next-app", - "version": "10.1.3-canary.1", + "version": "10.1.3-canary.2", "keywords": [ "react", "next", diff --git a/packages/eslint-plugin-next/package.json b/packages/eslint-plugin-next/package.json index 92f097c1aebf0..3221a7d76d5ad 100644 --- a/packages/eslint-plugin-next/package.json +++ b/packages/eslint-plugin-next/package.json @@ -1,6 +1,6 @@ { "name": "@next/eslint-plugin-next", - "version": "10.1.3-canary.1", + "version": "10.1.3-canary.2", "description": "ESLint plugin for NextJS.", "main": "lib/index.js", "license": "MIT", diff --git a/packages/next-bundle-analyzer/package.json b/packages/next-bundle-analyzer/package.json index e155ed153adee..e067c4bd4300d 100644 --- a/packages/next-bundle-analyzer/package.json +++ b/packages/next-bundle-analyzer/package.json @@ -1,6 +1,6 @@ { "name": "@next/bundle-analyzer", - "version": "10.1.3-canary.1", + "version": "10.1.3-canary.2", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-codemod/package.json b/packages/next-codemod/package.json index 5313f31882b5b..1b28fb3669806 100644 --- a/packages/next-codemod/package.json +++ b/packages/next-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@next/codemod", - "version": "10.1.3-canary.1", + "version": "10.1.3-canary.2", "license": "MIT", "dependencies": { "chalk": "4.1.0", diff --git a/packages/next-env/package.json b/packages/next-env/package.json index 5cdd4df68596f..a2640daa5b24c 100644 --- a/packages/next-env/package.json +++ b/packages/next-env/package.json @@ -1,6 +1,6 @@ { "name": "@next/env", - "version": "10.1.3-canary.1", + "version": "10.1.3-canary.2", "keywords": [ "react", "next", diff --git a/packages/next-mdx/package.json b/packages/next-mdx/package.json index 991529a9150e1..bd73cb6c9befe 100644 --- a/packages/next-mdx/package.json +++ b/packages/next-mdx/package.json @@ -1,6 +1,6 @@ { "name": "@next/mdx", - "version": "10.1.3-canary.1", + "version": "10.1.3-canary.2", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-plugin-google-analytics/package.json b/packages/next-plugin-google-analytics/package.json index f996adee584be..1c0c18bd665ec 100644 --- a/packages/next-plugin-google-analytics/package.json +++ b/packages/next-plugin-google-analytics/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-google-analytics", - "version": "10.1.3-canary.1", + "version": "10.1.3-canary.2", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-google-analytics" diff --git a/packages/next-plugin-sentry/package.json b/packages/next-plugin-sentry/package.json index 8d56178544a63..e0560094e9418 100644 --- a/packages/next-plugin-sentry/package.json +++ b/packages/next-plugin-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-sentry", - "version": "10.1.3-canary.1", + "version": "10.1.3-canary.2", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-sentry" diff --git a/packages/next-plugin-storybook/package.json b/packages/next-plugin-storybook/package.json index c3e5391bb2071..2e1595f94a3d0 100644 --- a/packages/next-plugin-storybook/package.json +++ b/packages/next-plugin-storybook/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-storybook", - "version": "10.1.3-canary.1", + "version": "10.1.3-canary.2", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-storybook" diff --git a/packages/next-polyfill-module/package.json b/packages/next-polyfill-module/package.json index f500b4ee9f712..4256cf408ebf0 100644 --- a/packages/next-polyfill-module/package.json +++ b/packages/next-polyfill-module/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-module", - "version": "10.1.3-canary.1", + "version": "10.1.3-canary.2", "description": "A standard library polyfill for ES Modules supporting browsers (Edge 16+, Firefox 60+, Chrome 61+, Safari 10.1+)", "main": "dist/polyfill-module.js", "license": "MIT", diff --git a/packages/next-polyfill-nomodule/package.json b/packages/next-polyfill-nomodule/package.json index 1ad63de8ab1f8..7f7bc888ebbc0 100644 --- a/packages/next-polyfill-nomodule/package.json +++ b/packages/next-polyfill-nomodule/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-nomodule", - "version": "10.1.3-canary.1", + "version": "10.1.3-canary.2", "description": "A polyfill for non-dead, nomodule browsers.", "main": "dist/polyfill-nomodule.js", "license": "MIT", diff --git a/packages/next/package.json b/packages/next/package.json index 1f4e2d06dd81d..a93cca2ab4f44 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "10.1.3-canary.1", + "version": "10.1.3-canary.2", "description": "The React Framework", "main": "./dist/server/next.js", "license": "MIT", @@ -62,10 +62,10 @@ "dependencies": { "@babel/runtime": "7.12.5", "@hapi/accept": "5.0.1", - "@next/env": "10.1.3-canary.1", - "@next/polyfill-module": "10.1.3-canary.1", - "@next/react-dev-overlay": "10.1.3-canary.1", - "@next/react-refresh-utils": "10.1.3-canary.1", + "@next/env": "10.1.3-canary.2", + "@next/polyfill-module": "10.1.3-canary.2", + "@next/react-dev-overlay": "10.1.3-canary.2", + "@next/react-refresh-utils": "10.1.3-canary.2", "@opentelemetry/api": "0.14.0", "assert": "2.0.0", "ast-types": "0.13.2", @@ -146,7 +146,7 @@ "@babel/preset-react": "7.12.10", "@babel/preset-typescript": "7.12.7", "@babel/types": "7.12.12", - "@next/polyfill-nomodule": "10.1.3-canary.1", + "@next/polyfill-nomodule": "10.1.3-canary.2", "@taskr/clear": "1.1.0", "@taskr/esnext": "1.1.0", "@taskr/watch": "1.1.0", diff --git a/packages/react-dev-overlay/package.json b/packages/react-dev-overlay/package.json index c80f4bc31ddc6..0547eabb7d455 100644 --- a/packages/react-dev-overlay/package.json +++ b/packages/react-dev-overlay/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-dev-overlay", - "version": "10.1.3-canary.1", + "version": "10.1.3-canary.2", "description": "A development-only overlay for developing React applications.", "repository": { "url": "vercel/next.js", diff --git a/packages/react-refresh-utils/package.json b/packages/react-refresh-utils/package.json index 532a80ef7ce19..f37dc8e1f177e 100644 --- a/packages/react-refresh-utils/package.json +++ b/packages/react-refresh-utils/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-refresh-utils", - "version": "10.1.3-canary.1", + "version": "10.1.3-canary.2", "description": "An experimental package providing utilities for React Refresh.", "repository": { "url": "vercel/next.js", From 29aa48dfc4684ac3c05177e69ac3e7d79c98cdf8 Mon Sep 17 00:00:00 2001 From: Tim Neutkens Date: Fri, 2 Apr 2021 12:24:12 +0200 Subject: [PATCH 17/36] v10.1.3 --- lerna.json | 2 +- packages/create-next-app/package.json | 2 +- packages/eslint-plugin-next/package.json | 2 +- packages/next-bundle-analyzer/package.json | 2 +- packages/next-codemod/package.json | 2 +- packages/next-env/package.json | 2 +- packages/next-mdx/package.json | 2 +- packages/next-plugin-google-analytics/package.json | 2 +- packages/next-plugin-sentry/package.json | 2 +- packages/next-plugin-storybook/package.json | 2 +- packages/next-polyfill-module/package.json | 2 +- packages/next-polyfill-nomodule/package.json | 2 +- packages/next/package.json | 12 ++++++------ packages/react-dev-overlay/package.json | 2 +- packages/react-refresh-utils/package.json | 2 +- 15 files changed, 20 insertions(+), 20 deletions(-) diff --git a/lerna.json b/lerna.json index 153b3ba534b2c..678fdd122b54e 100644 --- a/lerna.json +++ b/lerna.json @@ -17,5 +17,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "10.1.3-canary.2" + "version": "10.1.3" } diff --git a/packages/create-next-app/package.json b/packages/create-next-app/package.json index e3668bffd9fd9..4ea9be3ac02c4 100644 --- a/packages/create-next-app/package.json +++ b/packages/create-next-app/package.json @@ -1,6 +1,6 @@ { "name": "create-next-app", - "version": "10.1.3-canary.2", + "version": "10.1.3", "keywords": [ "react", "next", diff --git a/packages/eslint-plugin-next/package.json b/packages/eslint-plugin-next/package.json index 3221a7d76d5ad..f407b631a8cf2 100644 --- a/packages/eslint-plugin-next/package.json +++ b/packages/eslint-plugin-next/package.json @@ -1,6 +1,6 @@ { "name": "@next/eslint-plugin-next", - "version": "10.1.3-canary.2", + "version": "10.1.3", "description": "ESLint plugin for NextJS.", "main": "lib/index.js", "license": "MIT", diff --git a/packages/next-bundle-analyzer/package.json b/packages/next-bundle-analyzer/package.json index e067c4bd4300d..12021bdde017e 100644 --- a/packages/next-bundle-analyzer/package.json +++ b/packages/next-bundle-analyzer/package.json @@ -1,6 +1,6 @@ { "name": "@next/bundle-analyzer", - "version": "10.1.3-canary.2", + "version": "10.1.3", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-codemod/package.json b/packages/next-codemod/package.json index 1b28fb3669806..b23f8190d45a0 100644 --- a/packages/next-codemod/package.json +++ b/packages/next-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@next/codemod", - "version": "10.1.3-canary.2", + "version": "10.1.3", "license": "MIT", "dependencies": { "chalk": "4.1.0", diff --git a/packages/next-env/package.json b/packages/next-env/package.json index a2640daa5b24c..b67c0ab55731f 100644 --- a/packages/next-env/package.json +++ b/packages/next-env/package.json @@ -1,6 +1,6 @@ { "name": "@next/env", - "version": "10.1.3-canary.2", + "version": "10.1.3", "keywords": [ "react", "next", diff --git a/packages/next-mdx/package.json b/packages/next-mdx/package.json index bd73cb6c9befe..3eb585b1692a7 100644 --- a/packages/next-mdx/package.json +++ b/packages/next-mdx/package.json @@ -1,6 +1,6 @@ { "name": "@next/mdx", - "version": "10.1.3-canary.2", + "version": "10.1.3", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-plugin-google-analytics/package.json b/packages/next-plugin-google-analytics/package.json index 1c0c18bd665ec..00c12e2de3a66 100644 --- a/packages/next-plugin-google-analytics/package.json +++ b/packages/next-plugin-google-analytics/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-google-analytics", - "version": "10.1.3-canary.2", + "version": "10.1.3", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-google-analytics" diff --git a/packages/next-plugin-sentry/package.json b/packages/next-plugin-sentry/package.json index e0560094e9418..b24d862b4e3a6 100644 --- a/packages/next-plugin-sentry/package.json +++ b/packages/next-plugin-sentry/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-sentry", - "version": "10.1.3-canary.2", + "version": "10.1.3", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-sentry" diff --git a/packages/next-plugin-storybook/package.json b/packages/next-plugin-storybook/package.json index 2e1595f94a3d0..49f7d6bea549d 100644 --- a/packages/next-plugin-storybook/package.json +++ b/packages/next-plugin-storybook/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-storybook", - "version": "10.1.3-canary.2", + "version": "10.1.3", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-storybook" diff --git a/packages/next-polyfill-module/package.json b/packages/next-polyfill-module/package.json index 4256cf408ebf0..9dbb006fc47b4 100644 --- a/packages/next-polyfill-module/package.json +++ b/packages/next-polyfill-module/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-module", - "version": "10.1.3-canary.2", + "version": "10.1.3", "description": "A standard library polyfill for ES Modules supporting browsers (Edge 16+, Firefox 60+, Chrome 61+, Safari 10.1+)", "main": "dist/polyfill-module.js", "license": "MIT", diff --git a/packages/next-polyfill-nomodule/package.json b/packages/next-polyfill-nomodule/package.json index 7f7bc888ebbc0..ea1ab2f17bed2 100644 --- a/packages/next-polyfill-nomodule/package.json +++ b/packages/next-polyfill-nomodule/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-nomodule", - "version": "10.1.3-canary.2", + "version": "10.1.3", "description": "A polyfill for non-dead, nomodule browsers.", "main": "dist/polyfill-nomodule.js", "license": "MIT", diff --git a/packages/next/package.json b/packages/next/package.json index a93cca2ab4f44..0dd66c2d51dd4 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "10.1.3-canary.2", + "version": "10.1.3", "description": "The React Framework", "main": "./dist/server/next.js", "license": "MIT", @@ -62,10 +62,10 @@ "dependencies": { "@babel/runtime": "7.12.5", "@hapi/accept": "5.0.1", - "@next/env": "10.1.3-canary.2", - "@next/polyfill-module": "10.1.3-canary.2", - "@next/react-dev-overlay": "10.1.3-canary.2", - "@next/react-refresh-utils": "10.1.3-canary.2", + "@next/env": "10.1.3", + "@next/polyfill-module": "10.1.3", + "@next/react-dev-overlay": "10.1.3", + "@next/react-refresh-utils": "10.1.3", "@opentelemetry/api": "0.14.0", "assert": "2.0.0", "ast-types": "0.13.2", @@ -146,7 +146,7 @@ "@babel/preset-react": "7.12.10", "@babel/preset-typescript": "7.12.7", "@babel/types": "7.12.12", - "@next/polyfill-nomodule": "10.1.3-canary.2", + "@next/polyfill-nomodule": "10.1.3", "@taskr/clear": "1.1.0", "@taskr/esnext": "1.1.0", "@taskr/watch": "1.1.0", diff --git a/packages/react-dev-overlay/package.json b/packages/react-dev-overlay/package.json index 0547eabb7d455..f0a9ac87815fd 100644 --- a/packages/react-dev-overlay/package.json +++ b/packages/react-dev-overlay/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-dev-overlay", - "version": "10.1.3-canary.2", + "version": "10.1.3", "description": "A development-only overlay for developing React applications.", "repository": { "url": "vercel/next.js", diff --git a/packages/react-refresh-utils/package.json b/packages/react-refresh-utils/package.json index f37dc8e1f177e..62ae9ead1b4ad 100644 --- a/packages/react-refresh-utils/package.json +++ b/packages/react-refresh-utils/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-refresh-utils", - "version": "10.1.3-canary.2", + "version": "10.1.3", "description": "An experimental package providing utilities for React Refresh.", "repository": { "url": "vercel/next.js", From be0957650dc662955e1b1b8c628b85489fdf17d9 Mon Sep 17 00:00:00 2001 From: rpxs Date: Fri, 2 Apr 2021 07:38:58 -0600 Subject: [PATCH 18/36] fixes a part of #23607 remove with-glamor example (#23639) ## Bug - [x] Related issues linked using `fixes #number` - [ ] Integration tests added ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. ## Documentation / Examples - [ ] Make sure the linting passes The `with-glamor` package has been unmaintained for 4 years now. --- examples/with-glamor/.babelrc | 4 --- examples/with-glamor/.gitignore | 34 ----------------------- examples/with-glamor/README.md | 25 ----------------- examples/with-glamor/next.config.js | 16 ----------- examples/with-glamor/package.json | 17 ------------ examples/with-glamor/pages/_document.js | 36 ------------------------- examples/with-glamor/pages/index.js | 17 ------------ 7 files changed, 149 deletions(-) delete mode 100644 examples/with-glamor/.babelrc delete mode 100644 examples/with-glamor/.gitignore delete mode 100644 examples/with-glamor/README.md delete mode 100644 examples/with-glamor/next.config.js delete mode 100644 examples/with-glamor/package.json delete mode 100644 examples/with-glamor/pages/_document.js delete mode 100644 examples/with-glamor/pages/index.js diff --git a/examples/with-glamor/.babelrc b/examples/with-glamor/.babelrc deleted file mode 100644 index 857ad21176e1b..0000000000000 --- a/examples/with-glamor/.babelrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "presets": ["next/babel"], - "plugins": [["transform-react-jsx", { "pragma": "Glamor.createElement" }]] -} diff --git a/examples/with-glamor/.gitignore b/examples/with-glamor/.gitignore deleted file mode 100644 index 1437c53f70bc2..0000000000000 --- a/examples/with-glamor/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env.local -.env.development.local -.env.test.local -.env.production.local - -# vercel -.vercel diff --git a/examples/with-glamor/README.md b/examples/with-glamor/README.md deleted file mode 100644 index c09f9d12aa4e3..0000000000000 --- a/examples/with-glamor/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Example app with glamor - -This example features how to use a different styling solution than [styled-jsx](https://github.com/zeit/styled-jsx) that also supports universal styles. That means we can serve the required styles for the first render within the HTML and then load the rest in the client. In this case we are using [glamor](https://github.com/threepointone/glamor). - -For this purpose we are extending the `` and injecting the server side rendered styles into the ``. - -In this example a custom React.createElement is used. With the help of a babel plugin we can remove the extra boilerplate introduced by having to import this function anywhere the css prop would be used. Documentation of using the `css` prop with glamor [can be found here](https://github.com/threepointone/glamor/blob/master/docs/createElement.md) - -## Deploy your own - -Deploy the example using [Vercel](https://vercel.com?utm_source=github&utm_medium=readme&utm_campaign=next-example): - -[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/external?repository-url=https://github.com/vercel/next.js/tree/canary/examples/with-glamor&project-name=with-glamor&repository-name=with-glamor) - -## How to use - -Execute [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app) with [npm](https://docs.npmjs.com/cli/init) or [Yarn](https://yarnpkg.com/lang/en/docs/cli/create/) to bootstrap the example: - -```bash -npx create-next-app --example with-glamor with-glamor-app -# or -yarn create next-app --example with-glamor with-glamor-app -``` - -Deploy it to the cloud with [Vercel](https://vercel.com/new?utm_source=github&utm_medium=readme&utm_campaign=next-example) ([Documentation](https://nextjs.org/docs/deployment)). diff --git a/examples/with-glamor/next.config.js b/examples/with-glamor/next.config.js deleted file mode 100644 index 8b77b5d10a390..0000000000000 --- a/examples/with-glamor/next.config.js +++ /dev/null @@ -1,16 +0,0 @@ -const webpack = require('webpack') - -module.exports = { - webpack: (config, { buildId, dev, isServer, defaultLoaders }) => { - const { plugins } = config - return { - ...config, - plugins: [ - ...(plugins || []), - new webpack.ProvidePlugin({ - Glamor: 'glamor/react', - }), - ], - } - }, -} diff --git a/examples/with-glamor/package.json b/examples/with-glamor/package.json deleted file mode 100644 index a4c20c36f1ffc..0000000000000 --- a/examples/with-glamor/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "with-glamor", - "version": "1.0.0", - "scripts": { - "dev": "next", - "build": "next build", - "start": "next start" - }, - "dependencies": { - "babel-plugin-transform-react-jsx": "^6.24.1", - "glamor": "^2.20.24", - "next": "latest", - "react": "^16.7.0", - "react-dom": "^16.7.0" - }, - "license": "MIT" -} diff --git a/examples/with-glamor/pages/_document.js b/examples/with-glamor/pages/_document.js deleted file mode 100644 index 4bd79e43d38cc..0000000000000 --- a/examples/with-glamor/pages/_document.js +++ /dev/null @@ -1,36 +0,0 @@ -import Document, { Html, Head, Main, NextScript } from 'next/document' -import { renderStatic } from 'glamor/server' - -class MyDocument extends Document { - static async getInitialProps({ renderPage }) { - const page = await renderPage() - const { css, ids } = renderStatic(() => page.html || page.errorHtml) - return { ...page, css, ids } - } - - render() { - const { ids, css } = this.props - return ( - - -