diff --git a/package.json b/package.json index 199f5c9337a..7ddcd2bc6fb 100644 --- a/package.json +++ b/package.json @@ -90,7 +90,7 @@ "strip-ansi": "^6.0.0", "ts-jest": "^26.4.3", "typescript": "^3.9.7", - "webpack": "^5.10.0", + "webpack": "^5.11.0", "webpack-bundle-analyzer": "^3.9.0", "webpack-dev-server": "^3.11.0", "yeoman-test": "^2.7.0" diff --git a/packages/serve/src/index.ts b/packages/serve/src/index.ts index 45a903e7ce7..c8fe5dfc1dd 100644 --- a/packages/serve/src/index.ts +++ b/packages/serve/src/index.ts @@ -82,8 +82,38 @@ class ServeCommand { const compiler = await cli.createCompiler(webpackOptions); + if (!compiler) { + return; + } + + let servers; + + if (cli.needWatchStdin(compiler) || devServerOptions.stdin) { + // TODO + // Compatibility with old `stdin` option for `webpack-dev-server` + // Should be removed for the next major release on both sides + if (devServerOptions.stdin) { + delete devServerOptions.stdin; + } + + process.stdin.on('end', () => { + Promise.all( + servers.map((server) => { + return new Promise((resolve) => { + server.close(() => { + resolve(); + }); + }); + }), + ).then(() => { + process.exit(0); + }); + }); + process.stdin.resume(); + } + try { - await startDevServer(compiler, devServerOptions, logger); + servers = await startDevServer(compiler, devServerOptions, logger); } catch (error) { if (error.name === 'ValidationError') { logger.error(error.message); diff --git a/packages/webpack-cli/lib/utils/cli-flags.js b/packages/webpack-cli/lib/utils/cli-flags.js index 57ecfa67651..49272981835 100644 --- a/packages/webpack-cli/lib/utils/cli-flags.js +++ b/packages/webpack-cli/lib/utils/cli-flags.js @@ -8,6 +8,7 @@ const minimumHelpFlags = [ 'env', 'mode', 'watch', + 'watch-options-stdin', 'stats', 'devtool', 'entry', @@ -151,6 +152,13 @@ const builtInFlags = [ description: 'Watch for files changes.', negatedDescription: 'Do not watch for file changes.', }, + { + name: 'watch-options-stdin', + usage: '--watch-options-stdin', + type: Boolean, + negative: true, + description: 'Stop watching when stdin stream has ended.', + }, ]; // Extract all the flags being exported from core. diff --git a/packages/webpack-cli/lib/webpack-cli.js b/packages/webpack-cli/lib/webpack-cli.js index 5b7affc6f61..b4ede2b8d62 100644 --- a/packages/webpack-cli/lib/webpack-cli.js +++ b/packages/webpack-cli/lib/webpack-cli.js @@ -1021,6 +1021,13 @@ class WebpackCLI { configOptions.watch = options.watch; } + if (typeof options.watchOptionsStdin !== 'undefined') { + configOptions.watchOptions = { + ...configOptions.watchOptions, + ...{ stdin: options.watchOptionsStdin }, + }; + } + return configOptions; }; @@ -1058,6 +1065,14 @@ class WebpackCLI { return config; } + needWatchStdin(compiler) { + if (compiler.compilers) { + return compiler.compilers.some((compiler) => compiler.options.watchOptions && compiler.options.watchOptions.stdin); + } + + return compiler.options.watchOptions && compiler.options.watchOptions.stdin; + } + async createCompiler(options, callback) { const isValidationError = (error) => { // https://github.com/webpack/webpack/blob/master/lib/index.js#L267 @@ -1098,6 +1113,11 @@ class WebpackCLI { process.exit(2); } + // TODO webpack@4 return Watching and MultiWatching instead Compiler and MultiCompiler, remove this after drop webpack@4 + if (compiler && compiler.compiler) { + compiler = compiler.compiler; + } + return compiler; } @@ -1114,9 +1134,11 @@ class WebpackCLI { process.exitCode = 1; } + // TODO remove after drop webpack@4 + const statsForWebpack4 = webpack.Stats && webpack.Stats.presetToOptions; + const getStatsOptions = (stats) => { - // TODO remove after drop webpack@4 - if (webpack.Stats && webpack.Stats.presetToOptions) { + if (statsForWebpack4) { if (!stats) { stats = {}; } else if (typeof stats === 'boolean' || typeof stats === 'string') { @@ -1144,32 +1166,42 @@ class WebpackCLI { return stats; }; - const getStatsOptionsFromCompiler = (compiler) => getStatsOptions(compiler.options ? compiler.options.stats : undefined); - if (!compiler) { return; } const foundStats = compiler.compilers - ? { children: compiler.compilers.map(getStatsOptionsFromCompiler) } - : getStatsOptionsFromCompiler(compiler); - const handleWriteError = (error) => { - logger.error(error); - process.exit(2); - }; + ? { + children: compiler.compilers.map((compiler) => + getStatsOptions(compiler.options ? compiler.options.stats : undefined), + ), + } + : getStatsOptions(compiler.options ? compiler.options.stats : undefined); + + // TODO webpack@4 doesn't support `{ children: [{ colors: true }, { colors: true }] }` for stats + if (statsForWebpack4 && compiler.compilers) { + foundStats.colors = foundStats.children.some((child) => child.colors); + } + + if (options.json) { + const handleWriteError = (error) => { + logger.error(error); + process.exit(2); + }; - if (options.json === true) { - createJsonStringifyStream(stats.toJson(foundStats)) - .on('error', handleWriteError) - .pipe(process.stdout) - .on('error', handleWriteError) - .on('close', () => process.stdout.write('\n')); - } else if (typeof options.json === 'string') { - createJsonStringifyStream(stats.toJson(foundStats)) - .on('error', handleWriteError) - .pipe(createWriteStream(options.json)) - .on('error', handleWriteError) - .on('close', () => logger.success(`stats are successfully stored as json to ${options.json}`)); + if (options.json === true) { + createJsonStringifyStream(stats.toJson(foundStats)) + .on('error', handleWriteError) + .pipe(process.stdout) + .on('error', handleWriteError) + .on('close', () => process.stdout.write('\n')); + } else { + createJsonStringifyStream(stats.toJson(foundStats)) + .on('error', handleWriteError) + .pipe(createWriteStream(options.json)) + .on('error', handleWriteError) + .on('close', () => logger.success(`stats are successfully stored as json to ${options.json}`)); + } } else { const printedStats = stats.toString(foundStats); @@ -1184,9 +1216,18 @@ class WebpackCLI { compiler = await this.createCompiler(options, callback); - // TODO webpack@4 return Watching and MultiWathing instead Compiler and MultiCompiler, remove this after drop webpack@4 - if (compiler && compiler.compiler) { - compiler = compiler.compiler; + if (!compiler) { + return; + } + + const isWatch = (compiler) => + compiler.compilers ? compiler.compilers.some((compiler) => compiler.options.watch) : compiler.options.watch; + + if (isWatch(compiler) && this.needWatchStdin(compiler)) { + process.stdin.on('end', () => { + process.exit(0); + }); + process.stdin.resume(); } } } diff --git a/test/config/multiple/multiple-config.test.js b/test/config/multiple/multiple-config.test.js index 3daf66584a9..feee98f7bda 100644 --- a/test/config/multiple/multiple-config.test.js +++ b/test/config/multiple/multiple-config.test.js @@ -1,3 +1,5 @@ +const stripAnsi = require('strip-ansi'); + const { run } = require('../../utils/test-utils'); describe('Multiple config flag: ', () => { @@ -8,7 +10,7 @@ describe('Multiple config flag: ', () => { expect(exitCode).toEqual(0); expect(stderr).toBeFalsy(); // Should spawn multiple compilers - expect(stdout).toContain('amd:'); - expect(stdout).toContain('commonjs:'); + expect(stripAnsi(stdout)).toContain('amd:'); + expect(stripAnsi(stdout)).toContain('commonjs:'); }); }); diff --git a/test/core-flags/watch-flags.test.js b/test/core-flags/watch-flags.test.js index b0f9e8f2892..ddb47635f17 100644 --- a/test/core-flags/watch-flags.test.js +++ b/test/core-flags/watch-flags.test.js @@ -11,7 +11,7 @@ describe('watch config related flag', () => { const property = flag.name.split('watch-options-')[1]; const propName = hyphenToUpperCase(property); - if (flag.type === Boolean && flag.name !== 'watch') { + if (flag.type === Boolean && flag.name !== 'watch' && flag.name !== 'watch-options-stdin') { it(`should config --${flag.name} correctly`, () => { const { exitCode, stderr, stdout } = run(__dirname, [`--${flag.name}`]); diff --git a/test/error/error-in-plugin/error.test.js b/test/error/error-in-plugin/error.test.js new file mode 100644 index 00000000000..159bc0579e3 --- /dev/null +++ b/test/error/error-in-plugin/error.test.js @@ -0,0 +1,32 @@ +'use strict'; + +const { run } = require('../../utils/test-utils'); + +describe('error', () => { + it('should log error with stacktrace', async () => { + const { exitCode, stderr, stdout } = await run(__dirname); + + expect(exitCode).toBe(2); + expect(stderr).toContain('Error: test'); + expect(stderr).toMatch(/at .+ (.+)/); + expect(stdout).toBeFalsy(); + }); + + it('should log error with stacktrace using the "bundle" command', async () => { + const { exitCode, stderr, stdout } = await run(__dirname, ['bundle']); + + expect(exitCode).toBe(2); + expect(stderr).toContain('Error: test'); + expect(stderr).toMatch(/at .+ (.+)/); + expect(stdout).toBeFalsy(); + }); + + it('should log error with stacktrace using the "serve" command', async () => { + const { exitCode, stderr, stdout } = await run(__dirname, ['serve']); + + expect(exitCode).toBe(2); + expect(stderr).toContain('Error: test'); + expect(stderr).toMatch(/at .+ (.+)/); + expect(stdout).toBeFalsy(); + }); +}); diff --git a/test/error/src/index.js b/test/error/error-in-plugin/src/index.js similarity index 100% rename from test/error/src/index.js rename to test/error/error-in-plugin/src/index.js diff --git a/test/error/webpack.config.js b/test/error/error-in-plugin/webpack.config.js similarity index 100% rename from test/error/webpack.config.js rename to test/error/error-in-plugin/webpack.config.js diff --git a/test/error/error.test.js b/test/error/error.test.js deleted file mode 100644 index 5096f198b1a..00000000000 --- a/test/error/error.test.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -const { run } = require('../utils/test-utils'); - -describe('error', () => { - it('should log error with stacktrace', async () => { - const { exitCode, stderr, stdout } = await run(__dirname); - - expect(exitCode).toBe(2); - expect(stderr).toContain('Error: test'); - expect(stderr).toMatch(/at .+ (.+)/); - expect(stdout).toBeFalsy(); - }); -}); diff --git a/test/error/invalid-schema/invalid-schema.test.js b/test/error/invalid-schema/invalid-schema.test.js new file mode 100644 index 00000000000..cfcb54542da --- /dev/null +++ b/test/error/invalid-schema/invalid-schema.test.js @@ -0,0 +1,73 @@ +'use strict'; +const { run, isWebpack5 } = require('../../utils/test-utils'); + +describe('invalid schema', () => { + it('should log error on invalid config', () => { + const { exitCode, stderr, stdout } = run(__dirname, ['--config', './webpack.config.mock.js']); + + expect(exitCode).toEqual(2); + expect(stderr).toContain('Invalid configuration object'); + expect(stdout).toBeFalsy(); + }); + + it('should log error on invalid config using the "bundle" command', () => { + const { exitCode, stderr, stdout } = run(__dirname, ['bundle', '--config', './webpack.config.mock.js']); + + expect(exitCode).toEqual(2); + expect(stderr).toContain('Invalid configuration object'); + expect(stdout).toBeFalsy(); + }); + + it('should log error on invalid config using the "serve" command', () => { + const { exitCode, stderr, stdout } = run(__dirname, ['serve', '--config', './webpack.config.mock.js']); + + expect(exitCode).toEqual(2); + expect(stderr).toContain('Invalid configuration object'); + expect(stdout).toBeFalsy(); + }); + + it('should log error on invalid option', () => { + const { exitCode, stderr, stdout } = run(__dirname, ['--mode', 'Yukihira']); + + expect(exitCode).toEqual(2); + + if (isWebpack5) { + expect(stderr).toContain("Invalid value 'Yukihira' for the '--mode' option"); + expect(stderr).toContain("Expected: 'development | production | none'"); + } else { + expect(stderr).toContain('Invalid configuration object'); + } + + expect(stdout).toBeFalsy(); + }); + + it('should log error on invalid option using "bundle" command', () => { + const { exitCode, stderr, stdout } = run(__dirname, ['bundle', '--mode', 'Yukihira']); + + expect(exitCode).toEqual(2); + + if (isWebpack5) { + expect(stderr).toContain("Invalid value 'Yukihira' for the '--mode' option"); + expect(stderr).toContain("Expected: 'development | production | none'"); + } else { + expect(stderr).toContain('Invalid configuration object'); + } + + expect(stdout).toBeFalsy(); + }); + + it('should log error on invalid option using "server" command', () => { + const { exitCode, stderr, stdout } = run(__dirname, ['serve', '--mode', 'Yukihira']); + + expect(exitCode).toEqual(2); + + if (isWebpack5) { + expect(stderr).toContain("Invalid value 'Yukihira' for the '--mode' option"); + expect(stderr).toContain("Expected: 'development | production | none'"); + } else { + expect(stderr).toContain('Invalid configuration object'); + } + + expect(stdout).toBeFalsy(); + }); +}); diff --git a/test/invalid-schema/webpack.config.mock.js b/test/error/invalid-schema/webpack.config.mock.js similarity index 100% rename from test/invalid-schema/webpack.config.mock.js rename to test/error/invalid-schema/webpack.config.mock.js diff --git a/test/invalid-schema/invalid-schema.test.js b/test/invalid-schema/invalid-schema.test.js deleted file mode 100644 index bfea3e8e5e1..00000000000 --- a/test/invalid-schema/invalid-schema.test.js +++ /dev/null @@ -1,27 +0,0 @@ -'use strict'; -const { run, isWebpack5 } = require('../utils/test-utils'); - -describe('invalid schema', () => { - it('should log webpack error and exit process on invalid config', () => { - const { exitCode, stderr, stdout } = run(__dirname, ['--config', './webpack.config.mock.js']); - - expect(exitCode).toEqual(2); - expect(stderr).toContain('Invalid configuration object'); - expect(stdout).toBeFalsy(); - }); - - it('should log webpack error and exit process on invalid flag', () => { - const { exitCode, stderr, stdout } = run(__dirname, ['--mode', 'Yukihira']); - - expect(exitCode).toEqual(2); - - if (isWebpack5) { - expect(stderr).toContain("Invalid value 'Yukihira' for the '--mode' option"); - expect(stderr).toContain("Expected: 'development | production | none'"); - } else { - expect(stderr).toContain('Invalid configuration object'); - } - - expect(stdout).toBeFalsy(); - }); -}); diff --git a/test/watch/src/index.js b/test/watch/simple/src/index.js similarity index 100% rename from test/watch/src/index.js rename to test/watch/simple/src/index.js diff --git a/test/watch/watch.config.js b/test/watch/simple/watch.config.js similarity index 100% rename from test/watch/watch.config.js rename to test/watch/simple/watch.config.js diff --git a/test/watch/watch-flag.test.js b/test/watch/simple/watch.test.js similarity index 95% rename from test/watch/watch-flag.test.js rename to test/watch/simple/watch.test.js index 404a17fc568..4ddf7386acb 100644 --- a/test/watch/watch-flag.test.js +++ b/test/watch/simple/watch.test.js @@ -1,7 +1,7 @@ 'use strict'; const stripAnsi = require('strip-ansi'); -const { run, runAndGetWatchProc, isWebpack5 } = require('../utils/test-utils'); +const { run, runAndGetWatchProc, isWebpack5 } = require('../../utils/test-utils'); const { writeFileSync } = require('fs'); const { resolve } = require('path'); diff --git a/test/watch/stdin/multi-serve.config.js b/test/watch/stdin/multi-serve.config.js new file mode 100644 index 00000000000..ff242580667 --- /dev/null +++ b/test/watch/stdin/multi-serve.config.js @@ -0,0 +1,10 @@ +module.exports = [ + { + entry: './src/second.js', + }, + { + watchOptions: { + stdin: true, + }, + }, +]; diff --git a/test/watch/stdin/multi-watch.config.js b/test/watch/stdin/multi-watch.config.js new file mode 100644 index 00000000000..d722eda347a --- /dev/null +++ b/test/watch/stdin/multi-watch.config.js @@ -0,0 +1,11 @@ +module.exports = [ + { + entry: './src/second.js', + }, + { + watch: true, + watchOptions: { + stdin: true, + }, + }, +]; diff --git a/test/watch/stdin/serve.config.js b/test/watch/stdin/serve.config.js new file mode 100644 index 00000000000..dadb8eaff5c --- /dev/null +++ b/test/watch/stdin/serve.config.js @@ -0,0 +1,5 @@ +module.exports = { + watchOptions: { + stdin: true, + }, +}; diff --git a/test/watch/stdin/src/index.js b/test/watch/stdin/src/index.js new file mode 100644 index 00000000000..efc51ca0a97 --- /dev/null +++ b/test/watch/stdin/src/index.js @@ -0,0 +1 @@ +console.log('watch flag test'); \ No newline at end of file diff --git a/test/watch/stdin/src/second.js b/test/watch/stdin/src/second.js new file mode 100644 index 00000000000..1d8734ee1c8 --- /dev/null +++ b/test/watch/stdin/src/second.js @@ -0,0 +1 @@ +console.log('watch flag test'); diff --git a/test/watch/stdin/stdin.test.js b/test/watch/stdin/stdin.test.js new file mode 100644 index 00000000000..06d285d53ab --- /dev/null +++ b/test/watch/stdin/stdin.test.js @@ -0,0 +1,120 @@ +const { runAndGetWatchProc } = require('../../utils/test-utils'); + +describe('--watch-options-stdin', () => { + it.only('should stop the process when stdin ends using "--watch" and "--watch-options-stdin" options', (done) => { + const proc = runAndGetWatchProc(__dirname, ['--watch', '--watch-options-stdin'], false, '', true); + + let semaphore = false; + + proc.on('exit', () => { + expect(semaphore).toBe(true); + + proc.kill(); + + done(); + }); + + proc.stdin.end(() => { + semaphore = true; + }); + }); + + it('should stop the process when stdin ends using the config file', (done) => { + const proc = runAndGetWatchProc(__dirname, ['--config', './watch.config.js'], false, '', true); + + let semaphore = false; + + proc.on('exit', () => { + expect(semaphore).toBe(true); + + proc.kill(); + + done(); + }); + + proc.stdin.end(() => { + semaphore = true; + }); + }); + + it('should stop the process when stdin ends using the config file in multi compiler mode', (done) => { + const proc = runAndGetWatchProc(__dirname, ['--config', './multi-watch.config.js'], false, '', true); + + let semaphore = false; + + proc.on('exit', () => { + expect(semaphore).toBe(true); + + proc.kill(); + + done(); + }); + + proc.stdin.end(() => { + semaphore = true; + }); + }); + + it('should stop the process when stdin ends using the "serve" command and the "--watch-options-stdin" option', (done) => { + const proc = runAndGetWatchProc(__dirname, ['serve', '--watch-options-stdin'], false, '', true); + let semaphore = false; + + proc.on('exit', () => { + expect(semaphore).toBe(true); + proc.kill(); + done(); + }); + + proc.stdin.end(() => { + semaphore = true; + }); + }); + + it('should stop the process when stdin ends using the "serve" command and the "--stdin" option', (done) => { + const proc = runAndGetWatchProc(__dirname, ['serve', '--stdin'], false, '', true); + let semaphore = false; + + proc.on('exit', () => { + expect(semaphore).toBe(true); + proc.kill(); + done(); + }); + + proc.stdin.end(() => { + semaphore = true; + }); + }); + + it('should stop the process when stdin ends using the "serve" command and configuration', (done) => { + const proc = runAndGetWatchProc(__dirname, ['serve', '--config', './serve.config.js'], false, '', true); + let semaphore = false; + + proc.on('exit', () => { + expect(semaphore).toBe(true); + proc.kill(); + done(); + }); + + proc.stdin.end(() => { + semaphore = true; + }); + }); + + it('should stop the process when stdin ends using the "serve" command and the config file in multi compiler mode', (done) => { + const proc = runAndGetWatchProc(__dirname, ['--config', './multi-watch.config.js'], false, '', true); + + let semaphore = false; + + proc.on('exit', () => { + expect(semaphore).toBe(true); + + proc.kill(); + + done(); + }); + + proc.stdin.end(() => { + semaphore = true; + }); + }); +}); diff --git a/test/watch/stdin/watch.config.js b/test/watch/stdin/watch.config.js new file mode 100644 index 00000000000..1299830a892 --- /dev/null +++ b/test/watch/stdin/watch.config.js @@ -0,0 +1,6 @@ +module.exports = { + watch: true, + watchOptions: { + stdin: true, + }, +}; diff --git a/yarn.lock b/yarn.lock index 739043b9db7..3a780f28088 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2320,9 +2320,9 @@ integrity sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag== "@types/eslint@*": - version "7.2.4" - resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.4.tgz#d12eeed7741d2491b69808576ac2d20c14f74c41" - integrity sha512-YCY4kzHMsHoyKspQH+nwSe+70Kep7Vjt2X+dZe5Vs2vkRudqtoFoUIv1RlJmZB8Hbp7McneupoZij4PadxsK5Q== + version "7.2.6" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.6.tgz#5e9aff555a975596c03a98b59ecd103decc70c3c" + integrity sha512-I+1sYH+NPQ3/tVqCeUSBwTE/0heyvtXqpIopUUArlBm0Kpocb8FbMa3AZ/ASKIFpN3rnEx932TTXDbt9OXsNDw== dependencies: "@types/estree" "*" "@types/json-schema" "*" @@ -4292,13 +4292,20 @@ debug@3.1.0, debug@=3.1.0: dependencies: ms "2.0.0" -debug@^3.1.0, debug@^3.1.1, debug@^3.2.5: +debug@^3.1.0, debug@^3.1.1: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" +debug@^3.2.5: + version "3.2.7" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" @@ -4714,12 +4721,12 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: once "^1.4.0" enhanced-resolve@^5.3.1: - version "5.3.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.3.1.tgz#3f988d0d7775bdc2d96ede321dc81f8249492f57" - integrity sha512-G1XD3MRGrGfNcf6Hg0LVZG7GIKcYkbfHa5QMxt1HDUTdYoXH0JR1xXyg+MaKLF73E9A27uWNVxvFivNRYeUB6w== + version "5.4.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.4.1.tgz#c89b0c34f17f931902ef2913a125d4b825b49b6f" + integrity sha512-4GbyIMzYktTFoRSmkbgZ1LU+RXwf4AQ8Z+rSuuh1dC8plp0PPeaWvx6+G4hh4KnUJ48VoxKbNyA1QQQIUpXjYA== dependencies: graceful-fs "^4.2.4" - tapable "^2.0.0" + tapable "^2.2.0" enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" @@ -4749,9 +4756,9 @@ errlop@^2.0.0: integrity sha512-e64Qj9+4aZzjzzFpZC7p5kmm/ccCrbLhAJplhsDXQFs87XTsXwOpH4s1Io2s90Tau/8r2j9f4l/thhDevRjzxw== errno@^0.1.3: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== + version "0.1.8" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" + integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== dependencies: prr "~1.0.1" @@ -7364,16 +7371,7 @@ jest-watcher@^26.6.2: jest-util "^26.6.2" string-length "^4.0.1" -jest-worker@^26.6.1: - version "26.6.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.1.tgz#c2ae8cde6802cc14056043f997469ec170d9c32a" - integrity sha512-R5IE3qSGz+QynJx8y+ICEkdI2OJ3RJjRQVEyCcFAd3yVhQSEtquziPO29Mlzgn07LOVE8u8jhJ1FqcwegiXWOw== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^7.0.0" - -jest-worker@^26.6.2: +jest-worker@^26.6.1, jest-worker@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== @@ -7909,9 +7907,9 @@ log-update@^4.0.0: wrap-ansi "^6.2.0" loglevel@^1.6.8: - version "1.7.0" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.0.tgz#728166855a740d59d38db01cf46f042caa041bb0" - integrity sha512-i2sY04nal5jDcagM3FMfG++T69GEEM8CYuOfeOIvmXzOIcwE9a/CJPR0MFM97pYMj/u10lzz7/zd7+qwhrBTqQ== + version "1.7.1" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" + integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== loud-rejection@^1.0.0: version "1.6.0" @@ -8219,9 +8217,9 @@ mime@1.6.0: integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.4.4: - version "2.4.6" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1" - integrity sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA== + version "2.4.7" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.7.tgz#962aed9be0ed19c91fd7dc2ece5d7f4e89a90d74" + integrity sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA== mimic-fn@^1.0.0: version "1.2.0" @@ -10886,10 +10884,10 @@ table@^6.0.4: slice-ansi "^4.0.0" string-width "^4.2.0" -tapable@^2.0.0, tapable@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.1.1.tgz#b01cc1902d42a7bb30514e320ce21c456f72fd3f" - integrity sha512-Wib1S8m2wdpLbmQz0RBEVosIyvb/ykfKXf3ZIDqvWoMg/zTNm6G/tDSuUM61J1kNCDXWJrLHGSFeMhAG+gAGpQ== +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" + integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== tar@^4.4.10, tar@^4.4.12, tar@^4.4.8: version "4.4.13" @@ -10957,9 +10955,9 @@ terser-webpack-plugin@^5.0.3: terser "^5.3.8" terser@^5.3.8: - version "5.3.8" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.3.8.tgz#991ae8ba21a3d990579b54aa9af11586197a75dd" - integrity sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ== + version "5.5.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.5.1.tgz#540caa25139d6f496fdea056e414284886fb2289" + integrity sha512-6VGWZNVP2KTUcltUQJ25TtNjx/XgdDsBDKGt8nN0MpydU36LmbPPcMBd2kmtZNNGVVDLg44k7GKeHHj+4zPIBQ== dependencies: commander "^2.20.0" source-map "~0.7.2" @@ -11538,9 +11536,9 @@ walker@^1.0.7, walker@~1.0.5: makeerror "1.0.x" watchpack@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.0.tgz#b12248f32f0fd4799b7be0802ad1f6573a45955c" - integrity sha512-xSdCxxYZWNk3VK13bZRYhsQpfa8Vg63zXG+3pyU8ouqSLRCv4IGXIp9Kr226q6GBkGRlZrST2wwKtjfKz2m7Cg== + version "2.1.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.0.tgz#e63194736bf3aa22026f7b191cd57907b0f9f696" + integrity sha512-UjgD1mqjkG99+3lgG36at4wPnUXNvis2v1utwTgQ43C22c4LD71LsYMExdWXh4HZ+RmW+B0t1Vrg2GpXAkTOQw== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -11594,9 +11592,9 @@ webpack-bundle-analyzer@^3.9.0: ws "^6.0.0" webpack-dev-middleware@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" - integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== + version "3.7.3" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz#0639372b143262e2b84ab95d3b91a7597061c2c5" + integrity sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ== dependencies: memory-fs "^0.4.1" mime "^2.4.4" @@ -11666,7 +11664,7 @@ webpack-sources@^2.1.1: source-list-map "^2.0.1" source-map "^0.6.1" -webpack@^5.10.0: +webpack@^5.11.0: version "5.11.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.11.0.tgz#1647abc060441d86d01d8835b8f0fc1dae2fe76f" integrity sha512-ubWv7iP54RqAC/VjixgpnLLogCFbAfSOREcSWnnOlZEU8GICC5eKmJSu6YEnph2N2amKqY9rvxSwgyHxVqpaRw==