Index: frontend/node_modules/fork-ts-checker-webpack-plugin/CHANGELOG.md
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/CHANGELOG.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/CHANGELOG.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,318 @@
+## ⚠️ Next versions are available only on the [GitHub Releases](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/releases) page ⚠️
+
+# [1.3.0-beta.1](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/compare/v1.2.0...v1.3.0-beta.1@beta) (2019-04-30)
+
+### Bug Fixes
+
+- **tests:** fix linter tests that were doing nothing ([d078278](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/commit/d078278))
+- **tests:** linter tests - useTypescriptIncrementalApi usage ([e0020d6](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/commit/e0020d6))
+- **tests:** rework vue integration tests ([5ad2568](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/commit/5ad2568))
+
+### Features
+
+- **apiincrementalchecker:** improve generation of diagnostics ([ae80e5f](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/commit/ae80e5f)), closes [#257](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/issues/257)
+
+# [1.2.0](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/compare/v1.1.1...v1.2.0) (2019-04-22)
+
+### Bug Fixes
+
+- semantic-release update `CHANGELOG.md` on the git repo ([8ad58af](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/commit/8ad58af))
+
+### Features
+
+- add semantic-release integration ([5fe0653](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/commit/5fe0653))
+
+# [1.2.0-beta.4](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/compare/v1.2.0-beta.3@beta...v1.2.0-beta.4@beta) (2019-04-23)
+
+### Bug Fixes
+
+- **tests:** fix linter tests that were doing nothing ([d078278](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/commit/d078278))
+- **tests:** linter tests - useTypescriptIncrementalApi usage ([e0020d6](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/commit/e0020d6))
+
+### Features
+
+- **apiincrementalchecker:** improve generation of diagnostics ([ae80e5f](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/commit/ae80e5f)), closes [#257](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/issues/257)
+
+# [1.2.0-beta.3](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/compare/v1.2.0-beta.2@beta...v1.2.0-beta.3@beta) (2019-04-22)
+
+### Bug Fixes
+
+- **tests:** rework vue integration tests ([5ad2568](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/commit/5ad2568))
+
+# [1.2.0-beta.2](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/compare/v1.2.0-beta.1@beta...v1.2.0-beta.2@beta) (2019-04-22)
+
+### Bug Fixes
+
+- semantic-release update `CHANGELOG.md` on the git repo ([8ad58af](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/commit/8ad58af))
+
+# [1.2.0-beta.1](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/compare/v1.1.0...v1.2.0-beta.1@beta) (2019-04-22)
+
+### Features
+
+- add semantic-release integration ([5fe0653](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/commit/5fe0653))
+
+## v1.1.1
+
+- [Fix a regression w/ plugins like tsconfig-paths-webpack-plugin](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/260)
+
+## v1.1.0
+
+- [Add new custom resolution options](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/250)
+
+## v1.0.4
+
+- [gracefully handle error thrown from the service](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/249)
+
+## v1.0.3
+
+- [use worker-rpc library for inter-process communication](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/231)
+
+## v1.0.2
+
+- [Fix ignoreLintWarning mark warnings as errors](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/243)
+
+## v1.0.1
+
+- [Apply rounding to compilation time](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/235)
+
+## v1.0.0
+
+- [Going 1.0](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/218)
+
+This is the first major version of `fork-ts-checker-webpack-plugin`. A long time coming :-)
+
+There are actually no breaking changes that we're aware of; users of 0.x `fork-ts-checker-webpack-plugin` should be be able to upgrade without any drama. Users of TypeScript 3+ may notice a performance improvement as by default the plugin now uses the [incremental watch API](https://github.com/Microsoft/TypeScript/pull/20234) in TypeScript. Should this prove problematic you can opt out of using it by supplying `useTypescriptIncrementalApi: false`.
+
+We are aware of an [issue with Vue and the incremental API](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/issues/219). We hope it will be fixed soon - a generous member of the community is taking a look. In the meantime, we will _not_ default to using the incremental watch API when in Vue mode.
+
+The plugin supports webpack 2, 3, 4 and 5 alpha and TypeScript 2.1+ alongside tslint 4+.
+
+See also: https://blog.johnnyreilly.com/2019/03/the-big-one-point-oh.html
+
+## v1.0.0-alpha.10
+
+- [Fix incremental api to work with TS 3+ by default](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/223)
+
+## v1.0.0-alpha.9
+
+- [Default to incremental api usage to true if TS 3+](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/217)
+
+## v1.0.0-alpha.8
+
+- [Respect tslint configs hierarchical order](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/214)
+
+## v1.0.0-alpha.7
+
+- [Add ignoreLintWarnings option](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/213)
+
+## v1.0.0-alpha.6
+
+- [don't directly depend upon typescript](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/208)
+
+## v1.0.0-alpha.5
+
+- [can now provide path where typescript can be found](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/204)
+
+## v1.0.0-alpha.4
+
+- [make node 6 compatible](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/202)
+
+## v1.0.0-alpha.3
+
+- [replace peerDeps with runtime checks](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/201)
+
+## v1.0.0-alpha.2
+
+- [Add `useTypescriptIncrementalApi`](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/198) (#196)
+
+## v1.0.0-alpha.1
+
+- [Use object-spread instead of `Object.assign`](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/194) (#194)
+
+## v1.0.0-alpha.0
+
+- [Add support for webpack 5](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/166)
+
+### Breaking Changes
+
+Version `1.x` additionally supports webpack 5 alongside webpack 4, whose hooks are now tapped differently:
+
+```diff
+-  compiler.hooks.forkTsCheckerDone.tap(...args)
++  const forkTsCheckerHooks = ForkTsCheckerWebpackPlugin.getCompilerHooks(compiler)
++  forkTsCheckerHooks.done.tap(...args)
+```
+
+v1.0.0-alpha.0 drops support for node 6.
+
+## v0.5.2
+
+- [Fix erroneous error on diagnostics at 0 line; remove deprecated fs.existsSync](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/190) (#190)
+
+## v0.5.1
+
+- [Make the checker compile with TypeScript 3.2](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/189)
+
+## 0.5.0
+
+- Removed unused dependency `resolve`.
+- Replace `lodash` usage with native calls.
+- ** Breaking Changes**:
+  - Removed all getters from `NormalizedMessage`, use direct property access instead.
+- **Internal**:
+  - Test against ts-loader v5
+  - Enable all strict type checks
+  - Update dev dependencies
+
+## v0.4.15
+
+- [Add `tslintAutoFix` option to be passed on to tslint to auto format typescript files](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/174) (#174)
+
+## v0.4.14
+
+- [Add support for `reportFiles` option](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/179) (#179)
+
+## v0.4.13
+
+- [Merge in `compilerOptions` prior to calling `parseJsonConfigFileContent`](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/176) (#176)
+
+## v0.4.12
+
+- [Add `compilerOptions` option](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/173) (#173)
+
+## v0.4.11
+
+- [Fix os.cpus is not a function](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/172) (#172)
+
+## v0.4.10
+
+- [Allow fork-ts-checker-webpack-plugin to be imported in .ts files using ESM import syntax](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/163) (#163)
+
+## v0.4.9
+
+- [Set "compilationDone" before resolving "forkTsCheckerServiceBeforeStart"](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/146) (#146)
+
+## v0.4.8
+
+- [Fix(types collision): update webpack](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/151) (#142)
+
+## v0.4.7
+
+- [Fix(types collision): update chalk and chokidar](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/147) (#142)
+- [Fix(logger): Don't limit Options.logger to Console type](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/143)
+
+## v0.4.6
+
+- [Fix(types): Make options Partial<Options>](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/141) (#140)
+
+## v0.4.5
+
+- [Fix(types): Add types to the plugin](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/139) (#137)
+- [Fix(vue): Avoid false positive of no-consecutive-blank-lines TSLint rule in Vue file](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/138) (#130)
+
+## v0.4.4
+
+- [Fix(vue): resolve src attribute on the script block on Vue files](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/pull/130) (#111, #85)
+- Add TypeScript ^3.0.0 to peerDependencies
+
+## v0.4.3
+
+- Fix "File system lag can cause Invalid source file errors to slip through" (#127)
+
+## v0.4.2
+
+- Format messages when `async` is false
+
+## v0.4.1
+
+- Fix webpack 4 hooks bug
+
+## v0.4.0
+
+- Support webpack 4
+
+## v0.3.0
+
+- Add `vue` support
+
+## v0.2.10
+
+- Fix #80 "Cannot read property 'getLineAndCharacterOfPosition' of undefined"
+- Fix #76 "TypeError: Cannot read property '0' of undefined"
+
+## v0.2.9
+
+- Make errors formatting closer to `ts-loader` style
+- Handle tslint exclude option
+
+## v0.2.8
+
+- Add `checkSyntacticErrors` option
+- Fix `process.env` pass to the child process
+- Add `fork-ts-checker-service-before-start` hook
+
+## v0.2.7
+
+- Fix service is not killed when webpack watch is done
+
+## v0.2.6
+
+- Add diagnostics/lints formatters - `formatter` and `formatterOptions` option
+
+## v0.2.5
+
+- Add `async` option - more information in `README.md`
+
+## v0.2.4
+
+- Fix `ESLint: "fork-ts-checker-webpack-plugin" is not published.` issue
+
+## v0.2.3
+
+- Add support for webpack 3 as peerDependency
+
+## v0.2.2
+
+- Force `isolatedModule: false` in checker compiler for better performance
+
+## v0.2.1
+
+- Fix for `tslint: true` option issue
+
+## v0.2.0
+
+- tsconfig.json and tslint.json path are not printed anymore.
+- `watch` option is not used on 'build' mode
+- Handle case with no options object (`new ForkTsCheckerWebpacPlugin()`)
+- Basic integration tests (along units)
+- **Breaking changes**:
+  - tslint is not enabled by default - you have to set `tslint: true` or `tslint: './path/to/tslint.json'` to enable it.
+  - `blockEmit` option is removed - it choose automatically - blocks always on 'build' mode, never on 'watch' mode.
+
+## v0.1.5
+
+- Disable tslint if module is not installed and no tslint path is passed
+- Improve README.md
+
+## v0.1.4
+
+- Fix send to closed channel case
+- Fix removed files case
+- Add `fork-ts-checker-service-start-error` hook
+
+## v0.1.3
+
+- Fix "Cannot read property 'mtime' of undefined on OSX"
+
+## v0.1.2
+
+- Workers mode works correctly (fixed typo)
+
+## v0.1.1
+
+- Support memory limit in multi-process mode
+- Handle already closed channel case on sending ipc message
+
+## v0.1.0
+
+- Initial release - not production ready.
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/LICENSE
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2020 TypeStrong
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/README.md
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,438 @@
+<div align="center">
+
+<h1>Fork TS Checker Webpack Plugin</h1>
+<p>Webpack plugin that runs TypeScript type checker on a separate process.</p>
+
+[![npm version](https://img.shields.io/npm/v/fork-ts-checker-webpack-plugin.svg)](https://www.npmjs.com/package/fork-ts-checker-webpack-plugin)
+[![build status](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/workflows/CI/CD/badge.svg?branch=main&event=push)](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/actions?query=branch%3Amain+event%3Apush)
+[![downloads](http://img.shields.io/npm/dm/fork-ts-checker-webpack-plugin.svg)](https://npmjs.org/package/fork-ts-checker-webpack-plugin)
+[![commitizen friendly](https://img.shields.io/badge/commitizen-friendly-brightgreen.svg)](http://commitizen.github.io/cz-cli/)
+[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier)
+[![semantic-release](https://img.shields.io/badge/%20%20%F0%9F%93%A6%F0%9F%9A%80-semantic--release-e10079.svg)](https://github.com/semantic-release/semantic-release)
+
+</div>
+
+## Features
+
+ * Speeds up [TypeScript](https://github.com/Microsoft/TypeScript) type checking and [ESLint](https://eslint.org/) linting (by moving each to a separate process) 🏎
+ * Supports modern TypeScript features like [project references](https://www.typescriptlang.org/docs/handbook/project-references.html) and [incremental mode](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-4.html#faster-subsequent-builds-with-the---incremental-flag) ✨
+ * Supports [Vue Single File Component](https://vuejs.org/v2/guide/single-file-components.html) ✅ 
+ * Displays nice error messages with the [code frame](https://babeljs.io/docs/en/next/babel-code-frame.html) formatter 🌈
+
+## Installation
+
+This plugin requires minimum **Node.js 10**, **Webpack 4**, **TypeScript 2.7** and optionally **ESLint 6**
+
+* If you depend on **Webpack 2**, **Webpack 3**, or **TSLint 4**, please use [version 3](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/tree/v3.1.1) of the plugin. 
+* If you depend on **TypeScript >= 2.1** and **< 2.7** or you can't update to **Node 10**, please use [version 4](https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/tree/v4.1.4) of the plugin.
+```sh
+# with npm
+npm install --save-dev fork-ts-checker-webpack-plugin
+
+# with yarn
+yarn add --dev fork-ts-checker-webpack-plugin
+```
+
+The minimal webpack config (with [ts-loader](https://github.com/TypeStrong/ts-loader))
+
+```js
+// webpack.config.js
+const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
+
+module.exports = {
+  context: __dirname, // to automatically find tsconfig.json
+  entry: './src/index.ts',
+  resolve: {
+    extensions: [".ts", ".tsx", ".js"],
+  },
+  module: {
+    rules: [
+      {
+        test: /\.tsx?$/,
+        loader: 'ts-loader',
+        exclude: /node_modules/,
+        options: {
+          // disable type checker - we will use it in fork plugin
+          transpileOnly: true
+        }
+      }
+    ]
+  },
+  plugins: [new ForkTsCheckerWebpackPlugin()]
+};
+```
+
+> Examples how to configure it with [babel-loader](https://github.com/babel/babel-loader), [ts-loader](https://github.com/TypeStrong/ts-loader),
+> [eslint](https://github.com/eslint/eslint) and [Visual Studio Code](https://code.visualstudio.com/) are in the 
+> [**examples**](./examples) directory.
+
+## Modules resolution
+
+It's very important to be aware that **this plugin uses [TypeScript](https://github.com/Microsoft/TypeScript)'s, not
+[webpack](https://github.com/webpack/webpack)'s modules resolution**. It means that you have to setup `tsconfig.json` correctly. 
+
+> It's because of the performance - with TypeScript's module resolution we don't have to wait for webpack to compile files.
+>
+> To debug TypeScript's modules resolution, you can use `tsc --traceResolution` command.
+
+## ESLint
+
+If you'd like to use ESLint with the plugin, ensure you have the relevant dependencies installed:
+
+```sh
+# with npm
+npm install --save-dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
+
+# with yarn
+yarn add --dev eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
+```
+
+Then set up ESLint in the plugin. This is the minimal configuration:
+```js
+// webpack.config.js
+const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
+
+module.exports = {
+  // ...the webpack configuration
+  plugins: [
+    new ForkTsCheckerWebpackPlugin({
+      eslint: {
+        files: './src/**/*.{ts,tsx,js,jsx}' // required - same as command `eslint ./src/**/*.{ts,tsx,js,jsx} --ext .ts,.tsx,.js,.jsx`
+      }
+    })
+  ]
+};
+```
+
+You should also have an ESLint configuration file in your root project directory. 
+Here is a sample `.eslintrc.js` configuration for a TypeScript project:
+
+```js
+module.exports = {
+  parser: '@typescript-eslint/parser',
+  parserOptions: {
+    ecmaVersion: 2018,
+    sourceType: 'module',
+  },
+  extends: [
+    'plugin:@typescript-eslint/recommended'
+  ],
+  rules: {
+    // place to specify ESLint rules - can be used to overwrite rules specified from the extended configs
+    // e.g. "@typescript-eslint/explicit-function-return-type": "off",
+  }
+};
+```
+
+There's a [good explanation on setting up TypeScript ESLint support by Robert Cooper](https://dev.to/robertcoopercode/using-eslint-and-prettier-in-a-typescript-project-53jb).
+
+## Options
+
+This plugin uses [`cosmiconfig`](https://github.com/davidtheclark/cosmiconfig). This means that besides the plugin constructor,
+you can place your configuration in the:
+ * `"fork-ts-checker"` field in the `package.json`
+ * `.fork-ts-checkerrc` file in JSON or YAML format
+ * `fork-ts-checker.config.js` file exporting a JS object
+  
+Options passed to the plugin constructor will overwrite options from the cosmiconfig (using [deepmerge](https://github.com/TehShrike/deepmerge)).
+
+| Name              | Type                               | Default value                                                      | Description |
+| ----------------- | ---------------------------------- | ------------------------------------------------------------------ | ----------- |
+| `async`           | `boolean`                          | `compiler.options.mode === 'development'`                          | If `true`, reports issues **after** webpack's compilation is done. Thanks to that it doesn't block the compilation. Used only in the `watch` mode. |
+| `typescript`      | `object` or `boolean`              | `true`                                                             | If a `boolean`, it enables/disables TypeScript checker. If an `object`, see [TypeScript options](#typescript-options). |
+| `eslint`          | `object`                           | `undefined`                                                        | If `undefined`, it disables ESLint linter. If an `object`, see [ESLint options](#eslint-options). |
+| `issue`           | `object`                           | `{}`                                                               | See [Issues options](#issues-options). |
+| `formatter`       | `string` or `object` or `function` | `codeframe`                                                        | Available formatters are `basic`, `codeframe` and a custom `function`. To [configure](https://babeljs.io/docs/en/babel-code-frame#options) `codeframe` formatter, pass object: `{ type: 'codeframe', options: { <coderame options> } }`. |
+| `logger`          | `object`              | `{ infrastructure: 'silent', issues: 'console', devServer: true }` | Available loggers are `silent`, `console`, and `webpack-infrastructure`. Infrastructure logger prints additional information, issue logger prints `issues` in the `async` mode. If `devServer` is set to `false`, errors will not be reported to Webpack Dev Server. |
+
+### TypeScript options
+
+Options for the TypeScript checker (`typescript` option object).
+
+| Name                 | Type      | Default value                                                                                                  | Description |
+| -------------------- | --------- | -------------------------------------------------------------------------------------------------------------- | ----------- |
+| `enabled`            | `boolean` | `true`                                                                                                         | If `true`, it enables TypeScript checker. |
+| `memoryLimit`        | `number`  | `2048`                                                                                                         | Memory limit for the checker process in MB. If the process exits with the allocation failed error, try to increase this number. |
+| `configFile`         | `string`  | `'tsconfig.json'`                                                                                              | Path to the `tsconfig.json` file (path relative to the `compiler.options.context` or absolute path) |
+| `configOverwrite`    | `object`  | `{ compilerOptions: { skipLibCheck: true, sourceMap: false, inlineSourceMap: false, declarationMap: false } }` | This configuration will overwrite configuration from the `tsconfig.json` file. Supported fields are: `extends`, `compilerOptions`, `include`, `exclude`, `files`, and `references`. |
+| `context`            | `string`  | `dirname(configuration.configFile)`                                                                            | The base path for finding files specified in the `tsconfig.json`. Same as the `context` option from the [ts-loader](https://github.com/TypeStrong/ts-loader#context). Useful if you want to keep your `tsconfig.json` in an external package. Keep in mind that **not** having a `tsconfig.json` in your project root can cause different behaviour between `fork-ts-checker-webpack-plugin` and `tsc`. When using editors like `VS Code` it is advised to add a `tsconfig.json` file to the root of the project and extend the config file referenced in option `configFile`.  |
+| `build`              | `boolean` | `false`                                                                                                        | The equivalent of the `--build` flag for the `tsc` command. |
+| `mode`               | `'readonly'` or `'write-tsbuildinfo'` or `'write-dts'` or `'write-references'` | `'write-tsbuildinfo'`                                      | If you use the `babel-loader`, it's recommended to use `write-references` mode to improve initial compilation time. If you use `ts-loader`, it's recommended to use `write-tsbuildinfo` mode to not overwrite files emitted by the `ts-loader`. If you use `ts-loader` with `transpileOnly` flag set to `true`, use `'write-dts` to emit the type definition files. |
+| `diagnosticOptions` | `object`  | `{ syntactic: false, semantic: true, declaration: false, global: false }`                                      | Settings to select which diagnostics do we want to perform. |
+| `extensions`         | `object`  | `{}`                                                                                                           | See [TypeScript extensions options](#typescript-extensions-options). |
+| `profile`            | `boolean` | `false`                                                                                                        | Measures and prints timings related to the TypeScript performance. |
+| `typescriptPath`     | `string`  | `require.resolve('typescript')`                                                                                | If supplied this is a custom path where TypeScript can be found. |
+
+#### TypeScript extensions options
+
+Options for the TypeScript checker extensions (`typescript.extensions` option object).
+
+| Name                 | Type                  | Default value             | Description |
+| -------------------- | --------------------- | ------------------------- | ----------- |
+| `vue`                | `object` or `boolean` | `false`                   | If `true`, it enables Vue [Single File Component](https://vuejs.org/v2/guide/single-file-components.html) support. |
+| `vue.enabled`        | `boolean`             | `false`                   | Same as the `vue` option |
+| `vue.compiler`       | `string`              | `'vue-template-compiler'` | The package name of the compiler that will be used to parse `.vue` files. You can use `'nativescript-vue-template-compiler'` if you use [nativescript-vue](https://github.com/nativescript-vue/nativescript-vue) | 
+
+### ESLint options
+
+Options for the ESLint linter (`eslint` option object).
+
+| Name                 | Type                   | Default value             | Description |
+| -------------------- | ---------------------- | ------------------------- | ----------- |
+| `enabled`            | `boolean`              | `false`                   | If `true`, it enables ESLint linter. If you set the `files` option, it will be `true` by default. |
+| `files`              | `string` or `string[]` | This value is required    | One or more [glob patterns](https://en.wikipedia.org/wiki/Glob_(programming)) to the files that should be linted. Works the same as the `eslint` command. |
+| `memoryLimit`        | `number`               | `2048`                    | Memory limit for the linter process in MB. If the process exits with the allocation failed error, try to increase this number. |
+| `options`            | `object`               | `{}`                      | [Options](https://eslint.org/docs/developer-guide/nodejs-api#cliengine) that can be used to initialize ESLint. |
+
+### Issues options
+
+Options for the issues filtering (`issue` option object).
+I could write some plain text explanation of these options but I think code will explain it better:
+
+```typescript
+interface Issue {
+  origin: 'typescript' | 'eslint';
+  severity: 'error' | 'warning';
+  code: string;
+  file?: string;
+}
+
+type IssueMatch = Partial<Issue>; // file field supports glob matching
+type IssuePredicate = (issue: Issue) => boolean;
+type IssueFilter = IssueMatch | IssuePredicate | (IssueMatch | IssuePredicate)[];
+```
+
+| Name      | Type          | Default value | Description |
+| --------- | ------------- | ------------- | ----------- |
+| `include` | `IssueFilter` | `undefined`   | If `object`, defines issue properties that should be [matched](./src/issue/IssueMatch.ts). If `function`, acts as a predicate where `issue` is an argument. |
+| `exclude` | `IssueFilter` | `undefined`   | Same as `include` but issues that match this predicate will be excluded. |
+
+<details>
+<summary>Expand example</summary>
+
+Include issues from the `src` directory, exclude eslint issues from `.spec.ts` files:
+
+```js
+module.exports = {
+  // ...the webpack configuration
+  plugins: [
+    new ForkTsCheckerWebpackPlugin({
+      issue: {
+        include: [
+          { file: '**/src/**/*' }
+        ],
+        exclude: [
+          { origin: 'eslint', file: '**/*.spec.ts' }
+        ]
+      }
+    })
+  ]
+};
+```
+
+</details>
+
+## Vue.js
+
+⚠️ There are additional **constraints** regarding Vue.js Single File Component support: ⚠️
+ * It requires **TypeScript >= 3.8.0** (it's a limitation of the `transpileOnly` mode from `ts-loader`)
+ * It doesn't work with the `build` mode (project references)
+
+To enable Vue.js support, follow these steps:
+
+<details>
+<summary>Expand Vue.js set up instruction</summary>
+
+1. Ensure you have all required packages installed:
+```sh
+# with npm
+npm install --save vue vue-class-component
+npm install --save-dev vue-loader ts-loader css-loader vue-template-compiler 
+
+# with yarn
+yarn add vue vue-class-component
+yarn add --dev vue-loader ts-loader css-loader vue-template-compiler 
+```
+
+2. Add `tsconfig.json` configuration:
+```json
+{
+  "compilerOptions": {
+    "experimentalDecorators": true,
+    "jsx": "preserve",
+    "target": "ES5",
+    "lib": ["ES6", "DOM"],
+    "baseUrl": ".",
+    "paths": {
+      "@/*": ["src/*"],
+      "~/*": ["src/*"]
+    },
+    "sourceMap": true,
+    "importsNotUsedAsValues": "preserve"
+  },
+  "include": [
+    "src/**/*.ts",
+    "src/**/*.vue"
+  ],
+  "exclude": [
+    "node_modules"
+  ]
+}
+```
+
+3. Add `webpack.config.js` configuration:
+```js
+const path = require('path');
+const VueLoaderPlugin = require('vue-loader/lib/plugin');
+const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
+
+module.exports = {
+  entry: './src/index.ts',
+  output: {
+    filename: 'index.js',
+    path: path.resolve(__dirname, 'dist'),
+  },
+  module: {
+    rules: [
+      {
+        test: /\.vue$/,
+        loader: 'vue-loader'
+      },
+      {
+        test: /\.ts$/,
+        loader: 'ts-loader',
+        exclude: /node_modules/,
+        options: {
+          appendTsSuffixTo: [/\.vue$/],
+          transpileOnly: true
+        }
+      },
+      {
+        test: /\.css$/,
+        loader: 'css-loader'
+      },
+    ],
+  },
+  resolve: {
+    extensions: ['.ts', '.js', '.vue', '.json'],
+    alias: {
+      '@': path.resolve(__dirname, './src'),
+      '~': path.resolve(__dirname, './src'),
+    }
+  },
+  plugins: [
+    new VueLoaderPlugin(),
+    new ForkTsCheckerWebpackPlugin({
+      typescript: {
+        extensions: {
+          vue: true
+        }
+      }
+    })
+  ]
+};
+```
+
+4. Add `src/types/vue.d.ts` file to shim `.vue` modules:
+```typescript
+declare module "*.vue" {
+  import Vue from "vue";
+  export default Vue;
+}
+```
+
+5. If you are working in VSCode, you can get the [Vetur](https://marketplace.visualstudio.com/items?itemName=octref.vetur) extension to complete the developer workflow.
+
+</details>
+
+## Plugin hooks
+
+This plugin provides some custom webpack hooks:
+
+| Hook key   | Type                       | Params                | Description |
+| ---------- | -------------------------- | --------------------- | ----------- |
+| `start`    | `AsyncSeriesWaterfallHook` | `change, compilation` | Starts issues checking for a compilation. It's an async waterfall hook, so you can modify the list of changed and removed files or delay the start of the service. |
+| `waiting`  | `SyncHook`                 | `compilation`         | Waiting for the issues checking. |
+| `canceled` | `SyncHook`                 | `compilation`         | Issues checking for the compilation has been canceled. |
+| `error`    | `SyncHook`                 | `compilation`         | An error occurred during issues checking. |
+| `issues`   | `SyncWaterfallHook`        | `issues, compilation` | Issues have been received and will be reported. It's a waterfall hook, so you can modify the list of received issues. |
+
+To access plugin hooks and tap into the event, we need to use the `getCompilerHooks` static method.
+When we call this method with a [webpack compiler instance](https://webpack.js.org/api/node/), it returns the object with
+[tapable](https://github.com/webpack/tapable) hooks where you can pass in your callbacks.
+
+```js
+// ./src/webpack/MyWebpackPlugin.js
+const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
+
+class MyWebpackPlugin {
+  apply(compiler) {
+    const hooks = ForkTsCheckerWebpackPlugin.getCompilerHooks(compiler);
+
+    // log some message on waiting
+    hooks.waiting.tap('MyPlugin', () => {
+      console.log('waiting for issues');
+    });
+    // don't show warnings
+    hooks.issues.tap('MyPlugin', (issues) => 
+      issues.filter((issue) => issue.severity === 'error')
+    );
+  }
+}
+
+module.exports = MyWebpackPlugin;
+
+// webpack.config.js
+const ForkTsCheckerWebpackPlugin = require('fork-ts-checker-webpack-plugin');
+const MyWebpackPlugin = require('./src/webpack/MyWebpackPlugin');
+
+module.exports = {
+  /* ... */
+  plugins: [
+    new ForkTsCheckerWebpackPlugin(),
+    new MyWebpackPlugin()
+  ]
+};
+```
+
+## Typings
+
+To use the plugin typings, you have to install `@types/webpack`. It's not included by default to not collide with your
+existing typings (`@types/webpack` imports `@types/node`). [It's an old TypeScript issue](https://github.com/microsoft/TypeScript/issues/18588), 
+the alternative is to set `skipLibCheck: true` in the `compilerOptions` 😉
+```sh
+# with npm
+npm install --save-dev @types/webpack
+
+# with yarn
+yarn add --dev @types/webpack
+```
+
+## Profiling types resolution
+
+Starting from TypeScript 4.1.0, you can profile long type checks by
+setting "generateTrace" compiler option. This is an instruction from [microsoft/TypeScript#40063](https://github.com/microsoft/TypeScript/pull/40063):
+
+1. Set "generateTrace": "{folderName}" in your `tsconfig.json`
+2. Look in the resulting folder. If you used build mode, there will be a `legend.json` telling you what went where. 
+   Otherwise, there will be `trace.json` file and `types.json` files.
+3. Navigate to [edge://tracing](edge://tracing) or [chrome://tracing](chrome://tracing) and load `trace.json`
+4. Expand Process 1 with the little triangle in the left sidebar
+5. Click on different blocks to see their payloads in the bottom pane
+6. Open `types.json` in an editor
+7. When you see a type ID in the tracing output, go-to-line {id} to find data about that type
+
+
+## Related projects
+ 
+ * [`ts-loader`](https://github.com/TypeStrong/ts-loader) - TypeScript loader for webpack.
+ * [`babel-loader`](https://github.com/babel/babel-loader) - Alternative TypeScript loader for webpack.
+ * [`fork-ts-checker-notifier-webpack-plugin`](https://github.com/johnnyreilly/fork-ts-checker-notifier-webpack-plugin) - Notifies about build status using system notifications (similar to the [webpack-notifier](https://github.com/Turbo87/webpack-notifier)).
+
+## Credits
+
+This plugin was created in [Realytics](https://www.realytics.io/) in 2017. Thank you for supporting Open Source.
+
+## License
+
+MIT License
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/changelog.config.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/changelog.config.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/changelog.config.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,36 @@
+module.exports = {
+  list: ['feat', 'fix', 'refactor', 'perf', 'test', 'chore', 'docs'],
+  maxMessageLength: 64,
+  minMessageLength: 3,
+  questions: ['type', 'subject', 'body', 'breaking', 'issues'],
+  types: {
+    feat: {
+      description: 'A new feature',
+      value: 'feat',
+    },
+    fix: {
+      description: 'A bug fix',
+      value: 'fix',
+    },
+    refactor: {
+      description: 'A code change that neither adds a feature or fixes a bug',
+      value: 'refactor',
+    },
+    perf: {
+      description: 'A code change that improves performance',
+      value: 'perf',
+    },
+    test: {
+      description: 'Adding missing tests',
+      value: 'test',
+    },
+    chore: {
+      description: 'Build process, CI or auxiliary tool changes',
+      value: 'chore',
+    },
+    docs: {
+      description: 'Documentation only changes',
+      value: 'docs',
+    },
+  },
+};
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPlugin.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPlugin.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPlugin.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,29 @@
+import webpack from 'webpack';
+import { ForkTsCheckerWebpackPluginOptions } from './ForkTsCheckerWebpackPluginOptions';
+import { Pool } from './utils/async/pool';
+declare class ForkTsCheckerWebpackPlugin implements webpack.Plugin {
+    /**
+     * Current version of the plugin
+     */
+    static readonly version: string;
+    /**
+     * Default pools for the plugin concurrency limit
+     */
+    static readonly issuesPool: Pool;
+    static readonly dependenciesPool: Pool;
+    /**
+     * @deprecated Use ForkTsCheckerWebpackPlugin.issuesPool instead
+     */
+    static get pool(): Pool;
+    private readonly options;
+    constructor(options?: ForkTsCheckerWebpackPluginOptions);
+    static getCompilerHooks(compiler: webpack.Compiler): {
+        start: import("tapable").AsyncSeriesWaterfallHook<import("./reporter/FilesChange").FilesChange, webpack.compilation.Compilation, any>;
+        waiting: import("tapable").SyncHook<webpack.compilation.Compilation, any, any>;
+        canceled: import("tapable").SyncHook<webpack.compilation.Compilation, any, any>;
+        error: import("tapable").SyncHook<Error, webpack.compilation.Compilation, any>;
+        issues: import("tapable").SyncWaterfallHook<import("./issue/Issue").Issue[], webpack.compilation.Compilation | undefined, void>;
+    };
+    apply(compiler: webpack.Compiler): void;
+}
+export { ForkTsCheckerWebpackPlugin };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPlugin.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPlugin.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPlugin.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,84 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const schema_utils_1 = __importDefault(require("schema-utils"));
+const cosmiconfig_1 = require("cosmiconfig");
+const deepmerge_1 = __importDefault(require("deepmerge"));
+const ForkTsCheckerWebpackPluginOptions_json_1 = __importDefault(require("./ForkTsCheckerWebpackPluginOptions.json"));
+const ForkTsCheckerWebpackPluginConfiguration_1 = require("./ForkTsCheckerWebpackPluginConfiguration");
+const ForkTsCheckerWebpackPluginState_1 = require("./ForkTsCheckerWebpackPluginState");
+const reporter_1 = require("./reporter");
+const TypeScriptSupport_1 = require("./typescript-reporter/TypeScriptSupport");
+const TypeScriptReporterRpcClient_1 = require("./typescript-reporter/reporter/TypeScriptReporterRpcClient");
+const assertEsLintSupport_1 = require("./eslint-reporter/assertEsLintSupport");
+const EsLintReporterRpcClient_1 = require("./eslint-reporter/reporter/EsLintReporterRpcClient");
+const tapStartToConnectAndRunReporter_1 = require("./hooks/tapStartToConnectAndRunReporter");
+const tapStopToDisconnectReporter_1 = require("./hooks/tapStopToDisconnectReporter");
+const tapAfterCompileToAddDependencies_1 = require("./hooks/tapAfterCompileToAddDependencies");
+const tapErrorToLogMessage_1 = require("./hooks/tapErrorToLogMessage");
+const pluginHooks_1 = require("./hooks/pluginHooks");
+const tapAfterEnvironmentToPatchWatching_1 = require("./hooks/tapAfterEnvironmentToPatchWatching");
+const pool_1 = require("./utils/async/pool");
+const os_1 = __importDefault(require("os"));
+class ForkTsCheckerWebpackPlugin {
+    constructor(options = {}) {
+        const explorerSync = cosmiconfig_1.cosmiconfigSync('fork-ts-checker');
+        const { config: externalOptions } = explorerSync.search() || {};
+        // first validate options directly passed to the constructor
+        const configuration = { name: 'ForkTsCheckerWebpackPlugin' };
+        schema_utils_1.default(ForkTsCheckerWebpackPluginOptions_json_1.default, options, configuration);
+        this.options = deepmerge_1.default(externalOptions || {}, options || {});
+        // then validate merged options
+        schema_utils_1.default(ForkTsCheckerWebpackPluginOptions_json_1.default, this.options, configuration);
+    }
+    /**
+     * @deprecated Use ForkTsCheckerWebpackPlugin.issuesPool instead
+     */
+    static get pool() {
+        // for backward compatibility
+        return ForkTsCheckerWebpackPlugin.issuesPool;
+    }
+    static getCompilerHooks(compiler) {
+        return pluginHooks_1.getForkTsCheckerWebpackPluginHooks(compiler);
+    }
+    apply(compiler) {
+        const configuration = ForkTsCheckerWebpackPluginConfiguration_1.createForkTsCheckerWebpackPluginConfiguration(compiler, this.options);
+        const state = ForkTsCheckerWebpackPluginState_1.createForkTsCheckerWebpackPluginState();
+        const issuesReporters = [];
+        const dependenciesReporters = [];
+        if (configuration.typescript.enabled) {
+            TypeScriptSupport_1.assertTypeScriptSupport(configuration.typescript);
+            issuesReporters.push(TypeScriptReporterRpcClient_1.createTypeScriptReporterRpcClient(configuration.typescript));
+            dependenciesReporters.push(TypeScriptReporterRpcClient_1.createTypeScriptReporterRpcClient(configuration.typescript));
+        }
+        if (configuration.eslint.enabled) {
+            assertEsLintSupport_1.assertEsLintSupport(configuration.eslint);
+            issuesReporters.push(EsLintReporterRpcClient_1.createEsLintReporterRpcClient(configuration.eslint));
+            dependenciesReporters.push(EsLintReporterRpcClient_1.createEsLintReporterRpcClient(configuration.eslint));
+        }
+        if (issuesReporters.length) {
+            const issuesReporter = reporter_1.createAggregatedReporter(reporter_1.composeReporterRpcClients(issuesReporters));
+            const dependenciesReporter = reporter_1.createAggregatedReporter(reporter_1.composeReporterRpcClients(dependenciesReporters));
+            tapAfterEnvironmentToPatchWatching_1.tapAfterEnvironmentToPatchWatching(compiler, state);
+            tapStartToConnectAndRunReporter_1.tapStartToConnectAndRunReporter(compiler, issuesReporter, dependenciesReporter, configuration, state);
+            tapAfterCompileToAddDependencies_1.tapAfterCompileToAddDependencies(compiler, configuration, state);
+            tapStopToDisconnectReporter_1.tapStopToDisconnectReporter(compiler, issuesReporter, dependenciesReporter, state);
+            tapErrorToLogMessage_1.tapErrorToLogMessage(compiler, configuration);
+        }
+        else {
+            throw new Error(`ForkTsCheckerWebpackPlugin is configured to not use any issue reporter. It's probably a configuration issue.`);
+        }
+    }
+}
+exports.ForkTsCheckerWebpackPlugin = ForkTsCheckerWebpackPlugin;
+/**
+ * Current version of the plugin
+ */
+ForkTsCheckerWebpackPlugin.version = '6.5.3'; // will be replaced by the @semantic-release/exec
+/**
+ * Default pools for the plugin concurrency limit
+ */
+ForkTsCheckerWebpackPlugin.issuesPool = pool_1.createPool(Math.max(1, os_1.default.cpus().length));
+ForkTsCheckerWebpackPlugin.dependenciesPool = pool_1.createPool(Math.max(1, os_1.default.cpus().length));
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginConfiguration.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginConfiguration.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginConfiguration.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,17 @@
+import webpack from 'webpack';
+import { ForkTsCheckerWebpackPluginOptions } from './ForkTsCheckerWebpackPluginOptions';
+import { IssueConfiguration } from './issue/IssueConfiguration';
+import { FormatterConfiguration } from './formatter';
+import { TypeScriptReporterConfiguration } from './typescript-reporter/TypeScriptReporterConfiguration';
+import { EsLintReporterConfiguration } from './eslint-reporter/EsLintReporterConfiguration';
+import { LoggerConfiguration } from './logger/LoggerConfiguration';
+interface ForkTsCheckerWebpackPluginConfiguration {
+    async: boolean;
+    typescript: TypeScriptReporterConfiguration;
+    eslint: EsLintReporterConfiguration;
+    issue: IssueConfiguration;
+    formatter: FormatterConfiguration;
+    logger: LoggerConfiguration;
+}
+declare function createForkTsCheckerWebpackPluginConfiguration(compiler: webpack.Compiler, options?: ForkTsCheckerWebpackPluginOptions): ForkTsCheckerWebpackPluginConfiguration;
+export { ForkTsCheckerWebpackPluginConfiguration, createForkTsCheckerWebpackPluginConfiguration };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginConfiguration.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginConfiguration.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginConfiguration.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const IssueConfiguration_1 = require("./issue/IssueConfiguration");
+const formatter_1 = require("./formatter");
+const TypeScriptReporterConfiguration_1 = require("./typescript-reporter/TypeScriptReporterConfiguration");
+const EsLintReporterConfiguration_1 = require("./eslint-reporter/EsLintReporterConfiguration");
+const LoggerConfiguration_1 = require("./logger/LoggerConfiguration");
+function createForkTsCheckerWebpackPluginConfiguration(compiler, options = {}) {
+    return {
+        async: options.async === undefined ? compiler.options.mode === 'development' : options.async,
+        typescript: TypeScriptReporterConfiguration_1.createTypeScriptReporterConfiguration(compiler, options.typescript),
+        eslint: EsLintReporterConfiguration_1.createEsLintReporterConfiguration(compiler, options.eslint),
+        issue: IssueConfiguration_1.createIssueConfiguration(compiler, options.issue),
+        formatter: formatter_1.createFormatterConfiguration(options.formatter),
+        logger: LoggerConfiguration_1.createLoggerConfiguration(compiler, options.logger),
+    };
+}
+exports.createForkTsCheckerWebpackPluginConfiguration = createForkTsCheckerWebpackPluginConfiguration;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginOptions.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,14 @@
+import { TypeScriptReporterOptions } from './typescript-reporter/TypeScriptReporterOptions';
+import { EsLintReporterOptions } from './eslint-reporter/EsLintReporterOptions';
+import { IssueOptions } from './issue/IssueOptions';
+import { FormatterOptions } from './formatter';
+import LoggerOptions from './logger/LoggerOptions';
+interface ForkTsCheckerWebpackPluginOptions {
+    async?: boolean;
+    typescript?: TypeScriptReporterOptions;
+    eslint?: EsLintReporterOptions;
+    formatter?: FormatterOptions;
+    issue?: IssueOptions;
+    logger?: LoggerOptions;
+}
+export { ForkTsCheckerWebpackPluginOptions };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginOptions.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginOptions.json
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginOptions.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginOptions.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,297 @@
+{
+    "$schema": "http://json-schema.org/draft-07/schema#",
+    "type": "object",
+    "properties": {
+        "async": {
+            "type": "boolean",
+            "description": "When true, plugin will not block compilation to finish issues checking"
+        },
+        "typescript": {
+            "$ref": "#/definitions/TypeScriptReporterOptions"
+        },
+        "eslint": {
+            "$ref": "#/definitions/EsLintReporterOptions"
+        },
+        "formatter": {
+            "$ref": "#/definitions/FormatterOptions"
+        },
+        "issue": {
+            "$ref": "#/definitions/IssueOptions"
+        },
+        "logger": {
+            "$ref": "#/definitions/LoggerOptions"
+        }
+    },
+    "additionalProperties": false,
+    "definitions": {
+        "Formatter": {
+            "instanceof": "Function"
+        },
+        "ComplexFormatterPreferences": {
+            "type": "object",
+            "properties": {
+                "type": {
+                    "$ref": "#/definitions/FormatterType"
+                },
+                "options": {
+                    "type": "object",
+                    "additionalProperties": true
+                }
+            },
+            "required": ["type"]
+        },
+        "FormatterType": {
+            "type": "string",
+            "enum": ["basic", "codeframe"]
+        },
+        "IssueMatch": {
+            "type": "object",
+            "properties": {
+                "origin": {
+                    "type": "string",
+                    "enum": ["typescript", "eslint"]
+                },
+                "severity": {
+                    "type": "string",
+                    "enum": ["error", "warning"]
+                },
+                "code": {
+                    "type": "string"
+                },
+                "file": {
+                    "type": "string"
+                }
+            }
+        },
+        "IssuePredicate": {
+            "instanceof": "Function"
+        },
+        "IssuePredicateOption": {
+            "oneOf": [
+                {
+                    "$ref": "#/definitions/IssuePredicate"
+                },
+                {
+                    "$ref": "#/definitions/IssueMatch"
+                },
+                {
+                    "type": "array",
+                    "items": {
+                        "oneOf": [
+                            {
+                                "$ref": "#/definitions/IssuePredicate"
+                            },
+                            {
+                                "$ref": "#/definitions/IssueMatch"
+                            }
+                        ]
+                    }
+                }
+            ]
+        },
+        "LoggerType": {
+            "type": "string",
+            "enum": ["console", "webpack-infrastructure", "silent"]
+        },
+        "Logger": {
+            "type": "object",
+            "properties": {
+                "error": {
+                    "instanceof": "Function"
+                },
+                "info": {
+                    "instanceof": "Function"
+                },
+                "log": {
+                    "instanceof": "Function"
+                }
+            }
+        },
+        "TypeScriptReporterOptions": {
+            "oneOf": [
+                {
+                    "type": "boolean",
+                    "description": "Enable TypeScript reporter."
+                },
+                {
+                    "type": "object",
+                    "properties": {
+                        "enabled": {
+                            "type": "boolean",
+                            "description": "Enable TypeScript reporter."
+                        },
+                        "memoryLimit": {
+                            "type": "number",
+                            "description": "Memory limit for TypeScript reporter process."
+                        },
+                        "configFile": {
+                            "type": "string",
+                            "description": "Path to tsconfig.json. By default plugin uses context or process.cwd() to localize tsconfig.json file."
+                        },
+                        "context": {
+                            "type": "string",
+                            "description": "The base path for finding files specified in the tsconfig.json. Same as context option from the ts-loader."
+                        },
+                        "build": {
+                            "type": "boolean",
+                            "description": "The equivalent of the `--build` flag from the `tsc`."
+                        },
+                        "mode": {
+                            "type": "string",
+                            "enum": ["readonly", "write-tsbuildinfo", "write-dts", "write-references"],
+                            "description": "`readonly` keeps all emitted files in memory, `write-tsbuildinfo` which writes only .tsbuildinfo files, `write-dts` writes .tsbuildinfo and type definition files, and `write-references` which writes both .tsbuildinfo and referenced projects output"
+                        },
+                        "compilerOptions": {
+                            "type": "object",
+                            "description": "Custom compilerOptions to be passed to the TypeScript compiler.",
+                            "additionalProperties": true
+                        },
+                        "diagnosticOptions": {
+                            "type": "object",
+                            "description": "Types of diagnostics to be reported.",
+                            "properties": {
+                                "syntactic": {
+                                    "type": "boolean"
+                                },
+                                "semantic": {
+                                    "type": "boolean"
+                                },
+                                "declaration": {
+                                    "type": "boolean"
+                                },
+                                "global": {
+                                    "type": "boolean"
+                                }
+                            }
+                        },
+                        "extensions": {
+                            "type": "object",
+                            "properties": {
+                                "vue": {
+                                    "$ref": "#/definitions/TypeScriptVueExtensionOptions"
+                                }
+                            }
+                        },
+                        "profile": {
+                            "type": "boolean",
+                            "description": "Measures and prints timings related to the TypeScript performance."
+                        },
+                        "typescriptPath": {
+                            "type": "string",
+                            "description": "If supplied this is a custom path where TypeScript can be found."
+                        }
+                    }
+                }
+            ]
+        },
+        "TypeScriptVueExtensionOptions": {
+            "oneOf": [
+                {
+                    "type": "boolean",
+                    "description": "Enable TypeScript Vue extension."
+                },
+                {
+                    "type": "object",
+                    "properties": {
+                        "enabled": {
+                            "type": "boolean",
+                            "description": "Enable TypeScript Vue extension."
+                        },
+                        "compiler": {
+                            "type": "string",
+                            "description": "Custom vue-template-compiler package"
+                        }
+                    }
+                }
+            ]
+        },
+        "EsLintReporterOptions": {
+            "type": "object",
+            "properties": {
+                "files": {
+                    "oneOf": [
+                        {
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            },
+                            "minItems": 1,
+                            "uniqueItems": true
+                        },
+                        {
+                            "type": "string"
+                        }
+                    ],
+                    "description": "List of glob patterns or files to be linted."
+                },
+                "enabled": {
+                    "type": "boolean",
+                    "description": "Enable EsLint reporter."
+                },
+                "memoryLimit": {
+                    "type": "number",
+                    "description": "Memory limit for EsLint reporter process."
+                },
+                "options": {
+                    "type": "object",
+                    "description": "Custom options to be passed to the EsLint engine.",
+                    "additionalProperties": true
+                }
+            },
+            "required": ["files"]
+        },
+        "FormatterOptions": {
+            "oneOf": [
+                {
+                    "$ref": "#/definitions/FormatterType"
+                },
+                {
+                    "$ref": "#/definitions/ComplexFormatterPreferences"
+                },
+                {
+                    "$ref": "#/definitions/Formatter"
+                }
+            ]
+        },
+        "IssueOptions": {
+            "type": "object",
+            "properties": {
+                "include": {
+                    "$ref": "#/definitions/IssuePredicateOption"
+                },
+                "exclude": {
+                    "$ref": "#/definitions/IssuePredicateOption"
+                }
+            }
+        },
+        "LoggerOptions": {
+            "type": "object",
+            "properties": {
+                "infrastructure": {
+                    "oneOf": [
+                        {
+                            "$ref": "#/definitions/LoggerType"
+                        },
+                        {
+                            "$ref": "#/definitions/Logger"
+                        }
+                    ]
+                },
+                "issues": {
+                    "oneOf": [
+                        {
+                            "$ref": "#/definitions/LoggerType"
+                        },
+                        {
+                            "$ref": "#/definitions/Logger"
+                        }
+                    ]
+                },
+                "devServer": {
+                    "type": "boolean",
+                    "description": "Enable reporting to Webpack Dev Server."
+                }
+            }
+        }
+    }
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginState.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginState.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginState.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,15 @@
+import { Tap } from 'tapable';
+import { FilesMatch, Report } from './reporter';
+import { Issue } from './issue';
+interface ForkTsCheckerWebpackPluginState {
+    issuesReportPromise: Promise<Report | undefined>;
+    dependenciesReportPromise: Promise<Report | undefined>;
+    issuesPromise: Promise<Issue[] | undefined>;
+    dependenciesPromise: Promise<FilesMatch | undefined>;
+    lastDependencies: FilesMatch | undefined;
+    watching: boolean;
+    initialized: boolean;
+    webpackDevServerDoneTap: Tap | undefined;
+}
+declare function createForkTsCheckerWebpackPluginState(): ForkTsCheckerWebpackPluginState;
+export { ForkTsCheckerWebpackPluginState, createForkTsCheckerWebpackPluginState };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginState.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginState.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/ForkTsCheckerWebpackPluginState.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,15 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function createForkTsCheckerWebpackPluginState() {
+    return {
+        issuesReportPromise: Promise.resolve(undefined),
+        dependenciesReportPromise: Promise.resolve(undefined),
+        issuesPromise: Promise.resolve(undefined),
+        dependenciesPromise: Promise.resolve(undefined),
+        lastDependencies: undefined,
+        watching: false,
+        initialized: false,
+        webpackDevServerDoneTap: undefined,
+    };
+}
+exports.createForkTsCheckerWebpackPluginState = createForkTsCheckerWebpackPluginState;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/error/OperationCanceledError.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/error/OperationCanceledError.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/error/OperationCanceledError.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+declare class OperationCanceledError extends Error {
+    readonly canceled = true;
+}
+export { OperationCanceledError };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/error/OperationCanceledError.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/error/OperationCanceledError.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/error/OperationCanceledError.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+class OperationCanceledError extends Error {
+    constructor() {
+        super(...arguments);
+        this.canceled = true;
+    }
+}
+exports.OperationCanceledError = OperationCanceledError;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/EsLintReporterConfiguration.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/EsLintReporterConfiguration.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/EsLintReporterConfiguration.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,11 @@
+import webpack from 'webpack';
+import { EsLintReporterOptions } from './EsLintReporterOptions';
+import { CLIEngineOptions } from './types/eslint';
+interface EsLintReporterConfiguration {
+    enabled: boolean;
+    memoryLimit: number;
+    options: CLIEngineOptions;
+    files: string[];
+}
+declare function createEsLintReporterConfiguration(compiler: webpack.Compiler, options: EsLintReporterOptions | undefined): EsLintReporterConfiguration;
+export { EsLintReporterConfiguration, createEsLintReporterConfiguration };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/EsLintReporterConfiguration.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/EsLintReporterConfiguration.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/EsLintReporterConfiguration.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,26 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const path_1 = require("path");
+function castToArray(value) {
+    if (!value) {
+        return [];
+    }
+    else if (!Array.isArray(value)) {
+        return [value];
+    }
+    else {
+        return value;
+    }
+}
+function createEsLintReporterConfiguration(compiler, options) {
+    const filesPatterns = (typeof options === 'object' ? castToArray(options.files) : []).map((filesPattern) => 
+    // ensure that `filesPattern` is an absolute path
+    path_1.isAbsolute(filesPattern)
+        ? filesPattern
+        : path_1.join(compiler.options.context || process.cwd(), filesPattern));
+    return Object.assign(Object.assign({ enabled: !!options &&
+            typeof options !== 'boolean' &&
+            filesPatterns.length > 0 && // enable by default if files are provided
+            options.enabled !== false, memoryLimit: 2048 }, (typeof options === 'object' ? options : {})), { files: filesPatterns, options: Object.assign({ cwd: compiler.options.context || process.cwd(), extensions: ['.ts', '.tsx', '.js', '.jsx'] }, (typeof options === 'object' ? options.options || {} : {})) });
+}
+exports.createEsLintReporterConfiguration = createEsLintReporterConfiguration;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/EsLintReporterOptions.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/EsLintReporterOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/EsLintReporterOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,8 @@
+import { CLIEngineOptions } from './types/eslint';
+declare type EsLintReporterOptions = {
+    files: string | string[];
+    enabled?: boolean;
+    memoryLimit?: number;
+    options?: CLIEngineOptions;
+};
+export { EsLintReporterOptions };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/EsLintReporterOptions.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/EsLintReporterOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/EsLintReporterOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/assertEsLintSupport.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/assertEsLintSupport.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/assertEsLintSupport.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+import { EsLintReporterConfiguration } from './EsLintReporterConfiguration';
+declare function assertEsLintSupport(configuration: EsLintReporterConfiguration): void;
+export { assertEsLintSupport };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/assertEsLintSupport.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/assertEsLintSupport.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/assertEsLintSupport.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,30 @@
+"use strict";
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
+    result["default"] = mod;
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const semver = __importStar(require("semver"));
+function assertEsLintSupport(configuration) {
+    if (semver.lt(process.version, '8.10.0')) {
+        throw new Error(`To use 'eslint' option, please update to Node.js >= v8.10.0 ` +
+            `(current version is ${process.version})`);
+    }
+    let eslintVersion;
+    try {
+        eslintVersion = require('eslint').Linter.version;
+    }
+    catch (error) {
+        throw new Error(`When you use 'eslint' option, make sure to install 'eslint'.`);
+    }
+    if (semver.lt(eslintVersion, '6.0.0')) {
+        throw new Error(`Cannot use current eslint version of ${eslintVersion}, the minimum required version is 6.0.0`);
+    }
+    if (!configuration.files) {
+        throw new Error('The `eslint.files` settings is required for EsLint reporter to work.');
+    }
+}
+exports.assertEsLintSupport = assertEsLintSupport;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/issue/EsLintIssueFactory.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/issue/EsLintIssueFactory.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/issue/EsLintIssueFactory.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+import { Issue } from '../../issue';
+import { LintResult } from '../types/eslint';
+declare function createIssuesFromEsLintResults(results: LintResult[]): Issue[];
+export { createIssuesFromEsLintResults };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/issue/EsLintIssueFactory.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/issue/EsLintIssueFactory.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/issue/EsLintIssueFactory.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,32 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function createIssueFromEsLintMessage(filePath, message) {
+    let location;
+    if (message.line) {
+        location = {
+            start: {
+                line: message.line,
+                column: message.column,
+            },
+            end: {
+                line: message.endLine || message.line,
+                column: message.endColumn || message.column,
+            },
+        };
+    }
+    return {
+        origin: 'eslint',
+        code: message.ruleId ? String(message.ruleId) : '[unknown]',
+        severity: message.severity === 1 ? 'warning' : 'error',
+        message: message.message,
+        file: filePath,
+        location,
+    };
+}
+function createIssuesFromEsLintResults(results) {
+    return results.reduce((messages, result) => [
+        ...messages,
+        ...result.messages.map((message) => createIssueFromEsLintMessage(result.filePath, message)),
+    ], []);
+}
+exports.createIssuesFromEsLintResults = createIssuesFromEsLintResults;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporter.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+import { EsLintReporterConfiguration } from '../EsLintReporterConfiguration';
+import { Reporter } from '../../reporter';
+declare function createEsLintReporter(configuration: EsLintReporterConfiguration): Reporter;
+export { createEsLintReporter };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporter.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,179 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const EsLintIssueFactory_1 = require("../issue/EsLintIssueFactory");
+const path_1 = __importDefault(require("path"));
+const fs_extra_1 = __importDefault(require("fs-extra"));
+const minimatch_1 = __importDefault(require("minimatch"));
+const glob_1 = __importDefault(require("glob"));
+const isOldCLIEngine = (eslint) => eslint.resolveFileGlobPatterns !== undefined;
+function createEsLintReporter(configuration) {
+    // eslint-disable-next-line @typescript-eslint/no-var-requires
+    const { CLIEngine, ESLint } = require('eslint');
+    const eslint = ESLint
+        ? new ESLint(configuration.options)
+        : new CLIEngine(configuration.options);
+    let isInitialRun = true;
+    let isInitialGetFiles = true;
+    const lintResults = new Map();
+    const includedGlobPatterns = resolveFileGlobPatterns(configuration.files);
+    const includedFiles = new Set();
+    function isFileIncluded(path) {
+        return __awaiter(this, void 0, void 0, function* () {
+            return (!path.includes('node_modules') &&
+                includedGlobPatterns.some((pattern) => minimatch_1.default(path, pattern)) &&
+                !(yield eslint.isPathIgnored(path)));
+        });
+    }
+    function getFiles() {
+        return __awaiter(this, void 0, void 0, function* () {
+            if (isInitialGetFiles) {
+                isInitialGetFiles = false;
+                const resolvedGlobs = yield Promise.all(includedGlobPatterns.map((globPattern) => new Promise((resolve) => {
+                    glob_1.default(globPattern, (error, resolvedFiles) => {
+                        if (error) {
+                            // fail silently
+                            resolve([]);
+                        }
+                        else {
+                            resolve(resolvedFiles || []);
+                        }
+                    });
+                })));
+                for (const resolvedGlob of resolvedGlobs) {
+                    for (const resolvedFile of resolvedGlob) {
+                        if (yield isFileIncluded(resolvedFile)) {
+                            includedFiles.add(resolvedFile);
+                        }
+                    }
+                }
+            }
+            return Array.from(includedFiles);
+        });
+    }
+    function getDirs() {
+        return includedGlobPatterns || [];
+    }
+    function getExtensions() {
+        return configuration.options.extensions || [];
+    }
+    // Copied from the eslint 6 implementation, as it's not available in eslint 8
+    function resolveFileGlobPatterns(globPatterns) {
+        if (configuration.options.globInputPaths === false) {
+            return globPatterns.filter(Boolean);
+        }
+        const extensions = getExtensions().map((ext) => ext.replace(/^\./u, ''));
+        const dirSuffix = `/**/*.{${extensions.join(',')}}`;
+        return globPatterns.filter(Boolean).map((globPattern) => {
+            const resolvedPath = path_1.default.resolve(configuration.options.cwd || '', globPattern);
+            const newPath = directoryExists(resolvedPath)
+                ? globPattern.replace(/[/\\]$/u, '') + dirSuffix
+                : globPattern;
+            return path_1.default.normalize(newPath).replace(/\\/gu, '/');
+        });
+    }
+    // Copied from the eslint 6 implementation, as it's not available in eslint 8
+    function directoryExists(resolvedPath) {
+        try {
+            return fs_extra_1.default.statSync(resolvedPath).isDirectory();
+        }
+        catch (error) {
+            if (error && error.code === 'ENOENT') {
+                return false;
+            }
+            throw error;
+        }
+    }
+    return {
+        getReport: ({ changedFiles = [], deletedFiles = [] }) => __awaiter(this, void 0, void 0, function* () {
+            return {
+                getDependencies() {
+                    return __awaiter(this, void 0, void 0, function* () {
+                        for (const changedFile of changedFiles) {
+                            if (yield isFileIncluded(changedFile)) {
+                                includedFiles.add(changedFile);
+                            }
+                        }
+                        for (const deletedFile of deletedFiles) {
+                            includedFiles.delete(deletedFile);
+                        }
+                        return {
+                            files: (yield getFiles()).map((file) => path_1.default.normalize(file)),
+                            dirs: getDirs().map((dir) => path_1.default.normalize(dir)),
+                            excluded: [],
+                            extensions: getExtensions(),
+                        };
+                    });
+                },
+                getIssues() {
+                    return __awaiter(this, void 0, void 0, function* () {
+                        // cleanup old results
+                        for (const changedFile of changedFiles) {
+                            lintResults.delete(changedFile);
+                        }
+                        for (const deletedFile of deletedFiles) {
+                            lintResults.delete(deletedFile);
+                        }
+                        // get reports
+                        const lintReports = [];
+                        if (isInitialRun) {
+                            const lintReport = yield (isOldCLIEngine(eslint)
+                                ? Promise.resolve(eslint.executeOnFiles(includedGlobPatterns))
+                                : eslint.lintFiles(includedGlobPatterns).then((results) => ({ results })));
+                            lintReports.push(lintReport);
+                            isInitialRun = false;
+                        }
+                        else {
+                            // we need to take care to not lint files that are not included by the configuration.
+                            // the eslint engine will not exclude them automatically
+                            const changedAndIncludedFiles = [];
+                            for (const changedFile of changedFiles) {
+                                if (yield isFileIncluded(changedFile)) {
+                                    changedAndIncludedFiles.push(changedFile);
+                                }
+                            }
+                            if (changedAndIncludedFiles.length) {
+                                const lintReport = yield (isOldCLIEngine(eslint)
+                                    ? Promise.resolve(eslint.executeOnFiles(changedAndIncludedFiles))
+                                    : eslint.lintFiles(changedAndIncludedFiles).then((results) => ({ results })));
+                                lintReports.push(lintReport);
+                            }
+                        }
+                        // output fixes if `fix` option is provided
+                        if (configuration.options.fix) {
+                            yield Promise.all(lintReports.map((lintReport) => isOldCLIEngine(eslint)
+                                ? CLIEngine.outputFixes(lintReport)
+                                : ESLint.outputFixes(lintReport.results)));
+                        }
+                        // store results
+                        for (const lintReport of lintReports) {
+                            for (const lintResult of lintReport.results) {
+                                lintResults.set(lintResult.filePath, lintResult);
+                            }
+                        }
+                        // get actual list of previous and current reports
+                        const results = Array.from(lintResults.values());
+                        return EsLintIssueFactory_1.createIssuesFromEsLintResults(results);
+                    });
+                },
+                close() {
+                    return __awaiter(this, void 0, void 0, function* () {
+                        // do nothing
+                    });
+                },
+            };
+        }),
+    };
+}
+exports.createEsLintReporter = createEsLintReporter;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporterRpcClient.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporterRpcClient.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporterRpcClient.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+import { EsLintReporterConfiguration } from '../EsLintReporterConfiguration';
+import { ReporterRpcClient } from '../../reporter';
+declare function createEsLintReporterRpcClient(configuration: EsLintReporterConfiguration): ReporterRpcClient;
+export { createEsLintReporterRpcClient };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporterRpcClient.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporterRpcClient.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporterRpcClient.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,13 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const path_1 = __importDefault(require("path"));
+const reporter_1 = require("../../reporter");
+const rpc_ipc_1 = require("../../rpc/rpc-ipc");
+function createEsLintReporterRpcClient(configuration) {
+    const channel = rpc_ipc_1.createRpcIpcMessageChannel(path_1.default.resolve(__dirname, './EsLintReporterRpcService.js'), configuration.memoryLimit);
+    return reporter_1.createReporterRpcClient(channel, configuration);
+}
+exports.createEsLintReporterRpcClient = createEsLintReporterRpcClient;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporterRpcService.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporterRpcService.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporterRpcService.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export {};
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporterRpcService.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporterRpcService.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/reporter/EsLintReporterRpcService.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,11 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const process_1 = __importDefault(require("process"));
+const EsLintReporter_1 = require("./EsLintReporter");
+const reporter_1 = require("../../reporter");
+const rpc_ipc_1 = require("../../rpc/rpc-ipc");
+const service = reporter_1.registerReporterRpcService(rpc_ipc_1.createRpcIpcMessagePort(process_1.default), EsLintReporter_1.createEsLintReporter);
+service.open();
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/types/eslint.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/types/eslint.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/types/eslint.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,37 @@
+export interface LintMessage {
+    ruleId: string | null;
+    severity: number;
+    message: string;
+    line: number;
+    column: number;
+    endColumn?: number;
+    endLine?: number;
+    [key: string]: any;
+}
+export interface LintResult {
+    filePath: string;
+    messages: LintMessage[];
+    [key: string]: any;
+}
+export interface LintReport {
+    results: LintResult[];
+    [key: string]: any;
+}
+export interface CLIEngine {
+    version: string;
+    executeOnFiles(filesPatterns: string[]): LintReport;
+    resolveFileGlobPatterns(filesPatterns: string[]): string[];
+    isPathIgnored(filePath: string): boolean;
+}
+export interface ESLint {
+    version: string;
+    lintFiles(filesPatterns: string[]): Promise<LintResult[]>;
+    isPathIgnored(filePath: string): Promise<boolean>;
+}
+export declare type ESLintOrCLIEngine = CLIEngine | ESLint;
+export interface CLIEngineOptions {
+    cwd?: string;
+    extensions?: string[];
+    fix?: boolean;
+    [key: string]: any;
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/types/eslint.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/types/eslint.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/eslint-reporter/types/eslint.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/BasicFormatter.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/BasicFormatter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/BasicFormatter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+import { Formatter } from './Formatter';
+declare function createBasicFormatter(): Formatter;
+export { createBasicFormatter };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/BasicFormatter.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/BasicFormatter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/BasicFormatter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,12 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const chalk_1 = __importDefault(require("chalk"));
+function createBasicFormatter() {
+    return function basicFormatter(issue) {
+        return chalk_1.default.grey(issue.code + ': ') + issue.message;
+    };
+}
+exports.createBasicFormatter = createBasicFormatter;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/CodeFrameFormatter.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/CodeFrameFormatter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/CodeFrameFormatter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+import { Formatter } from './Formatter';
+import { BabelCodeFrameOptions } from './types/babel__code-frame';
+declare function createCodeFrameFormatter(options?: BabelCodeFrameOptions): Formatter;
+export { createCodeFrameFormatter, BabelCodeFrameOptions };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/CodeFrameFormatter.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/CodeFrameFormatter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/CodeFrameFormatter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,28 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const os_1 = __importDefault(require("os"));
+const fs_extra_1 = __importDefault(require("fs-extra"));
+const code_frame_1 = require("@babel/code-frame");
+const BasicFormatter_1 = require("./BasicFormatter");
+function createCodeFrameFormatter(options) {
+    const basicFormatter = BasicFormatter_1.createBasicFormatter();
+    return function codeFrameFormatter(issue) {
+        const source = issue.file && fs_extra_1.default.existsSync(issue.file) && fs_extra_1.default.readFileSync(issue.file, 'utf-8');
+        let frame = '';
+        if (source && issue.location) {
+            frame = code_frame_1.codeFrameColumns(source, issue.location, Object.assign({ highlightCode: true }, (options || {})))
+                .split('\n')
+                .map((line) => '  ' + line)
+                .join(os_1.default.EOL);
+        }
+        const lines = [basicFormatter(issue)];
+        if (frame) {
+            lines.push(frame);
+        }
+        return lines.join(os_1.default.EOL);
+    };
+}
+exports.createCodeFrameFormatter = createCodeFrameFormatter;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/Formatter.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/Formatter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/Formatter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+import { Issue } from '../issue';
+declare type Formatter = (issue: Issue) => string;
+export { Formatter };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/Formatter.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/Formatter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/Formatter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterConfiguration.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterConfiguration.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterConfiguration.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+import { FormatterOptions } from './FormatterOptions';
+import { Formatter } from './Formatter';
+declare type FormatterConfiguration = Formatter;
+declare function createFormatterConfiguration(options: FormatterOptions | undefined): Formatter;
+export { FormatterConfiguration, createFormatterConfiguration };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterConfiguration.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterConfiguration.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterConfiguration.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const FormatterFactory_1 = require("./FormatterFactory");
+function createFormatterConfiguration(options) {
+    return FormatterFactory_1.createFormatter(options ? (typeof options === 'object' ? options.type || 'codeframe' : options) : 'codeframe', options && typeof options === 'object' ? options.options || {} : {});
+}
+exports.createFormatterConfiguration = createFormatterConfiguration;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterFactory.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterFactory.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterFactory.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,13 @@
+import { Formatter } from './Formatter';
+import { BabelCodeFrameOptions } from './CodeFrameFormatter';
+declare type NotConfigurableFormatterType = undefined | 'basic' | Formatter;
+declare type ConfigurableFormatterType = 'codeframe';
+declare type FormatterType = NotConfigurableFormatterType | ConfigurableFormatterType;
+declare type ConfigurableFormatterOptions = {
+    codeframe: BabelCodeFrameOptions;
+};
+declare type ComplexFormatterOptions<T extends FormatterType> = T extends ConfigurableFormatterType ? ConfigurableFormatterOptions[T] : never;
+declare function createFormatter<T extends NotConfigurableFormatterType>(type?: T): Formatter;
+declare function createFormatter<T extends ConfigurableFormatterType>(type: T, options?: ConfigurableFormatterOptions[T]): Formatter;
+declare function createFormatter<T extends FormatterType>(type: T, options?: object): Formatter;
+export { createFormatter, FormatterType, ComplexFormatterOptions, NotConfigurableFormatterType, ConfigurableFormatterType, ConfigurableFormatterOptions, };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterFactory.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterFactory.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterFactory.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,18 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const CodeFrameFormatter_1 = require("./CodeFrameFormatter");
+const BasicFormatter_1 = require("./BasicFormatter");
+// declare function implementation
+function createFormatter(type, options) {
+    if (typeof type === 'function') {
+        return type;
+    }
+    if (typeof type === 'undefined' || type === 'basic') {
+        return BasicFormatter_1.createBasicFormatter();
+    }
+    if (type === 'codeframe') {
+        return CodeFrameFormatter_1.createCodeFrameFormatter(options);
+    }
+    throw new Error(`Unknown "${type}" formatter. Available types are: "basic", "codeframe" or a custom function.`);
+}
+exports.createFormatter = createFormatter;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterOptions.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+import { ComplexFormatterOptions, FormatterType } from './FormatterFactory';
+declare type ComplexFormatterPreferences<T extends FormatterType = FormatterType> = {
+    type: T;
+    options?: ComplexFormatterOptions<T>;
+};
+declare type FormatterOptions = FormatterType | ComplexFormatterPreferences;
+export { FormatterOptions };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterOptions.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/FormatterOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/WebpackFormatter.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/WebpackFormatter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/WebpackFormatter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+import { Formatter } from './Formatter';
+declare function createWebpackFormatter(formatter: Formatter): Formatter;
+export { createWebpackFormatter };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/WebpackFormatter.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/WebpackFormatter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/WebpackFormatter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,28 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const os_1 = __importDefault(require("os"));
+const chalk_1 = __importDefault(require("chalk"));
+const path_1 = __importDefault(require("path"));
+const issue_1 = require("../issue");
+const forwardSlash_1 = __importDefault(require("../utils/path/forwardSlash"));
+function createWebpackFormatter(formatter) {
+    // mimics webpack error formatter
+    return function webpackFormatter(issue) {
+        const color = issue.severity === 'warning' ? chalk_1.default.yellow.bold : chalk_1.default.red.bold;
+        const severity = issue.severity.toUpperCase();
+        if (issue.file) {
+            let location = forwardSlash_1.default(path_1.default.relative(process.cwd(), issue.file));
+            if (issue.location) {
+                location += `:${issue_1.formatIssueLocation(issue.location)}`;
+            }
+            return [color(`${severity} in ${location}`), formatter(issue), ''].join(os_1.default.EOL);
+        }
+        else {
+            return [color(`${severity} in `) + formatter(issue), ''].join(os_1.default.EOL);
+        }
+    };
+}
+exports.createWebpackFormatter = createWebpackFormatter;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/index.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+export * from './Formatter';
+export * from './BasicFormatter';
+export * from './CodeFrameFormatter';
+export * from './WebpackFormatter';
+export * from './FormatterFactory';
+export * from './FormatterOptions';
+export * from './FormatterConfiguration';
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,10 @@
+"use strict";
+function __export(m) {
+    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
+}
+Object.defineProperty(exports, "__esModule", { value: true });
+__export(require("./BasicFormatter"));
+__export(require("./CodeFrameFormatter"));
+__export(require("./WebpackFormatter"));
+__export(require("./FormatterFactory"));
+__export(require("./FormatterConfiguration"));
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/types/babel__code-frame.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/types/babel__code-frame.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/types/babel__code-frame.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,21 @@
+export interface BabelCodeFrameOptions {
+    /** Syntax highlight the code as JavaScript for terminals. default: false */
+    highlightCode?: boolean;
+    /**  The number of lines to show above the error. default: 2 */
+    linesAbove?: number;
+    /**  The number of lines to show below the error. default: 3 */
+    linesBelow?: number;
+    /**
+     * Forcibly syntax highlight the code as JavaScript (for non-terminals);
+     * overrides highlightCode.
+     * default: false
+     */
+    forceColor?: boolean;
+    /**
+     * Pass in a string to be displayed inline (if possible) next to the
+     * highlighted location in the code. If it can't be positioned inline,
+     * it will be placed above the code frame.
+     * default: nothing
+     */
+    message?: string;
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/types/babel__code-frame.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/types/babel__code-frame.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/formatter/types/babel__code-frame.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+"use strict";
+// Base on the type definitions for @babel/code-frame 7.0
+// Project: https://github.com/babel/babel/tree/main/packages/babel-code-frame, https://babeljs.io
+// Definitions by: Mohsen Azimi <https://github.com/mohsen1>
+//                 Forbes Lindesay <https://github.com/ForbesLindesay>
+// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/interceptDoneToGetWebpackDevServerTap.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/interceptDoneToGetWebpackDevServerTap.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/interceptDoneToGetWebpackDevServerTap.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+import webpack from 'webpack';
+import { ForkTsCheckerWebpackPluginConfiguration } from '../ForkTsCheckerWebpackPluginConfiguration';
+import { ForkTsCheckerWebpackPluginState } from '../ForkTsCheckerWebpackPluginState';
+declare function interceptDoneToGetWebpackDevServerTap(compiler: webpack.Compiler, configuration: ForkTsCheckerWebpackPluginConfiguration, state: ForkTsCheckerWebpackPluginState): void;
+export { interceptDoneToGetWebpackDevServerTap };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/interceptDoneToGetWebpackDevServerTap.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/interceptDoneToGetWebpackDevServerTap.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/interceptDoneToGetWebpackDevServerTap.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,16 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function interceptDoneToGetWebpackDevServerTap(compiler, configuration, state) {
+    // inspired by https://github.com/ypresto/fork-ts-checker-async-overlay-webpack-plugin
+    compiler.hooks.done.intercept({
+        register: (tap) => {
+            if (tap.name === 'webpack-dev-server' &&
+                tap.type === 'sync' &&
+                configuration.logger.devServer) {
+                state.webpackDevServerDoneTap = tap;
+            }
+            return tap;
+        },
+    });
+}
+exports.interceptDoneToGetWebpackDevServerTap = interceptDoneToGetWebpackDevServerTap;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/pluginHooks.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/pluginHooks.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/pluginHooks.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,20 @@
+import * as webpack from 'webpack';
+import { SyncHook, SyncWaterfallHook, AsyncSeriesWaterfallHook } from 'tapable';
+import { FilesChange } from '../reporter';
+import { Issue } from '../issue';
+declare function createForkTsCheckerWebpackPluginHooks(): {
+    start: AsyncSeriesWaterfallHook<FilesChange, webpack.compilation.Compilation, any>;
+    waiting: SyncHook<webpack.compilation.Compilation, any, any>;
+    canceled: SyncHook<webpack.compilation.Compilation, any, any>;
+    error: SyncHook<Error, webpack.compilation.Compilation, any>;
+    issues: SyncWaterfallHook<Issue[], webpack.compilation.Compilation | undefined, void>;
+};
+declare type ForkTsCheckerWebpackPluginHooks = ReturnType<typeof createForkTsCheckerWebpackPluginHooks>;
+declare function getForkTsCheckerWebpackPluginHooks(compiler: webpack.Compiler | webpack.MultiCompiler): {
+    start: AsyncSeriesWaterfallHook<FilesChange, webpack.compilation.Compilation, any>;
+    waiting: SyncHook<webpack.compilation.Compilation, any, any>;
+    canceled: SyncHook<webpack.compilation.Compilation, any, any>;
+    error: SyncHook<Error, webpack.compilation.Compilation, any>;
+    issues: SyncWaterfallHook<Issue[], webpack.compilation.Compilation | undefined, void>;
+};
+export { getForkTsCheckerWebpackPluginHooks, ForkTsCheckerWebpackPluginHooks };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/pluginHooks.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/pluginHooks.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/pluginHooks.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,44 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const tapable_1 = require("tapable");
+const compilerHookMap = new WeakMap();
+function createForkTsCheckerWebpackPluginHooks() {
+    return {
+        start: new tapable_1.AsyncSeriesWaterfallHook([
+            'change',
+            'compilation',
+        ]),
+        waiting: new tapable_1.SyncHook(['compilation']),
+        canceled: new tapable_1.SyncHook(['compilation']),
+        error: new tapable_1.SyncHook(['error', 'compilation']),
+        issues: new tapable_1.SyncWaterfallHook([
+            'issues',
+            'compilation',
+        ]),
+    };
+}
+function forwardForkTsCheckerWebpackPluginHooks(source, target) {
+    source.start.tapPromise('ForkTsCheckerWebpackPlugin', target.start.promise);
+    source.waiting.tap('ForkTsCheckerWebpackPlugin', target.waiting.call);
+    source.canceled.tap('ForkTsCheckerWebpackPlugin', target.canceled.call);
+    source.error.tap('ForkTsCheckerWebpackPlugin', target.error.call);
+    source.issues.tap('ForkTsCheckerWebpackPlugin', target.issues.call);
+}
+function getForkTsCheckerWebpackPluginHooks(compiler) {
+    let hooks = compilerHookMap.get(compiler);
+    if (hooks === undefined) {
+        hooks = createForkTsCheckerWebpackPluginHooks();
+        compilerHookMap.set(compiler, hooks);
+        // proxy hooks for multi-compiler
+        if ('compilers' in compiler) {
+            compiler.compilers.forEach((childCompiler) => {
+                const childHooks = getForkTsCheckerWebpackPluginHooks(childCompiler);
+                if (hooks) {
+                    forwardForkTsCheckerWebpackPluginHooks(childHooks, hooks);
+                }
+            });
+        }
+    }
+    return hooks;
+}
+exports.getForkTsCheckerWebpackPluginHooks = getForkTsCheckerWebpackPluginHooks;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterCompileToAddDependencies.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterCompileToAddDependencies.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterCompileToAddDependencies.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+import webpack from 'webpack';
+import { ForkTsCheckerWebpackPluginConfiguration } from '../ForkTsCheckerWebpackPluginConfiguration';
+import { ForkTsCheckerWebpackPluginState } from '../ForkTsCheckerWebpackPluginState';
+declare function tapAfterCompileToAddDependencies(compiler: webpack.Compiler, configuration: ForkTsCheckerWebpackPluginConfiguration, state: ForkTsCheckerWebpackPluginState): void;
+export { tapAfterCompileToAddDependencies };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterCompileToAddDependencies.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterCompileToAddDependencies.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterCompileToAddDependencies.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,27 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+function tapAfterCompileToAddDependencies(compiler, configuration, state) {
+    compiler.hooks.afterCompile.tapPromise('ForkTsCheckerWebpackPlugin', (compilation) => __awaiter(this, void 0, void 0, function* () {
+        if (compilation.compiler !== compiler) {
+            // run only for the compiler that the plugin was registered for
+            return;
+        }
+        const dependencies = yield state.dependenciesPromise;
+        if (dependencies) {
+            state.lastDependencies = dependencies;
+            dependencies.files.forEach((file) => {
+                compilation.fileDependencies.add(file);
+            });
+        }
+    }));
+}
+exports.tapAfterCompileToAddDependencies = tapAfterCompileToAddDependencies;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterCompileToGetIssues.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterCompileToGetIssues.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterCompileToGetIssues.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+import webpack from 'webpack';
+import { ForkTsCheckerWebpackPluginConfiguration } from '../ForkTsCheckerWebpackPluginConfiguration';
+import { ForkTsCheckerWebpackPluginState } from '../ForkTsCheckerWebpackPluginState';
+declare function tapAfterCompileToGetIssues(compiler: webpack.Compiler, configuration: ForkTsCheckerWebpackPluginConfiguration, state: ForkTsCheckerWebpackPluginState): void;
+export { tapAfterCompileToGetIssues };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterCompileToGetIssues.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterCompileToGetIssues.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterCompileToGetIssues.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,48 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const pluginHooks_1 = require("./pluginHooks");
+const IssueWebpackError_1 = require("../issue/IssueWebpackError");
+function tapAfterCompileToGetIssues(compiler, configuration, state) {
+    const hooks = pluginHooks_1.getForkTsCheckerWebpackPluginHooks(compiler);
+    compiler.hooks.afterCompile.tapPromise('ForkTsCheckerWebpackPlugin', (compilation) => __awaiter(this, void 0, void 0, function* () {
+        if (compilation.compiler !== compiler) {
+            // run only for the compiler that the plugin was registered for
+            return;
+        }
+        let issues = [];
+        try {
+            issues = yield state.issuesPromise;
+        }
+        catch (error) {
+            hooks.error.call(error, compilation);
+            return;
+        }
+        if (!issues) {
+            // some error has been thrown or it was canceled
+            return;
+        }
+        // filter list of issues by provided issue predicate
+        issues = issues.filter(configuration.issue.predicate);
+        // modify list of issues in the plugin hooks
+        issues = hooks.issues.call(issues, compilation);
+        issues.forEach((issue) => {
+            const error = new IssueWebpackError_1.IssueWebpackError(configuration.formatter(issue), issue);
+            if (issue.severity === 'warning') {
+                compilation.warnings.push(error);
+            }
+            else {
+                compilation.errors.push(error);
+            }
+        });
+    }));
+}
+exports.tapAfterCompileToGetIssues = tapAfterCompileToGetIssues;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterEnvironmentToPatchWatching.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterEnvironmentToPatchWatching.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterEnvironmentToPatchWatching.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+import webpack from 'webpack';
+import { ForkTsCheckerWebpackPluginState } from '../ForkTsCheckerWebpackPluginState';
+declare function tapAfterEnvironmentToPatchWatching(compiler: webpack.Compiler, state: ForkTsCheckerWebpackPluginState): void;
+export { tapAfterEnvironmentToPatchWatching };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterEnvironmentToPatchWatching.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterEnvironmentToPatchWatching.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapAfterEnvironmentToPatchWatching.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,13 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const InclusiveNodeWatchFileSystem_1 = require("../watch/InclusiveNodeWatchFileSystem");
+function tapAfterEnvironmentToPatchWatching(compiler, state) {
+    compiler.hooks.afterEnvironment.tap('ForkTsCheckerWebpackPlugin', () => {
+        const watchFileSystem = compiler.watchFileSystem;
+        if (watchFileSystem) {
+            // wrap original watch file system
+            compiler.watchFileSystem = new InclusiveNodeWatchFileSystem_1.InclusiveNodeWatchFileSystem(watchFileSystem, compiler, state);
+        }
+    });
+}
+exports.tapAfterEnvironmentToPatchWatching = tapAfterEnvironmentToPatchWatching;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapDoneToAsyncGetIssues.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapDoneToAsyncGetIssues.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapDoneToAsyncGetIssues.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+import webpack from 'webpack';
+import { ForkTsCheckerWebpackPluginConfiguration } from '../ForkTsCheckerWebpackPluginConfiguration';
+import { ForkTsCheckerWebpackPluginState } from '../ForkTsCheckerWebpackPluginState';
+declare function tapDoneToAsyncGetIssues(compiler: webpack.Compiler, configuration: ForkTsCheckerWebpackPluginConfiguration, state: ForkTsCheckerWebpackPluginState): void;
+export { tapDoneToAsyncGetIssues };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapDoneToAsyncGetIssues.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapDoneToAsyncGetIssues.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapDoneToAsyncGetIssues.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,85 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const chalk_1 = __importDefault(require("chalk"));
+const pluginHooks_1 = require("./pluginHooks");
+const WebpackFormatter_1 = require("../formatter/WebpackFormatter");
+const IssueWebpackError_1 = require("../issue/IssueWebpackError");
+const isPending_1 = __importDefault(require("../utils/async/isPending"));
+const wait_1 = __importDefault(require("../utils/async/wait"));
+function tapDoneToAsyncGetIssues(compiler, configuration, state) {
+    const hooks = pluginHooks_1.getForkTsCheckerWebpackPluginHooks(compiler);
+    compiler.hooks.done.tap('ForkTsCheckerWebpackPlugin', (stats) => __awaiter(this, void 0, void 0, function* () {
+        if (stats.compilation.compiler !== compiler) {
+            // run only for the compiler that the plugin was registered for
+            return;
+        }
+        const reportPromise = state.issuesReportPromise;
+        const issuesPromise = state.issuesPromise;
+        let issues;
+        try {
+            if (yield isPending_1.default(issuesPromise)) {
+                hooks.waiting.call(stats.compilation);
+                configuration.logger.issues.log(chalk_1.default.cyan('Issues checking in progress...'));
+            }
+            else {
+                // wait 10ms to log issues after webpack stats
+                yield wait_1.default(10);
+            }
+            issues = yield issuesPromise;
+        }
+        catch (error) {
+            hooks.error.call(error, stats.compilation);
+            return;
+        }
+        if (!issues) {
+            // some error has been thrown or it was canceled
+            return;
+        }
+        if (reportPromise !== state.issuesReportPromise) {
+            // there is a newer report - ignore this one
+            return;
+        }
+        // filter list of issues by provided issue predicate
+        issues = issues.filter(configuration.issue.predicate);
+        // modify list of issues in the plugin hooks
+        issues = hooks.issues.call(issues, stats.compilation);
+        const formatter = WebpackFormatter_1.createWebpackFormatter(configuration.formatter);
+        if (issues.length) {
+            // follow webpack's approach - one process.write to stderr with all errors and warnings
+            configuration.logger.issues.error(issues.map((issue) => formatter(issue)).join('\n'));
+        }
+        else {
+            configuration.logger.issues.log(chalk_1.default.green('No issues found.'));
+        }
+        // report issues to webpack-dev-server, if it's listening
+        // skip reporting if there are no issues, to avoid an extra hot reload
+        if (issues.length && state.webpackDevServerDoneTap) {
+            issues.forEach((issue) => {
+                const error = new IssueWebpackError_1.IssueWebpackError(configuration.formatter(issue), issue);
+                if (issue.severity === 'warning') {
+                    stats.compilation.warnings.push(error);
+                }
+                else {
+                    stats.compilation.errors.push(error);
+                }
+            });
+            state.webpackDevServerDoneTap.fn(stats);
+        }
+        if (stats.startTime) {
+            configuration.logger.infrastructure.info(`Time: ${Math.round(Date.now() - stats.startTime).toString()} ms`);
+        }
+    }));
+}
+exports.tapDoneToAsyncGetIssues = tapDoneToAsyncGetIssues;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapErrorToLogMessage.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapErrorToLogMessage.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapErrorToLogMessage.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+import webpack from 'webpack';
+import { ForkTsCheckerWebpackPluginConfiguration } from '../ForkTsCheckerWebpackPluginConfiguration';
+declare function tapErrorToLogMessage(compiler: webpack.Compiler, configuration: ForkTsCheckerWebpackPluginConfiguration): void;
+export { tapErrorToLogMessage };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapErrorToLogMessage.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapErrorToLogMessage.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapErrorToLogMessage.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,27 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const pluginHooks_1 = require("./pluginHooks");
+const RpcIpcMessagePortClosedError_1 = require("../rpc/rpc-ipc/error/RpcIpcMessagePortClosedError");
+const chalk_1 = __importDefault(require("chalk"));
+function tapErrorToLogMessage(compiler, configuration) {
+    const hooks = pluginHooks_1.getForkTsCheckerWebpackPluginHooks(compiler);
+    hooks.error.tap('ForkTsCheckerWebpackPlugin', (error) => {
+        configuration.logger.issues.error(String(error));
+        if (error instanceof RpcIpcMessagePortClosedError_1.RpcIpcMessagePortClosedError) {
+            if (error.signal === 'SIGINT') {
+                configuration.logger.issues.error(chalk_1.default.red('Issues checking service interrupted - If running in a docker container, this may be caused ' +
+                    "by the container running out of memory. If so, try increasing the container's memory limit " +
+                    'or lowering the `memoryLimit` value in the ForkTsCheckerWebpackPlugin configuration.'));
+            }
+            else {
+                configuration.logger.issues.error(chalk_1.default.red('Issues checking service aborted - probably out of memory. ' +
+                    'Check the `memoryLimit` option in the ForkTsCheckerWebpackPlugin configuration.\n' +
+                    "If increasing the memory doesn't solve the issue, it's most probably a bug in the TypeScript or EsLint."));
+            }
+        }
+    });
+}
+exports.tapErrorToLogMessage = tapErrorToLogMessage;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapStartToConnectAndRunReporter.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapStartToConnectAndRunReporter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapStartToConnectAndRunReporter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+import webpack from 'webpack';
+import { ForkTsCheckerWebpackPluginConfiguration } from '../ForkTsCheckerWebpackPluginConfiguration';
+import { ForkTsCheckerWebpackPluginState } from '../ForkTsCheckerWebpackPluginState';
+import { ReporterRpcClient } from '../reporter';
+declare function tapStartToConnectAndRunReporter(compiler: webpack.Compiler, issuesReporter: ReporterRpcClient, dependenciesReporter: ReporterRpcClient, configuration: ForkTsCheckerWebpackPluginConfiguration, state: ForkTsCheckerWebpackPluginState): void;
+export { tapStartToConnectAndRunReporter };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapStartToConnectAndRunReporter.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapStartToConnectAndRunReporter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapStartToConnectAndRunReporter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,125 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const pluginHooks_1 = require("./pluginHooks");
+const reporter_1 = require("../reporter");
+const OperationCanceledError_1 = require("../error/OperationCanceledError");
+const tapDoneToAsyncGetIssues_1 = require("./tapDoneToAsyncGetIssues");
+const tapAfterCompileToGetIssues_1 = require("./tapAfterCompileToGetIssues");
+const interceptDoneToGetWebpackDevServerTap_1 = require("./interceptDoneToGetWebpackDevServerTap");
+const ForkTsCheckerWebpackPlugin_1 = require("../ForkTsCheckerWebpackPlugin");
+function tapStartToConnectAndRunReporter(compiler, issuesReporter, dependenciesReporter, configuration, state) {
+    const hooks = pluginHooks_1.getForkTsCheckerWebpackPluginHooks(compiler);
+    compiler.hooks.run.tap('ForkTsCheckerWebpackPlugin', () => {
+        if (!state.initialized) {
+            state.initialized = true;
+            state.watching = false;
+            tapAfterCompileToGetIssues_1.tapAfterCompileToGetIssues(compiler, configuration, state);
+        }
+    });
+    compiler.hooks.watchRun.tap('ForkTsCheckerWebpackPlugin', () => __awaiter(this, void 0, void 0, function* () {
+        if (!state.initialized) {
+            state.initialized = true;
+            state.watching = true;
+            if (configuration.async) {
+                tapDoneToAsyncGetIssues_1.tapDoneToAsyncGetIssues(compiler, configuration, state);
+                interceptDoneToGetWebpackDevServerTap_1.interceptDoneToGetWebpackDevServerTap(compiler, configuration, state);
+            }
+            else {
+                tapAfterCompileToGetIssues_1.tapAfterCompileToGetIssues(compiler, configuration, state);
+            }
+        }
+    }));
+    compiler.hooks.compilation.tap('ForkTsCheckerWebpackPlugin', (compilation) => __awaiter(this, void 0, void 0, function* () {
+        if (compilation.compiler !== compiler) {
+            // run only for the compiler that the plugin was registered for
+            return;
+        }
+        let change = {};
+        if (state.watching) {
+            change = reporter_1.getFilesChange(compiler);
+            configuration.logger.infrastructure.info([
+                'Calling reporter service for incremental check.',
+                `  Changed files: ${JSON.stringify(change.changedFiles)}`,
+                `  Deleted files: ${JSON.stringify(change.deletedFiles)}`,
+            ].join('\n'));
+        }
+        else {
+            configuration.logger.infrastructure.info('Calling reporter service for single check.');
+        }
+        let resolveDependencies;
+        let rejectDependencies;
+        let resolveIssues;
+        let rejectIssues;
+        state.dependenciesPromise = new Promise((resolve, reject) => {
+            resolveDependencies = resolve;
+            rejectDependencies = reject;
+        });
+        state.issuesPromise = new Promise((resolve, reject) => {
+            resolveIssues = resolve;
+            rejectIssues = reject;
+        });
+        const previousIssuesReportPromise = state.issuesReportPromise;
+        const previousDependenciesReportPromise = state.dependenciesReportPromise;
+        change = yield hooks.start.promise(change, compilation);
+        state.issuesReportPromise = ForkTsCheckerWebpackPlugin_1.ForkTsCheckerWebpackPlugin.issuesPool.submit((done) => new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
+            try {
+                yield issuesReporter.connect();
+                const previousReport = yield previousIssuesReportPromise;
+                if (previousReport) {
+                    yield previousReport.close();
+                }
+                const report = yield issuesReporter.getReport(change);
+                resolve(report);
+                report.getIssues().then(resolveIssues).catch(rejectIssues).finally(done);
+            }
+            catch (error) {
+                if (error instanceof OperationCanceledError_1.OperationCanceledError) {
+                    hooks.canceled.call(compilation);
+                }
+                else {
+                    hooks.error.call(error, compilation);
+                }
+                resolve(undefined);
+                resolveIssues(undefined);
+                done();
+            }
+        })));
+        state.dependenciesReportPromise = ForkTsCheckerWebpackPlugin_1.ForkTsCheckerWebpackPlugin.dependenciesPool.submit((done) => new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
+            try {
+                yield dependenciesReporter.connect();
+                const previousReport = yield previousDependenciesReportPromise;
+                if (previousReport) {
+                    yield previousReport.close();
+                }
+                const report = yield dependenciesReporter.getReport(change);
+                resolve(report);
+                report
+                    .getDependencies()
+                    .then(resolveDependencies)
+                    .catch(rejectDependencies)
+                    .finally(done);
+            }
+            catch (error) {
+                if (error instanceof OperationCanceledError_1.OperationCanceledError) {
+                    hooks.canceled.call(compilation);
+                }
+                else {
+                    hooks.error.call(error, compilation);
+                }
+                resolve(undefined);
+                resolveDependencies(undefined);
+                done();
+            }
+        })));
+    }));
+}
+exports.tapStartToConnectAndRunReporter = tapStartToConnectAndRunReporter;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapStopToDisconnectReporter.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapStopToDisconnectReporter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapStopToDisconnectReporter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+import webpack from 'webpack';
+import { ForkTsCheckerWebpackPluginState } from '../ForkTsCheckerWebpackPluginState';
+import { ReporterRpcClient } from '../reporter';
+declare function tapStopToDisconnectReporter(compiler: webpack.Compiler, issuesReporter: ReporterRpcClient, dependenciesReporter: ReporterRpcClient, state: ForkTsCheckerWebpackPluginState): void;
+export { tapStopToDisconnectReporter };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapStopToDisconnectReporter.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapStopToDisconnectReporter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/hooks/tapStopToDisconnectReporter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,29 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+function tapStopToDisconnectReporter(compiler, issuesReporter, dependenciesReporter, state) {
+    compiler.hooks.watchClose.tap('ForkTsCheckerWebpackPlugin', () => {
+        issuesReporter.disconnect();
+        dependenciesReporter.disconnect();
+    });
+    compiler.hooks.done.tap('ForkTsCheckerWebpackPlugin', () => __awaiter(this, void 0, void 0, function* () {
+        if (!state.watching) {
+            yield Promise.all([issuesReporter.disconnect(), dependenciesReporter.disconnect()]);
+        }
+    }));
+    compiler.hooks.failed.tap('ForkTsCheckerWebpackPlugin', () => {
+        if (!state.watching) {
+            issuesReporter.disconnect();
+            dependenciesReporter.disconnect();
+        }
+    });
+}
+exports.tapStopToDisconnectReporter = tapStopToDisconnectReporter;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/index.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+import { ForkTsCheckerWebpackPlugin } from './ForkTsCheckerWebpackPlugin';
+export = ForkTsCheckerWebpackPlugin;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+"use strict";
+const ForkTsCheckerWebpackPlugin_1 = require("./ForkTsCheckerWebpackPlugin");
+module.exports = ForkTsCheckerWebpackPlugin_1.ForkTsCheckerWebpackPlugin;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/Issue.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/Issue.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/Issue.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,13 @@
+import { IssueSeverity } from './IssueSeverity';
+import { IssueLocation } from './IssueLocation';
+interface Issue {
+    origin: string;
+    severity: IssueSeverity;
+    code: string;
+    message: string;
+    file?: string;
+    location?: IssueLocation;
+}
+declare function isIssue(value: unknown): value is Issue;
+declare function deduplicateAndSortIssues(issues: Issue[]): Issue[];
+export { Issue, isIssue, deduplicateAndSortIssues };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/Issue.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/Issue.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/Issue.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,42 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const IssueSeverity_1 = require("./IssueSeverity");
+const IssueLocation_1 = require("./IssueLocation");
+function isIssue(value) {
+    return (!!value &&
+        typeof value === 'object' &&
+        !!value.origin &&
+        IssueSeverity_1.isIssueSeverity(value.severity) &&
+        !!value.code &&
+        !!value.message);
+}
+exports.isIssue = isIssue;
+function compareStrings(stringA, stringB) {
+    if (stringA === stringB) {
+        return 0;
+    }
+    if (stringA === undefined || stringA === null) {
+        return -1;
+    }
+    if (stringB === undefined || stringB === null) {
+        return 1;
+    }
+    return stringA.toString().localeCompare(stringB.toString());
+}
+function compareIssues(issueA, issueB) {
+    return (IssueSeverity_1.compareIssueSeverities(issueA.severity, issueB.severity) ||
+        compareStrings(issueA.origin, issueB.origin) ||
+        compareStrings(issueA.file, issueB.file) ||
+        IssueLocation_1.compareIssueLocations(issueA.location, issueB.location) ||
+        compareStrings(issueA.code, issueB.code) ||
+        compareStrings(issueA.message, issueB.message) ||
+        0 /* EqualTo */);
+}
+function equalsIssues(issueA, issueB) {
+    return compareIssues(issueA, issueB) === 0;
+}
+function deduplicateAndSortIssues(issues) {
+    const sortedIssues = issues.filter(isIssue).sort(compareIssues);
+    return sortedIssues.filter((issue, index) => index === 0 || !equalsIssues(issue, sortedIssues[index - 1]));
+}
+exports.deduplicateAndSortIssues = deduplicateAndSortIssues;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueConfiguration.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueConfiguration.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueConfiguration.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,8 @@
+import webpack from 'webpack';
+import { IssuePredicate } from './IssuePredicate';
+import { IssueOptions } from './IssueOptions';
+interface IssueConfiguration {
+    predicate: IssuePredicate;
+}
+declare function createIssueConfiguration(compiler: webpack.Compiler, options: IssueOptions | undefined): IssueConfiguration;
+export { IssueConfiguration, createIssueConfiguration };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueConfiguration.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueConfiguration.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueConfiguration.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,28 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const IssueMatch_1 = require("./IssueMatch");
+const IssuePredicate_1 = require("./IssuePredicate");
+function createIssuePredicateFromOption(context, option) {
+    if (Array.isArray(option)) {
+        return IssuePredicate_1.composeIssuePredicates(option.map((option) => typeof option === 'function' ? option : IssueMatch_1.createIssuePredicateFromIssueMatch(context, option)));
+    }
+    return typeof option === 'function'
+        ? option
+        : IssueMatch_1.createIssuePredicateFromIssueMatch(context, option);
+}
+function createIssueConfiguration(compiler, options) {
+    const context = compiler.options.context || process.cwd();
+    if (!options) {
+        options = {};
+    }
+    const include = options.include
+        ? createIssuePredicateFromOption(context, options.include)
+        : IssuePredicate_1.createTrivialIssuePredicate(true);
+    const exclude = options.exclude
+        ? createIssuePredicateFromOption(context, options.exclude)
+        : IssuePredicate_1.createTrivialIssuePredicate(false);
+    return {
+        predicate: (issue) => include(issue) && !exclude(issue),
+    };
+}
+exports.createIssueConfiguration = createIssueConfiguration;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueLocation.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueLocation.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueLocation.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,8 @@
+import { IssuePosition } from './IssuePosition';
+interface IssueLocation {
+    start: IssuePosition;
+    end: IssuePosition;
+}
+declare function compareIssueLocations(locationA?: IssueLocation, locationB?: IssueLocation): number;
+declare function formatIssueLocation(location: IssueLocation): string;
+export { IssueLocation, compareIssueLocations, formatIssueLocation };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueLocation.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueLocation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueLocation.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,21 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const IssuePosition_1 = require("./IssuePosition");
+function compareIssueLocations(locationA, locationB) {
+    if (locationA === locationB) {
+        return 0;
+    }
+    if (!locationA) {
+        return -1;
+    }
+    if (!locationB) {
+        return 1;
+    }
+    return (IssuePosition_1.compareIssuePositions(locationA.start, locationB.start) ||
+        IssuePosition_1.compareIssuePositions(locationA.end, locationB.end));
+}
+exports.compareIssueLocations = compareIssueLocations;
+function formatIssueLocation(location) {
+    return `${location.start.line}:${location.start.column}`;
+}
+exports.formatIssueLocation = formatIssueLocation;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueMatch.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueMatch.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueMatch.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+import { Issue } from './index';
+import { IssuePredicate } from './IssuePredicate';
+declare type IssueMatch = Partial<Pick<Issue, 'origin' | 'severity' | 'code' | 'file'>>;
+declare function createIssuePredicateFromIssueMatch(context: string, match: IssueMatch): IssuePredicate;
+export { IssueMatch, createIssuePredicateFromIssueMatch };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueMatch.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueMatch.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueMatch.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,20 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const minimatch_1 = __importDefault(require("minimatch"));
+const path_1 = __importDefault(require("path"));
+const forwardSlash_1 = __importDefault(require("../utils/path/forwardSlash"));
+function createIssuePredicateFromIssueMatch(context, match) {
+    return (issue) => {
+        const matchesOrigin = !match.origin || match.origin === issue.origin;
+        const matchesSeverity = !match.severity || match.severity === issue.severity;
+        const matchesCode = !match.code || match.code === issue.code;
+        const matchesFile = !issue.file ||
+            (!!issue.file &&
+                (!match.file || minimatch_1.default(forwardSlash_1.default(path_1.default.relative(context, issue.file)), match.file)));
+        return matchesOrigin && matchesSeverity && matchesCode && matchesFile;
+    };
+}
+exports.createIssuePredicateFromIssueMatch = createIssuePredicateFromIssueMatch;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueOptions.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,8 @@
+import { IssueMatch } from './IssueMatch';
+import { IssuePredicate } from './IssuePredicate';
+declare type IssuePredicateOption = IssuePredicate | IssueMatch | (IssuePredicate | IssueMatch)[];
+interface IssueOptions {
+    include?: IssuePredicateOption;
+    exclude?: IssuePredicateOption;
+}
+export { IssueOptions, IssuePredicateOption };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueOptions.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssuePosition.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssuePosition.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssuePosition.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+interface IssuePosition {
+    line: number;
+    column: number;
+}
+declare function compareIssuePositions(positionA?: IssuePosition, positionB?: IssuePosition): number;
+export { IssuePosition, compareIssuePositions };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssuePosition.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssuePosition.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssuePosition.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,15 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function compareIssuePositions(positionA, positionB) {
+    if (positionA === positionB) {
+        return 0;
+    }
+    if (!positionA) {
+        return -1;
+    }
+    if (!positionB) {
+        return 1;
+    }
+    return (Math.sign(positionA.line - positionB.line) || Math.sign(positionA.column - positionB.column));
+}
+exports.compareIssuePositions = compareIssuePositions;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssuePredicate.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssuePredicate.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssuePredicate.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+import { Issue } from './index';
+declare type IssuePredicate = (issue: Issue) => boolean;
+declare function createTrivialIssuePredicate(result: boolean): IssuePredicate;
+declare function composeIssuePredicates(predicates: IssuePredicate[]): IssuePredicate;
+export { IssuePredicate, createTrivialIssuePredicate, composeIssuePredicates };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssuePredicate.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssuePredicate.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssuePredicate.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,10 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function createTrivialIssuePredicate(result) {
+    return () => result;
+}
+exports.createTrivialIssuePredicate = createTrivialIssuePredicate;
+function composeIssuePredicates(predicates) {
+    return (issue) => predicates.some((predicate) => predicate(issue));
+}
+exports.composeIssuePredicates = composeIssuePredicates;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueSeverity.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueSeverity.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueSeverity.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+declare type IssueSeverity = 'error' | 'warning';
+declare function isIssueSeverity(value: unknown): value is IssueSeverity;
+declare function compareIssueSeverities(severityA: IssueSeverity, severityB: IssueSeverity): number;
+export { IssueSeverity, isIssueSeverity, compareIssueSeverities };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueSeverity.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueSeverity.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueSeverity.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,11 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function isIssueSeverity(value) {
+    return ['error', 'warning'].includes(value);
+}
+exports.isIssueSeverity = isIssueSeverity;
+function compareIssueSeverities(severityA, severityB) {
+    const [priorityA, priorityB] = [severityA, severityB].map((severity) => ['warning' /* 0 */, 'error' /* 1 */].indexOf(severity));
+    return Math.sign(priorityB - priorityA);
+}
+exports.compareIssueSeverities = compareIssueSeverities;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueWebpackError.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueWebpackError.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueWebpackError.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,8 @@
+import { Issue } from './Issue';
+declare class IssueWebpackError extends Error {
+    readonly issue: Issue;
+    readonly hideStack = true;
+    readonly file: string | undefined;
+    constructor(message: string, issue: Issue);
+}
+export { IssueWebpackError };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueWebpackError.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueWebpackError.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/IssueWebpackError.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,26 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const path_1 = require("path");
+const IssueLocation_1 = require("./IssueLocation");
+const forwardSlash_1 = __importDefault(require("../utils/path/forwardSlash"));
+class IssueWebpackError extends Error {
+    constructor(message, issue) {
+        super(message);
+        this.issue = issue;
+        this.hideStack = true;
+        // to display issue location using `loc` property, webpack requires `error.module` which
+        // should be a NormalModule instance.
+        // to avoid such a dependency, we do a workaround - error.file will contain formatted location instead
+        if (issue.file) {
+            this.file = forwardSlash_1.default(path_1.relative(process.cwd(), issue.file));
+            if (issue.location) {
+                this.file += `:${IssueLocation_1.formatIssueLocation(issue.location)}`;
+            }
+        }
+        Error.captureStackTrace(this, this.constructor);
+    }
+}
+exports.IssueWebpackError = IssueWebpackError;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/index.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+export * from './Issue';
+export * from './IssueSeverity';
+export * from './IssueLocation';
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/issue/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,8 @@
+"use strict";
+function __export(m) {
+    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
+}
+Object.defineProperty(exports, "__esModule", { value: true });
+__export(require("./Issue"));
+__export(require("./IssueSeverity"));
+__export(require("./IssueLocation"));
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/Logger.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/Logger.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/Logger.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+interface Logger {
+    info: (message: string) => void;
+    log: (message: string) => void;
+    error: (message: string) => void;
+}
+export default Logger;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/Logger.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/Logger.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/Logger.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerConfiguration.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerConfiguration.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerConfiguration.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,10 @@
+import LoggerOptions from './LoggerOptions';
+import Logger from './Logger';
+import webpack from 'webpack';
+interface LoggerConfiguration {
+    infrastructure: Logger;
+    issues: Logger;
+    devServer: boolean;
+}
+declare function createLoggerConfiguration(compiler: webpack.Compiler, options: LoggerOptions | undefined): LoggerConfiguration;
+export { LoggerConfiguration, createLoggerConfiguration };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerConfiguration.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerConfiguration.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerConfiguration.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,11 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const LoggerFactory_1 = require("./LoggerFactory");
+function createLoggerConfiguration(compiler, options) {
+    return {
+        infrastructure: LoggerFactory_1.createLogger((options && options.infrastructure) || 'silent', compiler),
+        issues: LoggerFactory_1.createLogger((options && options.issues) || 'console', compiler),
+        devServer: (options === null || options === void 0 ? void 0 : options.devServer) !== false,
+    };
+}
+exports.createLoggerConfiguration = createLoggerConfiguration;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerFactory.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerFactory.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerFactory.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+import webpack from 'webpack';
+import Logger from './Logger';
+declare type LoggerType = 'console' | 'webpack-infrastructure' | 'silent';
+declare function createLogger(type: LoggerType | Logger, compiler: webpack.Compiler): Logger;
+export { createLogger, LoggerType };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerFactory.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerFactory.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerFactory.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,20 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const WebpackInfrastructureLogger_1 = require("./WebpackInfrastructureLogger");
+const PartialLogger_1 = require("./PartialLogger");
+function createLogger(type, compiler) {
+    if (typeof type !== 'string') {
+        return type;
+    }
+    switch (type) {
+        case 'webpack-infrastructure':
+            return (WebpackInfrastructureLogger_1.createWebpackInfrastructureLogger(compiler) ||
+                PartialLogger_1.createPartialLogger(['log', 'error'], console));
+        case 'silent':
+            return PartialLogger_1.createPartialLogger([], console);
+        case 'console':
+        default:
+            return console;
+    }
+}
+exports.createLogger = createLogger;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerOptions.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,8 @@
+import { LoggerType } from './LoggerFactory';
+import Logger from './Logger';
+declare type LoggerOptions = {
+    infrastructure?: LoggerType | Logger;
+    issues?: LoggerType | Logger;
+    devServer?: boolean;
+};
+export default LoggerOptions;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerOptions.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/LoggerOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/PartialLogger.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/PartialLogger.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/PartialLogger.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+import Logger from './Logger';
+declare type LoggerMethods = 'info' | 'log' | 'error';
+declare function createPartialLogger(methods: LoggerMethods[], logger: Logger): Logger;
+export { createPartialLogger };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/PartialLogger.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/PartialLogger.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/PartialLogger.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,10 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function createPartialLogger(methods, logger) {
+    return {
+        info: (message) => (methods.includes('info') ? logger.info(message) : undefined),
+        log: (message) => (methods.includes('log') ? logger.log(message) : undefined),
+        error: (message) => (methods.includes('error') ? logger.error(message) : undefined),
+    };
+}
+exports.createPartialLogger = createPartialLogger;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/WebpackInfrastructureLogger.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/WebpackInfrastructureLogger.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/WebpackInfrastructureLogger.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+import webpack from 'webpack';
+import Logger from './Logger';
+declare function createWebpackInfrastructureLogger(compiler: webpack.Compiler): Logger | undefined;
+export { createWebpackInfrastructureLogger };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/WebpackInfrastructureLogger.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/WebpackInfrastructureLogger.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/logger/WebpackInfrastructureLogger.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,12 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function isInfrastructureLoggerProvider(candidate) {
+    // eslint-disable-next-line @typescript-eslint/no-explicit-any
+    return !!candidate.getInfrastructureLogger;
+}
+function createWebpackInfrastructureLogger(compiler) {
+    return isInfrastructureLoggerProvider(compiler)
+        ? compiler.getInfrastructureLogger('ForkTsCheckerWebpackPlugin')
+        : undefined;
+}
+exports.createWebpackInfrastructureLogger = createWebpackInfrastructureLogger;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/profile/Performance.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/profile/Performance.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/profile/Performance.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,11 @@
+interface Performance {
+    enable(): void;
+    disable(): void;
+    mark(name: string): void;
+    markStart(name: string): void;
+    markEnd(name: string): void;
+    measure(name: string, startMark?: string, endMark?: string): void;
+    print(): void;
+}
+declare function createPerformance(): Performance;
+export { Performance, createPerformance };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/profile/Performance.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/profile/Performance.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/profile/Performance.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,62 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const perf_hooks_1 = require("perf_hooks");
+function createPerformance() {
+    let enabled = false;
+    let timeOrigin;
+    let marks;
+    let measurements;
+    function enable() {
+        enabled = true;
+        marks = new Map();
+        measurements = new Map();
+        timeOrigin = perf_hooks_1.performance.now();
+    }
+    function disable() {
+        enabled = false;
+    }
+    function mark(name) {
+        if (enabled) {
+            marks.set(name, perf_hooks_1.performance.now());
+        }
+    }
+    function measure(name, startMark, endMark) {
+        if (enabled) {
+            const start = (startMark && marks.get(startMark)) || timeOrigin;
+            const end = (endMark && marks.get(endMark)) || perf_hooks_1.performance.now();
+            measurements.set(name, (measurements.get(name) || 0) + (end - start));
+        }
+    }
+    function markStart(name) {
+        if (enabled) {
+            mark(`${name} start`);
+        }
+    }
+    function markEnd(name) {
+        if (enabled) {
+            mark(`${name} end`);
+            measure(name, `${name} start`, `${name} end`);
+        }
+    }
+    function formatName(name, width = 0) {
+        return `${name}:`.padEnd(width);
+    }
+    function formatDuration(duration, width = 0) {
+        return `${(duration / 1000).toFixed(2)} s`.padStart(width);
+    }
+    function print() {
+        if (enabled) {
+            let nameWidth = 0;
+            let durationWidth = 0;
+            measurements.forEach((duration, name) => {
+                nameWidth = Math.max(nameWidth, formatName(name).length);
+                durationWidth = Math.max(durationWidth, formatDuration(duration).length);
+            });
+            measurements.forEach((duration, name) => {
+                console.log(`${formatName(name, nameWidth)} ${formatDuration(duration, durationWidth)}`);
+            });
+        }
+    }
+    return { enable, disable, mark, markStart, markEnd, measure, print };
+}
+exports.createPerformance = createPerformance;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/AggregatedReporter.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/AggregatedReporter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/AggregatedReporter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+import { Reporter } from './Reporter';
+/**
+ * This higher order reporter aggregates too frequent getReport requests to avoid unnecessary computation.
+ */
+declare function createAggregatedReporter<TReporter extends Reporter>(reporter: TReporter): TReporter;
+export { createAggregatedReporter };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/AggregatedReporter.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/AggregatedReporter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/AggregatedReporter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,60 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const OperationCanceledError_1 = require("../error/OperationCanceledError");
+const FilesChange_1 = require("./FilesChange");
+/**
+ * This higher order reporter aggregates too frequent getReport requests to avoid unnecessary computation.
+ */
+function createAggregatedReporter(reporter) {
+    let pendingPromise;
+    let queuedIndex = 0;
+    let queuedChanges = [];
+    const aggregatedReporter = Object.assign(Object.assign({}, reporter), { getReport: (change) => __awaiter(this, void 0, void 0, function* () {
+            if (!pendingPromise) {
+                let resolvePending;
+                pendingPromise = new Promise((resolve) => {
+                    resolvePending = () => {
+                        resolve();
+                        pendingPromise = undefined;
+                    };
+                });
+                return reporter
+                    .getReport(change)
+                    .then((report) => (Object.assign(Object.assign({}, report), { close() {
+                        return __awaiter(this, void 0, void 0, function* () {
+                            yield report.close();
+                            resolvePending();
+                        });
+                    } })))
+                    .catch((error) => {
+                    resolvePending();
+                    throw error;
+                });
+            }
+            else {
+                const currentIndex = ++queuedIndex;
+                queuedChanges.push(change);
+                return pendingPromise.then(() => {
+                    if (queuedIndex === currentIndex) {
+                        const change = FilesChange_1.aggregateFilesChanges(queuedChanges);
+                        queuedChanges = [];
+                        return aggregatedReporter.getReport(change);
+                    }
+                    else {
+                        throw new OperationCanceledError_1.OperationCanceledError('getReport canceled - new report requested.');
+                    }
+                });
+            }
+        }) });
+    return aggregatedReporter;
+}
+exports.createAggregatedReporter = createAggregatedReporter;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/FilesChange.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/FilesChange.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/FilesChange.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,16 @@
+import { Compiler } from 'webpack';
+interface FilesChange {
+    changedFiles?: string[];
+    deletedFiles?: string[];
+}
+declare function getFilesChange(compiler: Compiler): FilesChange;
+declare function updateFilesChange(compiler: Compiler, change: FilesChange): void;
+declare function clearFilesChange(compiler: Compiler): void;
+/**
+ * Computes aggregated files change based on the subsequent files changes.
+ *
+ * @param changes List of subsequent files changes
+ * @returns Files change that represents all subsequent changes as a one event
+ */
+declare function aggregateFilesChanges(changes: FilesChange[]): FilesChange;
+export { FilesChange, getFilesChange, updateFilesChange, clearFilesChange, aggregateFilesChanges };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/FilesChange.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/FilesChange.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/FilesChange.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,49 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const substract_1 = __importDefault(require("../utils/array/substract"));
+const unique_1 = __importDefault(require("../utils/array/unique"));
+// we ignore package.json file because of https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/issues/674
+const IGNORED_FILES = ['package.json'];
+const isIgnoredFile = (file) => IGNORED_FILES.some((ignoredFile) => file.endsWith(`/${ignoredFile}`) || file.endsWith(`\\${ignoredFile}`));
+const compilerFilesChangeMap = new WeakMap();
+function getFilesChange(compiler) {
+    const { changedFiles = [], deletedFiles = [] } = compilerFilesChangeMap.get(compiler) || {
+        changedFiles: [],
+        deletedFiles: [],
+    };
+    return {
+        changedFiles: changedFiles.filter((changedFile) => !isIgnoredFile(changedFile)),
+        deletedFiles: deletedFiles.filter((deletedFile) => !isIgnoredFile(deletedFile)),
+    };
+}
+exports.getFilesChange = getFilesChange;
+function updateFilesChange(compiler, change) {
+    compilerFilesChangeMap.set(compiler, aggregateFilesChanges([getFilesChange(compiler), change]));
+}
+exports.updateFilesChange = updateFilesChange;
+function clearFilesChange(compiler) {
+    compilerFilesChangeMap.delete(compiler);
+}
+exports.clearFilesChange = clearFilesChange;
+/**
+ * Computes aggregated files change based on the subsequent files changes.
+ *
+ * @param changes List of subsequent files changes
+ * @returns Files change that represents all subsequent changes as a one event
+ */
+function aggregateFilesChanges(changes) {
+    let changedFiles = [];
+    let deletedFiles = [];
+    for (const change of changes) {
+        changedFiles = unique_1.default(substract_1.default(changedFiles, change.deletedFiles).concat(change.changedFiles || []));
+        deletedFiles = unique_1.default(substract_1.default(deletedFiles, change.changedFiles).concat(change.deletedFiles || []));
+    }
+    return {
+        changedFiles,
+        deletedFiles,
+    };
+}
+exports.aggregateFilesChanges = aggregateFilesChanges;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/FilesMatch.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/FilesMatch.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/FilesMatch.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+interface FilesMatch {
+    files: string[];
+    dirs: string[];
+    excluded: string[];
+    extensions: string[];
+}
+export { FilesMatch };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/FilesMatch.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/FilesMatch.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/FilesMatch.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/Report.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/Report.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/Report.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,8 @@
+import { FilesMatch } from './FilesMatch';
+import { Issue } from '../issue';
+interface Report {
+    getDependencies(): Promise<FilesMatch>;
+    getIssues(): Promise<Issue[]>;
+    close(): Promise<void>;
+}
+export { Report };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/Report.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/Report.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/Report.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/Reporter.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/Reporter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/Reporter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+import { FilesChange } from './FilesChange';
+import { Report } from './Report';
+interface Reporter {
+    getReport(change: FilesChange): Promise<Report>;
+}
+export { Reporter };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/Reporter.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/Reporter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/Reporter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/index.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+export * from './Report';
+export * from './Reporter';
+export * from './AggregatedReporter';
+export * from './FilesChange';
+export * from './FilesMatch';
+export * from './reporter-rpc/ReporterRpcClient';
+export * from './reporter-rpc/ReporterRpcService';
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+"use strict";
+function __export(m) {
+    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
+}
+Object.defineProperty(exports, "__esModule", { value: true });
+__export(require("./AggregatedReporter"));
+__export(require("./FilesChange"));
+__export(require("./reporter-rpc/ReporterRpcClient"));
+__export(require("./reporter-rpc/ReporterRpcService"));
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcClient.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcClient.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcClient.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,10 @@
+import { Reporter } from '../Reporter';
+import { RpcMessageChannel } from '../../rpc';
+interface ReporterRpcClient extends Reporter {
+    isConnected: () => boolean;
+    connect: () => Promise<void>;
+    disconnect: () => Promise<void>;
+}
+declare function createReporterRpcClient<TConfiguration extends object>(channel: RpcMessageChannel, configuration: TConfiguration): ReporterRpcClient;
+declare function composeReporterRpcClients(clients: ReporterRpcClient[]): ReporterRpcClient;
+export { ReporterRpcClient, createReporterRpcClient, composeReporterRpcClients };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcClient.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcClient.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcClient.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,82 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const rpc_1 = require("../../rpc");
+const ReporterRpcProcedure_1 = require("./ReporterRpcProcedure");
+const flatten_1 = __importDefault(require("../../utils/array/flatten"));
+function createReporterRpcClient(channel, configuration) {
+    const rpcClient = rpc_1.createRpcClient(channel.clientPort);
+    return {
+        isConnected: () => channel.isOpen() && rpcClient.isConnected(),
+        connect: () => __awaiter(this, void 0, void 0, function* () {
+            if (!channel.isOpen()) {
+                yield channel.open();
+            }
+            if (!rpcClient.isConnected()) {
+                try {
+                    yield rpcClient.connect();
+                    yield rpcClient.dispatchCall(ReporterRpcProcedure_1.configure, configuration);
+                }
+                catch (error) {
+                    // connect or configure was not successful -
+                    // close the reporter and re-throw an error
+                    yield rpcClient.disconnect();
+                    yield channel.close();
+                    throw error;
+                }
+            }
+        }),
+        disconnect: () => __awaiter(this, void 0, void 0, function* () {
+            if (rpcClient.isConnected()) {
+                yield rpcClient.disconnect();
+            }
+            if (channel.isOpen()) {
+                yield channel.close();
+            }
+        }),
+        getReport: (change) => __awaiter(this, void 0, void 0, function* () {
+            const reportId = yield rpcClient.dispatchCall(ReporterRpcProcedure_1.getReport, change);
+            return {
+                getDependencies() {
+                    return rpcClient.dispatchCall(ReporterRpcProcedure_1.getDependencies, reportId);
+                },
+                getIssues() {
+                    return rpcClient.dispatchCall(ReporterRpcProcedure_1.getIssues, reportId);
+                },
+                close() {
+                    return rpcClient.dispatchCall(ReporterRpcProcedure_1.closeReport, reportId);
+                },
+            };
+        }),
+    };
+}
+exports.createReporterRpcClient = createReporterRpcClient;
+function composeReporterRpcClients(clients) {
+    return {
+        isConnected: () => clients.every((client) => client.isConnected()),
+        connect: () => Promise.all(clients.map((client) => client.connect())).then(() => undefined),
+        disconnect: () => Promise.all(clients.map((client) => client.disconnect())).then(() => undefined),
+        getReport: (change) => Promise.all(clients.map((client) => client.getReport(change))).then((reports) => ({
+            getDependencies: () => Promise.all(reports.map((report) => report.getDependencies())).then((dependencies) => dependencies.reduce((mergedDependencies, singleDependencies) => ({
+                files: Array.from(new Set([...mergedDependencies.files, ...singleDependencies.files])),
+                dirs: Array.from(new Set([...mergedDependencies.dirs, ...singleDependencies.dirs])),
+                excluded: Array.from(new Set([...mergedDependencies.excluded, ...singleDependencies.excluded])),
+                extensions: Array.from(new Set([...mergedDependencies.extensions, ...singleDependencies.extensions])),
+            }), { files: [], dirs: [], excluded: [], extensions: [] })),
+            getIssues: () => Promise.all(reports.map((report) => report.getIssues())).then((issues) => flatten_1.default(issues)),
+            close: () => Promise.all(reports.map((report) => report.close())).then(() => undefined),
+        })),
+    };
+}
+exports.composeReporterRpcClients = composeReporterRpcClients;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcProcedure.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcProcedure.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcProcedure.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,10 @@
+import { RpcProcedure } from '../../rpc';
+import { FilesChange } from '../FilesChange';
+import { Issue } from '../../issue';
+import { FilesMatch } from '../FilesMatch';
+declare const configure: RpcProcedure<object, void>;
+declare const getReport: RpcProcedure<FilesChange, void>;
+declare const getDependencies: RpcProcedure<void, FilesMatch>;
+declare const getIssues: RpcProcedure<void, Issue[]>;
+declare const closeReport: RpcProcedure<void, void>;
+export { configure, getReport, getDependencies, getIssues, closeReport };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcProcedure.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcProcedure.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcProcedure.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,12 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const configure = 'configure';
+exports.configure = configure;
+const getReport = 'getReport';
+exports.getReport = getReport;
+const getDependencies = 'getDependencies';
+exports.getDependencies = getDependencies;
+const getIssues = 'getIssues';
+exports.getIssues = getIssues;
+const closeReport = 'closeReport';
+exports.closeReport = closeReport;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcService.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcService.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcService.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+import { Reporter } from '../Reporter';
+import { RpcMessagePort } from '../../rpc';
+interface ReporterRpcService {
+    isOpen: () => boolean;
+    open: () => Promise<void>;
+    close: () => Promise<void>;
+}
+declare function registerReporterRpcService<TConfiguration extends object>(servicePort: RpcMessagePort, reporterFactory: (configuration: TConfiguration) => Reporter): ReporterRpcService;
+export { ReporterRpcService, registerReporterRpcService };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcService.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcService.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/reporter/reporter-rpc/ReporterRpcService.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,74 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const rpc_1 = require("../../rpc");
+const ReporterRpcProcedure_1 = require("./ReporterRpcProcedure");
+function registerReporterRpcService(servicePort, reporterFactory) {
+    const rpcService = rpc_1.createRpcService(servicePort);
+    let reporterRegistered = false;
+    let report = undefined;
+    const registerReporter = () => {
+        rpcService.addCallHandler(ReporterRpcProcedure_1.configure, (configuration) => __awaiter(this, void 0, void 0, function* () {
+            rpcService.removeCallHandler(ReporterRpcProcedure_1.configure);
+            const reporter = reporterFactory(configuration);
+            rpcService.addCallHandler(ReporterRpcProcedure_1.getReport, (change) => __awaiter(this, void 0, void 0, function* () {
+                if (report) {
+                    throw new Error(`Close previous report before opening the next one.`);
+                }
+                report = yield reporter.getReport(change);
+            }));
+            rpcService.addCallHandler(ReporterRpcProcedure_1.getDependencies, () => {
+                if (!report) {
+                    throw new Error(`Cannot find active report.`);
+                }
+                return report.getDependencies();
+            });
+            rpcService.addCallHandler(ReporterRpcProcedure_1.getIssues, () => {
+                if (!report) {
+                    throw new Error(`Cannot find active report.`);
+                }
+                return report.getIssues();
+            });
+            rpcService.addCallHandler(ReporterRpcProcedure_1.closeReport, () => __awaiter(this, void 0, void 0, function* () {
+                report = undefined;
+            }));
+        }));
+    };
+    const unregisterReporter = () => {
+        rpcService.removeCallHandler(ReporterRpcProcedure_1.configure);
+        rpcService.removeCallHandler(ReporterRpcProcedure_1.getReport);
+        rpcService.removeCallHandler(ReporterRpcProcedure_1.getDependencies);
+        rpcService.removeCallHandler(ReporterRpcProcedure_1.getIssues);
+        rpcService.removeCallHandler(ReporterRpcProcedure_1.closeReport);
+    };
+    return {
+        isOpen: () => rpcService.isOpen() && reporterRegistered,
+        open: () => __awaiter(this, void 0, void 0, function* () {
+            if (!rpcService.isOpen()) {
+                yield rpcService.open();
+            }
+            if (!reporterRegistered) {
+                registerReporter();
+                reporterRegistered = true;
+            }
+        }),
+        close: () => __awaiter(this, void 0, void 0, function* () {
+            if (reporterRegistered) {
+                unregisterReporter();
+                reporterRegistered = false;
+            }
+            if (rpcService.isOpen()) {
+                yield rpcService.close();
+            }
+        }),
+    };
+}
+exports.registerReporterRpcService = registerReporterRpcService;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcClient.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcClient.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcClient.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,10 @@
+import { RpcProcedure, RpcProcedurePayload, RpcProcedureResult } from './RpcProcedure';
+import { RpcMessagePort } from './RpcMessagePort';
+interface RpcClient {
+    readonly isConnected: () => boolean;
+    readonly connect: () => Promise<void>;
+    readonly disconnect: () => Promise<void>;
+    readonly dispatchCall: <TProcedure extends RpcProcedure>(procedure: TProcedure, payload: RpcProcedurePayload<TProcedure>) => Promise<RpcProcedureResult<TProcedure>>;
+}
+declare function createRpcClient(port: RpcMessagePort): RpcClient;
+export { RpcClient, createRpcClient };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcClient.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcClient.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcClient.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,78 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const RpcMessage_1 = require("./RpcMessage");
+const RpcRemoteError_1 = require("./error/RpcRemoteError");
+/* eslint-enable @typescript-eslint/no-explicit-any */
+function createRpcClient(port) {
+    let callIndex = 0;
+    const callbacks = new Map();
+    let isListenerRegistered = false;
+    const returnOrThrowListener = (message) => __awaiter(this, void 0, void 0, function* () {
+        if (RpcMessage_1.isRpcReturnMessage(message)) {
+            const key = RpcMessage_1.getRpcMessageKey(message);
+            const callback = callbacks.get(key);
+            if (callback) {
+                callback.return(message.payload);
+                callbacks.delete(key);
+            }
+        }
+        if (RpcMessage_1.isRpcThrowMessage(message)) {
+            const key = RpcMessage_1.getRpcMessageKey(message);
+            const callback = callbacks.get(key);
+            if (callback) {
+                callback.throw(new RpcRemoteError_1.RpcRemoteError(message.payload.message, message.payload.stack));
+                callbacks.delete(key);
+            }
+        }
+    });
+    const errorListener = (error) => __awaiter(this, void 0, void 0, function* () {
+        callbacks.forEach((callback, key) => {
+            callback.throw(error);
+            callbacks.delete(key);
+        });
+    });
+    return {
+        isConnected: () => port.isOpen() && isListenerRegistered,
+        connect: () => __awaiter(this, void 0, void 0, function* () {
+            if (!port.isOpen()) {
+                yield port.open();
+            }
+            if (!isListenerRegistered) {
+                port.addMessageListener(returnOrThrowListener);
+                port.addErrorListener(errorListener);
+                isListenerRegistered = true;
+            }
+        }),
+        disconnect: () => __awaiter(this, void 0, void 0, function* () {
+            if (isListenerRegistered) {
+                port.removeMessageListener(returnOrThrowListener);
+                port.removeErrorListener(errorListener);
+                isListenerRegistered = false;
+            }
+            if (port.isOpen()) {
+                yield port.close();
+            }
+        }),
+        dispatchCall: (procedure, payload) => __awaiter(this, void 0, void 0, function* () {
+            return new Promise((resolve, reject) => {
+                const call = RpcMessage_1.createRpcCall(procedure, callIndex++, payload);
+                const key = RpcMessage_1.getRpcMessageKey(call);
+                callbacks.set(key, { return: resolve, throw: reject });
+                port.dispatchMessage(call).catch((error) => {
+                    callbacks.delete(key);
+                    reject(error);
+                });
+            });
+        }),
+    };
+}
+exports.createRpcClient = createRpcClient;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcHost.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcHost.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcHost.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+declare type RpcDispatcher = <TMessage>(message: TMessage) => Promise<void>;
+interface RpcHost {
+    dispatch: RpcDispatcher;
+    register: (dispatch: RpcDispatcher) => void;
+}
+export { RpcHost, RpcDispatcher };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcHost.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcHost.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcHost.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessage.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessage.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessage.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,26 @@
+import { RpcProcedure, RpcProcedurePayload, RpcProcedureResult } from './RpcProcedure';
+interface RpcMessage<TType extends string = string, TProcedure extends RpcProcedure = RpcProcedure, TPayload = unknown> {
+    rpc: true;
+    type: TType;
+    procedure: TProcedure;
+    id: number;
+    payload: TPayload;
+    source?: string;
+}
+interface RpcRemoteError {
+    message: string;
+    stack?: string;
+}
+declare type RpcCall<TProcedure extends RpcProcedure> = RpcMessage<'call', TProcedure, RpcProcedurePayload<TProcedure>>;
+declare type RpcReturn<TProcedure extends RpcProcedure> = RpcMessage<'return', TProcedure, RpcProcedureResult<TProcedure>>;
+declare type RpcThrow<TProcedure extends RpcProcedure> = RpcMessage<'throw', TProcedure, RpcRemoteError>;
+declare function createRpcMessage<TType extends string = string, TProcedure extends RpcProcedure = RpcProcedure, TPayload = unknown>(procedure: TProcedure, id: number, type: TType, payload: TPayload, source?: string): RpcMessage<TType, TProcedure, TPayload>;
+declare function createRpcCall<TProcedure extends RpcProcedure>(procedure: TProcedure, index: number, payload: RpcProcedurePayload<TProcedure>): RpcCall<TProcedure>;
+declare function createRpcReturn<TProcedure extends RpcProcedure>(procedure: TProcedure, index: number, payload: RpcProcedureResult<TProcedure>): RpcReturn<TProcedure>;
+declare function createRpcThrow<TProcedure extends RpcProcedure, TError = Error>(procedure: TProcedure, index: number, payload: RpcRemoteError): RpcThrow<TProcedure>;
+declare function isRpcMessage<TType extends string = string, TProcedure extends RpcProcedure = RpcProcedure>(candidate: unknown): candidate is RpcMessage<TType, TProcedure>;
+declare function isRpcCallMessage<TType extends string = string, TProcedure extends RpcProcedure = RpcProcedure>(candidate: unknown): candidate is RpcCall<TProcedure>;
+declare function isRpcReturnMessage<TType extends string = string, TProcedure extends RpcProcedure = RpcProcedure>(candidate: unknown): candidate is RpcReturn<TProcedure>;
+declare function isRpcThrowMessage<TType extends string = string, TProcedure extends RpcProcedure = RpcProcedure>(candidate: unknown): candidate is RpcThrow<TProcedure>;
+declare function getRpcMessageKey(message: RpcMessage): string;
+export { RpcMessage, RpcCall, RpcReturn, RpcThrow, createRpcMessage, createRpcCall, createRpcReturn, createRpcThrow, isRpcMessage, isRpcCallMessage, isRpcReturnMessage, isRpcThrowMessage, getRpcMessageKey, };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessage.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessage.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessage.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,45 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function createRpcMessage(procedure, id, type, payload, source) {
+    return {
+        rpc: true,
+        type,
+        id,
+        procedure,
+        payload,
+        source,
+    };
+}
+exports.createRpcMessage = createRpcMessage;
+function createRpcCall(procedure, index, payload) {
+    return createRpcMessage(procedure, index, 'call', payload);
+}
+exports.createRpcCall = createRpcCall;
+function createRpcReturn(procedure, index, payload) {
+    return createRpcMessage(procedure, index, 'return', payload);
+}
+exports.createRpcReturn = createRpcReturn;
+function createRpcThrow(procedure, index, payload) {
+    return createRpcMessage(procedure, index, 'throw', payload);
+}
+exports.createRpcThrow = createRpcThrow;
+function isRpcMessage(candidate) {
+    return !!(typeof candidate === 'object' && candidate && candidate.rpc);
+}
+exports.isRpcMessage = isRpcMessage;
+function isRpcCallMessage(candidate) {
+    return isRpcMessage(candidate) && candidate.type === 'call';
+}
+exports.isRpcCallMessage = isRpcCallMessage;
+function isRpcReturnMessage(candidate) {
+    return isRpcMessage(candidate) && candidate.type === 'return';
+}
+exports.isRpcReturnMessage = isRpcReturnMessage;
+function isRpcThrowMessage(candidate) {
+    return isRpcMessage(candidate) && candidate.type === 'throw';
+}
+exports.isRpcThrowMessage = isRpcThrowMessage;
+function getRpcMessageKey(message) {
+    return `${message.procedure}_${message.id}`;
+}
+exports.getRpcMessageKey = getRpcMessageKey;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessageChannel.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessageChannel.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessageChannel.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,10 @@
+import { RpcMessagePort } from './RpcMessagePort';
+interface RpcMessageChannel {
+    readonly servicePort: RpcMessagePort;
+    readonly clientPort: RpcMessagePort;
+    readonly isOpen: () => boolean;
+    readonly open: () => Promise<void>;
+    readonly close: () => Promise<void>;
+}
+declare function createRpcMessageChannel(servicePort: RpcMessagePort, clientPort: RpcMessagePort, linkPorts?: () => Promise<void>, unlinkPorts?: () => Promise<void>): RpcMessageChannel;
+export { RpcMessageChannel, createRpcMessageChannel };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessageChannel.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessageChannel.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessageChannel.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,49 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+function createRpcMessageChannel(servicePort, clientPort, linkPorts, unlinkPorts) {
+    // if there is not link and unlink function provided, we assume that channel is automatically linked
+    let arePortsLinked = !linkPorts && !unlinkPorts;
+    return {
+        servicePort,
+        clientPort,
+        isOpen: () => servicePort.isOpen() && clientPort.isOpen() && arePortsLinked,
+        open: () => __awaiter(this, void 0, void 0, function* () {
+            if (!servicePort.isOpen()) {
+                yield servicePort.open();
+            }
+            if (!clientPort.isOpen()) {
+                yield clientPort.open();
+            }
+            if (!arePortsLinked) {
+                if (linkPorts) {
+                    yield linkPorts();
+                }
+                arePortsLinked = true;
+            }
+        }),
+        close: () => __awaiter(this, void 0, void 0, function* () {
+            if (arePortsLinked) {
+                if (unlinkPorts) {
+                    yield unlinkPorts();
+                }
+                arePortsLinked = false;
+            }
+            if (servicePort.isOpen()) {
+                yield servicePort.close();
+            }
+            if (clientPort.isOpen()) {
+                yield clientPort.close();
+            }
+        }),
+    };
+}
+exports.createRpcMessageChannel = createRpcMessageChannel;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessagePort.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessagePort.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessagePort.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,14 @@
+declare type RpcMessageDispatch = <TMessage>(message: TMessage) => Promise<void>;
+declare type RpcMessageListener = RpcMessageDispatch;
+declare type RpcErrorListener = (error: Error) => void;
+interface RpcMessagePort {
+    readonly dispatchMessage: RpcMessageDispatch;
+    readonly addMessageListener: (listener: RpcMessageListener) => void;
+    readonly removeMessageListener: (listener: RpcMessageListener) => void;
+    readonly addErrorListener: (listener: RpcErrorListener) => void;
+    readonly removeErrorListener: (listener: RpcErrorListener) => void;
+    readonly isOpen: () => boolean;
+    readonly open: () => Promise<void>;
+    readonly close: () => Promise<void>;
+}
+export { RpcMessagePort, RpcMessageDispatch, RpcMessageListener, RpcErrorListener };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessagePort.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessagePort.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcMessagePort.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcProcedure.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcProcedure.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcProcedure.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+interface RpcProcedure<TPayload = unknown, TResult = unknown> extends String {
+}
+declare type RpcProcedurePayload<TProcedure> = TProcedure extends RpcProcedure<infer TPayload, infer TResult> ? TPayload : never;
+declare type RpcProcedureResult<TProcedure> = TProcedure extends RpcProcedure<infer TPayload, infer TResult> ? TResult : never;
+export { RpcProcedure, RpcProcedurePayload, RpcProcedureResult };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcProcedure.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcProcedure.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcProcedure.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcService.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcService.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcService.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,12 @@
+import { RpcProcedure } from './RpcProcedure';
+import { RpcMessagePort } from './RpcMessagePort';
+declare type RpcCallHandler<TPayload = any, TResult = any> = (payload: TPayload) => Promise<TResult>;
+interface RpcService {
+    readonly isOpen: () => boolean;
+    readonly open: () => Promise<void>;
+    readonly close: () => Promise<void>;
+    readonly addCallHandler: <TPayload, TResult>(procedure: RpcProcedure<TPayload, TResult>, handler: RpcCallHandler<TPayload, TResult>) => void;
+    readonly removeCallHandler: <TPayload, TResult>(procedure: RpcProcedure<TPayload, TResult>) => void;
+}
+declare function createRpcService(port: RpcMessagePort): RpcService;
+export { RpcService, createRpcService };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcService.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcService.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/RpcService.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,63 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const RpcMessage_1 = require("./RpcMessage");
+function createRpcService(port) {
+    const handlers = new Map();
+    let isListenerRegistered = false;
+    const callListener = (message) => __awaiter(this, void 0, void 0, function* () {
+        if (RpcMessage_1.isRpcCallMessage(message)) {
+            const handler = handlers.get(message.procedure);
+            try {
+                if (!handler) {
+                    throw new Error(`No handler found for procedure ${message.procedure}.`);
+                }
+                const result = yield handler(message.payload);
+                yield port.dispatchMessage(RpcMessage_1.createRpcReturn(message.procedure, message.id, result));
+            }
+            catch (error) {
+                yield port.dispatchMessage(RpcMessage_1.createRpcThrow(message.procedure, message.id, {
+                    message: error.toString(),
+                    stack: error.stack,
+                }));
+            }
+        }
+    });
+    return {
+        isOpen: () => port.isOpen() && isListenerRegistered,
+        open: () => __awaiter(this, void 0, void 0, function* () {
+            if (!port.isOpen()) {
+                yield port.open();
+            }
+            if (!isListenerRegistered) {
+                port.addMessageListener(callListener);
+                isListenerRegistered = true;
+            }
+        }),
+        close: () => __awaiter(this, void 0, void 0, function* () {
+            if (isListenerRegistered) {
+                port.removeMessageListener(callListener);
+                isListenerRegistered = false;
+            }
+            if (port.isOpen()) {
+                yield port.close();
+            }
+        }),
+        addCallHandler: (procedure, handler) => {
+            if (handlers.has(procedure)) {
+                throw new Error(`Handler for '${procedure}' procedure has been already registered`);
+            }
+            handlers.set(procedure, handler);
+        },
+        removeCallHandler: (procedure) => handlers.delete(procedure),
+    };
+}
+exports.createRpcService = createRpcService;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/error/RpcMessagePortClosedError.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/error/RpcMessagePortClosedError.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/error/RpcMessagePortClosedError.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+declare class RpcMessagePortClosedError extends Error {
+}
+export { RpcMessagePortClosedError };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/error/RpcMessagePortClosedError.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/error/RpcMessagePortClosedError.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/error/RpcMessagePortClosedError.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+class RpcMessagePortClosedError extends Error {
+}
+exports.RpcMessagePortClosedError = RpcMessagePortClosedError;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/error/RpcRemoteError.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/error/RpcRemoteError.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/error/RpcRemoteError.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+declare class RpcRemoteError extends Error {
+    readonly stack?: string | undefined;
+    constructor(message: string, stack?: string | undefined);
+    toString(): string;
+}
+export { RpcRemoteError };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/error/RpcRemoteError.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/error/RpcRemoteError.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/error/RpcRemoteError.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,17 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+class RpcRemoteError extends Error {
+    constructor(message, stack) {
+        super(message);
+        this.stack = stack;
+    }
+    toString() {
+        if (this.stack) {
+            return [this.message, this.stack].join('\n');
+        }
+        else {
+            return this.message;
+        }
+    }
+}
+exports.RpcRemoteError = RpcRemoteError;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/index.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+export * from './RpcMessage';
+export * from './RpcProcedure';
+export * from './RpcClient';
+export * from './RpcHost';
+export * from './RpcService';
+export * from './RpcMessagePort';
+export * from './RpcMessageChannel';
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+"use strict";
+function __export(m) {
+    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
+}
+Object.defineProperty(exports, "__esModule", { value: true });
+__export(require("./RpcMessage"));
+__export(require("./RpcClient"));
+__export(require("./RpcService"));
+__export(require("./RpcMessageChannel"));
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/ProcessLike.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/ProcessLike.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/ProcessLike.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,12 @@
+/**
+ * This interface describes Node.js process that is potentially able to communicate over IPC channel
+ */
+interface ProcessLike {
+    pid?: string | number;
+    send?: (message: any, sendHandle?: any, options?: any, callback?: (error: any) => void) => boolean;
+    on: (event: any, listener: any) => any;
+    off: (event: any, listener?: any) => any;
+    connected?: boolean;
+    disconnect?: () => void;
+}
+export { ProcessLike };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/ProcessLike.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/ProcessLike.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/ProcessLike.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+"use strict";
+/* eslint-disable @typescript-eslint/no-explicit-any */
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessageChannel.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessageChannel.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessageChannel.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+import { RpcMessageChannel } from '../index';
+declare function createRpcIpcMessageChannel(servicePath: string, memoryLimit?: number): RpcMessageChannel;
+export { createRpcIpcMessageChannel };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessageChannel.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessageChannel.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessageChannel.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,10 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const index_1 = require("../index");
+const RpcIpcMessagePort_1 = require("./RpcIpcMessagePort");
+function createRpcIpcMessageChannel(servicePath, memoryLimit = 2048) {
+    const port = RpcIpcMessagePort_1.createRpcIpcForkedProcessMessagePort(servicePath, memoryLimit);
+    // linked by the child_process IPC implementation - no manual linking needed
+    return index_1.createRpcMessageChannel(port, port);
+}
+exports.createRpcIpcMessageChannel = createRpcIpcMessageChannel;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessagePort.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessagePort.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessagePort.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+import { ProcessLike } from './ProcessLike';
+import { RpcMessagePort } from '../index';
+declare function createRpcIpcMessagePort(process: ProcessLike): RpcMessagePort;
+declare function createRpcIpcForkedProcessMessagePort(filePath: string, memoryLimit?: number, autoRecreate?: boolean): RpcMessagePort;
+export { createRpcIpcMessagePort, createRpcIpcForkedProcessMessagePort };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessagePort.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessagePort.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/RpcIpcMessagePort.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,150 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const child_process_1 = require("child_process");
+const RpcIpcMessagePortClosedError_1 = require("./error/RpcIpcMessagePortClosedError");
+function createRpcIpcMessagePort(process) {
+    const messageListeners = new Set();
+    const errorListeners = new Set();
+    let closedError;
+    const handleExit = (code, signal) => __awaiter(this, void 0, void 0, function* () {
+        closedError = new RpcIpcMessagePortClosedError_1.RpcIpcMessagePortClosedError(code
+            ? `Process ${process.pid} exited with code "${code}" [${signal}]`
+            : `Process ${process.pid} exited [${signal}].`, code, signal);
+        errorListeners.forEach((listener) => {
+            if (closedError) {
+                listener(closedError);
+            }
+        });
+        yield port.close();
+    });
+    const handleMessage = (message) => {
+        messageListeners.forEach((listener) => {
+            listener(message);
+        });
+    };
+    process.on('message', handleMessage);
+    process.on('exit', handleExit);
+    const port = {
+        dispatchMessage: (message) => __awaiter(this, void 0, void 0, function* () {
+            return new Promise((resolve, reject) => {
+                if (!process.connected) {
+                    reject(closedError ||
+                        new RpcIpcMessagePortClosedError_1.RpcIpcMessagePortClosedError(`Process ${process.pid} doesn't have open IPC channels`));
+                }
+                if (process.send) {
+                    process.send(Object.assign(Object.assign({}, message), { source: process.pid }), undefined, undefined, (sendError) => {
+                        if (sendError) {
+                            if (!closedError) {
+                                closedError = new RpcIpcMessagePortClosedError_1.RpcIpcMessagePortClosedError(`Cannot send the message - the message port has been closed for the process ${process.pid}.`);
+                            }
+                            reject(closedError);
+                        }
+                        else {
+                            resolve();
+                        }
+                    });
+                }
+                else {
+                    reject(new RpcIpcMessagePortClosedError_1.RpcIpcMessagePortClosedError(`Process ${process.pid} doesn't have IPC channels`));
+                }
+            });
+        }),
+        addMessageListener: (listener) => {
+            messageListeners.add(listener);
+        },
+        removeMessageListener: (listener) => {
+            messageListeners.delete(listener);
+        },
+        addErrorListener: (listener) => {
+            errorListeners.add(listener);
+        },
+        removeErrorListener: (listener) => {
+            errorListeners.delete(listener);
+        },
+        isOpen: () => !!process.connected,
+        open: () => __awaiter(this, void 0, void 0, function* () {
+            if (!process.connected || closedError) {
+                throw (closedError ||
+                    new RpcIpcMessagePortClosedError_1.RpcIpcMessagePortClosedError(`Cannot open closed IPC channel for process ${process.pid}.`));
+            }
+        }),
+        close: () => __awaiter(this, void 0, void 0, function* () {
+            process.off('message', handleMessage);
+            process.off('exit', handleExit);
+            messageListeners.clear();
+            errorListeners.clear();
+            if (process.disconnect && process.connected) {
+                process.disconnect();
+            }
+        }),
+    };
+    return port;
+}
+exports.createRpcIpcMessagePort = createRpcIpcMessagePort;
+function createRpcIpcForkedProcessMessagePort(filePath, memoryLimit = 2048, autoRecreate = true) {
+    function createChildProcess() {
+        return child_process_1.fork(filePath, [], {
+            execArgv: [`--max-old-space-size=${memoryLimit}`],
+            stdio: ['inherit', 'inherit', 'inherit', 'ipc'],
+        });
+    }
+    const messageListeners = new Set();
+    const errorListeners = new Set();
+    let childProcess = createChildProcess();
+    let port = createRpcIpcMessagePort(childProcess);
+    return {
+        dispatchMessage: (message) => port.dispatchMessage(message),
+        addMessageListener: (listener) => {
+            messageListeners.add(listener);
+            return port.addMessageListener(listener);
+        },
+        removeMessageListener: (listener) => {
+            messageListeners.delete(listener);
+            return port.removeMessageListener(listener);
+        },
+        addErrorListener: (listener) => {
+            errorListeners.add(listener);
+            return port.addErrorListener(listener);
+        },
+        removeErrorListener: (listener) => {
+            errorListeners.delete(listener);
+            return port.removeErrorListener(listener);
+        },
+        isOpen: () => port.isOpen(),
+        open: () => __awaiter(this, void 0, void 0, function* () {
+            if (!port.isOpen() && autoRecreate) {
+                // recreate the process and add existing message listeners
+                childProcess = createChildProcess();
+                port = createRpcIpcMessagePort(childProcess);
+                messageListeners.forEach((listener) => {
+                    port.addMessageListener(listener);
+                });
+                errorListeners.forEach((listener) => {
+                    port.addErrorListener(listener);
+                });
+            }
+            else {
+                return port.open();
+            }
+        }),
+        close: () => __awaiter(this, void 0, void 0, function* () {
+            yield port.close();
+            messageListeners.clear();
+            errorListeners.clear();
+            if (childProcess) {
+                childProcess.kill('SIGTERM');
+                childProcess = undefined;
+            }
+        }),
+    };
+}
+exports.createRpcIpcForkedProcessMessagePort = createRpcIpcForkedProcessMessagePort;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/error/RpcIpcMessagePortClosedError.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/error/RpcIpcMessagePortClosedError.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/error/RpcIpcMessagePortClosedError.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+import { RpcMessagePortClosedError } from '../../error/RpcMessagePortClosedError';
+declare class RpcIpcMessagePortClosedError extends RpcMessagePortClosedError {
+    readonly code?: string | number | null | undefined;
+    readonly signal?: string | null | undefined;
+    constructor(message: string, code?: string | number | null | undefined, signal?: string | null | undefined);
+}
+export { RpcIpcMessagePortClosedError };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/error/RpcIpcMessagePortClosedError.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/error/RpcIpcMessagePortClosedError.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/error/RpcIpcMessagePortClosedError.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,12 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const RpcMessagePortClosedError_1 = require("../../error/RpcMessagePortClosedError");
+class RpcIpcMessagePortClosedError extends RpcMessagePortClosedError_1.RpcMessagePortClosedError {
+    constructor(message, code, signal) {
+        super(message);
+        this.code = code;
+        this.signal = signal;
+        this.name = 'RpcIpcMessagePortClosedError';
+    }
+}
+exports.RpcIpcMessagePortClosedError = RpcIpcMessagePortClosedError;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/index.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+export * from './RpcIpcMessagePort';
+export * from './RpcIpcMessageChannel';
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/rpc/rpc-ipc/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+"use strict";
+function __export(m) {
+    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
+}
+Object.defineProperty(exports, "__esModule", { value: true });
+__export(require("./RpcIpcMessagePort"));
+__export(require("./RpcIpcMessageChannel"));
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptConfigurationOverwrite.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptConfigurationOverwrite.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptConfigurationOverwrite.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,12 @@
+interface TypeScriptConfigurationOverwrite {
+    extends?: string;
+    compilerOptions?: object;
+    include?: string[];
+    exclude?: string[];
+    files?: string[];
+    references?: {
+        path: string;
+        prepend?: boolean;
+    }[];
+}
+export { TypeScriptConfigurationOverwrite };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptConfigurationOverwrite.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptConfigurationOverwrite.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptConfigurationOverwrite.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptDiagnosticsOptions.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptDiagnosticsOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptDiagnosticsOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+interface TypeScriptDiagnosticsOptions {
+    syntactic: boolean;
+    semantic: boolean;
+    declaration: boolean;
+    global: boolean;
+}
+export { TypeScriptDiagnosticsOptions };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptDiagnosticsOptions.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptDiagnosticsOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptDiagnosticsOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptReporterConfiguration.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptReporterConfiguration.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptReporterConfiguration.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,22 @@
+import webpack from 'webpack';
+import { TypeScriptDiagnosticsOptions } from './TypeScriptDiagnosticsOptions';
+import { TypeScriptReporterOptions } from './TypeScriptReporterOptions';
+import { TypeScriptVueExtensionConfiguration } from './extension/vue/TypeScriptVueExtensionConfiguration';
+import { TypeScriptConfigurationOverwrite } from './TypeScriptConfigurationOverwrite';
+interface TypeScriptReporterConfiguration {
+    enabled: boolean;
+    memoryLimit: number;
+    configFile: string;
+    configOverwrite: TypeScriptConfigurationOverwrite;
+    build: boolean;
+    context: string;
+    mode: 'readonly' | 'write-tsbuildinfo' | 'write-dts' | 'write-references';
+    diagnosticOptions: TypeScriptDiagnosticsOptions;
+    extensions: {
+        vue: TypeScriptVueExtensionConfiguration;
+    };
+    profile: boolean;
+    typescriptPath: string;
+}
+declare function createTypeScriptReporterConfiguration(compiler: webpack.Compiler, options: TypeScriptReporterOptions | undefined): TypeScriptReporterConfiguration;
+export { createTypeScriptReporterConfiguration, TypeScriptReporterConfiguration };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptReporterConfiguration.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptReporterConfiguration.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptReporterConfiguration.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,29 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const path_1 = __importDefault(require("path"));
+const semver_1 = __importDefault(require("semver"));
+const TypeScriptVueExtensionConfiguration_1 = require("./extension/vue/TypeScriptVueExtensionConfiguration");
+function createTypeScriptReporterConfiguration(compiler, options) {
+    let configFile = typeof options === 'object' ? options.configFile || 'tsconfig.json' : 'tsconfig.json';
+    // ensure that `configFile` is an absolute normalized path
+    configFile = path_1.default.normalize(path_1.default.isAbsolute(configFile)
+        ? configFile
+        : path_1.default.resolve(compiler.options.context || process.cwd(), configFile));
+    const optionsAsObject = typeof options === 'object' ? options : {};
+    const typescriptPath = optionsAsObject.typescriptPath || require.resolve('typescript');
+    const defaultCompilerOptions = {
+        skipLibCheck: true,
+        sourceMap: false,
+        inlineSourceMap: false,
+    };
+    if (semver_1.default.gte(require(typescriptPath).version, '2.9.0')) {
+        defaultCompilerOptions.declarationMap = false;
+    }
+    return Object.assign(Object.assign({ enabled: options !== false, memoryLimit: 2048, build: false, mode: 'write-tsbuildinfo', profile: false }, optionsAsObject), { configFile: configFile, configOverwrite: Object.assign(Object.assign({}, (optionsAsObject.configOverwrite || {})), { compilerOptions: Object.assign(Object.assign({}, defaultCompilerOptions), ((optionsAsObject.configOverwrite || {}).compilerOptions || {})) }), context: optionsAsObject.context || path_1.default.dirname(configFile), extensions: {
+            vue: TypeScriptVueExtensionConfiguration_1.createTypeScriptVueExtensionConfiguration(optionsAsObject.extensions ? optionsAsObject.extensions.vue : undefined),
+        }, diagnosticOptions: Object.assign({ syntactic: false, semantic: true, declaration: false, global: false }, (optionsAsObject.diagnosticOptions || {})), typescriptPath: typescriptPath });
+}
+exports.createTypeScriptReporterConfiguration = createTypeScriptReporterConfiguration;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptReporterOptions.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptReporterOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptReporterOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+import { TypeScriptDiagnosticsOptions } from './TypeScriptDiagnosticsOptions';
+import { TypeScriptVueExtensionOptions } from './extension/vue/TypeScriptVueExtensionOptions';
+import { TypeScriptConfigurationOverwrite } from './TypeScriptConfigurationOverwrite';
+declare type TypeScriptReporterOptions = boolean | {
+    enabled?: boolean;
+    memoryLimit?: number;
+    configFile?: string;
+    configOverwrite?: TypeScriptConfigurationOverwrite;
+    context?: string;
+    build?: boolean;
+    mode?: 'readonly' | 'write-tsbuildinfo' | 'write-dts' | 'write-references';
+    diagnosticOptions?: Partial<TypeScriptDiagnosticsOptions>;
+    extensions?: {
+        vue?: TypeScriptVueExtensionOptions;
+    };
+    profile?: boolean;
+    typescriptPath?: string;
+};
+export { TypeScriptReporterOptions };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptReporterOptions.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptReporterOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptReporterOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptSupport.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptSupport.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptSupport.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+import { TypeScriptReporterConfiguration } from './TypeScriptReporterConfiguration';
+declare function assertTypeScriptSupport(configuration: TypeScriptReporterConfiguration): void;
+export { assertTypeScriptSupport };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptSupport.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptSupport.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/TypeScriptSupport.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,52 @@
+"use strict";
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
+    result["default"] = mod;
+    return result;
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const semver = __importStar(require("semver"));
+const fs_extra_1 = __importDefault(require("fs-extra"));
+const os_1 = __importDefault(require("os"));
+const TypeScriptVueExtensionSupport_1 = require("./extension/vue/TypeScriptVueExtensionSupport");
+function assertTypeScriptSupport(configuration) {
+    let typescriptVersion;
+    try {
+        typescriptVersion = require(configuration.typescriptPath).version;
+    }
+    catch (error) { }
+    if (!typescriptVersion) {
+        throw new Error('When you use ForkTsCheckerWebpackPlugin with typescript reporter enabled, you must install `typescript` package.');
+    }
+    if (semver.lt(typescriptVersion, '2.7.0')) {
+        throw new Error([
+            `ForkTsCheckerWebpackPlugin cannot use the current typescript version of ${typescriptVersion}.`,
+            'The minimum required version is 2.7.0.',
+        ].join(os_1.default.EOL));
+    }
+    if (configuration.build && semver.lt(typescriptVersion, '3.6.0')) {
+        throw new Error([
+            `ForkTsCheckerWebpackPlugin cannot use the current typescript version of ${typescriptVersion} because of the "build" option enabled.`,
+            'The minimum version that supports "build" option is 3.6.0.',
+            'Consider upgrading `typescript` or disabling "build" option.',
+        ].join(os_1.default.EOL));
+    }
+    if (!fs_extra_1.default.existsSync(configuration.configFile)) {
+        throw new Error([
+            `Cannot find the "${configuration.configFile}" file.`,
+            `Please check webpack and ForkTsCheckerWebpackPlugin configuration.`,
+            `Possible errors:`,
+            '  - wrong `context` directory in webpack configuration (if `configFile` is not set or is a relative path in the fork plugin configuration)',
+            '  - wrong `typescript.configFile` path in the plugin configuration (should be a relative or absolute path)',
+        ].join(os_1.default.EOL));
+    }
+    if (configuration.extensions.vue.enabled) {
+        TypeScriptVueExtensionSupport_1.assertTypeScriptVueExtensionSupport(configuration.extensions.vue);
+    }
+}
+exports.assertTypeScriptSupport = assertTypeScriptSupport;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/TypeScriptEmbeddedExtension.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/TypeScriptEmbeddedExtension.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/TypeScriptEmbeddedExtension.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+import { TypeScriptExtension } from './TypeScriptExtension';
+interface TypeScriptEmbeddedSource {
+    sourceText: string;
+    extension: '.ts' | '.tsx' | '.js';
+}
+interface TypeScriptEmbeddedExtensionHost {
+    embeddedExtensions: string[];
+    getEmbeddedSource(fileName: string): TypeScriptEmbeddedSource | undefined;
+}
+/**
+ * It handles most of the logic required to process embedded TypeScript code (like in Vue components or MDX)
+ *
+ * @param embeddedExtensions List of file extensions that should be treated as an embedded TypeScript source
+ *                           (for example ['.vue'])
+ * @param getEmbeddedSource  Function that returns embedded TypeScript source text and extension that this file
+ *                           would have if it would be a regular TypeScript file
+ */
+declare function createTypeScriptEmbeddedExtension({ embeddedExtensions, getEmbeddedSource, }: TypeScriptEmbeddedExtensionHost): TypeScriptExtension;
+export { TypeScriptEmbeddedExtensionHost, TypeScriptEmbeddedSource, createTypeScriptEmbeddedExtension, };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/TypeScriptEmbeddedExtension.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/TypeScriptEmbeddedExtension.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/TypeScriptEmbeddedExtension.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,111 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const path_1 = require("path");
+/**
+ * It handles most of the logic required to process embedded TypeScript code (like in Vue components or MDX)
+ *
+ * @param embeddedExtensions List of file extensions that should be treated as an embedded TypeScript source
+ *                           (for example ['.vue'])
+ * @param getEmbeddedSource  Function that returns embedded TypeScript source text and extension that this file
+ *                           would have if it would be a regular TypeScript file
+ */
+function createTypeScriptEmbeddedExtension({ embeddedExtensions, getEmbeddedSource, }) {
+    const embeddedSourceCache = new Map();
+    function getCachedEmbeddedSource(fileName) {
+        if (!embeddedSourceCache.has(fileName)) {
+            embeddedSourceCache.set(fileName, getEmbeddedSource(fileName));
+        }
+        return embeddedSourceCache.get(fileName);
+    }
+    function parsePotentiallyEmbeddedFileName(fileName) {
+        const extension = path_1.extname(fileName);
+        const embeddedFileName = fileName.slice(0, fileName.length - extension.length);
+        const embeddedExtension = path_1.extname(embeddedFileName);
+        return {
+            extension,
+            embeddedFileName,
+            embeddedExtension,
+        };
+    }
+    function createEmbeddedFileExists(fileExists) {
+        return function embeddedFileExists(fileName) {
+            const { embeddedExtension, embeddedFileName, extension } = parsePotentiallyEmbeddedFileName(fileName);
+            if (embeddedExtensions.includes(embeddedExtension) && fileExists(embeddedFileName)) {
+                const embeddedSource = getCachedEmbeddedSource(embeddedFileName);
+                return !!(embeddedSource && embeddedSource.extension === extension);
+            }
+            return fileExists(fileName);
+        };
+    }
+    function createEmbeddedReadFile(readFile) {
+        return function embeddedReadFile(fileName, encoding) {
+            const { embeddedExtension, embeddedFileName, extension } = parsePotentiallyEmbeddedFileName(fileName);
+            if (embeddedExtensions.includes(embeddedExtension)) {
+                const embeddedSource = getCachedEmbeddedSource(embeddedFileName);
+                if (embeddedSource && embeddedSource.extension === extension) {
+                    return embeddedSource.sourceText;
+                }
+            }
+            return readFile(fileName, encoding);
+        };
+    }
+    return {
+        extendIssues(issues) {
+            return issues.map((issue) => {
+                if (issue.file) {
+                    const { embeddedExtension, embeddedFileName } = parsePotentiallyEmbeddedFileName(issue.file);
+                    if (embeddedExtensions.includes(embeddedExtension)) {
+                        return Object.assign(Object.assign({}, issue), { file: embeddedFileName });
+                    }
+                }
+                return issue;
+            });
+        },
+        extendWatchCompilerHost(host) {
+            return Object.assign(Object.assign({}, host), { watchFile(fileName, callback, poolingInterval) {
+                    const { embeddedExtension, embeddedFileName } = parsePotentiallyEmbeddedFileName(fileName);
+                    if (embeddedExtensions.includes(embeddedExtension)) {
+                        return host.watchFile(embeddedFileName, (innerFileName, eventKind) => {
+                            embeddedSourceCache.delete(embeddedFileName);
+                            return callback(fileName, eventKind);
+                        }, poolingInterval);
+                    }
+                    else {
+                        return host.watchFile(fileName, callback, poolingInterval);
+                    }
+                }, readFile: createEmbeddedReadFile(host.readFile), fileExists: createEmbeddedFileExists(host.fileExists) });
+        },
+        extendCompilerHost(host) {
+            return Object.assign(Object.assign({}, host), { readFile: createEmbeddedReadFile(host.readFile), fileExists: createEmbeddedFileExists(host.fileExists) });
+        },
+        extendParseConfigFileHost(host) {
+            return Object.assign(Object.assign({}, host), { readDirectory(rootDir, extensions, excludes, includes, depth) {
+                    return host
+                        .readDirectory(rootDir, [...extensions, ...embeddedExtensions], excludes, includes, depth)
+                        .map((fileName) => {
+                        const isEmbeddedFile = embeddedExtensions.some((embeddedExtension) => fileName.endsWith(embeddedExtension));
+                        if (isEmbeddedFile) {
+                            const embeddedSource = getCachedEmbeddedSource(fileName);
+                            return embeddedSource ? `${fileName}${embeddedSource.extension}` : fileName;
+                        }
+                        else {
+                            return fileName;
+                        }
+                    });
+                } });
+        },
+        extendDependencies(dependencies) {
+            return Object.assign(Object.assign({}, dependencies), { files: dependencies.files.map((fileName) => {
+                    const { embeddedExtension, embeddedFileName, extension, } = parsePotentiallyEmbeddedFileName(fileName);
+                    if (embeddedExtensions.includes(embeddedExtension)) {
+                        const embeddedSource = getCachedEmbeddedSource(embeddedFileName);
+                        if (embeddedSource && embeddedSource.extension === extension) {
+                            return embeddedFileName;
+                        }
+                    }
+                    return fileName;
+                }), extensions: [...dependencies.extensions, ...embeddedExtensions] });
+        },
+    };
+}
+exports.createTypeScriptEmbeddedExtension = createTypeScriptEmbeddedExtension;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/TypeScriptExtension.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/TypeScriptExtension.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/TypeScriptExtension.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,16 @@
+import type * as ts from 'typescript';
+import { Issue } from '../../issue';
+import { FilesMatch } from '../../reporter';
+interface TypeScriptHostExtension {
+    extendWatchSolutionBuilderHost?<TProgram extends ts.BuilderProgram, THost extends ts.SolutionBuilderWithWatchHost<TProgram>>(host: THost, parsedCommandLine?: ts.ParsedCommandLine): THost;
+    extendWatchCompilerHost?<TProgram extends ts.BuilderProgram, THost extends ts.WatchCompilerHost<TProgram>>(host: THost, parsedCommandLine?: ts.ParsedCommandLine): THost;
+    extendCompilerHost?<THost extends ts.CompilerHost>(host: THost, parsedCommandLine?: ts.ParsedCommandLine): THost;
+    extendParseConfigFileHost?<THost extends ts.ParseConfigFileHost>(host: THost): THost;
+}
+interface TypeScriptReporterExtension {
+    extendIssues?(issues: Issue[]): Issue[];
+    extendDependencies?(dependencies: FilesMatch): FilesMatch;
+}
+interface TypeScriptExtension extends TypeScriptHostExtension, TypeScriptReporterExtension {
+}
+export { TypeScriptExtension, TypeScriptReporterExtension, TypeScriptHostExtension };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/TypeScriptExtension.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/TypeScriptExtension.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/TypeScriptExtension.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtension.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtension.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtension.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+import { TypeScriptExtension } from '../TypeScriptExtension';
+import { TypeScriptVueExtensionConfiguration } from './TypeScriptVueExtensionConfiguration';
+declare function createTypeScriptVueExtension(configuration: TypeScriptVueExtensionConfiguration): TypeScriptExtension;
+export { createTypeScriptVueExtension };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtension.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtension.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtension.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,115 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const TypeScriptEmbeddedExtension_1 = require("../TypeScriptEmbeddedExtension");
+const fs_extra_1 = __importDefault(require("fs-extra"));
+function createTypeScriptVueExtension(configuration) {
+    function loadVueTemplateCompiler() {
+        return require(configuration.compiler);
+    }
+    function isVueTemplateCompilerV2(compiler) {
+        return typeof compiler.parseComponent === 'function';
+    }
+    function isVueTemplateCompilerV3(compiler) {
+        return typeof compiler.parse === 'function';
+    }
+    function getExtensionByLang(lang) {
+        if (lang === true) {
+            return '.js';
+        }
+        switch (lang) {
+            case 'ts':
+                return '.ts';
+            case 'tsx':
+                return '.tsx';
+            case 'js':
+            case 'jsx':
+            default:
+                return '.js';
+        }
+    }
+    function createVueNoScriptEmbeddedSource() {
+        return {
+            sourceText: 'export default {};\n',
+            extension: '.js',
+        };
+    }
+    function createVueSrcScriptEmbeddedSource(src, lang) {
+        // Import path cannot be end with '.ts[x]'
+        src = src.replace(/\.tsx?$/i, '');
+        // For now, ignore the error when the src file is not found since it will produce incorrect code location.
+        // It's not a large problem since it's handled on webpack side.
+        const text = [
+            '// @ts-ignore',
+            `export { default } from '${src}';`,
+            '// @ts-ignore',
+            `export * from '${src}';`,
+        ].join('\n');
+        return {
+            sourceText: text,
+            extension: getExtensionByLang(lang),
+        };
+    }
+    function createVueInlineScriptEmbeddedSource(text, lang) {
+        return {
+            sourceText: text,
+            extension: getExtensionByLang(lang),
+        };
+    }
+    function getVueEmbeddedSource(fileName) {
+        if (!fs_extra_1.default.existsSync(fileName)) {
+            return undefined;
+        }
+        const compiler = loadVueTemplateCompiler();
+        const vueSourceText = fs_extra_1.default.readFileSync(fileName, { encoding: 'utf-8' });
+        let script;
+        if (isVueTemplateCompilerV2(compiler)) {
+            const parsed = compiler.parseComponent(vueSourceText, {
+                pad: 'space',
+            });
+            script = parsed.script;
+        }
+        else if (isVueTemplateCompilerV3(compiler)) {
+            const parsed = compiler.parse(vueSourceText);
+            if (parsed.descriptor && parsed.descriptor.script) {
+                const scriptV3 = parsed.descriptor.script;
+                // map newer version of SFCScriptBlock to the generic one
+                script = {
+                    content: scriptV3.content,
+                    attrs: scriptV3.attrs,
+                    start: scriptV3.loc.start.offset,
+                    end: scriptV3.loc.end.offset,
+                    lang: scriptV3.lang,
+                    src: scriptV3.src,
+                };
+            }
+        }
+        else {
+            throw new Error('Unsupported vue template compiler. Compiler should provide `parse` or `parseComponent` function.');
+        }
+        if (!script) {
+            // No <script> block
+            return createVueNoScriptEmbeddedSource();
+        }
+        else if (script.attrs.src) {
+            // <script src="file.ts" /> block
+            if (typeof script.attrs.src === 'string') {
+                return createVueSrcScriptEmbeddedSource(script.attrs.src, script.attrs.lang);
+            }
+        }
+        else {
+            // <script lang="ts"></script> block
+            // pad blank lines to retain diagnostics location
+            const lineOffset = vueSourceText.slice(0, script.start).split(/\r?\n/g).length;
+            const paddedSourceText = Array(lineOffset).join('\n') + vueSourceText.slice(script.start, script.end);
+            return createVueInlineScriptEmbeddedSource(paddedSourceText, script.attrs.lang);
+        }
+    }
+    return TypeScriptEmbeddedExtension_1.createTypeScriptEmbeddedExtension({
+        embeddedExtensions: ['.vue'],
+        getEmbeddedSource: getVueEmbeddedSource,
+    });
+}
+exports.createTypeScriptVueExtension = createTypeScriptVueExtension;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionConfiguration.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionConfiguration.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionConfiguration.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+import { TypeScriptVueExtensionOptions } from './TypeScriptVueExtensionOptions';
+interface TypeScriptVueExtensionConfiguration {
+    enabled: boolean;
+    compiler: string;
+}
+declare function createTypeScriptVueExtensionConfiguration(options: TypeScriptVueExtensionOptions | undefined): TypeScriptVueExtensionConfiguration;
+export { TypeScriptVueExtensionConfiguration, createTypeScriptVueExtensionConfiguration };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionConfiguration.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionConfiguration.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionConfiguration.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function createTypeScriptVueExtensionConfiguration(options) {
+    return Object.assign({ enabled: options === true, compiler: 'vue-template-compiler' }, (typeof options === 'object' ? options : {}));
+}
+exports.createTypeScriptVueExtensionConfiguration = createTypeScriptVueExtensionConfiguration;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionOptions.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionOptions.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+declare type TypeScriptVueExtensionOptions = boolean | {
+    enabled?: boolean;
+    compiler?: string;
+};
+export { TypeScriptVueExtensionOptions };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionOptions.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionOptions.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionSupport.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionSupport.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionSupport.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,3 @@
+import { TypeScriptVueExtensionConfiguration } from './TypeScriptVueExtensionConfiguration';
+declare function assertTypeScriptVueExtensionSupport(configuration: TypeScriptVueExtensionConfiguration): void;
+export { assertTypeScriptVueExtensionSupport };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionSupport.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionSupport.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/TypeScriptVueExtensionSupport.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function assertTypeScriptVueExtensionSupport(configuration) {
+    // We need to import template compiler for vue lazily because it cannot be included it
+    // as direct dependency because it is an optional dependency of fork-ts-checker-webpack-plugin.
+    // Since its version must not mismatch with user-installed Vue.js,
+    // we should let the users install template compiler for vue by themselves.
+    const compilerName = configuration.compiler;
+    try {
+        require(compilerName);
+    }
+    catch (error) {
+        throw new Error([
+            `Could not initialize '${compilerName}'. When you use 'typescript.extensions.vue' option, make sure to install '${compilerName}' and that the version matches that of 'vue'.`,
+            `Error details: ${error.message}`,
+        ].join('\n'));
+    }
+}
+exports.assertTypeScriptVueExtensionSupport = assertTypeScriptVueExtensionSupport;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/types/vue-template-compiler.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/types/vue-template-compiler.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/types/vue-template-compiler.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,28 @@
+/**
+ * This declaration is copied from https://github.com/vuejs/vue/pull/7918
+ * which may included vue-template-compiler v2.6.0.
+ */
+interface SFCParserOptionsV2 {
+    pad?: true | 'line' | 'space';
+}
+export interface SFCBlockV2 {
+    type: string;
+    content: string;
+    attrs: Record<string, string>;
+    start?: number;
+    end?: number;
+    lang?: string;
+    src?: string;
+    scoped?: boolean;
+    module?: string | boolean;
+}
+export interface SFCDescriptorV2 {
+    template: SFCBlockV2 | undefined;
+    script: SFCBlockV2 | undefined;
+    styles: SFCBlockV2[];
+    customBlocks: SFCBlockV2[];
+}
+export interface VueTemplateCompilerV2 {
+    parseComponent(file: string, options?: SFCParserOptionsV2): SFCDescriptorV2;
+}
+export {};
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/types/vue-template-compiler.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/types/vue-template-compiler.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/types/vue-template-compiler.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/types/vue__compiler-sfc.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/types/vue__compiler-sfc.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/types/vue__compiler-sfc.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,37 @@
+interface Position {
+    offset: number;
+    line: number;
+    column: number;
+}
+interface SourceLocation {
+    start: Position;
+    end: Position;
+    source: string;
+}
+export interface SFCBlock {
+    type: string;
+    content: string;
+    attrs: Record<string, string | true>;
+    loc: SourceLocation;
+    lang?: string;
+    src?: string;
+}
+interface SFCDescriptor {
+    filename: string;
+    template: SFCBlock | null;
+    script: SFCBlock | null;
+    styles: SFCBlock[];
+    customBlocks: SFCBlock[];
+}
+interface CompilerError extends SyntaxError {
+    code: number;
+    loc?: SourceLocation;
+}
+interface SFCParseResult {
+    descriptor: SFCDescriptor;
+    errors: CompilerError[];
+}
+export interface VueTemplateCompilerV3 {
+    parse(template: string, options?: any): SFCParseResult;
+}
+export {};
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/types/vue__compiler-sfc.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/types/vue__compiler-sfc.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/extension/vue/types/vue__compiler-sfc.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/FileSystem.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/FileSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/FileSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+/// <reference types="node" />
+import { Dirent, Stats } from 'fs';
+/**
+ * Interface to abstract file system implementation details.
+ */
+interface FileSystem {
+    exists(path: string): boolean;
+    readFile(path: string, encoding?: string): string | undefined;
+    readDir(path: string): Dirent[];
+    readStats(path: string): Stats | undefined;
+    realPath(path: string): string;
+    normalizePath(path: string): string;
+    writeFile(path: string, data: string): void;
+    deleteFile(path: string): void;
+    createDir(path: string): void;
+    updateTimes(path: string, atime: Date, mtime: Date): void;
+    clearCache(): void;
+}
+export { FileSystem };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/FileSystem.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/FileSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/FileSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/MemFileSystem.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/MemFileSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/MemFileSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,8 @@
+import { FileSystem } from './FileSystem';
+/**
+ * It's an implementation of FileSystem interface which reads and writes to the in-memory file system.
+ *
+ * @param realFileSystem
+ */
+declare function createMemFileSystem(realFileSystem: FileSystem): FileSystem;
+export { createMemFileSystem };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/MemFileSystem.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/MemFileSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/MemFileSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,81 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const path_1 = require("path");
+const memfs_1 = require("memfs");
+/**
+ * It's an implementation of FileSystem interface which reads and writes to the in-memory file system.
+ *
+ * @param realFileSystem
+ */
+function createMemFileSystem(realFileSystem) {
+    function exists(path) {
+        return memfs_1.fs.existsSync(realFileSystem.normalizePath(path));
+    }
+    function readStats(path) {
+        return exists(path) ? memfs_1.fs.statSync(realFileSystem.normalizePath(path)) : undefined;
+    }
+    function readFile(path, encoding) {
+        const stats = readStats(path);
+        if (stats && stats.isFile()) {
+            return memfs_1.fs
+                .readFileSync(realFileSystem.normalizePath(path), { encoding: encoding })
+                .toString();
+        }
+    }
+    function readDir(path) {
+        const stats = readStats(path);
+        if (stats && stats.isDirectory()) {
+            return memfs_1.fs.readdirSync(realFileSystem.normalizePath(path), {
+                withFileTypes: true,
+            });
+        }
+        return [];
+    }
+    function createDir(path) {
+        memfs_1.fs.mkdirSync(realFileSystem.normalizePath(path), { recursive: true });
+    }
+    function writeFile(path, data) {
+        if (!exists(path_1.dirname(path))) {
+            createDir(path_1.dirname(path));
+        }
+        memfs_1.fs.writeFileSync(realFileSystem.normalizePath(path), data);
+    }
+    function deleteFile(path) {
+        if (exists(path)) {
+            memfs_1.fs.unlinkSync(realFileSystem.normalizePath(path));
+        }
+    }
+    function updateTimes(path, atime, mtime) {
+        if (exists(path)) {
+            memfs_1.fs.utimesSync(realFileSystem.normalizePath(path), atime, mtime);
+        }
+    }
+    return Object.assign(Object.assign({}, realFileSystem), { exists(path) {
+            return exists(realFileSystem.realPath(path));
+        },
+        readFile(path, encoding) {
+            return readFile(realFileSystem.realPath(path), encoding);
+        },
+        readDir(path) {
+            return readDir(realFileSystem.realPath(path));
+        },
+        readStats(path) {
+            return readStats(realFileSystem.realPath(path));
+        },
+        writeFile(path, data) {
+            writeFile(realFileSystem.realPath(path), data);
+        },
+        deleteFile(path) {
+            deleteFile(realFileSystem.realPath(path));
+        },
+        createDir(path) {
+            createDir(realFileSystem.realPath(path));
+        },
+        updateTimes(path, atime, mtime) {
+            updateTimes(realFileSystem.realPath(path), atime, mtime);
+        },
+        clearCache() {
+            realFileSystem.clearCache();
+        } });
+}
+exports.createMemFileSystem = createMemFileSystem;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/PassiveFileSystem.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/PassiveFileSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/PassiveFileSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+import { FileSystem } from './FileSystem';
+/**
+ * It's an implementation of FileSystem interface which reads from the real file system, but write to the in-memory file system.
+ *
+ * @param memFileSystem
+ * @param realFileSystem
+ */
+declare function createPassiveFileSystem(memFileSystem: FileSystem, realFileSystem: FileSystem): FileSystem;
+export { createPassiveFileSystem };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/PassiveFileSystem.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/PassiveFileSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/PassiveFileSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,68 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+/**
+ * It's an implementation of FileSystem interface which reads from the real file system, but write to the in-memory file system.
+ *
+ * @param memFileSystem
+ * @param realFileSystem
+ */
+function createPassiveFileSystem(memFileSystem, realFileSystem) {
+    function exists(path) {
+        return realFileSystem.exists(path) || memFileSystem.exists(path);
+    }
+    function readFile(path, encoding) {
+        const fsStats = realFileSystem.readStats(path);
+        const memStats = memFileSystem.readStats(path);
+        if (fsStats && memStats) {
+            return fsStats.mtimeMs > memStats.mtimeMs
+                ? realFileSystem.readFile(path, encoding)
+                : memFileSystem.readFile(path, encoding);
+        }
+        else if (fsStats) {
+            return realFileSystem.readFile(path, encoding);
+        }
+        else if (memStats) {
+            return memFileSystem.readFile(path, encoding);
+        }
+    }
+    function readDir(path) {
+        const fsDirents = realFileSystem.readDir(path);
+        const memDirents = memFileSystem.readDir(path);
+        // merge list of dirents from fs and mem
+        return fsDirents
+            .filter((fsDirent) => !memDirents.some((memDirent) => memDirent.name === fsDirent.name))
+            .concat(memDirents);
+    }
+    function readStats(path) {
+        const fsStats = realFileSystem.readStats(path);
+        const memStats = memFileSystem.readStats(path);
+        if (fsStats && memStats) {
+            return fsStats.mtimeMs > memStats.mtimeMs ? fsStats : memStats;
+        }
+        else if (fsStats) {
+            return fsStats;
+        }
+        else if (memStats) {
+            return memStats;
+        }
+    }
+    return Object.assign(Object.assign({}, memFileSystem), { exists(path) {
+            return exists(realFileSystem.realPath(path));
+        },
+        readFile(path, encoding) {
+            return readFile(realFileSystem.realPath(path), encoding);
+        },
+        readDir(path) {
+            return readDir(realFileSystem.realPath(path));
+        },
+        readStats(path) {
+            return readStats(realFileSystem.realPath(path));
+        },
+        realPath(path) {
+            return realFileSystem.realPath(path);
+        },
+        clearCache() {
+            realFileSystem.clearCache();
+        } });
+}
+exports.createPassiveFileSystem = createPassiveFileSystem;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/RealFileSystem.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/RealFileSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/RealFileSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,8 @@
+import { FileSystem } from './FileSystem';
+/**
+ * It's an implementation of the FileSystem interface which reads and writes directly to the real file system.
+ *
+ * @param caseSensitive
+ */
+declare function createRealFileSystem(caseSensitive?: boolean): FileSystem;
+export { createRealFileSystem };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/RealFileSystem.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/RealFileSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/file-system/RealFileSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,179 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const path_1 = require("path");
+const fs_extra_1 = __importDefault(require("fs-extra"));
+/**
+ * It's an implementation of the FileSystem interface which reads and writes directly to the real file system.
+ *
+ * @param caseSensitive
+ */
+function createRealFileSystem(caseSensitive = false) {
+    // read cache
+    const existsCache = new Map();
+    const readStatsCache = new Map();
+    const readFileCache = new Map();
+    const readDirCache = new Map();
+    const realPathCache = new Map();
+    function normalizePath(path) {
+        return caseSensitive ? path_1.normalize(path) : path_1.normalize(path).toLowerCase();
+    }
+    // read methods
+    function exists(path) {
+        const normalizedPath = normalizePath(path);
+        if (!existsCache.has(normalizedPath)) {
+            existsCache.set(normalizedPath, fs_extra_1.default.existsSync(normalizedPath));
+        }
+        return !!existsCache.get(normalizedPath);
+    }
+    function readStats(path) {
+        const normalizedPath = normalizePath(path);
+        if (!readStatsCache.has(normalizedPath)) {
+            if (exists(normalizedPath)) {
+                readStatsCache.set(normalizedPath, fs_extra_1.default.statSync(normalizedPath));
+            }
+        }
+        return readStatsCache.get(normalizedPath);
+    }
+    function readFile(path, encoding) {
+        const normalizedPath = normalizePath(path);
+        if (!readFileCache.has(normalizedPath)) {
+            const stats = readStats(normalizedPath);
+            if (stats && stats.isFile()) {
+                readFileCache.set(normalizedPath, fs_extra_1.default.readFileSync(normalizedPath, { encoding: encoding }).toString());
+            }
+            else {
+                readFileCache.set(normalizedPath, undefined);
+            }
+        }
+        return readFileCache.get(normalizedPath);
+    }
+    function readDir(path) {
+        const normalizedPath = normalizePath(path);
+        if (!readDirCache.has(normalizedPath)) {
+            const stats = readStats(normalizedPath);
+            if (stats && stats.isDirectory()) {
+                readDirCache.set(normalizedPath, fs_extra_1.default.readdirSync(normalizedPath, { withFileTypes: true }));
+            }
+            else {
+                readDirCache.set(normalizedPath, []);
+            }
+        }
+        return readDirCache.get(normalizedPath) || [];
+    }
+    function getRealPath(path) {
+        const normalizedPath = normalizePath(path);
+        if (!realPathCache.has(normalizedPath)) {
+            let base = normalizedPath;
+            let nested = '';
+            while (base !== path_1.dirname(base)) {
+                if (exists(base)) {
+                    realPathCache.set(normalizedPath, normalizePath(path_1.join(fs_extra_1.default.realpathSync(base), nested)));
+                    break;
+                }
+                nested = path_1.join(path_1.basename(base), nested);
+                base = path_1.dirname(base);
+            }
+        }
+        return realPathCache.get(normalizedPath) || normalizedPath;
+    }
+    function createDir(path) {
+        const normalizedPath = normalizePath(path);
+        fs_extra_1.default.mkdirSync(normalizedPath, { recursive: true });
+        // update cache
+        existsCache.set(normalizedPath, true);
+        if (readDirCache.has(path_1.dirname(normalizedPath))) {
+            readDirCache.delete(path_1.dirname(normalizedPath));
+        }
+        if (readStatsCache.has(normalizedPath)) {
+            readStatsCache.delete(normalizedPath);
+        }
+    }
+    function writeFile(path, data) {
+        const normalizedPath = normalizePath(path);
+        if (!exists(path_1.dirname(normalizedPath))) {
+            createDir(path_1.dirname(normalizedPath));
+        }
+        fs_extra_1.default.writeFileSync(normalizedPath, data);
+        // update cache
+        existsCache.set(normalizedPath, true);
+        if (readDirCache.has(path_1.dirname(normalizedPath))) {
+            readDirCache.delete(path_1.dirname(normalizedPath));
+        }
+        if (readStatsCache.has(normalizedPath)) {
+            readStatsCache.delete(normalizedPath);
+        }
+        if (readFileCache.has(normalizedPath)) {
+            readFileCache.delete(normalizedPath);
+        }
+    }
+    function deleteFile(path) {
+        if (exists(path)) {
+            const normalizedPath = normalizePath(path);
+            fs_extra_1.default.unlinkSync(normalizedPath);
+            // update cache
+            existsCache.set(normalizedPath, false);
+            if (readDirCache.has(path_1.dirname(normalizedPath))) {
+                readDirCache.delete(path_1.dirname(normalizedPath));
+            }
+            if (readStatsCache.has(normalizedPath)) {
+                readStatsCache.delete(normalizedPath);
+            }
+            if (readFileCache.has(normalizedPath)) {
+                readFileCache.delete(normalizedPath);
+            }
+        }
+    }
+    function updateTimes(path, atime, mtime) {
+        if (exists(path)) {
+            const normalizedPath = normalizePath(path);
+            fs_extra_1.default.utimesSync(normalizePath(path), atime, mtime);
+            // update cache
+            if (readStatsCache.has(normalizedPath)) {
+                readStatsCache.delete(normalizedPath);
+            }
+        }
+    }
+    return {
+        exists(path) {
+            return exists(getRealPath(path));
+        },
+        readFile(path, encoding) {
+            return readFile(getRealPath(path), encoding);
+        },
+        readDir(path) {
+            return readDir(getRealPath(path));
+        },
+        readStats(path) {
+            return readStats(getRealPath(path));
+        },
+        realPath(path) {
+            return getRealPath(path);
+        },
+        normalizePath(path) {
+            return normalizePath(path);
+        },
+        writeFile(path, data) {
+            writeFile(getRealPath(path), data);
+        },
+        deleteFile(path) {
+            deleteFile(getRealPath(path));
+        },
+        createDir(path) {
+            createDir(getRealPath(path));
+        },
+        updateTimes(path, atime, mtime) {
+            updateTimes(getRealPath(path), atime, mtime);
+        },
+        clearCache() {
+            existsCache.clear();
+            readStatsCache.clear();
+            readFileCache.clear();
+            readDirCache.clear();
+            realPathCache.clear();
+        },
+    };
+}
+exports.createRealFileSystem = createRealFileSystem;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/issue/TypeScriptIssueFactory.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/issue/TypeScriptIssueFactory.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/issue/TypeScriptIssueFactory.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+import type * as ts from 'typescript';
+import { Issue } from '../../issue';
+declare function createIssuesFromTsDiagnostics(typescript: typeof ts, diagnostics: ts.Diagnostic[]): Issue[];
+export { createIssuesFromTsDiagnostics };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/issue/TypeScriptIssueFactory.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/issue/TypeScriptIssueFactory.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/issue/TypeScriptIssueFactory.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,45 @@
+"use strict";
+var __importStar = (this && this.__importStar) || function (mod) {
+    if (mod && mod.__esModule) return mod;
+    var result = {};
+    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
+    result["default"] = mod;
+    return result;
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const os = __importStar(require("os"));
+const issue_1 = require("../../issue");
+function createIssueFromTsDiagnostic(typescript, diagnostic) {
+    let file;
+    let location;
+    if (diagnostic.file) {
+        file = diagnostic.file.fileName;
+        if (diagnostic.start && diagnostic.length) {
+            const { line: startLine, character: startCharacter, } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start);
+            const { line: endLine, character: endCharacter, } = diagnostic.file.getLineAndCharacterOfPosition(diagnostic.start + diagnostic.length);
+            location = {
+                start: {
+                    line: startLine + 1,
+                    column: startCharacter + 1,
+                },
+                end: {
+                    line: endLine + 1,
+                    column: endCharacter + 1,
+                },
+            };
+        }
+    }
+    return {
+        origin: 'typescript',
+        code: 'TS' + String(diagnostic.code),
+        // we don't handle Suggestion and Message diagnostics
+        severity: diagnostic.category === 0 ? 'warning' : 'error',
+        message: typescript.flattenDiagnosticMessageText(diagnostic.messageText, os.EOL),
+        file,
+        location,
+    };
+}
+function createIssuesFromTsDiagnostics(typescript, diagnostics) {
+    return issue_1.deduplicateAndSortIssues(diagnostics.map((diagnostic) => createIssueFromTsDiagnostic(typescript, diagnostic)));
+}
+exports.createIssuesFromTsDiagnostics = createIssuesFromTsDiagnostics;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/profile/TypeScriptPerformance.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/profile/TypeScriptPerformance.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/profile/TypeScriptPerformance.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+import type * as ts from 'typescript';
+import { Performance } from '../../profile/Performance';
+interface TypeScriptPerformance {
+    enable?(): void;
+    disable?(): void;
+    forEachMeasure?(callback: (measureName: string, duration: number) => void): void;
+}
+declare function connectTypeScriptPerformance(typescript: typeof ts, performance: Performance): Performance;
+export { TypeScriptPerformance, connectTypeScriptPerformance };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/profile/TypeScriptPerformance.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/profile/TypeScriptPerformance.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/profile/TypeScriptPerformance.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,26 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function getTypeScriptPerformance(typescript) {
+    // eslint-disable-next-line @typescript-eslint/no-explicit-any
+    return typescript.performance;
+}
+function connectTypeScriptPerformance(typescript, performance) {
+    const typeScriptPerformance = getTypeScriptPerformance(typescript);
+    if (typeScriptPerformance) {
+        const { enable, disable } = performance;
+        return Object.assign(Object.assign({}, performance), { enable() {
+                var _a;
+                enable();
+                (_a = typeScriptPerformance.enable) === null || _a === void 0 ? void 0 : _a.call(typeScriptPerformance);
+            },
+            disable() {
+                var _a;
+                disable();
+                (_a = typeScriptPerformance.disable) === null || _a === void 0 ? void 0 : _a.call(typeScriptPerformance);
+            } });
+    }
+    else {
+        return performance;
+    }
+}
+exports.connectTypeScriptPerformance = connectTypeScriptPerformance;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledTypeScriptSystem.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledTypeScriptSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledTypeScriptSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,21 @@
+import type * as ts from 'typescript';
+import { FilesMatch } from '../../reporter';
+interface ControlledTypeScriptSystem extends ts.System {
+    invokeFileCreated(path: string): void;
+    invokeFileChanged(path: string): void;
+    invokeFileDeleted(path: string): void;
+    clearCache(): void;
+    getFileSize(path: string): number;
+    watchFile(path: string, callback: ts.FileWatcherCallback, pollingInterval?: number, options?: ts.WatchOptions): ts.FileWatcher;
+    watchDirectory(path: string, callback: ts.DirectoryWatcherCallback, recursive?: boolean, options?: ts.WatchOptions): ts.FileWatcher;
+    getModifiedTime(path: string): Date | undefined;
+    setModifiedTime(path: string, time: Date): void;
+    deleteFile(path: string): void;
+    setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): any;
+    clearTimeout(timeoutId: any): void;
+    waitForQueued(): Promise<void>;
+    setArtifacts(artifacts: FilesMatch): void;
+}
+declare type FileSystemMode = 'readonly' | 'write-tsbuildinfo' | 'write-dts' | 'write-references';
+declare function createControlledTypeScriptSystem(typescript: typeof ts, mode?: FileSystemMode): ControlledTypeScriptSystem;
+export { createControlledTypeScriptSystem, ControlledTypeScriptSystem };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledTypeScriptSystem.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledTypeScriptSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledTypeScriptSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,231 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const path_1 = require("path");
+const PassiveFileSystem_1 = require("../file-system/PassiveFileSystem");
+const forwardSlash_1 = __importDefault(require("../../utils/path/forwardSlash"));
+const RealFileSystem_1 = require("../file-system/RealFileSystem");
+const MemFileSystem_1 = require("../file-system/MemFileSystem");
+function createControlledTypeScriptSystem(typescript, mode = 'readonly') {
+    let artifacts = {
+        files: [],
+        dirs: [],
+        excluded: [],
+        extensions: [],
+    };
+    let isInitialRun = true;
+    // watchers
+    const fileWatcherCallbacksMap = new Map();
+    const directoryWatcherCallbacksMap = new Map();
+    const recursiveDirectoryWatcherCallbacksMap = new Map();
+    const deletedFiles = new Map();
+    // eslint-disable-next-line @typescript-eslint/no-explicit-any
+    const timeoutCallbacks = new Set();
+    // always use case-sensitive as normalization to lower-case can be a problem for some
+    // third-party libraries, like fsevents
+    const caseSensitive = true;
+    const realFileSystem = RealFileSystem_1.createRealFileSystem(caseSensitive);
+    const memFileSystem = MemFileSystem_1.createMemFileSystem(realFileSystem);
+    const passiveFileSystem = PassiveFileSystem_1.createPassiveFileSystem(memFileSystem, realFileSystem);
+    // based on the ts.ignorePaths
+    const ignoredPaths = ['/node_modules/.', '/.git', '/.#'];
+    function createWatcher(watchersMap, path, callback) {
+        const normalizedPath = realFileSystem.normalizePath(path);
+        const watchers = watchersMap.get(normalizedPath) || [];
+        const nextWatchers = [...watchers, callback];
+        watchersMap.set(normalizedPath, nextWatchers);
+        return {
+            close: () => {
+                const watchers = watchersMap.get(normalizedPath) || [];
+                const nextWatchers = watchers.filter((watcher) => watcher !== callback);
+                if (nextWatchers.length > 0) {
+                    watchersMap.set(normalizedPath, nextWatchers);
+                }
+                else {
+                    watchersMap.delete(normalizedPath);
+                }
+            },
+        };
+    }
+    function invokeFileWatchers(path, event) {
+        const normalizedPath = realFileSystem.normalizePath(path);
+        if (normalizedPath.endsWith('.js')) {
+            // trigger relevant .d.ts file watcher - handles the case, when we have webpack watcher
+            // that points to a symlinked package
+            invokeFileWatchers(normalizedPath.slice(0, -3) + '.d.ts', event);
+        }
+        const fileWatcherCallbacks = fileWatcherCallbacksMap.get(normalizedPath);
+        if (fileWatcherCallbacks) {
+            // typescript expects normalized paths with posix forward slash
+            fileWatcherCallbacks.forEach((fileWatcherCallback) => fileWatcherCallback(forwardSlash_1.default(normalizedPath), event));
+        }
+    }
+    function invokeDirectoryWatchers(path) {
+        const normalizedPath = realFileSystem.normalizePath(path);
+        const directory = path_1.dirname(normalizedPath);
+        if (ignoredPaths.some((ignoredPath) => forwardSlash_1.default(normalizedPath).includes(ignoredPath))) {
+            return;
+        }
+        const directoryWatcherCallbacks = directoryWatcherCallbacksMap.get(directory);
+        if (directoryWatcherCallbacks) {
+            directoryWatcherCallbacks.forEach((directoryWatcherCallback) => directoryWatcherCallback(forwardSlash_1.default(normalizedPath)));
+        }
+        recursiveDirectoryWatcherCallbacksMap.forEach((recursiveDirectoryWatcherCallbacks, watchedDirectory) => {
+            if (watchedDirectory === directory ||
+                (directory.startsWith(watchedDirectory) &&
+                    forwardSlash_1.default(directory)[watchedDirectory.length] === '/')) {
+                recursiveDirectoryWatcherCallbacks.forEach((recursiveDirectoryWatcherCallback) => recursiveDirectoryWatcherCallback(forwardSlash_1.default(normalizedPath)));
+            }
+        });
+    }
+    function isArtifact(path) {
+        return ((artifacts.dirs.some((dir) => path.includes(dir)) ||
+            artifacts.files.some((file) => path === file)) &&
+            artifacts.extensions.some((extension) => path.endsWith(extension)));
+    }
+    function getReadFileSystem(path) {
+        if ((mode === 'readonly' || mode === 'write-tsbuildinfo') && isArtifact(path)) {
+            if (isInitialRun && !memFileSystem.exists(path) && passiveFileSystem.exists(path)) {
+                // copy file to memory on initial run
+                const stats = passiveFileSystem.readStats(path);
+                if (stats === null || stats === void 0 ? void 0 : stats.isFile()) {
+                    const content = passiveFileSystem.readFile(path);
+                    if (content) {
+                        memFileSystem.writeFile(path, content);
+                        memFileSystem.updateTimes(path, stats.atime, stats.mtime);
+                    }
+                }
+            }
+            return memFileSystem;
+        }
+        return passiveFileSystem;
+    }
+    function getWriteFileSystem(path) {
+        if (mode === 'write-references' ||
+            (mode === 'write-tsbuildinfo' && path.endsWith('.tsbuildinfo')) ||
+            (mode === 'write-dts' &&
+                ['.tsbuildinfo', '.d.ts', '.d.ts.map'].some((prefix) => path.endsWith(prefix)))) {
+            return realFileSystem;
+        }
+        return passiveFileSystem;
+    }
+    const controlledSystem = Object.assign(Object.assign({}, typescript.sys), { useCaseSensitiveFileNames: caseSensitive, realpath(path) {
+            return getReadFileSystem(path).realPath(path);
+        },
+        fileExists(path) {
+            const stats = getReadFileSystem(path).readStats(path);
+            return !!stats && stats.isFile();
+        },
+        readFile(path, encoding) {
+            return getReadFileSystem(path).readFile(path, encoding);
+        },
+        getFileSize(path) {
+            const stats = getReadFileSystem(path).readStats(path);
+            return stats ? stats.size : 0;
+        },
+        writeFile(path, data) {
+            getWriteFileSystem(path).writeFile(path, data);
+            controlledSystem.invokeFileChanged(path);
+        },
+        deleteFile(path) {
+            getWriteFileSystem(path).deleteFile(path);
+            controlledSystem.invokeFileDeleted(path);
+        },
+        directoryExists(path) {
+            var _a;
+            return Boolean((_a = getReadFileSystem(path).readStats(path)) === null || _a === void 0 ? void 0 : _a.isDirectory());
+        },
+        createDirectory(path) {
+            getWriteFileSystem(path).createDir(path);
+            invokeDirectoryWatchers(path);
+        },
+        getDirectories(path) {
+            const dirents = getReadFileSystem(path).readDir(path);
+            return dirents
+                .filter((dirent) => dirent.isDirectory() ||
+                (dirent.isSymbolicLink() && controlledSystem.directoryExists(path_1.join(path, dirent.name))))
+                .map((dirent) => dirent.name);
+        },
+        getModifiedTime(path) {
+            const stats = getReadFileSystem(path).readStats(path);
+            if (stats) {
+                return stats.mtime;
+            }
+        },
+        setModifiedTime(path, date) {
+            getWriteFileSystem(path).updateTimes(path, date, date);
+            invokeDirectoryWatchers(path);
+            invokeFileWatchers(path, typescript.FileWatcherEventKind.Changed);
+        },
+        watchFile(path, callback) {
+            return createWatcher(fileWatcherCallbacksMap, path, callback);
+        },
+        watchDirectory(path, callback, recursive = false) {
+            return createWatcher(recursive ? recursiveDirectoryWatcherCallbacksMap : directoryWatcherCallbacksMap, path, callback);
+        }, 
+        // use immediate instead of timeout to avoid waiting 250ms for batching files changes
+        setTimeout: (callback, timeout, ...args) => {
+            const timeoutId = setImmediate(() => {
+                callback(...args);
+                timeoutCallbacks.delete(timeoutId);
+            });
+            timeoutCallbacks.add(timeoutId);
+            return timeoutId;
+        }, clearTimeout: (timeoutId) => {
+            clearImmediate(timeoutId);
+            timeoutCallbacks.delete(timeoutId);
+        }, waitForQueued() {
+            return __awaiter(this, void 0, void 0, function* () {
+                while (timeoutCallbacks.size > 0) {
+                    yield new Promise((resolve) => setImmediate(resolve));
+                }
+                isInitialRun = false;
+            });
+        },
+        invokeFileCreated(path) {
+            const normalizedPath = realFileSystem.normalizePath(path);
+            invokeFileWatchers(path, typescript.FileWatcherEventKind.Created);
+            invokeDirectoryWatchers(normalizedPath);
+            deletedFiles.set(normalizedPath, false);
+        },
+        invokeFileChanged(path) {
+            const normalizedPath = realFileSystem.normalizePath(path);
+            if (deletedFiles.get(normalizedPath) || !fileWatcherCallbacksMap.has(normalizedPath)) {
+                invokeFileWatchers(path, typescript.FileWatcherEventKind.Created);
+                invokeDirectoryWatchers(normalizedPath);
+                deletedFiles.set(normalizedPath, false);
+            }
+            else {
+                invokeFileWatchers(path, typescript.FileWatcherEventKind.Changed);
+            }
+        },
+        invokeFileDeleted(path) {
+            const normalizedPath = realFileSystem.normalizePath(path);
+            if (!deletedFiles.get(normalizedPath)) {
+                invokeFileWatchers(path, typescript.FileWatcherEventKind.Deleted);
+                invokeDirectoryWatchers(path);
+                deletedFiles.set(normalizedPath, true);
+            }
+        },
+        clearCache() {
+            realFileSystem.clearCache();
+            memFileSystem.clearCache();
+            passiveFileSystem.clearCache();
+        },
+        setArtifacts(nextArtifacts) {
+            artifacts = nextArtifacts;
+        } });
+    return controlledSystem;
+}
+exports.createControlledTypeScriptSystem = createControlledTypeScriptSystem;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledWatchCompilerHost.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledWatchCompilerHost.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledWatchCompilerHost.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+import type * as ts from 'typescript';
+import { TypeScriptHostExtension } from '../extension/TypeScriptExtension';
+import { ControlledTypeScriptSystem } from './ControlledTypeScriptSystem';
+declare function createControlledWatchCompilerHost<TProgram extends ts.BuilderProgram>(typescript: typeof ts, parsedCommandLine: ts.ParsedCommandLine, system: ControlledTypeScriptSystem, createProgram?: ts.CreateProgram<TProgram>, reportDiagnostic?: ts.DiagnosticReporter, reportWatchStatus?: ts.WatchStatusReporter, afterProgramCreate?: (program: TProgram) => void, hostExtensions?: TypeScriptHostExtension[]): ts.WatchCompilerHostOfFilesAndCompilerOptions<TProgram>;
+export { createControlledWatchCompilerHost };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledWatchCompilerHost.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledWatchCompilerHost.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledWatchCompilerHost.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,28 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function createControlledWatchCompilerHost(typescript, parsedCommandLine, system, createProgram, reportDiagnostic, reportWatchStatus, afterProgramCreate, hostExtensions = []) {
+    const baseWatchCompilerHost = typescript.createWatchCompilerHost(parsedCommandLine.fileNames, parsedCommandLine.options, system, createProgram, reportDiagnostic, reportWatchStatus, parsedCommandLine.projectReferences);
+    let controlledWatchCompilerHost = Object.assign(Object.assign({}, baseWatchCompilerHost), { createProgram(rootNames, options, compilerHost, oldProgram, configFileParsingDiagnostics, projectReferences) {
+            hostExtensions.forEach((hostExtension) => {
+                if (compilerHost && hostExtension.extendCompilerHost) {
+                    compilerHost = hostExtension.extendCompilerHost(compilerHost, parsedCommandLine);
+                }
+            });
+            return baseWatchCompilerHost.createProgram(rootNames, options, compilerHost, oldProgram, configFileParsingDiagnostics, projectReferences);
+        },
+        afterProgramCreate(program) {
+            if (afterProgramCreate) {
+                afterProgramCreate(program);
+            }
+        },
+        onWatchStatusChange() {
+            // do nothing
+        }, watchFile: system.watchFile, watchDirectory: system.watchDirectory, setTimeout: system.setTimeout, clearTimeout: system.clearTimeout, fileExists: system.fileExists, readFile: system.readFile, directoryExists: system.directoryExists, getDirectories: system.getDirectories, realpath: system.realpath });
+    hostExtensions.forEach((hostExtension) => {
+        if (hostExtension.extendWatchCompilerHost) {
+            controlledWatchCompilerHost = hostExtension.extendWatchCompilerHost(controlledWatchCompilerHost, parsedCommandLine);
+        }
+    });
+    return controlledWatchCompilerHost;
+}
+exports.createControlledWatchCompilerHost = createControlledWatchCompilerHost;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledWatchSolutionBuilderHost.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledWatchSolutionBuilderHost.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledWatchSolutionBuilderHost.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+import type * as ts from 'typescript';
+import { TypeScriptHostExtension } from '../extension/TypeScriptExtension';
+import { ControlledTypeScriptSystem } from './ControlledTypeScriptSystem';
+declare function createControlledWatchSolutionBuilderHost<TProgram extends ts.BuilderProgram>(typescript: typeof ts, parsedCommandLine: ts.ParsedCommandLine, system: ControlledTypeScriptSystem, createProgram?: ts.CreateProgram<TProgram>, reportDiagnostic?: ts.DiagnosticReporter, reportWatchStatus?: ts.WatchStatusReporter, reportSolutionBuilderStatus?: (diagnostic: ts.Diagnostic) => void, afterProgramCreate?: (program: TProgram) => void, afterProgramEmitAndDiagnostics?: (program: TProgram) => void, hostExtensions?: TypeScriptHostExtension[]): ts.SolutionBuilderWithWatchHost<TProgram>;
+export { createControlledWatchSolutionBuilderHost };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledWatchSolutionBuilderHost.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledWatchSolutionBuilderHost.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/ControlledWatchSolutionBuilderHost.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,50 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const ControlledWatchCompilerHost_1 = require("./ControlledWatchCompilerHost");
+function createControlledWatchSolutionBuilderHost(typescript, parsedCommandLine, system, createProgram, reportDiagnostic, reportWatchStatus, reportSolutionBuilderStatus, afterProgramCreate, afterProgramEmitAndDiagnostics, hostExtensions = []) {
+    const controlledWatchCompilerHost = ControlledWatchCompilerHost_1.createControlledWatchCompilerHost(typescript, parsedCommandLine, system, createProgram, reportDiagnostic, reportWatchStatus, afterProgramCreate, hostExtensions);
+    let controlledWatchSolutionBuilderHost = Object.assign(Object.assign({}, controlledWatchCompilerHost), { reportDiagnostic(diagnostic) {
+            if (reportDiagnostic) {
+                reportDiagnostic(diagnostic);
+            }
+        },
+        reportSolutionBuilderStatus(diagnostic) {
+            if (reportSolutionBuilderStatus) {
+                reportSolutionBuilderStatus(diagnostic);
+            }
+        },
+        afterProgramEmitAndDiagnostics(program) {
+            if (afterProgramEmitAndDiagnostics) {
+                afterProgramEmitAndDiagnostics(program);
+            }
+        },
+        createDirectory(path) {
+            system.createDirectory(path);
+        },
+        writeFile(path, data) {
+            system.writeFile(path, data);
+        },
+        getModifiedTime(fileName) {
+            return system.getModifiedTime(fileName);
+        },
+        setModifiedTime(fileName, date) {
+            system.setModifiedTime(fileName, date);
+        },
+        deleteFile(fileName) {
+            system.deleteFile(fileName);
+        },
+        getParsedCommandLine(fileName) {
+            return typescript.getParsedCommandLineOfConfigFile(fileName, { skipLibCheck: true }, Object.assign(Object.assign({}, system), { onUnRecoverableConfigFileDiagnostic: (diagnostic) => {
+                    if (reportDiagnostic) {
+                        reportDiagnostic(diagnostic);
+                    }
+                } }));
+        } });
+    hostExtensions.forEach((hostExtension) => {
+        if (hostExtension.extendWatchSolutionBuilderHost) {
+            controlledWatchSolutionBuilderHost = hostExtension.extendWatchSolutionBuilderHost(controlledWatchSolutionBuilderHost, parsedCommandLine);
+        }
+    });
+    return controlledWatchSolutionBuilderHost;
+}
+exports.createControlledWatchSolutionBuilderHost = createControlledWatchSolutionBuilderHost;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptConfigurationParser.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptConfigurationParser.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptConfigurationParser.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,8 @@
+import type * as ts from 'typescript';
+import { TypeScriptConfigurationOverwrite } from '../TypeScriptConfigurationOverwrite';
+import { FilesMatch } from '../../reporter';
+declare function parseTypeScriptConfiguration(typescript: typeof ts, configFileName: string, configFileContext: string, configOverwriteJSON: TypeScriptConfigurationOverwrite, parseConfigFileHost: ts.ParseConfigFileHost): ts.ParsedCommandLine;
+declare function getDependenciesFromTypeScriptConfiguration(typescript: typeof ts, parsedConfiguration: ts.ParsedCommandLine, configFileContext: string, parseConfigFileHost: ts.ParseConfigFileHost, processedConfigFiles?: string[]): FilesMatch;
+export declare function isIncrementalCompilation(options: ts.CompilerOptions): boolean;
+declare function getArtifactsFromTypeScriptConfiguration(typescript: typeof ts, parsedConfiguration: ts.ParsedCommandLine, configFileContext: string, parseConfigFileHost: ts.ParseConfigFileHost, processedConfigFiles?: string[]): FilesMatch;
+export { parseTypeScriptConfiguration, getDependenciesFromTypeScriptConfiguration, getArtifactsFromTypeScriptConfiguration, };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptConfigurationParser.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptConfigurationParser.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptConfigurationParser.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,136 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const path_1 = require("path");
+function parseTypeScriptConfiguration(typescript, configFileName, configFileContext, configOverwriteJSON, parseConfigFileHost) {
+    const parsedConfigFileJSON = typescript.readConfigFile(configFileName, parseConfigFileHost.readFile);
+    const overwrittenConfigFileJSON = Object.assign(Object.assign(Object.assign({}, (parsedConfigFileJSON.config || {})), configOverwriteJSON), { compilerOptions: Object.assign(Object.assign({}, ((parsedConfigFileJSON.config || {}).compilerOptions || {})), (configOverwriteJSON.compilerOptions || {})) });
+    const parsedConfigFile = typescript.parseJsonConfigFileContent(overwrittenConfigFileJSON, parseConfigFileHost, configFileContext);
+    return Object.assign(Object.assign({}, parsedConfigFile), { options: Object.assign(Object.assign({}, parsedConfigFile.options), { configFilePath: configFileName }), errors: parsedConfigFileJSON.error ? [parsedConfigFileJSON.error] : parsedConfigFile.errors });
+}
+exports.parseTypeScriptConfiguration = parseTypeScriptConfiguration;
+function getDependenciesFromTypeScriptConfiguration(typescript, parsedConfiguration, configFileContext, parseConfigFileHost, processedConfigFiles = []) {
+    var _a;
+    const files = new Set(parsedConfiguration.fileNames);
+    const configFilePath = parsedConfiguration.options.configFilePath;
+    if (typeof configFilePath === 'string') {
+        files.add(configFilePath);
+    }
+    const dirs = new Set(Object.keys(parsedConfiguration.wildcardDirectories || {}));
+    const excluded = new Set((((_a = parsedConfiguration.raw) === null || _a === void 0 ? void 0 : _a.exclude) || []).map((path) => path_1.resolve(configFileContext, path)));
+    for (const projectReference of parsedConfiguration.projectReferences || []) {
+        const childConfigFilePath = typescript.resolveProjectReferencePath(projectReference);
+        const childConfigContext = path_1.dirname(childConfigFilePath);
+        if (processedConfigFiles.includes(childConfigFilePath)) {
+            // handle circular dependencies
+            continue;
+        }
+        const childParsedConfiguration = parseTypeScriptConfiguration(typescript, childConfigFilePath, childConfigContext, {}, parseConfigFileHost);
+        const childDependencies = getDependenciesFromTypeScriptConfiguration(typescript, childParsedConfiguration, childConfigContext, parseConfigFileHost, [...processedConfigFiles, childConfigFilePath]);
+        childDependencies.files.forEach((file) => {
+            files.add(file);
+        });
+        childDependencies.dirs.forEach((dir) => {
+            dirs.add(dir);
+        });
+    }
+    const extensions = [
+        typescript.Extension.Ts,
+        typescript.Extension.Tsx,
+        typescript.Extension.Js,
+        typescript.Extension.Jsx,
+        typescript.Extension.TsBuildInfo,
+    ];
+    return {
+        files: Array.from(files).map((file) => path_1.normalize(file)),
+        dirs: Array.from(dirs).map((dir) => path_1.normalize(dir)),
+        excluded: Array.from(excluded).map((path) => path_1.normalize(path)),
+        extensions: extensions,
+    };
+}
+exports.getDependenciesFromTypeScriptConfiguration = getDependenciesFromTypeScriptConfiguration;
+function isIncrementalCompilation(options) {
+    return Boolean((options.incremental || options.composite) && !options.outFile);
+}
+exports.isIncrementalCompilation = isIncrementalCompilation;
+function removeJsonExtension(path) {
+    if (path.endsWith('.json')) {
+        return path.slice(0, -'.json'.length);
+    }
+    else {
+        return path;
+    }
+}
+function getTsBuildInfoEmitOutputFilePath(typescript, options) {
+    if (typeof typescript.getTsBuildInfoEmitOutputFilePath === 'function') {
+        // old TypeScript version doesn't provides this method
+        return typescript.getTsBuildInfoEmitOutputFilePath(options);
+    }
+    // based on the implementation from typescript
+    const configFile = options.configFilePath;
+    if (!isIncrementalCompilation(options)) {
+        return undefined;
+    }
+    if (options.tsBuildInfoFile) {
+        return options.tsBuildInfoFile;
+    }
+    const outPath = options.outFile || options.out;
+    let buildInfoExtensionLess;
+    if (outPath) {
+        buildInfoExtensionLess = removeJsonExtension(outPath);
+    }
+    else {
+        if (!configFile) {
+            return undefined;
+        }
+        const configFileExtensionLess = removeJsonExtension(configFile);
+        buildInfoExtensionLess = options.outDir
+            ? options.rootDir
+                ? path_1.resolve(options.outDir, path_1.relative(options.rootDir, configFileExtensionLess))
+                : path_1.resolve(options.outDir, path_1.basename(configFileExtensionLess))
+            : configFileExtensionLess;
+    }
+    return buildInfoExtensionLess + '.tsbuildinfo';
+}
+function getArtifactsFromTypeScriptConfiguration(typescript, parsedConfiguration, configFileContext, parseConfigFileHost, processedConfigFiles = []) {
+    const files = new Set();
+    const dirs = new Set();
+    if (parsedConfiguration.fileNames.length > 0) {
+        if (parsedConfiguration.options.outFile) {
+            files.add(path_1.resolve(configFileContext, parsedConfiguration.options.outFile));
+        }
+        const tsBuildInfoPath = getTsBuildInfoEmitOutputFilePath(typescript, parsedConfiguration.options);
+        if (tsBuildInfoPath) {
+            files.add(path_1.resolve(configFileContext, tsBuildInfoPath));
+        }
+        if (parsedConfiguration.options.outDir) {
+            dirs.add(path_1.resolve(configFileContext, parsedConfiguration.options.outDir));
+        }
+    }
+    for (const projectReference of parsedConfiguration.projectReferences || []) {
+        const configFile = typescript.resolveProjectReferencePath(projectReference);
+        if (processedConfigFiles.includes(configFile)) {
+            // handle circular dependencies
+            continue;
+        }
+        const parsedConfiguration = parseTypeScriptConfiguration(typescript, configFile, path_1.dirname(configFile), {}, parseConfigFileHost);
+        const childArtifacts = getArtifactsFromTypeScriptConfiguration(typescript, parsedConfiguration, configFileContext, parseConfigFileHost, [...processedConfigFiles, configFile]);
+        childArtifacts.files.forEach((file) => {
+            files.add(file);
+        });
+        childArtifacts.dirs.forEach((dir) => {
+            dirs.add(dir);
+        });
+    }
+    const extensions = [
+        typescript.Extension.Dts,
+        typescript.Extension.Js,
+        typescript.Extension.TsBuildInfo,
+    ];
+    return {
+        files: Array.from(files).map((file) => path_1.normalize(file)),
+        dirs: Array.from(dirs).map((dir) => path_1.normalize(dir)),
+        excluded: [],
+        extensions,
+    };
+}
+exports.getArtifactsFromTypeScriptConfiguration = getArtifactsFromTypeScriptConfiguration;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporter.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporter.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+import { Reporter } from '../../reporter';
+import { TypeScriptReporterConfiguration } from '../TypeScriptReporterConfiguration';
+declare function createTypeScriptReporter(configuration: TypeScriptReporterConfiguration): Reporter;
+export { createTypeScriptReporter };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporter.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporter.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,352 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const path_1 = __importDefault(require("path"));
+const TypeScriptIssueFactory_1 = require("../issue/TypeScriptIssueFactory");
+const ControlledWatchCompilerHost_1 = require("./ControlledWatchCompilerHost");
+const TypeScriptVueExtension_1 = require("../extension/vue/TypeScriptVueExtension");
+const ControlledWatchSolutionBuilderHost_1 = require("./ControlledWatchSolutionBuilderHost");
+const ControlledTypeScriptSystem_1 = require("./ControlledTypeScriptSystem");
+const TypeScriptConfigurationParser_1 = require("./TypeScriptConfigurationParser");
+const Performance_1 = require("../../profile/Performance");
+const TypeScriptPerformance_1 = require("../profile/TypeScriptPerformance");
+function createTypeScriptReporter(configuration) {
+    let parsedConfiguration;
+    let parseConfigurationDiagnostics = [];
+    let dependencies;
+    let artifacts;
+    let configurationChanged = false;
+    let watchCompilerHost;
+    let watchSolutionBuilderHost;
+    let watchProgram;
+    let solutionBuilder;
+    let shouldUpdateRootFiles = false;
+    // eslint-disable-next-line @typescript-eslint/no-var-requires
+    const typescript = require(configuration.typescriptPath);
+    const extensions = [];
+    const system = ControlledTypeScriptSystem_1.createControlledTypeScriptSystem(typescript, configuration.mode);
+    const diagnosticsPerProject = new Map();
+    const performance = TypeScriptPerformance_1.connectTypeScriptPerformance(typescript, Performance_1.createPerformance());
+    if (configuration.extensions.vue.enabled) {
+        extensions.push(TypeScriptVueExtension_1.createTypeScriptVueExtension(configuration.extensions.vue));
+    }
+    function getConfigFilePathFromCompilerOptions(compilerOptions) {
+        return compilerOptions.configFilePath;
+    }
+    function getProjectNameOfBuilderProgram(builderProgram) {
+        return getConfigFilePathFromCompilerOptions(builderProgram.getProgram().getCompilerOptions());
+    }
+    function getTracing() {
+        // eslint-disable-next-line @typescript-eslint/no-explicit-any
+        return typescript.tracing;
+    }
+    function getDiagnosticsOfBuilderProgram(builderProgram) {
+        const diagnostics = [];
+        if (configuration.diagnosticOptions.syntactic) {
+            performance.markStart('Syntactic Diagnostics');
+            diagnostics.push(...builderProgram.getSyntacticDiagnostics());
+            performance.markEnd('Syntactic Diagnostics');
+        }
+        if (configuration.diagnosticOptions.global) {
+            performance.markStart('Global Diagnostics');
+            diagnostics.push(...builderProgram.getGlobalDiagnostics());
+            performance.markEnd('Global Diagnostics');
+        }
+        if (configuration.diagnosticOptions.semantic) {
+            performance.markStart('Semantic Diagnostics');
+            diagnostics.push(...builderProgram.getSemanticDiagnostics());
+            performance.markEnd('Semantic Diagnostics');
+        }
+        if (configuration.diagnosticOptions.declaration) {
+            performance.markStart('Declaration Diagnostics');
+            diagnostics.push(...builderProgram.getDeclarationDiagnostics());
+            performance.markEnd('Declaration Diagnostics');
+        }
+        return diagnostics;
+    }
+    function emitTsBuildInfoFileForBuilderProgram(builderProgram) {
+        if (configuration.mode !== 'readonly' &&
+            parsedConfiguration &&
+            TypeScriptConfigurationParser_1.isIncrementalCompilation(parsedConfiguration.options)) {
+            const program = builderProgram.getProgram();
+            // eslint-disable-next-line @typescript-eslint/no-explicit-any
+            if (typeof program.emitBuildInfo === 'function') {
+                // eslint-disable-next-line @typescript-eslint/no-explicit-any
+                program.emitBuildInfo();
+            }
+        }
+    }
+    function getParseConfigFileHost() {
+        const parseConfigDiagnostics = [];
+        let parseConfigFileHost = Object.assign(Object.assign({}, system), { onUnRecoverableConfigFileDiagnostic: (diagnostic) => {
+                parseConfigDiagnostics.push(diagnostic);
+            } });
+        for (const extension of extensions) {
+            if (extension.extendParseConfigFileHost) {
+                parseConfigFileHost = extension.extendParseConfigFileHost(parseConfigFileHost);
+            }
+        }
+        return [parseConfigFileHost, parseConfigDiagnostics];
+    }
+    function parseConfiguration() {
+        const [parseConfigFileHost, parseConfigDiagnostics] = getParseConfigFileHost();
+        const parsedConfiguration = TypeScriptConfigurationParser_1.parseTypeScriptConfiguration(typescript, configuration.configFile, configuration.context, configuration.configOverwrite, parseConfigFileHost);
+        if (parsedConfiguration.errors) {
+            parseConfigDiagnostics.push(...parsedConfiguration.errors);
+        }
+        return [parsedConfiguration, parseConfigDiagnostics];
+    }
+    function parseConfigurationIfNeeded() {
+        if (!parsedConfiguration) {
+            [parsedConfiguration, parseConfigurationDiagnostics] = parseConfiguration();
+        }
+        return parsedConfiguration;
+    }
+    function getDependencies() {
+        parsedConfiguration = parseConfigurationIfNeeded();
+        const [parseConfigFileHost] = getParseConfigFileHost();
+        let dependencies = TypeScriptConfigurationParser_1.getDependenciesFromTypeScriptConfiguration(typescript, parsedConfiguration, configuration.context, parseConfigFileHost);
+        for (const extension of extensions) {
+            if (extension.extendDependencies) {
+                dependencies = extension.extendDependencies(dependencies);
+            }
+        }
+        return dependencies;
+    }
+    function getArtifacts() {
+        parsedConfiguration = parseConfigurationIfNeeded();
+        const [parseConfigFileHost] = getParseConfigFileHost();
+        return TypeScriptConfigurationParser_1.getArtifactsFromTypeScriptConfiguration(typescript, parsedConfiguration, configuration.context, parseConfigFileHost);
+    }
+    function getArtifactsIfNeeded() {
+        if (!artifacts) {
+            artifacts = getArtifacts();
+        }
+        return artifacts;
+    }
+    function startProfilingIfNeeded() {
+        if (configuration.profile) {
+            performance.enable();
+        }
+    }
+    function stopProfilingIfNeeded() {
+        if (configuration.profile) {
+            performance.print();
+            performance.disable();
+        }
+    }
+    function startTracingIfNeeded(compilerOptions) {
+        const tracing = getTracing();
+        if (compilerOptions.generateTrace && tracing) {
+            tracing.startTracing(getConfigFilePathFromCompilerOptions(compilerOptions), compilerOptions.generateTrace, configuration.build);
+        }
+    }
+    function stopTracingIfNeeded(program) {
+        const tracing = getTracing();
+        const compilerOptions = program.getCompilerOptions();
+        if (compilerOptions.generateTrace && tracing) {
+            // eslint-disable-next-line @typescript-eslint/no-explicit-any
+            tracing.stopTracing(program.getProgram().getTypeCatalog());
+        }
+    }
+    function dumpTracingLegendIfNeeded() {
+        const tracing = getTracing();
+        if (tracing) {
+            tracing.dumpLegend();
+        }
+    }
+    return {
+        getReport: ({ changedFiles = [], deletedFiles = [] }) => __awaiter(this, void 0, void 0, function* () {
+            // clear cache to be ready for next iteration and to free memory
+            system.clearCache();
+            if ([...changedFiles, ...deletedFiles]
+                .map((affectedFile) => path_1.default.normalize(affectedFile))
+                .includes(path_1.default.normalize(configuration.configFile))) {
+                // we need to re-create programs
+                parsedConfiguration = undefined;
+                dependencies = undefined;
+                artifacts = undefined;
+                watchCompilerHost = undefined;
+                watchSolutionBuilderHost = undefined;
+                watchProgram = undefined;
+                solutionBuilder = undefined;
+                diagnosticsPerProject.clear();
+                configurationChanged = true;
+            }
+            else {
+                const previousDependencies = dependencies;
+                [parsedConfiguration, parseConfigurationDiagnostics] = parseConfiguration();
+                dependencies = getDependencies();
+                if (previousDependencies &&
+                    JSON.stringify(previousDependencies) !== JSON.stringify(dependencies)) {
+                    // dependencies changed - we need to recompute artifacts
+                    artifacts = getArtifacts();
+                    shouldUpdateRootFiles = true;
+                }
+            }
+            parsedConfiguration = parseConfigurationIfNeeded();
+            system.setArtifacts(getArtifactsIfNeeded());
+            if (configurationChanged) {
+                configurationChanged = false;
+                // try to remove outdated .tsbuildinfo file for incremental mode
+                if (typeof typescript.getTsBuildInfoEmitOutputFilePath === 'function' &&
+                    configuration.mode !== 'readonly' &&
+                    parsedConfiguration.options.incremental) {
+                    const tsBuildInfoPath = typescript.getTsBuildInfoEmitOutputFilePath(parsedConfiguration.options);
+                    if (tsBuildInfoPath) {
+                        try {
+                            system.deleteFile(tsBuildInfoPath);
+                        }
+                        catch (error) {
+                            // silent
+                        }
+                    }
+                }
+            }
+            return {
+                getDependencies() {
+                    return __awaiter(this, void 0, void 0, function* () {
+                        if (!dependencies) {
+                            dependencies = getDependencies();
+                        }
+                        return dependencies;
+                    });
+                },
+                getIssues() {
+                    return __awaiter(this, void 0, void 0, function* () {
+                        startProfilingIfNeeded();
+                        parsedConfiguration = parseConfigurationIfNeeded();
+                        // report configuration diagnostics and exit
+                        if (parseConfigurationDiagnostics.length) {
+                            let issues = TypeScriptIssueFactory_1.createIssuesFromTsDiagnostics(typescript, parseConfigurationDiagnostics);
+                            issues.forEach((issue) => {
+                                if (!issue.file) {
+                                    issue.file = configuration.configFile;
+                                }
+                            });
+                            extensions.forEach((extension) => {
+                                if (extension.extendIssues) {
+                                    issues = extension.extendIssues(issues);
+                                }
+                            });
+                            return issues;
+                        }
+                        if (configuration.build) {
+                            // solution builder case
+                            // ensure watch solution builder host exists
+                            if (!watchSolutionBuilderHost) {
+                                performance.markStart('Create Solution Builder Host');
+                                watchSolutionBuilderHost = ControlledWatchSolutionBuilderHost_1.createControlledWatchSolutionBuilderHost(typescript, parsedConfiguration, system, (rootNames, compilerOptions, host, oldProgram, configFileParsingDiagnostics, projectReferences) => {
+                                    if (compilerOptions) {
+                                        startTracingIfNeeded(compilerOptions);
+                                    }
+                                    return typescript.createSemanticDiagnosticsBuilderProgram(rootNames, compilerOptions, host, oldProgram, configFileParsingDiagnostics, projectReferences);
+                                }, undefined, undefined, undefined, undefined, (builderProgram) => {
+                                    const projectName = getProjectNameOfBuilderProgram(builderProgram);
+                                    const diagnostics = getDiagnosticsOfBuilderProgram(builderProgram);
+                                    // update diagnostics
+                                    diagnosticsPerProject.set(projectName, diagnostics);
+                                    // emit .tsbuildinfo file if needed
+                                    emitTsBuildInfoFileForBuilderProgram(builderProgram);
+                                    stopTracingIfNeeded(builderProgram);
+                                }, extensions);
+                                performance.markEnd('Create Solution Builder Host');
+                                solutionBuilder = undefined;
+                            }
+                            // ensure solution builder exists and is up-to-date
+                            if (!solutionBuilder || shouldUpdateRootFiles) {
+                                // not sure if it's the best option - maybe there is a smarter way to do this
+                                shouldUpdateRootFiles = false;
+                                performance.markStart('Create Solution Builder');
+                                solutionBuilder = typescript.createSolutionBuilderWithWatch(watchSolutionBuilderHost, [configuration.configFile], {});
+                                performance.markEnd('Create Solution Builder');
+                                performance.markStart('Build Solutions');
+                                solutionBuilder.build();
+                                performance.markEnd('Build Solutions');
+                            }
+                        }
+                        else {
+                            // watch compiler case
+                            // ensure watch compiler host exists
+                            if (!watchCompilerHost) {
+                                performance.markStart('Create Watch Compiler Host');
+                                watchCompilerHost = ControlledWatchCompilerHost_1.createControlledWatchCompilerHost(typescript, parsedConfiguration, system, (rootNames, compilerOptions, host, oldProgram, configFileParsingDiagnostics, projectReferences) => {
+                                    if (compilerOptions) {
+                                        startTracingIfNeeded(compilerOptions);
+                                    }
+                                    return typescript.createSemanticDiagnosticsBuilderProgram(rootNames, compilerOptions, host, oldProgram, configFileParsingDiagnostics, projectReferences);
+                                }, undefined, undefined, (builderProgram) => {
+                                    const projectName = getProjectNameOfBuilderProgram(builderProgram);
+                                    const diagnostics = getDiagnosticsOfBuilderProgram(builderProgram);
+                                    // update diagnostics
+                                    diagnosticsPerProject.set(projectName, diagnostics);
+                                    // emit .tsbuildinfo file if needed
+                                    emitTsBuildInfoFileForBuilderProgram(builderProgram);
+                                    stopTracingIfNeeded(builderProgram);
+                                }, extensions);
+                                performance.markEnd('Create Watch Compiler Host');
+                                watchProgram = undefined;
+                            }
+                            // ensure watch program exists
+                            if (!watchProgram) {
+                                performance.markStart('Create Watch Program');
+                                watchProgram = typescript.createWatchProgram(watchCompilerHost);
+                                performance.markEnd('Create Watch Program');
+                            }
+                            if (shouldUpdateRootFiles && (dependencies === null || dependencies === void 0 ? void 0 : dependencies.files)) {
+                                // we have to update root files manually as don't use config file as a program input
+                                watchProgram.updateRootFileNames(dependencies.files);
+                                shouldUpdateRootFiles = false;
+                            }
+                        }
+                        changedFiles.forEach((changedFile) => {
+                            if (system) {
+                                system.invokeFileChanged(changedFile);
+                            }
+                        });
+                        deletedFiles.forEach((removedFile) => {
+                            if (system) {
+                                system.invokeFileDeleted(removedFile);
+                            }
+                        });
+                        // wait for all queued events to be processed
+                        performance.markStart('Queued Tasks');
+                        yield system.waitForQueued();
+                        performance.markEnd('Queued Tasks');
+                        // aggregate all diagnostics and map them to issues
+                        const diagnostics = [];
+                        diagnosticsPerProject.forEach((projectDiagnostics) => {
+                            diagnostics.push(...projectDiagnostics);
+                        });
+                        let issues = TypeScriptIssueFactory_1.createIssuesFromTsDiagnostics(typescript, diagnostics);
+                        extensions.forEach((extension) => {
+                            if (extension.extendIssues) {
+                                issues = extension.extendIssues(issues);
+                            }
+                        });
+                        dumpTracingLegendIfNeeded();
+                        stopProfilingIfNeeded();
+                        return issues;
+                    });
+                },
+                close() {
+                    return __awaiter(this, void 0, void 0, function* () {
+                        // do nothing
+                    });
+                },
+            };
+        }),
+    };
+}
+exports.createTypeScriptReporter = createTypeScriptReporter;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporterRpcClient.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporterRpcClient.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporterRpcClient.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+import { TypeScriptReporterConfiguration } from '../TypeScriptReporterConfiguration';
+import { ReporterRpcClient } from '../../reporter';
+declare function createTypeScriptReporterRpcClient(configuration: TypeScriptReporterConfiguration): ReporterRpcClient;
+export { createTypeScriptReporterRpcClient };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporterRpcClient.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporterRpcClient.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporterRpcClient.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,13 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const path_1 = __importDefault(require("path"));
+const reporter_1 = require("../../reporter");
+const rpc_ipc_1 = require("../../rpc/rpc-ipc");
+function createTypeScriptReporterRpcClient(configuration) {
+    const channel = rpc_ipc_1.createRpcIpcMessageChannel(path_1.default.resolve(__dirname, './TypeScriptReporterRpcService.js'), configuration.memoryLimit);
+    return reporter_1.createReporterRpcClient(channel, configuration);
+}
+exports.createTypeScriptReporterRpcClient = createTypeScriptReporterRpcClient;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporterRpcService.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporterRpcService.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporterRpcService.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+export {};
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporterRpcService.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporterRpcService.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/typescript-reporter/reporter/TypeScriptReporterRpcService.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,11 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const process_1 = __importDefault(require("process"));
+const TypeScriptReporter_1 = require("./TypeScriptReporter");
+const rpc_ipc_1 = require("../../rpc/rpc-ipc");
+const reporter_1 = require("../../reporter");
+const service = reporter_1.registerReporterRpcService(rpc_ipc_1.createRpcIpcMessagePort(process_1.default), TypeScriptReporter_1.createTypeScriptReporter);
+service.open();
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/flatten.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/flatten.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/flatten.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+declare function flatten<T>(matrix: T[][]): T[];
+export default flatten;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/flatten.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/flatten.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/flatten.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function flatten(matrix) {
+    return matrix.reduce((flatten, array) => flatten.concat(array), []);
+}
+exports.default = flatten;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/intersect.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/intersect.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/intersect.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+declare function intersect<T>(arrayA?: T[], arrayB?: T[]): T[];
+export default intersect;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/intersect.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/intersect.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/intersect.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function intersect(arrayA = [], arrayB = []) {
+    return arrayA.filter((item) => arrayB.includes(item));
+}
+exports.default = intersect;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/substract.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/substract.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/substract.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+declare function subtract<T>(arrayA?: T[], arrayB?: T[]): T[];
+export default subtract;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/substract.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/substract.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/substract.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function subtract(arrayA = [], arrayB = []) {
+    return arrayA.filter((item) => !arrayB.includes(item));
+}
+exports.default = subtract;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/unique.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/unique.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/unique.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+declare function unique<T>(array: T[]): T[];
+export default unique;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/unique.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/unique.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/array/unique.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function unique(array) {
+    return Array.from(new Set(array));
+}
+exports.default = unique;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/isPending.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/isPending.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/isPending.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+declare function isPending(promise: Promise<unknown>, timeout?: number): Promise<unknown>;
+export default isPending;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/isPending.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/isPending.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/isPending.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function isPending(promise, timeout = 100) {
+    return Promise.race([
+        promise.then(() => false).catch(() => false),
+        new Promise((resolve) => setTimeout(() => resolve(true), timeout)),
+    ]);
+}
+exports.default = isPending;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/pool.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/pool.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/pool.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,8 @@
+declare type Task<T> = (done: () => void) => Promise<T>;
+interface Pool {
+    submit<T>(task: Task<T>): Promise<T>;
+    size: number;
+    readonly pending: number;
+}
+declare function createPool(size: number): Pool;
+export { Pool, createPool };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/pool.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/pool.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/pool.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,45 @@
+"use strict";
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
+    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+    return new (P || (P = Promise))(function (resolve, reject) {
+        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+        step((generator = generator.apply(thisArg, _arguments || [])).next());
+    });
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+function createPool(size) {
+    let pendingPromises = [];
+    const pool = {
+        submit(task) {
+            return __awaiter(this, void 0, void 0, function* () {
+                while (pendingPromises.length >= pool.size) {
+                    yield Promise.race(pendingPromises).catch(() => undefined);
+                }
+                let resolve;
+                let reject;
+                const taskPromise = new Promise((taskResolve, taskReject) => {
+                    resolve = taskResolve;
+                    reject = taskReject;
+                });
+                const donePromise = new Promise((doneResolve) => {
+                    task(() => {
+                        doneResolve(undefined);
+                        pendingPromises = pendingPromises.filter((pendingPromise) => pendingPromise !== donePromise);
+                    })
+                        .then(resolve)
+                        .catch(reject);
+                });
+                pendingPromises.push(donePromise);
+                return taskPromise;
+            });
+        },
+        size,
+        get pending() {
+            return pendingPromises.length;
+        },
+    };
+    return pool;
+}
+exports.createPool = createPool;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/wait.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/wait.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/wait.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+declare function wait(timeout: number): Promise<unknown>;
+export default wait;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/wait.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/wait.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/async/wait.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+function wait(timeout) {
+    return new Promise((resolve) => setTimeout(resolve, timeout));
+}
+exports.default = wait;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/path/forwardSlash.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/path/forwardSlash.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/path/forwardSlash.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+/**
+ * Replaces backslashes with one forward slash
+ * @param input
+ */
+declare function forwardSlash(input: string): string;
+export default forwardSlash;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/path/forwardSlash.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/path/forwardSlash.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/utils/path/forwardSlash.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,14 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const path_1 = __importDefault(require("path"));
+/**
+ * Replaces backslashes with one forward slash
+ * @param input
+ */
+function forwardSlash(input) {
+    return path_1.default.normalize(input).replace(/\\+/g, '/');
+}
+exports.default = forwardSlash;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/CompilerWithWatchFileSystem.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/CompilerWithWatchFileSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/CompilerWithWatchFileSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+import webpack from 'webpack';
+import { WatchFileSystem } from './WatchFileSystem';
+interface CompilerWithWatchFileSystem<TWatchFileSystem extends WatchFileSystem = WatchFileSystem> extends webpack.Compiler {
+    watchFileSystem?: TWatchFileSystem;
+}
+export { CompilerWithWatchFileSystem };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/CompilerWithWatchFileSystem.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/CompilerWithWatchFileSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/CompilerWithWatchFileSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/InclusiveNodeWatchFileSystem.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/InclusiveNodeWatchFileSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/InclusiveNodeWatchFileSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,15 @@
+import { ForkTsCheckerWebpackPluginState } from '../ForkTsCheckerWebpackPluginState';
+import { FSWatcher } from 'chokidar';
+import { Watcher, WatchFileSystem, WatchFileSystemOptions } from './WatchFileSystem';
+import { Compiler } from 'webpack';
+declare class InclusiveNodeWatchFileSystem implements WatchFileSystem {
+    private watchFileSystem;
+    private compiler;
+    private pluginState;
+    get watcher(): import("./WatchFileSystem").Watchpack;
+    readonly dirsWatchers: Map<string, FSWatcher | undefined>;
+    constructor(watchFileSystem: WatchFileSystem, compiler: Compiler, pluginState: ForkTsCheckerWebpackPluginState);
+    private paused;
+    watch(files: Iterable<string>, dirs: Iterable<string>, missing: Iterable<string>, startTime?: number, options?: Partial<WatchFileSystemOptions>, callback?: Function, callbackUndelayed?: Function): Watcher;
+}
+export { InclusiveNodeWatchFileSystem };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/InclusiveNodeWatchFileSystem.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/InclusiveNodeWatchFileSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/InclusiveNodeWatchFileSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,135 @@
+"use strict";
+var __importDefault = (this && this.__importDefault) || function (mod) {
+    return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", { value: true });
+const chokidar_1 = __importDefault(require("chokidar"));
+const path_1 = require("path");
+const reporter_1 = require("../reporter");
+const minimatch_1 = __importDefault(require("minimatch"));
+const BUILTIN_IGNORED_DIRS = ['node_modules', '.git', '.yarn', '.pnp'];
+function createIsIgnored(ignored, excluded) {
+    const ignoredPatterns = ignored ? (Array.isArray(ignored) ? ignored : [ignored]) : [];
+    const ignoredFunctions = ignoredPatterns.map((pattern) => {
+        // ensure patterns are valid - see https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/issues/594
+        if (typeof pattern === 'string') {
+            return (path) => minimatch_1.default(path, pattern);
+        }
+        else if (typeof pattern === 'function') {
+            return pattern;
+        }
+        else if (pattern instanceof RegExp) {
+            return (path) => pattern.test(path);
+        }
+        else {
+            // fallback to no-ignore function
+            return () => false;
+        }
+    });
+    ignoredFunctions.push((path) => excluded.some((excludedPath) => path.startsWith(excludedPath)));
+    ignoredFunctions.push((path) => BUILTIN_IGNORED_DIRS.some((ignoredDir) => path.includes(`/${ignoredDir}/`) || path.includes(`\\${ignoredDir}\\`)));
+    return function isIgnored(path) {
+        return ignoredFunctions.some((ignoredFunction) => ignoredFunction(path));
+    };
+}
+class InclusiveNodeWatchFileSystem {
+    constructor(watchFileSystem, compiler, pluginState) {
+        this.watchFileSystem = watchFileSystem;
+        this.compiler = compiler;
+        this.pluginState = pluginState;
+        this.paused = true;
+        this.dirsWatchers = new Map();
+    }
+    get watcher() {
+        var _a;
+        return this.watchFileSystem.watcher || ((_a = this.watchFileSystem.wfs) === null || _a === void 0 ? void 0 : _a.watcher);
+    }
+    watch(files, dirs, missing, startTime, options, callback, callbackUndelayed) {
+        var _a, _b, _c, _d;
+        reporter_1.clearFilesChange(this.compiler);
+        const isIgnored = createIsIgnored(options === null || options === void 0 ? void 0 : options.ignored, ((_a = this.pluginState.lastDependencies) === null || _a === void 0 ? void 0 : _a.excluded) || []);
+        // use standard watch file system for files and missing
+        const standardWatcher = this.watchFileSystem.watch(files, dirs, missing, startTime, options, callback, callbackUndelayed);
+        (_b = this.watcher) === null || _b === void 0 ? void 0 : _b.on('change', (file) => {
+            if (typeof file === 'string' && !isIgnored(file)) {
+                reporter_1.updateFilesChange(this.compiler, { changedFiles: [file] });
+            }
+        });
+        (_c = this.watcher) === null || _c === void 0 ? void 0 : _c.on('remove', (file) => {
+            if (typeof file === 'string' && !isIgnored(file)) {
+                reporter_1.updateFilesChange(this.compiler, { deletedFiles: [file] });
+            }
+        });
+        // calculate what to change
+        const prevDirs = Array.from(this.dirsWatchers.keys());
+        const nextDirs = Array.from(((_d = this.pluginState.lastDependencies) === null || _d === void 0 ? void 0 : _d.dirs) || []);
+        const dirsToUnwatch = prevDirs.filter((prevDir) => !nextDirs.includes(prevDir));
+        const dirsToWatch = nextDirs.filter((nextDir) => !prevDirs.includes(nextDir) && !isIgnored(nextDir));
+        // update dirs watcher
+        dirsToUnwatch.forEach((dirToUnwatch) => {
+            var _a;
+            (_a = this.dirsWatchers.get(dirToUnwatch)) === null || _a === void 0 ? void 0 : _a.close();
+            this.dirsWatchers.delete(dirToUnwatch);
+        });
+        dirsToWatch.forEach((dirToWatch) => {
+            const interval = typeof (options === null || options === void 0 ? void 0 : options.poll) === 'number' ? options.poll : undefined;
+            const dirWatcher = chokidar_1.default.watch(dirToWatch, {
+                ignoreInitial: true,
+                ignorePermissionErrors: true,
+                ignored: (path) => isIgnored(path),
+                usePolling: (options === null || options === void 0 ? void 0 : options.poll) ? true : undefined,
+                interval: interval,
+                binaryInterval: interval,
+                alwaysStat: true,
+                atomic: true,
+                awaitWriteFinish: true,
+            });
+            dirWatcher.on('add', (file, stats) => {
+                var _a, _b;
+                if (this.paused) {
+                    return;
+                }
+                const extension = path_1.extname(file);
+                const supportedExtensions = ((_a = this.pluginState.lastDependencies) === null || _a === void 0 ? void 0 : _a.extensions) || [];
+                if (!supportedExtensions.includes(extension)) {
+                    return;
+                }
+                reporter_1.updateFilesChange(this.compiler, { changedFiles: [file] });
+                const mtime = (stats === null || stats === void 0 ? void 0 : stats.mtimeMs) || (stats === null || stats === void 0 ? void 0 : stats.ctimeMs) || 1;
+                (_b = this.watcher) === null || _b === void 0 ? void 0 : _b._onChange(dirToWatch, mtime, file, 'rename');
+            });
+            dirWatcher.on('unlink', (file) => {
+                var _a, _b;
+                if (this.paused) {
+                    return;
+                }
+                const extension = path_1.extname(file);
+                const supportedExtensions = ((_a = this.pluginState.lastDependencies) === null || _a === void 0 ? void 0 : _a.extensions) || [];
+                if (!supportedExtensions.includes(extension)) {
+                    return;
+                }
+                reporter_1.updateFilesChange(this.compiler, { deletedFiles: [file] });
+                (_b = this.watcher) === null || _b === void 0 ? void 0 : _b._onRemove(dirToWatch, file, 'rename');
+            });
+            this.dirsWatchers.set(dirToWatch, dirWatcher);
+        });
+        this.paused = false;
+        return Object.assign(Object.assign({}, standardWatcher), { close: () => {
+                reporter_1.clearFilesChange(this.compiler);
+                if (standardWatcher) {
+                    standardWatcher.close();
+                }
+                this.dirsWatchers.forEach((dirWatcher) => {
+                    dirWatcher === null || dirWatcher === void 0 ? void 0 : dirWatcher.close();
+                });
+                this.dirsWatchers.clear();
+                this.paused = true;
+            }, pause: () => {
+                if (standardWatcher) {
+                    standardWatcher.pause();
+                }
+                this.paused = true;
+            } });
+    }
+}
+exports.InclusiveNodeWatchFileSystem = InclusiveNodeWatchFileSystem;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/WatchFileSystem.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/WatchFileSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/WatchFileSystem.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,33 @@
+/// <reference types="node" />
+import { EventEmitter } from 'events';
+interface WatchFileSystemOptions {
+    aggregateTimeout: number;
+    poll: boolean;
+    followSymlinks: boolean;
+    ignored: string | RegExp | Function | (string | RegExp | Function)[];
+}
+interface Watchpack extends EventEmitter {
+    _onChange(item: string, mtime: number, file: string, type?: string): void;
+    _onRemove(item: string, file: string, type?: string): void;
+}
+interface WatcherV4 {
+    close(): void;
+    pause(): void;
+    getFileTimestamps(): Map<string, number>;
+    getContextTimestamps(): Map<string, number>;
+}
+interface WatcherV5 {
+    close(): void;
+    pause(): void;
+    getFileTimeInfoEntries(): Map<string, number>;
+    getContextTimeInfoEntries(): Map<string, number>;
+}
+declare type Watcher = WatcherV4 | WatcherV5;
+interface WatchFileSystem {
+    watcher: Watchpack;
+    wfs?: {
+        watcher: Watchpack;
+    };
+    watch(files: Iterable<string>, dirs: Iterable<string>, missing: Iterable<string>, startTime?: number, options?: Partial<WatchFileSystemOptions>, callback?: Function, callbackUndelayed?: Function): Watcher;
+}
+export { WatchFileSystem, WatchFileSystemOptions, Watchpack, WatcherV4, WatcherV5, Watcher };
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/WatchFileSystem.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/WatchFileSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/lib/watch/WatchFileSystem.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/CHANGELOG.md
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/CHANGELOG.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/CHANGELOG.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,196 @@
+# Changelog
+
+## 6.0.0
+
+- **Breaking change:** The package now has named exports. See examples below.
+- **Breaking change:** Separate async and sync APIs, accessible from different named exports. If you used `explorer.searchSync()` or `explorer.loadSync()`, you'll now create a sync explorer with `cosmiconfigSync()`, then use `explorerSync.search()` and `explorerSync.load()`.
+
+  ```js
+  // OLD: cosmiconfig v5
+  import cosmiconfig from 'cosmiconfig';
+
+  const explorer = cosmiconfig('example');
+  const searchAsyncResult = await explorer.search();
+  const loadAsyncResult = await explorer.load('./file/to/load');
+  const searchSyncResult = explorer.searchSync();
+  const loadSyncResult = explorer.loadSync('./file/to/load');
+
+  // NEW: cosmiconfig v6
+  import { cosmiconfig, cosmiconfigSync } from 'cosmiconfig';
+
+  const explorer = cosmiconfig('example');
+  const searchAsyncResult = await explorer.search();
+  const loadAsyncResult = await explorer.load('./file/to/load');
+
+  const explorerSync = cosmiconfigSync('example');
+  const searchSyncResult = explorerSync.search();
+  const loadSyncResult = explorerSync.load('./file/to/load');
+  ```
+- **Breaking change:** Remove support for Node 4 and 6. Requires Node 8+.
+- **Breaking change:** Use npm package [yaml](https://www.npmjs.com/package/yaml) to parse YAML instead of npm package [js-yaml](https://www.npmjs.com/package/js-yaml).
+- **Breaking change:** Remove `cosmiconfig.loaders` and add named export `defaultLoaders` that exports the default loaders used for each extension.
+
+  ```js
+  import { defaultLoaders } from 'cosmiconfig';
+
+  console.log(Object.entries(defaultLoaders))
+  // [
+  //   [ '.js', [Function: loadJs] ],
+  //   [ '.json', [Function: loadJson] ],
+  //   [ '.yaml', [Function: loadYaml] ],
+  //   [ '.yml', [Function: loadYaml] ],
+  //   [ 'noExt', [Function: loadYaml] ]
+  // ]
+  ```
+- Migrate from Flowtype to Typescript.
+- Lazy load all default loaders.
+
+## 5.2.1
+
+- Chore: Upgrade `js-yaml` to avoid npm audit warning.
+
+## 5.2.0
+
+- Added: `packageProp` values can be arrays of strings, to allow for property names that include periods. (This was possible before, but not documented or deliberately supported.)
+- Chore: Replaced the `lodash.get` dependency with a locally defined function.
+- Chore: Upgrade `js-yaml` to avoid npm audit warning.
+
+## 5.1.0
+
+- Added: `packageProp` values can include periods to describe paths to nested objects within `package.json`.
+
+## 5.0.7
+
+- Fixed: JS loader bypasses Node's `require` cache, fixing a bug where updates to `.js` config files would not load even when Cosmiconfig was told not to cache.
+
+## 5.0.6
+
+- Fixed: Better error message if the end user tries an extension Cosmiconfig is not configured to understand.
+
+## 5.0.5
+
+- Fixed: `load` and `loadSync` work with paths relative to `process.cwd()`.
+
+## 5.0.4
+
+- Fixed: `rc` files with `.js` extensions included in default `searchPlaces`.
+
+## 5.0.3
+
+- Docs: Minor corrections to documentation. *Released to update package documentation on npm*.
+
+## 5.0.2
+
+- Fixed: Allow `searchSync` and `loadSync` to load JS configuration files whose export is a Promise.
+
+## 5.0.1
+
+The API has been completely revamped to increase clarity and enable a very wide range of new usage. **Please read the readme for all the details.**
+
+While the defaults remain just as useful as before — and you can still pass no options at all — now you can also do all kinds of wild and crazy things.
+
+- The `loaders` option allows you specify custom functions to derive config objects from files. Your loader functions could parse ES2015 modules or TypeScript, JSON5, even INI or XML. Whatever suits you.
+- The `searchPlaces` option allows you to specify exactly where cosmiconfig looks within each directory it searches.
+- The combination of `loaders` and `searchPlaces` means that you should be able to load pretty much any kind of configuration file you want, from wherever you want it to look.
+
+Additionally, the overloaded `load()` function has been split up into several clear and focused functions:
+
+- `search()` now searches up the directory tree, and `load()` loads a configuration file that you don't need to search for.
+- The `sync` option has been replaced with separate synchronous functions: `searchSync()` and `loadSync()`.
+- `clearFileCache()` and `clearDirectoryCache()` have been renamed to `clearLoadCache()` and `clearSearchPath()` respectively.
+
+More details:
+
+- The default JS loader uses `require`, instead of `require-from-string`. So you *could* use `require` hooks to control the loading of JS files (e.g. pass them through esm or Babel). In most cases it is probably preferable to use a custom loader.
+- The options `rc`, `js`, and `rcExtensions` have all been removed. You can accomplish the same and more with `searchPlaces`.
+- The default `searchPlaces` include `rc` files with extensions, e.g. `.thingrc.json`, `.thingrc.yaml`, `.thingrc.yml`. This is the equivalent of switching the default value of the old `rcExtensions` option to `true`.
+- The option `rcStrictJson` has been removed. To get the same effect, you can specify `noExt: cosmiconfig.loadJson` in your `loaders` object.
+- `packageProp` no longer accepts `false`. If you don't want to look in `package.json`, write a `searchPlaces` array that does not include it.
+- By default, empty files are ignored by `search()`. The new option `ignoreEmptySearchPlaces` allows you to load them, instead, in case you want to do something with empty files.
+- The option `configPath` has been removed. Just pass your filepaths directory to `load()`.
+- Removed the `format` option.  Formats are now all handled via the file extensions specified in `loaders`.
+
+(If you're wondering with happened to 5.0.0 ... it was a silly publishing mistake.)
+
+## 4.0.0
+
+- Licensing improvement: updated `parse-json` from `3.0.0` to `4.0.0`(see [sindresorhus/parse-json#12][parse-json-pr-12]).
+- Changed: error message format for `JSON` parse errors(see [#101][pr-101]). If you were relying on the format of JSON-parsing error messages, this will be a breaking change for you.
+- Changed: set default for `searchPath` as `process.cwd()` in `explorer.load`.
+
+## 3.1.0
+
+- Added: infer format based on filePath
+
+## 3.0.1
+
+- Fixed: memory leak due to bug in `require-from-string`.
+- Added: for JSON files, append position to end of error message.
+
+## 3.0.0
+
+- Removed: support for loading config path using the `--config` flag. cosmiconfig will not parse command line arguments. Your application can parse command line arguments and pass them to cosmiconfig.
+- Removed: `argv` config option.
+- Removed: support for Node versions &lt; 4.
+- Added: `sync` option.
+- Fixed: Throw a clear error on getting empty config file.
+- Fixed: when a `options.configPath` is `package.json`, return the package prop, not the entire JSON file.
+
+## 2.2.2
+
+- Fixed: `options.configPath` and `--config` flag are respected.
+
+## 2.2.0, 2.2.1
+
+- 2.2.0 included a number of improvements but somehow broke stylelint. The changes were reverted in 2.2.1, to be restored later.
+
+## 2.1.3
+
+- Licensing improvement: switched from `json-parse-helpfulerror` to `parse-json`.
+
+## 2.1.2
+
+- Fixed: bug where an `ENOENT` error would be thrown is `searchPath` referenced a non-existent file.
+- Fixed: JSON parsing errors in Node v7.
+
+## 2.1.1
+
+- Fixed: swapped `graceful-fs` for regular `fs`, fixing a garbage collection problem.
+
+## 2.1.0
+
+- Added: Node 0.12 support.
+
+## 2.0.2
+
+- Fixed: Node version specified in `package.json`.
+
+## 2.0.1
+
+- Fixed: no more infinite loop in Windows.
+
+## 2.0.0
+
+- Changed: module now creates cosmiconfig instances with `load` methods (see README).
+- Added: caching (enabled by the change above).
+- Removed: support for Node versions &lt;4.
+
+## 1.1.0
+
+- Add `rcExtensions` option.
+
+## 1.0.2
+
+- Fix handling of `require()`'s within JS module configs.
+
+## 1.0.1
+
+- Switch Promise implementation to pinkie-promise.
+
+## 1.0.0
+
+- Initial release.
+
+[parse-json-pr-12]: https://github.com/sindresorhus/parse-json/pull/12
+
+[pr-101]: https://github.com/davidtheclark/cosmiconfig/pull/101
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/LICENSE
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 David Clark
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/README.md
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,576 @@
+# cosmiconfig
+
+[![Build Status](https://img.shields.io/travis/davidtheclark/cosmiconfig/master.svg?label=unix%20build)](https://travis-ci.org/davidtheclark/cosmiconfig) [![Build status](https://img.shields.io/appveyor/ci/davidtheclark/cosmiconfig/master.svg?label=windows%20build)](https://ci.appveyor.com/project/davidtheclark/cosmiconfig/branch/master)
+[![codecov](https://codecov.io/gh/davidtheclark/cosmiconfig/branch/master/graph/badge.svg)](https://codecov.io/gh/davidtheclark/cosmiconfig)
+
+Cosmiconfig searches for and loads configuration for your program.
+
+It features smart defaults based on conventional expectations in the JavaScript ecosystem.
+But it's also flexible enough to search wherever you'd like to search, and load whatever you'd like to load.
+
+By default, Cosmiconfig will start where you tell it to start and search up the directory tree for the following:
+
+- a `package.json` property
+- a JSON or YAML, extensionless "rc file"
+- an "rc file" with the extensions `.json`, `.yaml`, `.yml`, or `.js`.
+- a `.config.js` CommonJS module
+
+For example, if your module's name is "myapp", cosmiconfig will search up the directory tree for configuration in the following places:
+
+- a `myapp` property in `package.json`
+- a `.myapprc` file in JSON or YAML format
+- a `.myapprc.json` file
+- a `.myapprc.yaml`, `.myapprc.yml`, or `.myapprc.js` file
+- a `myapp.config.js` file exporting a JS object
+
+Cosmiconfig continues to search up the directory tree, checking each of these places in each directory, until it finds some acceptable configuration (or hits the home directory).
+
+👀 **Looking for the v5 docs?**
+v6 involves slight changes to Cosmiconfig's API, clarifying the difference between synchronous and asynchronous usage.
+If you have trouble switching from v5 to v6, please file an issue.
+If you are still using v5, those v5 docs are available [in the `5.x.x` tagged code](https://github.com/davidtheclark/cosmiconfig/tree/5.2.1).
+
+## Table of contents
+
+- [Installation](#installation)
+- [Usage](#usage)
+- [Result](#result)
+- [Asynchronous API](#asynchronous-api)
+  - [cosmiconfig()](#cosmiconfig)
+  - [explorer.search()](#explorersearch)
+  - [explorer.load()](#explorerload)
+  - [explorer.clearLoadCache()](#explorerclearloadcache)
+  - [explorer.clearSearchCache()](#explorerclearsearchcache)
+  - [explorer.clearCaches()](#explorerclearcaches)
+- [Synchronsous API](#synchronsous-api)
+  - [cosmiconfigSync()](#cosmiconfigsync)
+  - [explorerSync.search()](#explorersyncsearch)
+  - [explorerSync.load()](#explorersyncload)
+  - [explorerSync.clearLoadCache()](#explorersyncclearloadcache)
+  - [explorerSync.clearSearchCache()](#explorersyncclearsearchcache)
+  - [explorerSync.clearCaches()](#explorersyncclearcaches)
+- [cosmiconfigOptions](#cosmiconfigoptions)
+  - [searchPlaces](#searchplaces)
+  - [loaders](#loaders)
+  - [packageProp](#packageprop)
+  - [stopDir](#stopdir)
+  - [cache](#cache)
+  - [transform](#transform)
+  - [ignoreEmptySearchPlaces](#ignoreemptysearchplaces)
+- [Caching](#caching)
+- [Differences from rc](#differences-from-rc)
+- [Contributing & Development](#contributing--development)
+
+## Installation
+
+```
+npm install cosmiconfig
+```
+
+Tested in Node 8+.
+
+## Usage
+
+Create a Cosmiconfig explorer, then either `search` for or directly `load` a configuration file.
+
+```js
+const { cosmiconfig, cosmiconfigSync } = require('cosmiconfig');
+// ...
+const explorer = cosmiconfig(moduleName);
+
+// Search for a configuration by walking up directories.
+// See documentation for search, below.
+explorer.search()
+  .then((result) => {
+    // result.config is the parsed configuration object.
+    // result.filepath is the path to the config file that was found.
+    // result.isEmpty is true if there was nothing to parse in the config file.
+  })
+  .catch((error) => {
+    // Do something constructive.
+  });
+
+// Load a configuration directly when you know where it should be.
+// The result object is the same as for search.
+// See documentation for load, below.
+explorer.load(pathToConfig).then(..);
+
+// You can also search and load synchronously.
+const explorerSync = cosmiconfigSync(moduleName);
+
+const searchedFor = explorerSync.search();
+const loaded = explorerSync.load(pathToConfig);
+```
+
+## Result
+
+The result object you get from `search` or `load` has the following properties:
+
+- **config:** The parsed configuration object. `undefined` if the file is empty.
+- **filepath:** The path to the configuration file that was found.
+- **isEmpty:** `true` if the configuration file is empty. This property will not be present if the configuration file is not empty.
+
+## Asynchronous API
+
+### cosmiconfig()
+
+```js
+const { cosmiconfig } = require('cosmiconfig');
+const explorer = cosmiconfig(moduleName[, cosmiconfigOptions])
+```
+
+Creates a cosmiconfig instance ("explorer") configured according to the arguments, and initializes its caches.
+
+#### moduleName
+
+Type: `string`. **Required.**
+
+Your module name. This is used to create the default [`searchPlaces`] and [`packageProp`].
+
+If your [`searchPlaces`] value will include files, as it does by default (e.g. `${moduleName}rc`), your `moduleName` must consist of characters allowed in filenames. That means you should not copy scoped package names, such as `@my-org/my-package`, directly into `moduleName`.
+
+**[`cosmiconfigOptions`] are documented below.**
+You may not need them, and should first read about the functions you'll use.
+
+### explorer.search()
+
+```js
+explorer.search([searchFrom]).then(result => {..})
+```
+
+Searches for a configuration file. Returns a Promise that resolves with a [result] or with `null`, if no configuration file is found.
+
+You can do the same thing synchronously with [`explorerSync.search()`].
+
+Let's say your module name is `goldengrahams` so you initialized with `const explorer = cosmiconfig('goldengrahams');`.
+Here's how your default [`search()`] will work:
+
+- Starting from `process.cwd()` (or some other directory defined by the `searchFrom` argument to [`search()`]), look for configuration objects in the following places:
+  1. A `goldengrahams` property in a `package.json` file.
+  2. A `.goldengrahamsrc` file with JSON or YAML syntax.
+  3. A `.goldengrahamsrc.json` file.
+  4. A `.goldengrahamsrc.yaml`, `.goldengrahamsrc.yml`, or `.goldengrahamsrc.js` file.
+  5. A `goldengrahams.config.js` JS file exporting the object.
+- If none of those searches reveal a configuration object, move up one directory level and try again.
+  So the search continues in `./`, `../`, `../../`, `../../../`, etc., checking the same places in each directory.
+- Continue searching until arriving at your home directory (or some other directory defined by the cosmiconfig option [`stopDir`]).
+- If at any point a parsable configuration is found, the [`search()`] Promise resolves with its [result] \(or, with [`explorerSync.search()`], the [result] is returned).
+- If no configuration object is found, the [`search()`] Promise resolves with `null` (or, with [`explorerSync.search()`], `null` is returned).
+- If a configuration object is found *but is malformed* (causing a parsing error), the [`search()`] Promise rejects with that error (so you should `.catch()` it). (Or, with [`explorerSync.search()`], the error is thrown.)
+
+**If you know exactly where your configuration file should be, you can use [`load()`], instead.**
+
+**The search process is highly customizable.**
+Use the cosmiconfig options [`searchPlaces`] and [`loaders`] to precisely define where you want to look for configurations and how you want to load them.
+
+#### searchFrom
+
+Type: `string`.
+Default: `process.cwd()`.
+
+A filename.
+[`search()`] will start its search here.
+
+If the value is a directory, that's where the search starts.
+If it's a file, the search starts in that file's directory.
+
+### explorer.load()
+
+```js
+explorer.load(loadPath).then(result => {..})
+```
+
+Loads a configuration file. Returns a Promise that resolves with a [result] or rejects with an error (if the file does not exist or cannot be loaded).
+
+Use `load` if you already know where the configuration file is and you just need to load it.
+
+```js
+explorer.load('load/this/file.json'); // Tries to load load/this/file.json.
+```
+
+If you load a `package.json` file, the result will be derived from whatever property is specified as your [`packageProp`].
+
+You can do the same thing synchronously with [`explorerSync.load()`].
+
+### explorer.clearLoadCache()
+
+Clears the cache used in [`load()`].
+
+### explorer.clearSearchCache()
+
+Clears the cache used in [`search()`].
+
+### explorer.clearCaches()
+
+Performs both [`clearLoadCache()`] and [`clearSearchCache()`].
+
+## Synchronsous API
+
+### cosmiconfigSync()
+
+```js
+const { cosmiconfigSync } = require('cosmiconfig');
+const explorerSync = cosmiconfigSync(moduleName[, cosmiconfigOptions])
+```
+
+Creates a *synchronous* cosmiconfig instance ("explorerSync") configured according to the arguments, and initializes its caches.
+
+See [`cosmiconfig()`].
+
+### explorerSync.search()
+
+```js
+const result = explorerSync.search([searchFrom]);
+```
+
+Synchronous version of [`explorer.search()`].
+
+Returns a [result] or `null`.
+
+### explorerSync.load()
+
+```js
+const result = explorerSync.load(loadPath);
+```
+
+Synchronous version of [`explorer.load()`].
+
+Returns a [result].
+
+### explorerSync.clearLoadCache()
+
+Clears the cache used in [`load()`].
+
+### explorerSync.clearSearchCache()
+
+Clears the cache used in [`search()`].
+
+### explorerSync.clearCaches()
+
+Performs both [`clearLoadCache()`] and [`clearSearchCache()`].
+
+## cosmiconfigOptions
+
+Type: `Object`.
+
+Possible options are documented below.
+
+### searchPlaces
+
+Type: `Array<string>`.
+Default: See below.
+
+An array of places that [`search()`] will check in each directory as it moves up the directory tree.
+Each place is relative to the directory being searched, and the places are checked in the specified order.
+
+**Default `searchPlaces`:**
+
+```js
+[
+  'package.json',
+  `.${moduleName}rc`,
+  `.${moduleName}rc.json`,
+  `.${moduleName}rc.yaml`,
+  `.${moduleName}rc.yml`,
+  `.${moduleName}rc.js`,
+  `${moduleName}.config.js`,
+]
+```
+
+Create your own array to search more, fewer, or altogether different places.
+
+Every item in `searchPlaces` needs to have a loader in [`loaders`] that corresponds to its extension.
+(Common extensions are covered by default loaders.)
+Read more about [`loaders`] below.
+
+`package.json` is a special value: When it is included in `searchPlaces`, Cosmiconfig will always parse it as JSON and load a property within it, not the whole file.
+That property is defined with the [`packageProp`] option, and defaults to your module name.
+
+Examples, with a module named `porgy`:
+
+```js
+// Disallow extensions on rc files:
+[
+  'package.json',
+  '.porgyrc',
+  'porgy.config.js'
+]
+
+// ESLint searches for configuration in these places:
+[
+  '.eslintrc.js',
+  '.eslintrc.yaml',
+  '.eslintrc.yml',
+  '.eslintrc.json',
+  '.eslintrc',
+  'package.json'
+]
+
+// Babel looks in fewer places:
+[
+  'package.json',
+  '.babelrc'
+]
+
+// Maybe you want to look for a wide variety of JS flavors:
+[
+  'porgy.config.js',
+  'porgy.config.mjs',
+  'porgy.config.ts',
+  'porgy.config.coffee'
+]
+// ^^ You will need to designate custom loaders to tell
+// Cosmiconfig how to handle these special JS flavors.
+
+// Look within a .config/ subdirectory of every searched directory:
+[
+  'package.json',
+  '.porgyrc',
+  '.config/.porgyrc',
+  '.porgyrc.json',
+  '.config/.porgyrc.json'
+]
+```
+
+### loaders
+
+Type: `Object`.
+Default: See below.
+
+An object that maps extensions to the loader functions responsible for loading and parsing files with those extensions.
+
+Cosmiconfig exposes its default loaders on a named export `defaultLoaders`.
+
+**Default `loaders`:**
+
+```js
+const { defaultLoaders } = require('cosmiconfig');
+
+console.log(Object.entries(defaultLoaders))
+// [
+//   [ '.js', [Function: loadJs] ],
+//   [ '.json', [Function: loadJson] ],
+//   [ '.yaml', [Function: loadYaml] ],
+//   [ '.yml', [Function: loadYaml] ],
+//   [ 'noExt', [Function: loadYaml] ]
+// ]
+```
+
+(YAML is a superset of JSON; which means YAML parsers can parse JSON; which is how extensionless files can be either YAML *or* JSON with only one parser.)
+
+**If you provide a `loaders` object, your object will be *merged* with the defaults.**
+So you can override one or two without having to override them all.
+
+**Keys in `loaders`** are extensions (starting with a period), or `noExt` to specify the loader for files *without* extensions, like `.myapprc`.
+
+**Values in `loaders`** are a loader function (described below) whose values are loader functions.
+
+**The most common use case for custom loaders value is to load extensionless `rc` files as strict JSON**, instead of JSON *or* YAML (the default).
+To accomplish that, provide the following `loaders` value:
+
+```js
+{
+  noExt: defaultLoaders['.json']
+}
+```
+
+If you want to load files that are not handled by the loader functions Cosmiconfig exposes, you can write a custom loader function or use one from NPM if it exists.
+
+**Third-party loaders:**
+
+- [@endemolshinegroup/cosmiconfig-typescript-loader](https://github.com/EndemolShineGroup/cosmiconfig-typescript-loader)
+
+**Use cases for custom loader function:**
+
+- Allow configuration syntaxes that aren't handled by Cosmiconfig's defaults, like JSON5, INI, or XML.
+- Allow ES2015 modules from `.mjs` configuration files.
+- Parse JS files with Babel before deriving the configuration.
+
+**Custom loader functions** have the following signature:
+
+```js
+// Sync
+(filepath: string, content: string) => Object | null
+
+// Async
+(filepath: string, content: string) => Object | null | Promise<Object | null>
+```
+
+Cosmiconfig reads the file when it checks whether the file exists, so it will provide you with both the file's path and its content.
+Do whatever you need to, and return either a configuration object or `null` (or, for async-only loaders, a Promise that resolves with one of those).
+`null` indicates that no real configuration was found and the search should continue.
+
+A few things to note:
+
+- If you use a custom loader, be aware of whether it's sync or async: you cannot use async customer loaders with the sync API ([`cosmiconfigSync()`]).
+- **Special JS syntax can also be handled by using a `require` hook**, because `defaultLoaders['.js']` just uses `require`.
+  Whether you use custom loaders or a `require` hook is up to you.
+
+Examples:
+
+```js
+// Allow JSON5 syntax:
+{
+  '.json': json5Loader
+}
+
+// Allow a special configuration syntax of your own creation:
+{
+  '.special': specialLoader
+}
+
+// Allow many flavors of JS, using custom loaders:
+{
+  '.mjs': esmLoader,
+  '.ts': typeScriptLoader,
+  '.coffee': coffeeScriptLoader
+}
+
+// Allow many flavors of JS but rely on require hooks:
+{
+  '.mjs': defaultLoaders['.js'],
+  '.ts': defaultLoaders['.js'],
+  '.coffee': defaultLoaders['.js']
+}
+```
+
+### packageProp
+
+Type: `string | Array<string>`.
+Default: `` `${moduleName}` ``.
+
+Name of the property in `package.json` to look for.
+
+Use a period-delimited string or an array of strings to describe a path to nested properties.
+
+For example, the value `'configs.myPackage'` or `['configs', 'myPackage']` will get you the `"myPackage"` value in a `package.json` like this:
+
+```json
+{
+  "configs": {
+    "myPackage": {..}
+  }
+}
+```
+
+If nested property names within the path include periods, you need to use an array of strings. For example, the value `['configs', 'foo.bar', 'baz']` will get you the `"baz"` value in a `package.json` like this:
+
+```json
+{
+  "configs": {
+    "foo.bar": {
+      "baz": {..}
+    }
+  }
+}
+```
+
+If a string includes period but corresponds to a top-level property name, it will not be interpreted as a period-delimited path. For example, the value `'one.two'` will get you the `"three"` value in a `package.json` like this:
+
+```json
+{
+  "one.two": "three",
+  "one": {
+    "two": "four"
+  }
+}
+```
+
+### stopDir
+
+Type: `string`.
+Default: Absolute path to your home directory.
+
+Directory where the search will stop.
+
+### cache
+
+Type: `boolean`.
+Default: `true`.
+
+If `false`, no caches will be used.
+Read more about ["Caching"](#caching) below.
+
+### transform
+
+Type: `(Result) => Promise<Result> | Result`.
+
+A function that transforms the parsed configuration. Receives the [result].
+
+If using [`search()`] or [`load()`] \(which are async), the transform function can return the transformed result or return a Promise that resolves with the transformed result.
+If using `cosmiconfigSync`, [`search()`] or [`load()`], the function must be synchronous and return the transformed result.
+
+The reason you might use this option — instead of simply applying your transform function some other way — is that *the transformed result will be cached*. If your transformation involves additional filesystem I/O or other potentially slow processing, you can use this option to avoid repeating those steps every time a given configuration is searched or loaded.
+
+### ignoreEmptySearchPlaces
+
+Type: `boolean`.
+Default: `true`.
+
+By default, if [`search()`] encounters an empty file (containing nothing but whitespace) in one of the [`searchPlaces`], it will ignore the empty file and move on.
+If you'd like to load empty configuration files, instead, set this option to `false`.
+
+Why might you want to load empty configuration files?
+If you want to throw an error, or if an empty configuration file means something to your program.
+
+## Caching
+
+As of v2, cosmiconfig uses caching to reduce the need for repetitious reading of the filesystem or expensive transforms. Every new cosmiconfig instance (created with `cosmiconfig()`) has its own caches.
+
+To avoid or work around caching, you can do the following:
+
+- Set the `cosmiconfig` option [`cache`] to `false`.
+- Use the cache-clearing methods [`clearLoadCache()`], [`clearSearchCache()`], and [`clearCaches()`].
+- Create separate instances of cosmiconfig (separate "explorers").
+
+## Differences from [rc](https://github.com/dominictarr/rc)
+
+[rc](https://github.com/dominictarr/rc) serves its focused purpose well. cosmiconfig differs in a few key ways — making it more useful for some projects, less useful for others:
+
+- Looks for configuration in some different places: in a `package.json` property, an rc file, a `.config.js` file, and rc files with extensions.
+- Built-in support for JSON, YAML, and CommonJS formats.
+- Stops at the first configuration found, instead of finding all that can be found up the directory tree and merging them automatically.
+- Options.
+- Asynchronous by default (though can be run synchronously).
+
+## Contributing & Development
+
+Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
+
+And please do participate!
+
+[result]: #result
+
+[`load()`]: #explorerload
+
+[`search()`]: #explorersearch
+
+[`clearloadcache()`]: #explorerclearloadcache
+
+[`clearsearchcache()`]: #explorerclearsearchcache
+
+[`cosmiconfig()`]: #cosmiconfig
+
+[`cosmiconfigSync()`]: #cosmiconfigsync
+
+[`clearcaches()`]: #explorerclearcaches
+
+[`packageprop`]: #packageprop
+
+[`cache`]: #cache
+
+[`stopdir`]: #stopdir
+
+[`searchplaces`]: #searchplaces
+
+[`loaders`]: #loaders
+
+[`cosmiconfigoptions`]: #cosmiconfigoptions
+
+[`explorerSync.search()`]: #explorersyncsearch
+
+[`explorerSync.load()`]: #explorersyncload
+
+[`explorer.search()`]: #explorersearch
+
+[`explorer.load()`]: #explorerload
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/Explorer.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/Explorer.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/Explorer.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,14 @@
+import { ExplorerBase } from './ExplorerBase';
+import { CosmiconfigResult, ExplorerOptions } from './types';
+declare class Explorer extends ExplorerBase<ExplorerOptions> {
+    constructor(options: ExplorerOptions);
+    search(searchFrom?: string): Promise<CosmiconfigResult>;
+    private searchFromDirectory;
+    private searchDirectory;
+    private loadSearchPlace;
+    private loadFileContent;
+    private createCosmiconfigResult;
+    load(filepath: string): Promise<CosmiconfigResult>;
+}
+export { Explorer };
+//# sourceMappingURL=Explorer.d.ts.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/Explorer.d.ts.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/Explorer.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/Explorer.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"file":"Explorer.d.ts","sourceRoot":"","sources":["../src/Explorer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI9C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAqB,MAAM,SAAS,CAAC;AAEhF,cAAM,QAAS,SAAQ,YAAY,CAAC,eAAe,CAAC;gBAC/B,OAAO,EAAE,eAAe;IAI9B,MAAM,CACjB,UAAU,GAAE,MAAsB,GACjC,OAAO,CAAC,iBAAiB,CAAC;YAOf,mBAAmB;YAuBnB,eAAe;YAaf,eAAe;YAYf,eAAe;YAef,uBAAuB;IAUxB,IAAI,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAyBhE;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/Explorer.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/Explorer.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/Explorer.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,141 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.Explorer = void 0;
+
+var _path = _interopRequireDefault(require("path"));
+
+var _ExplorerBase = require("./ExplorerBase");
+
+var _readFile = require("./readFile");
+
+var _cacheWrapper = require("./cacheWrapper");
+
+var _getDirectory = require("./getDirectory");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _asyncIterator(iterable) { var method; if (typeof Symbol !== "undefined") { if (Symbol.asyncIterator) { method = iterable[Symbol.asyncIterator]; if (method != null) return method.call(iterable); } if (Symbol.iterator) { method = iterable[Symbol.iterator]; if (method != null) return method.call(iterable); } } throw new TypeError("Object is not async iterable"); }
+
+class Explorer extends _ExplorerBase.ExplorerBase {
+  constructor(options) {
+    super(options);
+  }
+
+  async search(searchFrom = process.cwd()) {
+    const startDirectory = await (0, _getDirectory.getDirectory)(searchFrom);
+    const result = await this.searchFromDirectory(startDirectory);
+    return result;
+  }
+
+  async searchFromDirectory(dir) {
+    const absoluteDir = _path.default.resolve(process.cwd(), dir);
+
+    const run = async () => {
+      const result = await this.searchDirectory(absoluteDir);
+      const nextDir = this.nextDirectoryToSearch(absoluteDir, result);
+
+      if (nextDir) {
+        return this.searchFromDirectory(nextDir);
+      }
+
+      const transformResult = await this.config.transform(result);
+      return transformResult;
+    };
+
+    if (this.searchCache) {
+      return (0, _cacheWrapper.cacheWrapper)(this.searchCache, absoluteDir, run);
+    }
+
+    return run();
+  }
+
+  async searchDirectory(dir) {
+    var _iteratorNormalCompletion = true;
+    var _didIteratorError = false;
+
+    var _iteratorError;
+
+    try {
+      for (var _iterator = _asyncIterator(this.config.searchPlaces), _step, _value; _step = await _iterator.next(), _iteratorNormalCompletion = _step.done, _value = await _step.value, !_iteratorNormalCompletion; _iteratorNormalCompletion = true) {
+        const place = _value;
+        const placeResult = await this.loadSearchPlace(dir, place);
+
+        if (this.shouldSearchStopWithResult(placeResult) === true) {
+          return placeResult;
+        }
+      } // config not found
+
+    } catch (err) {
+      _didIteratorError = true;
+      _iteratorError = err;
+    } finally {
+      try {
+        if (!_iteratorNormalCompletion && _iterator.return != null) {
+          await _iterator.return();
+        }
+      } finally {
+        if (_didIteratorError) {
+          throw _iteratorError;
+        }
+      }
+    }
+
+    return null;
+  }
+
+  async loadSearchPlace(dir, place) {
+    const filepath = _path.default.join(dir, place);
+
+    const fileContents = await (0, _readFile.readFile)(filepath);
+    const result = await this.createCosmiconfigResult(filepath, fileContents);
+    return result;
+  }
+
+  async loadFileContent(filepath, content) {
+    if (content === null) {
+      return null;
+    }
+
+    if (content.trim() === '') {
+      return undefined;
+    }
+
+    const loader = this.getLoaderEntryForFile(filepath);
+    const loaderResult = await loader(filepath, content);
+    return loaderResult;
+  }
+
+  async createCosmiconfigResult(filepath, content) {
+    const fileContent = await this.loadFileContent(filepath, content);
+    const result = this.loadedContentToCosmiconfigResult(filepath, fileContent);
+    return result;
+  }
+
+  async load(filepath) {
+    this.validateFilePath(filepath);
+
+    const absoluteFilePath = _path.default.resolve(process.cwd(), filepath);
+
+    const runLoad = async () => {
+      const fileContents = await (0, _readFile.readFile)(absoluteFilePath, {
+        throwNotFound: true
+      });
+      const result = await this.createCosmiconfigResult(absoluteFilePath, fileContents);
+      const transformResult = await this.config.transform(result);
+      return transformResult;
+    };
+
+    if (this.loadCache) {
+      return (0, _cacheWrapper.cacheWrapper)(this.loadCache, absoluteFilePath, runLoad);
+    }
+
+    return runLoad();
+  }
+
+}
+
+exports.Explorer = Explorer;
+//# sourceMappingURL=Explorer.js.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/Explorer.js.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/Explorer.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/Explorer.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"sources":["../src/Explorer.ts"],"names":["Explorer","ExplorerBase","constructor","options","search","searchFrom","process","cwd","startDirectory","result","searchFromDirectory","dir","absoluteDir","path","resolve","run","searchDirectory","nextDir","nextDirectoryToSearch","transformResult","config","transform","searchCache","searchPlaces","place","placeResult","loadSearchPlace","shouldSearchStopWithResult","filepath","join","fileContents","createCosmiconfigResult","loadFileContent","content","trim","undefined","loader","getLoaderEntryForFile","loaderResult","fileContent","loadedContentToCosmiconfigResult","load","validateFilePath","absoluteFilePath","runLoad","throwNotFound","loadCache"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;;;;;AAGA,MAAMA,QAAN,SAAuBC,0BAAvB,CAAqD;AAC5CC,EAAAA,WAAP,CAAmBC,OAAnB,EAA6C;AAC3C,UAAMA,OAAN;AACD;;AAED,QAAaC,MAAb,CACEC,UAAkB,GAAGC,OAAO,CAACC,GAAR,EADvB,EAE8B;AAC5B,UAAMC,cAAc,GAAG,MAAM,gCAAaH,UAAb,CAA7B;AACA,UAAMI,MAAM,GAAG,MAAM,KAAKC,mBAAL,CAAyBF,cAAzB,CAArB;AAEA,WAAOC,MAAP;AACD;;AAED,QAAcC,mBAAd,CAAkCC,GAAlC,EAA2E;AACzE,UAAMC,WAAW,GAAGC,cAAKC,OAAL,CAAaR,OAAO,CAACC,GAAR,EAAb,EAA4BI,GAA5B,CAApB;;AAEA,UAAMI,GAAG,GAAG,YAAwC;AAClD,YAAMN,MAAM,GAAG,MAAM,KAAKO,eAAL,CAAqBJ,WAArB,CAArB;AACA,YAAMK,OAAO,GAAG,KAAKC,qBAAL,CAA2BN,WAA3B,EAAwCH,MAAxC,CAAhB;;AAEA,UAAIQ,OAAJ,EAAa;AACX,eAAO,KAAKP,mBAAL,CAAyBO,OAAzB,CAAP;AACD;;AAED,YAAME,eAAe,GAAG,MAAM,KAAKC,MAAL,CAAYC,SAAZ,CAAsBZ,MAAtB,CAA9B;AAEA,aAAOU,eAAP;AACD,KAXD;;AAaA,QAAI,KAAKG,WAAT,EAAsB;AACpB,aAAO,gCAAa,KAAKA,WAAlB,EAA+BV,WAA/B,EAA4CG,GAA5C,CAAP;AACD;;AAED,WAAOA,GAAG,EAAV;AACD;;AAED,QAAcC,eAAd,CAA8BL,GAA9B,EAAuE;AAAA;AAAA;;AAAA;;AAAA;AACrE,0CAA0B,KAAKS,MAAL,CAAYG,YAAtC,oLAAoD;AAAA,cAAnCC,KAAmC;AAClD,cAAMC,WAAW,GAAG,MAAM,KAAKC,eAAL,CAAqBf,GAArB,EAA0Ba,KAA1B,CAA1B;;AAEA,YAAI,KAAKG,0BAAL,CAAgCF,WAAhC,MAAiD,IAArD,EAA2D;AACzD,iBAAOA,WAAP;AACD;AACF,OAPoE,CASrE;;AATqE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAUrE,WAAO,IAAP;AACD;;AAED,QAAcC,eAAd,CACEf,GADF,EAEEa,KAFF,EAG8B;AAC5B,UAAMI,QAAQ,GAAGf,cAAKgB,IAAL,CAAUlB,GAAV,EAAea,KAAf,CAAjB;;AACA,UAAMM,YAAY,GAAG,MAAM,wBAASF,QAAT,CAA3B;AAEA,UAAMnB,MAAM,GAAG,MAAM,KAAKsB,uBAAL,CAA6BH,QAA7B,EAAuCE,YAAvC,CAArB;AAEA,WAAOrB,MAAP;AACD;;AAED,QAAcuB,eAAd,CACEJ,QADF,EAEEK,OAFF,EAG8B;AAC5B,QAAIA,OAAO,KAAK,IAAhB,EAAsB;AACpB,aAAO,IAAP;AACD;;AACD,QAAIA,OAAO,CAACC,IAAR,OAAmB,EAAvB,EAA2B;AACzB,aAAOC,SAAP;AACD;;AACD,UAAMC,MAAM,GAAG,KAAKC,qBAAL,CAA2BT,QAA3B,CAAf;AACA,UAAMU,YAAY,GAAG,MAAMF,MAAM,CAACR,QAAD,EAAWK,OAAX,CAAjC;AACA,WAAOK,YAAP;AACD;;AAED,QAAcP,uBAAd,CACEH,QADF,EAEEK,OAFF,EAG8B;AAC5B,UAAMM,WAAW,GAAG,MAAM,KAAKP,eAAL,CAAqBJ,QAArB,EAA+BK,OAA/B,CAA1B;AACA,UAAMxB,MAAM,GAAG,KAAK+B,gCAAL,CAAsCZ,QAAtC,EAAgDW,WAAhD,CAAf;AAEA,WAAO9B,MAAP;AACD;;AAED,QAAagC,IAAb,CAAkBb,QAAlB,EAAgE;AAC9D,SAAKc,gBAAL,CAAsBd,QAAtB;;AACA,UAAMe,gBAAgB,GAAG9B,cAAKC,OAAL,CAAaR,OAAO,CAACC,GAAR,EAAb,EAA4BqB,QAA5B,CAAzB;;AAEA,UAAMgB,OAAO,GAAG,YAAwC;AACtD,YAAMd,YAAY,GAAG,MAAM,wBAASa,gBAAT,EAA2B;AACpDE,QAAAA,aAAa,EAAE;AADqC,OAA3B,CAA3B;AAIA,YAAMpC,MAAM,GAAG,MAAM,KAAKsB,uBAAL,CACnBY,gBADmB,EAEnBb,YAFmB,CAArB;AAKA,YAAMX,eAAe,GAAG,MAAM,KAAKC,MAAL,CAAYC,SAAZ,CAAsBZ,MAAtB,CAA9B;AAEA,aAAOU,eAAP;AACD,KAbD;;AAeA,QAAI,KAAK2B,SAAT,EAAoB;AAClB,aAAO,gCAAa,KAAKA,SAAlB,EAA6BH,gBAA7B,EAA+CC,OAA/C,CAAP;AACD;;AAED,WAAOA,OAAO,EAAd;AACD;;AA/GkD","sourcesContent":["import path from 'path';\nimport { ExplorerBase } from './ExplorerBase';\nimport { readFile } from './readFile';\nimport { cacheWrapper } from './cacheWrapper';\nimport { getDirectory } from './getDirectory';\nimport { CosmiconfigResult, ExplorerOptions, LoadedFileContent } from './types';\n\nclass Explorer extends ExplorerBase<ExplorerOptions> {\n  public constructor(options: ExplorerOptions) {\n    super(options);\n  }\n\n  public async search(\n    searchFrom: string = process.cwd(),\n  ): Promise<CosmiconfigResult> {\n    const startDirectory = await getDirectory(searchFrom);\n    const result = await this.searchFromDirectory(startDirectory);\n\n    return result;\n  }\n\n  private async searchFromDirectory(dir: string): Promise<CosmiconfigResult> {\n    const absoluteDir = path.resolve(process.cwd(), dir);\n\n    const run = async (): Promise<CosmiconfigResult> => {\n      const result = await this.searchDirectory(absoluteDir);\n      const nextDir = this.nextDirectoryToSearch(absoluteDir, result);\n\n      if (nextDir) {\n        return this.searchFromDirectory(nextDir);\n      }\n\n      const transformResult = await this.config.transform(result);\n\n      return transformResult;\n    };\n\n    if (this.searchCache) {\n      return cacheWrapper(this.searchCache, absoluteDir, run);\n    }\n\n    return run();\n  }\n\n  private async searchDirectory(dir: string): Promise<CosmiconfigResult> {\n    for await (const place of this.config.searchPlaces) {\n      const placeResult = await this.loadSearchPlace(dir, place);\n\n      if (this.shouldSearchStopWithResult(placeResult) === true) {\n        return placeResult;\n      }\n    }\n\n    // config not found\n    return null;\n  }\n\n  private async loadSearchPlace(\n    dir: string,\n    place: string,\n  ): Promise<CosmiconfigResult> {\n    const filepath = path.join(dir, place);\n    const fileContents = await readFile(filepath);\n\n    const result = await this.createCosmiconfigResult(filepath, fileContents);\n\n    return result;\n  }\n\n  private async loadFileContent(\n    filepath: string,\n    content: string | null,\n  ): Promise<LoadedFileContent> {\n    if (content === null) {\n      return null;\n    }\n    if (content.trim() === '') {\n      return undefined;\n    }\n    const loader = this.getLoaderEntryForFile(filepath);\n    const loaderResult = await loader(filepath, content);\n    return loaderResult;\n  }\n\n  private async createCosmiconfigResult(\n    filepath: string,\n    content: string | null,\n  ): Promise<CosmiconfigResult> {\n    const fileContent = await this.loadFileContent(filepath, content);\n    const result = this.loadedContentToCosmiconfigResult(filepath, fileContent);\n\n    return result;\n  }\n\n  public async load(filepath: string): Promise<CosmiconfigResult> {\n    this.validateFilePath(filepath);\n    const absoluteFilePath = path.resolve(process.cwd(), filepath);\n\n    const runLoad = async (): Promise<CosmiconfigResult> => {\n      const fileContents = await readFile(absoluteFilePath, {\n        throwNotFound: true,\n      });\n\n      const result = await this.createCosmiconfigResult(\n        absoluteFilePath,\n        fileContents,\n      );\n\n      const transformResult = await this.config.transform(result);\n\n      return transformResult;\n    };\n\n    if (this.loadCache) {\n      return cacheWrapper(this.loadCache, absoluteFilePath, runLoad);\n    }\n\n    return runLoad();\n  }\n}\n\nexport { Explorer };\n"],"file":"Explorer.js"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerBase.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerBase.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerBase.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,21 @@
+import { CosmiconfigResult, ExplorerOptions, ExplorerOptionsSync, Cache, LoadedFileContent } from './types';
+import { Loader } from './index';
+declare class ExplorerBase<T extends ExplorerOptions | ExplorerOptionsSync> {
+    protected readonly loadCache?: Cache;
+    protected readonly searchCache?: Cache;
+    protected readonly config: T;
+    constructor(options: T);
+    clearLoadCache(): void;
+    clearSearchCache(): void;
+    clearCaches(): void;
+    private validateConfig;
+    protected shouldSearchStopWithResult(result: CosmiconfigResult): boolean;
+    protected nextDirectoryToSearch(currentDir: string, currentResult: CosmiconfigResult): string | null;
+    private loadPackageProp;
+    protected getLoaderEntryForFile(filepath: string): Loader;
+    protected loadedContentToCosmiconfigResult(filepath: string, loadedContent: LoadedFileContent): CosmiconfigResult;
+    protected validateFilePath(filepath: string): void;
+}
+declare function getExtensionDescription(filepath: string): string;
+export { ExplorerBase, getExtensionDescription };
+//# sourceMappingURL=ExplorerBase.d.ts.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerBase.d.ts.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerBase.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerBase.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"file":"ExplorerBase.d.ts","sourceRoot":"","sources":["../src/ExplorerBase.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,iBAAiB,EACjB,eAAe,EACf,mBAAmB,EACnB,KAAK,EACL,iBAAiB,EAClB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,cAAM,YAAY,CAAC,CAAC,SAAS,eAAe,GAAG,mBAAmB;IAChE,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IACrC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC;IACvC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBAEV,OAAO,EAAE,CAAC;IAUtB,cAAc,IAAI,IAAI;IAMtB,gBAAgB,IAAI,IAAI;IAMxB,WAAW,IAAI,IAAI;IAK1B,OAAO,CAAC,cAAc;IAwBtB,SAAS,CAAC,0BAA0B,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO;IAMxE,SAAS,CAAC,qBAAqB,CAC7B,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,iBAAiB,GAC/B,MAAM,GAAG,IAAI;IAWhB,OAAO,CAAC,eAAe;IASvB,SAAS,CAAC,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAmBzD,SAAS,CAAC,gCAAgC,CACxC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,iBAAiB,GAC/B,iBAAiB;IAUpB,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;CAKnD;AAMD,iBAAS,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGzD;AAED,OAAO,EAAE,YAAY,EAAE,uBAAuB,EAAE,CAAC"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerBase.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerBase.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerBase.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,142 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.getExtensionDescription = getExtensionDescription;
+exports.ExplorerBase = void 0;
+
+var _path = _interopRequireDefault(require("path"));
+
+var _loaders = require("./loaders");
+
+var _getPropertyByPath = require("./getPropertyByPath");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+class ExplorerBase {
+  constructor(options) {
+    if (options.cache === true) {
+      this.loadCache = new Map();
+      this.searchCache = new Map();
+    }
+
+    this.config = options;
+    this.validateConfig();
+  }
+
+  clearLoadCache() {
+    if (this.loadCache) {
+      this.loadCache.clear();
+    }
+  }
+
+  clearSearchCache() {
+    if (this.searchCache) {
+      this.searchCache.clear();
+    }
+  }
+
+  clearCaches() {
+    this.clearLoadCache();
+    this.clearSearchCache();
+  }
+
+  validateConfig() {
+    const config = this.config;
+    config.searchPlaces.forEach(place => {
+      const loaderKey = _path.default.extname(place) || 'noExt';
+      const loader = config.loaders[loaderKey];
+
+      if (!loader) {
+        throw new Error(`No loader specified for ${getExtensionDescription(place)}, so searchPlaces item "${place}" is invalid`);
+      }
+
+      if (typeof loader !== 'function') {
+        throw new Error(`loader for ${getExtensionDescription(place)} is not a function (type provided: "${typeof loader}"), so searchPlaces item "${place}" is invalid`);
+      }
+    });
+  }
+
+  shouldSearchStopWithResult(result) {
+    if (result === null) return false;
+    if (result.isEmpty && this.config.ignoreEmptySearchPlaces) return false;
+    return true;
+  }
+
+  nextDirectoryToSearch(currentDir, currentResult) {
+    if (this.shouldSearchStopWithResult(currentResult)) {
+      return null;
+    }
+
+    const nextDir = nextDirUp(currentDir);
+
+    if (nextDir === currentDir || currentDir === this.config.stopDir) {
+      return null;
+    }
+
+    return nextDir;
+  }
+
+  loadPackageProp(filepath, content) {
+    const parsedContent = _loaders.loaders.loadJson(filepath, content);
+
+    const packagePropValue = (0, _getPropertyByPath.getPropertyByPath)(parsedContent, this.config.packageProp);
+    return packagePropValue || null;
+  }
+
+  getLoaderEntryForFile(filepath) {
+    if (_path.default.basename(filepath) === 'package.json') {
+      const loader = this.loadPackageProp.bind(this);
+      return loader;
+    }
+
+    const loaderKey = _path.default.extname(filepath) || 'noExt';
+    const loader = this.config.loaders[loaderKey];
+
+    if (!loader) {
+      throw new Error(`No loader specified for ${getExtensionDescription(filepath)}`);
+    }
+
+    return loader;
+  }
+
+  loadedContentToCosmiconfigResult(filepath, loadedContent) {
+    if (loadedContent === null) {
+      return null;
+    }
+
+    if (loadedContent === undefined) {
+      return {
+        filepath,
+        config: undefined,
+        isEmpty: true
+      };
+    }
+
+    return {
+      config: loadedContent,
+      filepath
+    };
+  }
+
+  validateFilePath(filepath) {
+    if (!filepath) {
+      throw new Error('load must pass a non-empty string');
+    }
+  }
+
+}
+
+exports.ExplorerBase = ExplorerBase;
+
+function nextDirUp(dir) {
+  return _path.default.dirname(dir);
+}
+
+function getExtensionDescription(filepath) {
+  const ext = _path.default.extname(filepath);
+
+  return ext ? `extension "${ext}"` : 'files without extensions';
+}
+//# sourceMappingURL=ExplorerBase.js.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerBase.js.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerBase.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerBase.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"sources":["../src/ExplorerBase.ts"],"names":["ExplorerBase","constructor","options","cache","loadCache","Map","searchCache","config","validateConfig","clearLoadCache","clear","clearSearchCache","clearCaches","searchPlaces","forEach","place","loaderKey","path","extname","loader","loaders","Error","getExtensionDescription","shouldSearchStopWithResult","result","isEmpty","ignoreEmptySearchPlaces","nextDirectoryToSearch","currentDir","currentResult","nextDir","nextDirUp","stopDir","loadPackageProp","filepath","content","parsedContent","loadJson","packagePropValue","packageProp","getLoaderEntryForFile","basename","bind","loadedContentToCosmiconfigResult","loadedContent","undefined","validateFilePath","dir","dirname","ext"],"mappings":";;;;;;;;AAAA;;AACA;;AACA;;;;AAUA,MAAMA,YAAN,CAAoE;AAK3DC,EAAAA,WAAP,CAAmBC,OAAnB,EAA+B;AAC7B,QAAIA,OAAO,CAACC,KAAR,KAAkB,IAAtB,EAA4B;AAC1B,WAAKC,SAAL,GAAiB,IAAIC,GAAJ,EAAjB;AACA,WAAKC,WAAL,GAAmB,IAAID,GAAJ,EAAnB;AACD;;AAED,SAAKE,MAAL,GAAcL,OAAd;AACA,SAAKM,cAAL;AACD;;AAEMC,EAAAA,cAAP,GAA8B;AAC5B,QAAI,KAAKL,SAAT,EAAoB;AAClB,WAAKA,SAAL,CAAeM,KAAf;AACD;AACF;;AAEMC,EAAAA,gBAAP,GAAgC;AAC9B,QAAI,KAAKL,WAAT,EAAsB;AACpB,WAAKA,WAAL,CAAiBI,KAAjB;AACD;AACF;;AAEME,EAAAA,WAAP,GAA2B;AACzB,SAAKH,cAAL;AACA,SAAKE,gBAAL;AACD;;AAEOH,EAAAA,cAAR,GAA+B;AAC7B,UAAMD,MAAM,GAAG,KAAKA,MAApB;AAEAA,IAAAA,MAAM,CAACM,YAAP,CAAoBC,OAApB,CAA6BC,KAAD,IAAiB;AAC3C,YAAMC,SAAS,GAAGC,cAAKC,OAAL,CAAaH,KAAb,KAAuB,OAAzC;AACA,YAAMI,MAAM,GAAGZ,MAAM,CAACa,OAAP,CAAeJ,SAAf,CAAf;;AACA,UAAI,CAACG,MAAL,EAAa;AACX,cAAM,IAAIE,KAAJ,CACH,2BAA0BC,uBAAuB,CAChDP,KADgD,CAEhD,2BAA0BA,KAAM,cAH9B,CAAN;AAKD;;AAED,UAAI,OAAOI,MAAP,KAAkB,UAAtB,EAAkC;AAChC,cAAM,IAAIE,KAAJ,CACH,cAAaC,uBAAuB,CACnCP,KADmC,CAEnC,uCAAsC,OAAOI,MAAO,6BAA4BJ,KAAM,cAHpF,CAAN;AAKD;AACF,KAlBD;AAmBD;;AAESQ,EAAAA,0BAAV,CAAqCC,MAArC,EAAyE;AACvE,QAAIA,MAAM,KAAK,IAAf,EAAqB,OAAO,KAAP;AACrB,QAAIA,MAAM,CAACC,OAAP,IAAkB,KAAKlB,MAAL,CAAYmB,uBAAlC,EAA2D,OAAO,KAAP;AAC3D,WAAO,IAAP;AACD;;AAESC,EAAAA,qBAAV,CACEC,UADF,EAEEC,aAFF,EAGiB;AACf,QAAI,KAAKN,0BAAL,CAAgCM,aAAhC,CAAJ,EAAoD;AAClD,aAAO,IAAP;AACD;;AACD,UAAMC,OAAO,GAAGC,SAAS,CAACH,UAAD,CAAzB;;AACA,QAAIE,OAAO,KAAKF,UAAZ,IAA0BA,UAAU,KAAK,KAAKrB,MAAL,CAAYyB,OAAzD,EAAkE;AAChE,aAAO,IAAP;AACD;;AACD,WAAOF,OAAP;AACD;;AAEOG,EAAAA,eAAR,CAAwBC,QAAxB,EAA0CC,OAA1C,EAAoE;AAClE,UAAMC,aAAa,GAAGhB,iBAAQiB,QAAR,CAAiBH,QAAjB,EAA2BC,OAA3B,CAAtB;;AACA,UAAMG,gBAAgB,GAAG,0CACvBF,aADuB,EAEvB,KAAK7B,MAAL,CAAYgC,WAFW,CAAzB;AAIA,WAAOD,gBAAgB,IAAI,IAA3B;AACD;;AAESE,EAAAA,qBAAV,CAAgCN,QAAhC,EAA0D;AACxD,QAAIjB,cAAKwB,QAAL,CAAcP,QAAd,MAA4B,cAAhC,EAAgD;AAC9C,YAAMf,MAAM,GAAG,KAAKc,eAAL,CAAqBS,IAArB,CAA0B,IAA1B,CAAf;AACA,aAAOvB,MAAP;AACD;;AAED,UAAMH,SAAS,GAAGC,cAAKC,OAAL,CAAagB,QAAb,KAA0B,OAA5C;AAEA,UAAMf,MAAM,GAAG,KAAKZ,MAAL,CAAYa,OAAZ,CAAoBJ,SAApB,CAAf;;AAEA,QAAI,CAACG,MAAL,EAAa;AACX,YAAM,IAAIE,KAAJ,CACH,2BAA0BC,uBAAuB,CAACY,QAAD,CAAW,EADzD,CAAN;AAGD;;AAED,WAAOf,MAAP;AACD;;AAESwB,EAAAA,gCAAV,CACET,QADF,EAEEU,aAFF,EAGqB;AACnB,QAAIA,aAAa,KAAK,IAAtB,EAA4B;AAC1B,aAAO,IAAP;AACD;;AACD,QAAIA,aAAa,KAAKC,SAAtB,EAAiC;AAC/B,aAAO;AAAEX,QAAAA,QAAF;AAAY3B,QAAAA,MAAM,EAAEsC,SAApB;AAA+BpB,QAAAA,OAAO,EAAE;AAAxC,OAAP;AACD;;AACD,WAAO;AAAElB,MAAAA,MAAM,EAAEqC,aAAV;AAAyBV,MAAAA;AAAzB,KAAP;AACD;;AAESY,EAAAA,gBAAV,CAA2BZ,QAA3B,EAAmD;AACjD,QAAI,CAACA,QAAL,EAAe;AACb,YAAM,IAAIb,KAAJ,CAAU,mCAAV,CAAN;AACD;AACF;;AAzHiE;;;;AA4HpE,SAASU,SAAT,CAAmBgB,GAAnB,EAAwC;AACtC,SAAO9B,cAAK+B,OAAL,CAAaD,GAAb,CAAP;AACD;;AAED,SAASzB,uBAAT,CAAiCY,QAAjC,EAA2D;AACzD,QAAMe,GAAG,GAAGhC,cAAKC,OAAL,CAAagB,QAAb,CAAZ;;AACA,SAAOe,GAAG,GAAI,cAAaA,GAAI,GAArB,GAA0B,0BAApC;AACD","sourcesContent":["import path from 'path';\nimport { loaders } from './loaders';\nimport { getPropertyByPath } from './getPropertyByPath';\nimport {\n  CosmiconfigResult,\n  ExplorerOptions,\n  ExplorerOptionsSync,\n  Cache,\n  LoadedFileContent,\n} from './types';\nimport { Loader } from './index';\n\nclass ExplorerBase<T extends ExplorerOptions | ExplorerOptionsSync> {\n  protected readonly loadCache?: Cache;\n  protected readonly searchCache?: Cache;\n  protected readonly config: T;\n\n  public constructor(options: T) {\n    if (options.cache === true) {\n      this.loadCache = new Map();\n      this.searchCache = new Map();\n    }\n\n    this.config = options;\n    this.validateConfig();\n  }\n\n  public clearLoadCache(): void {\n    if (this.loadCache) {\n      this.loadCache.clear();\n    }\n  }\n\n  public clearSearchCache(): void {\n    if (this.searchCache) {\n      this.searchCache.clear();\n    }\n  }\n\n  public clearCaches(): void {\n    this.clearLoadCache();\n    this.clearSearchCache();\n  }\n\n  private validateConfig(): void {\n    const config = this.config;\n\n    config.searchPlaces.forEach((place): void => {\n      const loaderKey = path.extname(place) || 'noExt';\n      const loader = config.loaders[loaderKey];\n      if (!loader) {\n        throw new Error(\n          `No loader specified for ${getExtensionDescription(\n            place,\n          )}, so searchPlaces item \"${place}\" is invalid`,\n        );\n      }\n\n      if (typeof loader !== 'function') {\n        throw new Error(\n          `loader for ${getExtensionDescription(\n            place,\n          )} is not a function (type provided: \"${typeof loader}\"), so searchPlaces item \"${place}\" is invalid`,\n        );\n      }\n    });\n  }\n\n  protected shouldSearchStopWithResult(result: CosmiconfigResult): boolean {\n    if (result === null) return false;\n    if (result.isEmpty && this.config.ignoreEmptySearchPlaces) return false;\n    return true;\n  }\n\n  protected nextDirectoryToSearch(\n    currentDir: string,\n    currentResult: CosmiconfigResult,\n  ): string | null {\n    if (this.shouldSearchStopWithResult(currentResult)) {\n      return null;\n    }\n    const nextDir = nextDirUp(currentDir);\n    if (nextDir === currentDir || currentDir === this.config.stopDir) {\n      return null;\n    }\n    return nextDir;\n  }\n\n  private loadPackageProp(filepath: string, content: string): unknown {\n    const parsedContent = loaders.loadJson(filepath, content);\n    const packagePropValue = getPropertyByPath(\n      parsedContent,\n      this.config.packageProp,\n    );\n    return packagePropValue || null;\n  }\n\n  protected getLoaderEntryForFile(filepath: string): Loader {\n    if (path.basename(filepath) === 'package.json') {\n      const loader = this.loadPackageProp.bind(this);\n      return loader;\n    }\n\n    const loaderKey = path.extname(filepath) || 'noExt';\n\n    const loader = this.config.loaders[loaderKey];\n\n    if (!loader) {\n      throw new Error(\n        `No loader specified for ${getExtensionDescription(filepath)}`,\n      );\n    }\n\n    return loader;\n  }\n\n  protected loadedContentToCosmiconfigResult(\n    filepath: string,\n    loadedContent: LoadedFileContent,\n  ): CosmiconfigResult {\n    if (loadedContent === null) {\n      return null;\n    }\n    if (loadedContent === undefined) {\n      return { filepath, config: undefined, isEmpty: true };\n    }\n    return { config: loadedContent, filepath };\n  }\n\n  protected validateFilePath(filepath: string): void {\n    if (!filepath) {\n      throw new Error('load must pass a non-empty string');\n    }\n  }\n}\n\nfunction nextDirUp(dir: string): string {\n  return path.dirname(dir);\n}\n\nfunction getExtensionDescription(filepath: string): string {\n  const ext = path.extname(filepath);\n  return ext ? `extension \"${ext}\"` : 'files without extensions';\n}\n\nexport { ExplorerBase, getExtensionDescription };\n"],"file":"ExplorerBase.js"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerSync.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerSync.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerSync.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,14 @@
+import { ExplorerBase } from './ExplorerBase';
+import { CosmiconfigResult, ExplorerOptionsSync } from './types';
+declare class ExplorerSync extends ExplorerBase<ExplorerOptionsSync> {
+    constructor(options: ExplorerOptionsSync);
+    searchSync(searchFrom?: string): CosmiconfigResult;
+    private searchFromDirectorySync;
+    private searchDirectorySync;
+    private loadSearchPlaceSync;
+    private loadFileContentSync;
+    private createCosmiconfigResultSync;
+    loadSync(filepath: string): CosmiconfigResult;
+}
+export { ExplorerSync };
+//# sourceMappingURL=ExplorerSync.d.ts.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerSync.d.ts.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerSync.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerSync.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"file":"ExplorerSync.d.ts","sourceRoot":"","sources":["../src/ExplorerSync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI9C,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EAEpB,MAAM,SAAS,CAAC;AAEjB,cAAM,YAAa,SAAQ,YAAY,CAAC,mBAAmB,CAAC;gBACvC,OAAO,EAAE,mBAAmB;IAIxC,UAAU,CAAC,UAAU,GAAE,MAAsB,GAAG,iBAAiB;IAOxE,OAAO,CAAC,uBAAuB;IAuB/B,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,2BAA2B;IAU5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB;CAsBrD;AAED,OAAO,EAAE,YAAY,EAAE,CAAC"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerSync.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerSync.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerSync.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,118 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.ExplorerSync = void 0;
+
+var _path = _interopRequireDefault(require("path"));
+
+var _ExplorerBase = require("./ExplorerBase");
+
+var _readFile = require("./readFile");
+
+var _cacheWrapper = require("./cacheWrapper");
+
+var _getDirectory = require("./getDirectory");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+class ExplorerSync extends _ExplorerBase.ExplorerBase {
+  constructor(options) {
+    super(options);
+  }
+
+  searchSync(searchFrom = process.cwd()) {
+    const startDirectory = (0, _getDirectory.getDirectorySync)(searchFrom);
+    const result = this.searchFromDirectorySync(startDirectory);
+    return result;
+  }
+
+  searchFromDirectorySync(dir) {
+    const absoluteDir = _path.default.resolve(process.cwd(), dir);
+
+    const run = () => {
+      const result = this.searchDirectorySync(absoluteDir);
+      const nextDir = this.nextDirectoryToSearch(absoluteDir, result);
+
+      if (nextDir) {
+        return this.searchFromDirectorySync(nextDir);
+      }
+
+      const transformResult = this.config.transform(result);
+      return transformResult;
+    };
+
+    if (this.searchCache) {
+      return (0, _cacheWrapper.cacheWrapperSync)(this.searchCache, absoluteDir, run);
+    }
+
+    return run();
+  }
+
+  searchDirectorySync(dir) {
+    for (const place of this.config.searchPlaces) {
+      const placeResult = this.loadSearchPlaceSync(dir, place);
+
+      if (this.shouldSearchStopWithResult(placeResult) === true) {
+        return placeResult;
+      }
+    } // config not found
+
+
+    return null;
+  }
+
+  loadSearchPlaceSync(dir, place) {
+    const filepath = _path.default.join(dir, place);
+
+    const content = (0, _readFile.readFileSync)(filepath);
+    const result = this.createCosmiconfigResultSync(filepath, content);
+    return result;
+  }
+
+  loadFileContentSync(filepath, content) {
+    if (content === null) {
+      return null;
+    }
+
+    if (content.trim() === '') {
+      return undefined;
+    }
+
+    const loader = this.getLoaderEntryForFile(filepath);
+    const loaderResult = loader(filepath, content);
+    return loaderResult;
+  }
+
+  createCosmiconfigResultSync(filepath, content) {
+    const fileContent = this.loadFileContentSync(filepath, content);
+    const result = this.loadedContentToCosmiconfigResult(filepath, fileContent);
+    return result;
+  }
+
+  loadSync(filepath) {
+    this.validateFilePath(filepath);
+
+    const absoluteFilePath = _path.default.resolve(process.cwd(), filepath);
+
+    const runLoadSync = () => {
+      const content = (0, _readFile.readFileSync)(absoluteFilePath, {
+        throwNotFound: true
+      });
+      const cosmiconfigResult = this.createCosmiconfigResultSync(absoluteFilePath, content);
+      const transformResult = this.config.transform(cosmiconfigResult);
+      return transformResult;
+    };
+
+    if (this.loadCache) {
+      return (0, _cacheWrapper.cacheWrapperSync)(this.loadCache, absoluteFilePath, runLoadSync);
+    }
+
+    return runLoadSync();
+  }
+
+}
+
+exports.ExplorerSync = ExplorerSync;
+//# sourceMappingURL=ExplorerSync.js.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerSync.js.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerSync.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/ExplorerSync.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"sources":["../src/ExplorerSync.ts"],"names":["ExplorerSync","ExplorerBase","constructor","options","searchSync","searchFrom","process","cwd","startDirectory","result","searchFromDirectorySync","dir","absoluteDir","path","resolve","run","searchDirectorySync","nextDir","nextDirectoryToSearch","transformResult","config","transform","searchCache","place","searchPlaces","placeResult","loadSearchPlaceSync","shouldSearchStopWithResult","filepath","join","content","createCosmiconfigResultSync","loadFileContentSync","trim","undefined","loader","getLoaderEntryForFile","loaderResult","fileContent","loadedContentToCosmiconfigResult","loadSync","validateFilePath","absoluteFilePath","runLoadSync","throwNotFound","cosmiconfigResult","loadCache"],"mappings":";;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;;;AAOA,MAAMA,YAAN,SAA2BC,0BAA3B,CAA6D;AACpDC,EAAAA,WAAP,CAAmBC,OAAnB,EAAiD;AAC/C,UAAMA,OAAN;AACD;;AAEMC,EAAAA,UAAP,CAAkBC,UAAkB,GAAGC,OAAO,CAACC,GAAR,EAAvC,EAAyE;AACvE,UAAMC,cAAc,GAAG,oCAAiBH,UAAjB,CAAvB;AACA,UAAMI,MAAM,GAAG,KAAKC,uBAAL,CAA6BF,cAA7B,CAAf;AAEA,WAAOC,MAAP;AACD;;AAEOC,EAAAA,uBAAR,CAAgCC,GAAhC,EAAgE;AAC9D,UAAMC,WAAW,GAAGC,cAAKC,OAAL,CAAaR,OAAO,CAACC,GAAR,EAAb,EAA4BI,GAA5B,CAApB;;AAEA,UAAMI,GAAG,GAAG,MAAyB;AACnC,YAAMN,MAAM,GAAG,KAAKO,mBAAL,CAAyBJ,WAAzB,CAAf;AACA,YAAMK,OAAO,GAAG,KAAKC,qBAAL,CAA2BN,WAA3B,EAAwCH,MAAxC,CAAhB;;AAEA,UAAIQ,OAAJ,EAAa;AACX,eAAO,KAAKP,uBAAL,CAA6BO,OAA7B,CAAP;AACD;;AAED,YAAME,eAAe,GAAG,KAAKC,MAAL,CAAYC,SAAZ,CAAsBZ,MAAtB,CAAxB;AAEA,aAAOU,eAAP;AACD,KAXD;;AAaA,QAAI,KAAKG,WAAT,EAAsB;AACpB,aAAO,oCAAiB,KAAKA,WAAtB,EAAmCV,WAAnC,EAAgDG,GAAhD,CAAP;AACD;;AAED,WAAOA,GAAG,EAAV;AACD;;AAEOC,EAAAA,mBAAR,CAA4BL,GAA5B,EAA4D;AAC1D,SAAK,MAAMY,KAAX,IAAoB,KAAKH,MAAL,CAAYI,YAAhC,EAA8C;AAC5C,YAAMC,WAAW,GAAG,KAAKC,mBAAL,CAAyBf,GAAzB,EAA8BY,KAA9B,CAApB;;AAEA,UAAI,KAAKI,0BAAL,CAAgCF,WAAhC,MAAiD,IAArD,EAA2D;AACzD,eAAOA,WAAP;AACD;AACF,KAPyD,CAS1D;;;AACA,WAAO,IAAP;AACD;;AAEOC,EAAAA,mBAAR,CAA4Bf,GAA5B,EAAyCY,KAAzC,EAA2E;AACzE,UAAMK,QAAQ,GAAGf,cAAKgB,IAAL,CAAUlB,GAAV,EAAeY,KAAf,CAAjB;;AACA,UAAMO,OAAO,GAAG,4BAAaF,QAAb,CAAhB;AAEA,UAAMnB,MAAM,GAAG,KAAKsB,2BAAL,CAAiCH,QAAjC,EAA2CE,OAA3C,CAAf;AAEA,WAAOrB,MAAP;AACD;;AAEOuB,EAAAA,mBAAR,CACEJ,QADF,EAEEE,OAFF,EAGqB;AACnB,QAAIA,OAAO,KAAK,IAAhB,EAAsB;AACpB,aAAO,IAAP;AACD;;AACD,QAAIA,OAAO,CAACG,IAAR,OAAmB,EAAvB,EAA2B;AACzB,aAAOC,SAAP;AACD;;AACD,UAAMC,MAAM,GAAG,KAAKC,qBAAL,CAA2BR,QAA3B,CAAf;AACA,UAAMS,YAAY,GAAGF,MAAM,CAACP,QAAD,EAAWE,OAAX,CAA3B;AAEA,WAAOO,YAAP;AACD;;AAEON,EAAAA,2BAAR,CACEH,QADF,EAEEE,OAFF,EAGqB;AACnB,UAAMQ,WAAW,GAAG,KAAKN,mBAAL,CAAyBJ,QAAzB,EAAmCE,OAAnC,CAApB;AACA,UAAMrB,MAAM,GAAG,KAAK8B,gCAAL,CAAsCX,QAAtC,EAAgDU,WAAhD,CAAf;AAEA,WAAO7B,MAAP;AACD;;AAEM+B,EAAAA,QAAP,CAAgBZ,QAAhB,EAAqD;AACnD,SAAKa,gBAAL,CAAsBb,QAAtB;;AACA,UAAMc,gBAAgB,GAAG7B,cAAKC,OAAL,CAAaR,OAAO,CAACC,GAAR,EAAb,EAA4BqB,QAA5B,CAAzB;;AAEA,UAAMe,WAAW,GAAG,MAAyB;AAC3C,YAAMb,OAAO,GAAG,4BAAaY,gBAAb,EAA+B;AAAEE,QAAAA,aAAa,EAAE;AAAjB,OAA/B,CAAhB;AACA,YAAMC,iBAAiB,GAAG,KAAKd,2BAAL,CACxBW,gBADwB,EAExBZ,OAFwB,CAA1B;AAKA,YAAMX,eAAe,GAAG,KAAKC,MAAL,CAAYC,SAAZ,CAAsBwB,iBAAtB,CAAxB;AAEA,aAAO1B,eAAP;AACD,KAVD;;AAYA,QAAI,KAAK2B,SAAT,EAAoB;AAClB,aAAO,oCAAiB,KAAKA,SAAtB,EAAiCJ,gBAAjC,EAAmDC,WAAnD,CAAP;AACD;;AAED,WAAOA,WAAW,EAAlB;AACD;;AAxG0D","sourcesContent":["import path from 'path';\nimport { ExplorerBase } from './ExplorerBase';\nimport { readFileSync } from './readFile';\nimport { cacheWrapperSync } from './cacheWrapper';\nimport { getDirectorySync } from './getDirectory';\nimport {\n  CosmiconfigResult,\n  ExplorerOptionsSync,\n  LoadedFileContent,\n} from './types';\n\nclass ExplorerSync extends ExplorerBase<ExplorerOptionsSync> {\n  public constructor(options: ExplorerOptionsSync) {\n    super(options);\n  }\n\n  public searchSync(searchFrom: string = process.cwd()): CosmiconfigResult {\n    const startDirectory = getDirectorySync(searchFrom);\n    const result = this.searchFromDirectorySync(startDirectory);\n\n    return result;\n  }\n\n  private searchFromDirectorySync(dir: string): CosmiconfigResult {\n    const absoluteDir = path.resolve(process.cwd(), dir);\n\n    const run = (): CosmiconfigResult => {\n      const result = this.searchDirectorySync(absoluteDir);\n      const nextDir = this.nextDirectoryToSearch(absoluteDir, result);\n\n      if (nextDir) {\n        return this.searchFromDirectorySync(nextDir);\n      }\n\n      const transformResult = this.config.transform(result);\n\n      return transformResult;\n    };\n\n    if (this.searchCache) {\n      return cacheWrapperSync(this.searchCache, absoluteDir, run);\n    }\n\n    return run();\n  }\n\n  private searchDirectorySync(dir: string): CosmiconfigResult {\n    for (const place of this.config.searchPlaces) {\n      const placeResult = this.loadSearchPlaceSync(dir, place);\n\n      if (this.shouldSearchStopWithResult(placeResult) === true) {\n        return placeResult;\n      }\n    }\n\n    // config not found\n    return null;\n  }\n\n  private loadSearchPlaceSync(dir: string, place: string): CosmiconfigResult {\n    const filepath = path.join(dir, place);\n    const content = readFileSync(filepath);\n\n    const result = this.createCosmiconfigResultSync(filepath, content);\n\n    return result;\n  }\n\n  private loadFileContentSync(\n    filepath: string,\n    content: string | null,\n  ): LoadedFileContent {\n    if (content === null) {\n      return null;\n    }\n    if (content.trim() === '') {\n      return undefined;\n    }\n    const loader = this.getLoaderEntryForFile(filepath);\n    const loaderResult = loader(filepath, content);\n\n    return loaderResult;\n  }\n\n  private createCosmiconfigResultSync(\n    filepath: string,\n    content: string | null,\n  ): CosmiconfigResult {\n    const fileContent = this.loadFileContentSync(filepath, content);\n    const result = this.loadedContentToCosmiconfigResult(filepath, fileContent);\n\n    return result;\n  }\n\n  public loadSync(filepath: string): CosmiconfigResult {\n    this.validateFilePath(filepath);\n    const absoluteFilePath = path.resolve(process.cwd(), filepath);\n\n    const runLoadSync = (): CosmiconfigResult => {\n      const content = readFileSync(absoluteFilePath, { throwNotFound: true });\n      const cosmiconfigResult = this.createCosmiconfigResultSync(\n        absoluteFilePath,\n        content,\n      );\n\n      const transformResult = this.config.transform(cosmiconfigResult);\n\n      return transformResult;\n    };\n\n    if (this.loadCache) {\n      return cacheWrapperSync(this.loadCache, absoluteFilePath, runLoadSync);\n    }\n\n    return runLoadSync();\n  }\n}\n\nexport { ExplorerSync };\n"],"file":"ExplorerSync.js"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/cacheWrapper.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/cacheWrapper.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/cacheWrapper.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+import { Cache, CosmiconfigResult } from './types';
+declare function cacheWrapper(cache: Cache, key: string, fn: () => Promise<CosmiconfigResult>): Promise<CosmiconfigResult>;
+declare function cacheWrapperSync(cache: Cache, key: string, fn: () => CosmiconfigResult): CosmiconfigResult;
+export { cacheWrapper, cacheWrapperSync };
+//# sourceMappingURL=cacheWrapper.d.ts.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/cacheWrapper.d.ts.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/cacheWrapper.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/cacheWrapper.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"file":"cacheWrapper.d.ts","sourceRoot":"","sources":["../src/cacheWrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEnD,iBAAe,YAAY,CACzB,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,GACnC,OAAO,CAAC,iBAAiB,CAAC,CAS5B;AAED,iBAAS,gBAAgB,CACvB,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,MAAM,EACX,EAAE,EAAE,MAAM,iBAAiB,GAC1B,iBAAiB,CASnB;AAED,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/cacheWrapper.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/cacheWrapper.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/cacheWrapper.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,32 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.cacheWrapper = cacheWrapper;
+exports.cacheWrapperSync = cacheWrapperSync;
+
+async function cacheWrapper(cache, key, fn) {
+  const cached = cache.get(key);
+
+  if (cached !== undefined) {
+    return cached;
+  }
+
+  const result = await fn();
+  cache.set(key, result);
+  return result;
+}
+
+function cacheWrapperSync(cache, key, fn) {
+  const cached = cache.get(key);
+
+  if (cached !== undefined) {
+    return cached;
+  }
+
+  const result = fn();
+  cache.set(key, result);
+  return result;
+}
+//# sourceMappingURL=cacheWrapper.js.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/cacheWrapper.js.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/cacheWrapper.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/cacheWrapper.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"sources":["../src/cacheWrapper.ts"],"names":["cacheWrapper","cache","key","fn","cached","get","undefined","result","set","cacheWrapperSync"],"mappings":";;;;;;;;AAEA,eAAeA,YAAf,CACEC,KADF,EAEEC,GAFF,EAGEC,EAHF,EAI8B;AAC5B,QAAMC,MAAM,GAAGH,KAAK,CAACI,GAAN,CAAUH,GAAV,CAAf;;AACA,MAAIE,MAAM,KAAKE,SAAf,EAA0B;AACxB,WAAOF,MAAP;AACD;;AAED,QAAMG,MAAM,GAAG,MAAMJ,EAAE,EAAvB;AACAF,EAAAA,KAAK,CAACO,GAAN,CAAUN,GAAV,EAAeK,MAAf;AACA,SAAOA,MAAP;AACD;;AAED,SAASE,gBAAT,CACER,KADF,EAEEC,GAFF,EAGEC,EAHF,EAIqB;AACnB,QAAMC,MAAM,GAAGH,KAAK,CAACI,GAAN,CAAUH,GAAV,CAAf;;AACA,MAAIE,MAAM,KAAKE,SAAf,EAA0B;AACxB,WAAOF,MAAP;AACD;;AAED,QAAMG,MAAM,GAAGJ,EAAE,EAAjB;AACAF,EAAAA,KAAK,CAACO,GAAN,CAAUN,GAAV,EAAeK,MAAf;AACA,SAAOA,MAAP;AACD","sourcesContent":["import { Cache, CosmiconfigResult } from './types';\n\nasync function cacheWrapper(\n  cache: Cache,\n  key: string,\n  fn: () => Promise<CosmiconfigResult>,\n): Promise<CosmiconfigResult> {\n  const cached = cache.get(key);\n  if (cached !== undefined) {\n    return cached;\n  }\n\n  const result = await fn();\n  cache.set(key, result);\n  return result;\n}\n\nfunction cacheWrapperSync(\n  cache: Cache,\n  key: string,\n  fn: () => CosmiconfigResult,\n): CosmiconfigResult {\n  const cached = cache.get(key);\n  if (cached !== undefined) {\n    return cached;\n  }\n\n  const result = fn();\n  cache.set(key, result);\n  return result;\n}\n\nexport { cacheWrapper, cacheWrapperSync };\n"],"file":"cacheWrapper.js"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getDirectory.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getDirectory.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getDirectory.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+declare function getDirectory(filepath: string): Promise<string>;
+declare function getDirectorySync(filepath: string): string;
+export { getDirectory, getDirectorySync };
+//# sourceMappingURL=getDirectory.d.ts.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getDirectory.d.ts.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getDirectory.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getDirectory.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"file":"getDirectory.d.ts","sourceRoot":"","sources":["../src/getDirectory.ts"],"names":[],"mappings":"AAGA,iBAAe,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAU7D;AAED,iBAAS,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getDirectory.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getDirectory.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getDirectory.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,38 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.getDirectory = getDirectory;
+exports.getDirectorySync = getDirectorySync;
+
+var _path = _interopRequireDefault(require("path"));
+
+var _pathType = require("path-type");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+async function getDirectory(filepath) {
+  const filePathIsDirectory = await (0, _pathType.isDirectory)(filepath);
+
+  if (filePathIsDirectory === true) {
+    return filepath;
+  }
+
+  const directory = _path.default.dirname(filepath);
+
+  return directory;
+}
+
+function getDirectorySync(filepath) {
+  const filePathIsDirectory = (0, _pathType.isDirectorySync)(filepath);
+
+  if (filePathIsDirectory === true) {
+    return filepath;
+  }
+
+  const directory = _path.default.dirname(filepath);
+
+  return directory;
+}
+//# sourceMappingURL=getDirectory.js.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getDirectory.js.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getDirectory.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getDirectory.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"sources":["../src/getDirectory.ts"],"names":["getDirectory","filepath","filePathIsDirectory","directory","path","dirname","getDirectorySync"],"mappings":";;;;;;;;AAAA;;AACA;;;;AAEA,eAAeA,YAAf,CAA4BC,QAA5B,EAA+D;AAC7D,QAAMC,mBAAmB,GAAG,MAAM,2BAAYD,QAAZ,CAAlC;;AAEA,MAAIC,mBAAmB,KAAK,IAA5B,EAAkC;AAChC,WAAOD,QAAP;AACD;;AAED,QAAME,SAAS,GAAGC,cAAKC,OAAL,CAAaJ,QAAb,CAAlB;;AAEA,SAAOE,SAAP;AACD;;AAED,SAASG,gBAAT,CAA0BL,QAA1B,EAAoD;AAClD,QAAMC,mBAAmB,GAAG,+BAAgBD,QAAhB,CAA5B;;AAEA,MAAIC,mBAAmB,KAAK,IAA5B,EAAkC;AAChC,WAAOD,QAAP;AACD;;AAED,QAAME,SAAS,GAAGC,cAAKC,OAAL,CAAaJ,QAAb,CAAlB;;AAEA,SAAOE,SAAP;AACD","sourcesContent":["import path from 'path';\nimport { isDirectory, isDirectorySync } from 'path-type';\n\nasync function getDirectory(filepath: string): Promise<string> {\n  const filePathIsDirectory = await isDirectory(filepath);\n\n  if (filePathIsDirectory === true) {\n    return filepath;\n  }\n\n  const directory = path.dirname(filepath);\n\n  return directory;\n}\n\nfunction getDirectorySync(filepath: string): string {\n  const filePathIsDirectory = isDirectorySync(filepath);\n\n  if (filePathIsDirectory === true) {\n    return filepath;\n  }\n\n  const directory = path.dirname(filepath);\n\n  return directory;\n}\n\nexport { getDirectory, getDirectorySync };\n"],"file":"getDirectory.js"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getPropertyByPath.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getPropertyByPath.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getPropertyByPath.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+declare function getPropertyByPath(source: {
+    [key: string]: unknown;
+}, path: string | Array<string>): unknown;
+export { getPropertyByPath };
+//# sourceMappingURL=getPropertyByPath.d.ts.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getPropertyByPath.d.ts.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getPropertyByPath.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getPropertyByPath.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"file":"getPropertyByPath.d.ts","sourceRoot":"","sources":["../src/getPropertyByPath.ts"],"names":[],"mappings":"AAKA,iBAAS,iBAAiB,CACxB,MAAM,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,EAClC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAC3B,OAAO,CAgBT;AAED,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getPropertyByPath.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getPropertyByPath.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getPropertyByPath.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,28 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.getPropertyByPath = getPropertyByPath;
+
+// Resolves property names or property paths defined with period-delimited
+// strings or arrays of strings. Property names that are found on the source
+// object are used directly (even if they include a period).
+// Nested property names that include periods, within a path, are only
+// understood in array paths.
+function getPropertyByPath(source, path) {
+  if (typeof path === 'string' && Object.prototype.hasOwnProperty.call(source, path)) {
+    return source[path];
+  }
+
+  const parsedPath = typeof path === 'string' ? path.split('.') : path; // eslint-disable-next-line @typescript-eslint/no-explicit-any
+
+  return parsedPath.reduce((previous, key) => {
+    if (previous === undefined) {
+      return previous;
+    }
+
+    return previous[key];
+  }, source);
+}
+//# sourceMappingURL=getPropertyByPath.js.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getPropertyByPath.js.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getPropertyByPath.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/getPropertyByPath.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"sources":["../src/getPropertyByPath.ts"],"names":["getPropertyByPath","source","path","Object","prototype","hasOwnProperty","call","parsedPath","split","reduce","previous","key","undefined"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA,SAASA,iBAAT,CACEC,MADF,EAEEC,IAFF,EAGW;AACT,MACE,OAAOA,IAAP,KAAgB,QAAhB,IACAC,MAAM,CAACC,SAAP,CAAiBC,cAAjB,CAAgCC,IAAhC,CAAqCL,MAArC,EAA6CC,IAA7C,CAFF,EAGE;AACA,WAAOD,MAAM,CAACC,IAAD,CAAb;AACD;;AAED,QAAMK,UAAU,GAAG,OAAOL,IAAP,KAAgB,QAAhB,GAA2BA,IAAI,CAACM,KAAL,CAAW,GAAX,CAA3B,GAA6CN,IAAhE,CARS,CAST;;AACA,SAAOK,UAAU,CAACE,MAAX,CAAkB,CAACC,QAAD,EAAgBC,GAAhB,KAAiC;AACxD,QAAID,QAAQ,KAAKE,SAAjB,EAA4B;AAC1B,aAAOF,QAAP;AACD;;AACD,WAAOA,QAAQ,CAACC,GAAD,CAAf;AACD,GALM,EAKJV,MALI,CAAP;AAMD","sourcesContent":["// Resolves property names or property paths defined with period-delimited\n// strings or arrays of strings. Property names that are found on the source\n// object are used directly (even if they include a period).\n// Nested property names that include periods, within a path, are only\n// understood in array paths.\nfunction getPropertyByPath(\n  source: { [key: string]: unknown },\n  path: string | Array<string>,\n): unknown {\n  if (\n    typeof path === 'string' &&\n    Object.prototype.hasOwnProperty.call(source, path)\n  ) {\n    return source[path];\n  }\n\n  const parsedPath = typeof path === 'string' ? path.split('.') : path;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  return parsedPath.reduce((previous: any, key): unknown => {\n    if (previous === undefined) {\n      return previous;\n    }\n    return previous[key];\n  }, source);\n}\n\nexport { getPropertyByPath };\n"],"file":"getPropertyByPath.js"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/index.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,44 @@
+import { Config, CosmiconfigResult, Loaders, LoadersSync } from './types';
+declare type LoaderResult = Config | null;
+export declare type Loader = ((filepath: string, content: string) => Promise<LoaderResult>) | LoaderSync;
+export declare type LoaderSync = (filepath: string, content: string) => LoaderResult;
+export declare type Transform = ((CosmiconfigResult: CosmiconfigResult) => Promise<CosmiconfigResult>) | TransformSync;
+export declare type TransformSync = (CosmiconfigResult: CosmiconfigResult) => CosmiconfigResult;
+interface OptionsBase {
+    packageProp?: string;
+    searchPlaces?: Array<string>;
+    ignoreEmptySearchPlaces?: boolean;
+    stopDir?: string;
+    cache?: boolean;
+}
+export interface Options extends OptionsBase {
+    loaders?: Loaders;
+    transform?: Transform;
+}
+export interface OptionsSync extends OptionsBase {
+    loaders?: LoadersSync;
+    transform?: TransformSync;
+}
+declare function cosmiconfig(moduleName: string, options?: Options): {
+    readonly search: (searchFrom?: string) => Promise<CosmiconfigResult>;
+    readonly load: (filepath: string) => Promise<CosmiconfigResult>;
+    readonly clearLoadCache: () => void;
+    readonly clearSearchCache: () => void;
+    readonly clearCaches: () => void;
+};
+declare function cosmiconfigSync(moduleName: string, options?: OptionsSync): {
+    readonly search: (searchFrom?: string) => CosmiconfigResult;
+    readonly load: (filepath: string) => CosmiconfigResult;
+    readonly clearLoadCache: () => void;
+    readonly clearSearchCache: () => void;
+    readonly clearCaches: () => void;
+};
+declare const defaultLoaders: Readonly<{
+    readonly '.js': LoaderSync;
+    readonly '.json': LoaderSync;
+    readonly '.yaml': LoaderSync;
+    readonly '.yml': LoaderSync;
+    readonly noExt: LoaderSync;
+}>;
+export { cosmiconfig, cosmiconfigSync, defaultLoaders };
+//# sourceMappingURL=index.d.ts.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/index.d.ts.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/index.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/index.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,MAAM,EACN,iBAAiB,EAGjB,OAAO,EACP,WAAW,EACZ,MAAM,SAAS,CAAC;AAEjB,aAAK,YAAY,GAAG,MAAM,GAAG,IAAI,CAAC;AAClC,oBAAY,MAAM,GACd,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC,GAC9D,UAAU,CAAC;AACf,oBAAY,UAAU,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,YAAY,CAAC;AAE7E,oBAAY,SAAS,GACjB,CAAC,CAAC,iBAAiB,EAAE,iBAAiB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC,GACtE,aAAa,CAAC;AAElB,oBAAY,aAAa,GAAG,CAC1B,iBAAiB,EAAE,iBAAiB,KACjC,iBAAiB,CAAC;AAEvB,UAAU,WAAW;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7B,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,OAAQ,SAAQ,WAAW;IAC1C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAED,MAAM,WAAW,WAAY,SAAQ,WAAW;IAC9C,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,SAAS,CAAC,EAAE,aAAa,CAAC;CAC3B;AAGD,iBAAS,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,OAAY;;;;;;EAe7D;AAGD,iBAAS,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB;;;;;;EAerE;AAGD,QAAA,MAAM,cAAc;;;;;;EAMT,CAAC;AAgDZ,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,CAAC"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,80 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.cosmiconfig = cosmiconfig;
+exports.cosmiconfigSync = cosmiconfigSync;
+exports.defaultLoaders = void 0;
+
+var _os = _interopRequireDefault(require("os"));
+
+var _Explorer = require("./Explorer");
+
+var _ExplorerSync = require("./ExplorerSync");
+
+var _loaders = require("./loaders");
+
+var _types = require("./types");
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
+function cosmiconfig(moduleName, options = {}) {
+  const normalizedOptions = normalizeOptions(moduleName, options);
+  const explorer = new _Explorer.Explorer(normalizedOptions);
+  return {
+    search: explorer.search.bind(explorer),
+    load: explorer.load.bind(explorer),
+    clearLoadCache: explorer.clearLoadCache.bind(explorer),
+    clearSearchCache: explorer.clearSearchCache.bind(explorer),
+    clearCaches: explorer.clearCaches.bind(explorer)
+  };
+} // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
+
+
+function cosmiconfigSync(moduleName, options = {}) {
+  const normalizedOptions = normalizeOptions(moduleName, options);
+  const explorerSync = new _ExplorerSync.ExplorerSync(normalizedOptions);
+  return {
+    search: explorerSync.searchSync.bind(explorerSync),
+    load: explorerSync.loadSync.bind(explorerSync),
+    clearLoadCache: explorerSync.clearLoadCache.bind(explorerSync),
+    clearSearchCache: explorerSync.clearSearchCache.bind(explorerSync),
+    clearCaches: explorerSync.clearCaches.bind(explorerSync)
+  };
+} // do not allow mutation of default loaders. Make sure it is set inside options
+
+
+const defaultLoaders = Object.freeze({
+  '.js': _loaders.loaders.loadJs,
+  '.json': _loaders.loaders.loadJson,
+  '.yaml': _loaders.loaders.loadYaml,
+  '.yml': _loaders.loaders.loadYaml,
+  noExt: _loaders.loaders.loadYaml
+});
+exports.defaultLoaders = defaultLoaders;
+
+function normalizeOptions(moduleName, options) {
+  const defaults = {
+    packageProp: moduleName,
+    searchPlaces: ['package.json', `.${moduleName}rc`, `.${moduleName}rc.json`, `.${moduleName}rc.yaml`, `.${moduleName}rc.yml`, `.${moduleName}rc.js`, `${moduleName}.config.js`],
+    ignoreEmptySearchPlaces: true,
+    stopDir: _os.default.homedir(),
+    cache: true,
+    transform: identity,
+    loaders: defaultLoaders
+  };
+  const normalizedOptions = { ...defaults,
+    ...options,
+    loaders: { ...defaults.loaders,
+      ...options.loaders
+    }
+  };
+  return normalizedOptions;
+}
+
+const identity = function identity(x) {
+  return x;
+};
+//# sourceMappingURL=index.js.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/index.js.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/index.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/index.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"sources":["../src/index.ts"],"names":["cosmiconfig","moduleName","options","normalizedOptions","normalizeOptions","explorer","Explorer","search","bind","load","clearLoadCache","clearSearchCache","clearCaches","cosmiconfigSync","explorerSync","ExplorerSync","searchSync","loadSync","defaultLoaders","Object","freeze","loaders","loadJs","loadJson","loadYaml","noExt","defaults","packageProp","searchPlaces","ignoreEmptySearchPlaces","stopDir","os","homedir","cache","transform","identity","x"],"mappings":";;;;;;;;;AAAA;;AACA;;AACA;;AACA;;AACA;;;;AAyCA;AACA,SAASA,WAAT,CAAqBC,UAArB,EAAyCC,OAAgB,GAAG,EAA5D,EAAgE;AAC9D,QAAMC,iBAAkC,GAAGC,gBAAgB,CACzDH,UADyD,EAEzDC,OAFyD,CAA3D;AAKA,QAAMG,QAAQ,GAAG,IAAIC,kBAAJ,CAAaH,iBAAb,CAAjB;AAEA,SAAO;AACLI,IAAAA,MAAM,EAAEF,QAAQ,CAACE,MAAT,CAAgBC,IAAhB,CAAqBH,QAArB,CADH;AAELI,IAAAA,IAAI,EAAEJ,QAAQ,CAACI,IAAT,CAAcD,IAAd,CAAmBH,QAAnB,CAFD;AAGLK,IAAAA,cAAc,EAAEL,QAAQ,CAACK,cAAT,CAAwBF,IAAxB,CAA6BH,QAA7B,CAHX;AAILM,IAAAA,gBAAgB,EAAEN,QAAQ,CAACM,gBAAT,CAA0BH,IAA1B,CAA+BH,QAA/B,CAJb;AAKLO,IAAAA,WAAW,EAAEP,QAAQ,CAACO,WAAT,CAAqBJ,IAArB,CAA0BH,QAA1B;AALR,GAAP;AAOD,C,CAED;;;AACA,SAASQ,eAAT,CAAyBZ,UAAzB,EAA6CC,OAAoB,GAAG,EAApE,EAAwE;AACtE,QAAMC,iBAAsC,GAAGC,gBAAgB,CAC7DH,UAD6D,EAE7DC,OAF6D,CAA/D;AAKA,QAAMY,YAAY,GAAG,IAAIC,0BAAJ,CAAiBZ,iBAAjB,CAArB;AAEA,SAAO;AACLI,IAAAA,MAAM,EAAEO,YAAY,CAACE,UAAb,CAAwBR,IAAxB,CAA6BM,YAA7B,CADH;AAELL,IAAAA,IAAI,EAAEK,YAAY,CAACG,QAAb,CAAsBT,IAAtB,CAA2BM,YAA3B,CAFD;AAGLJ,IAAAA,cAAc,EAAEI,YAAY,CAACJ,cAAb,CAA4BF,IAA5B,CAAiCM,YAAjC,CAHX;AAILH,IAAAA,gBAAgB,EAAEG,YAAY,CAACH,gBAAb,CAA8BH,IAA9B,CAAmCM,YAAnC,CAJb;AAKLF,IAAAA,WAAW,EAAEE,YAAY,CAACF,WAAb,CAAyBJ,IAAzB,CAA8BM,YAA9B;AALR,GAAP;AAOD,C,CAED;;;AACA,MAAMI,cAAc,GAAGC,MAAM,CAACC,MAAP,CAAc;AACnC,SAAOC,iBAAQC,MADoB;AAEnC,WAASD,iBAAQE,QAFkB;AAGnC,WAASF,iBAAQG,QAHkB;AAInC,UAAQH,iBAAQG,QAJmB;AAKnCC,EAAAA,KAAK,EAAEJ,iBAAQG;AALoB,CAAd,CAAvB;;;AAgBA,SAASpB,gBAAT,CACEH,UADF,EAEEC,OAFF,EAGyC;AACvC,QAAMwB,QAA+C,GAAG;AACtDC,IAAAA,WAAW,EAAE1B,UADyC;AAEtD2B,IAAAA,YAAY,EAAE,CACZ,cADY,EAEX,IAAG3B,UAAW,IAFH,EAGX,IAAGA,UAAW,SAHH,EAIX,IAAGA,UAAW,SAJH,EAKX,IAAGA,UAAW,QALH,EAMX,IAAGA,UAAW,OANH,EAOX,GAAEA,UAAW,YAPF,CAFwC;AAWtD4B,IAAAA,uBAAuB,EAAE,IAX6B;AAYtDC,IAAAA,OAAO,EAAEC,YAAGC,OAAH,EAZ6C;AAatDC,IAAAA,KAAK,EAAE,IAb+C;AActDC,IAAAA,SAAS,EAAEC,QAd2C;AAetDd,IAAAA,OAAO,EAAEH;AAf6C,GAAxD;AAkBA,QAAMf,iBAAwD,GAAG,EAC/D,GAAGuB,QAD4D;AAE/D,OAAGxB,OAF4D;AAG/DmB,IAAAA,OAAO,EAAE,EACP,GAAGK,QAAQ,CAACL,OADL;AAEP,SAAGnB,OAAO,CAACmB;AAFJ;AAHsD,GAAjE;AASA,SAAOlB,iBAAP;AACD;;AAED,MAAMgC,QAAuB,GAAG,SAASA,QAAT,CAAkBC,CAAlB,EAAqB;AACnD,SAAOA,CAAP;AACD,CAFD","sourcesContent":["import os from 'os';\nimport { Explorer } from './Explorer';\nimport { ExplorerSync } from './ExplorerSync';\nimport { loaders } from './loaders';\nimport {\n  Config,\n  CosmiconfigResult,\n  ExplorerOptions,\n  ExplorerOptionsSync,\n  Loaders,\n  LoadersSync,\n} from './types';\n\ntype LoaderResult = Config | null;\nexport type Loader =\n  | ((filepath: string, content: string) => Promise<LoaderResult>)\n  | LoaderSync;\nexport type LoaderSync = (filepath: string, content: string) => LoaderResult;\n\nexport type Transform =\n  | ((CosmiconfigResult: CosmiconfigResult) => Promise<CosmiconfigResult>)\n  | TransformSync;\n\nexport type TransformSync = (\n  CosmiconfigResult: CosmiconfigResult,\n) => CosmiconfigResult;\n\ninterface OptionsBase {\n  packageProp?: string;\n  searchPlaces?: Array<string>;\n  ignoreEmptySearchPlaces?: boolean;\n  stopDir?: string;\n  cache?: boolean;\n}\n\nexport interface Options extends OptionsBase {\n  loaders?: Loaders;\n  transform?: Transform;\n}\n\nexport interface OptionsSync extends OptionsBase {\n  loaders?: LoadersSync;\n  transform?: TransformSync;\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction cosmiconfig(moduleName: string, options: Options = {}) {\n  const normalizedOptions: ExplorerOptions = normalizeOptions(\n    moduleName,\n    options,\n  );\n\n  const explorer = new Explorer(normalizedOptions);\n\n  return {\n    search: explorer.search.bind(explorer),\n    load: explorer.load.bind(explorer),\n    clearLoadCache: explorer.clearLoadCache.bind(explorer),\n    clearSearchCache: explorer.clearSearchCache.bind(explorer),\n    clearCaches: explorer.clearCaches.bind(explorer),\n  } as const;\n}\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nfunction cosmiconfigSync(moduleName: string, options: OptionsSync = {}) {\n  const normalizedOptions: ExplorerOptionsSync = normalizeOptions(\n    moduleName,\n    options,\n  );\n\n  const explorerSync = new ExplorerSync(normalizedOptions);\n\n  return {\n    search: explorerSync.searchSync.bind(explorerSync),\n    load: explorerSync.loadSync.bind(explorerSync),\n    clearLoadCache: explorerSync.clearLoadCache.bind(explorerSync),\n    clearSearchCache: explorerSync.clearSearchCache.bind(explorerSync),\n    clearCaches: explorerSync.clearCaches.bind(explorerSync),\n  } as const;\n}\n\n// do not allow mutation of default loaders. Make sure it is set inside options\nconst defaultLoaders = Object.freeze({\n  '.js': loaders.loadJs,\n  '.json': loaders.loadJson,\n  '.yaml': loaders.loadYaml,\n  '.yml': loaders.loadYaml,\n  noExt: loaders.loadYaml,\n} as const);\n\nfunction normalizeOptions(\n  moduleName: string,\n  options: OptionsSync,\n): ExplorerOptionsSync;\nfunction normalizeOptions(\n  moduleName: string,\n  options: Options,\n): ExplorerOptions;\nfunction normalizeOptions(\n  moduleName: string,\n  options: Options | OptionsSync,\n): ExplorerOptions | ExplorerOptionsSync {\n  const defaults: ExplorerOptions | ExplorerOptionsSync = {\n    packageProp: moduleName,\n    searchPlaces: [\n      'package.json',\n      `.${moduleName}rc`,\n      `.${moduleName}rc.json`,\n      `.${moduleName}rc.yaml`,\n      `.${moduleName}rc.yml`,\n      `.${moduleName}rc.js`,\n      `${moduleName}.config.js`,\n    ],\n    ignoreEmptySearchPlaces: true,\n    stopDir: os.homedir(),\n    cache: true,\n    transform: identity,\n    loaders: defaultLoaders,\n  };\n\n  const normalizedOptions: ExplorerOptions | ExplorerOptionsSync = {\n    ...defaults,\n    ...options,\n    loaders: {\n      ...defaults.loaders,\n      ...options.loaders,\n    },\n  };\n\n  return normalizedOptions;\n}\n\nconst identity: TransformSync = function identity(x) {\n  return x;\n};\n\nexport { cosmiconfig, cosmiconfigSync, defaultLoaders };\n"],"file":"index.js"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/loaders.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/loaders.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/loaders.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,4 @@
+import { LoadersSync } from './types';
+declare const loaders: LoadersSync;
+export { loaders };
+//# sourceMappingURL=loaders.d.ts.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/loaders.d.ts.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/loaders.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/loaders.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"file":"loaders.d.ts","sourceRoot":"","sources":["../src/loaders.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AA0CtC,QAAA,MAAM,OAAO,EAAE,WAA4C,CAAC;AAE5D,OAAO,EAAE,OAAO,EAAE,CAAC"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/loaders.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/loaders.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/loaders.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,60 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.loaders = void 0;
+
+/* eslint-disable @typescript-eslint/no-require-imports */
+let importFresh;
+
+const loadJs = function loadJs(filepath) {
+  if (importFresh === undefined) {
+    importFresh = require('import-fresh');
+  }
+
+  const result = importFresh(filepath);
+  return result;
+};
+
+let parseJson;
+
+const loadJson = function loadJson(filepath, content) {
+  if (parseJson === undefined) {
+    parseJson = require('parse-json');
+  }
+
+  try {
+    const result = parseJson(content);
+    return result;
+  } catch (error) {
+    error.message = `JSON Error in ${filepath}:\n${error.message}`;
+    throw error;
+  }
+};
+
+let yaml;
+
+const loadYaml = function loadYaml(filepath, content) {
+  if (yaml === undefined) {
+    yaml = require('yaml');
+  }
+
+  try {
+    const result = yaml.parse(content, {
+      prettyErrors: true
+    });
+    return result;
+  } catch (error) {
+    error.message = `YAML Error in ${filepath}:\n${error.message}`;
+    throw error;
+  }
+};
+
+const loaders = {
+  loadJs,
+  loadJson,
+  loadYaml
+};
+exports.loaders = loaders;
+//# sourceMappingURL=loaders.js.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/loaders.js.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/loaders.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/loaders.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"sources":["../src/loaders.ts"],"names":["importFresh","loadJs","filepath","undefined","require","result","parseJson","loadJson","content","error","message","yaml","loadYaml","parse","prettyErrors","loaders"],"mappings":";;;;;;;AAAA;AAQA,IAAIA,WAAJ;;AACA,MAAMC,MAAkB,GAAG,SAASA,MAAT,CAAgBC,QAAhB,EAA0B;AACnD,MAAIF,WAAW,KAAKG,SAApB,EAA+B;AAC7BH,IAAAA,WAAW,GAAGI,OAAO,CAAC,cAAD,CAArB;AACD;;AAED,QAAMC,MAAM,GAAGL,WAAW,CAACE,QAAD,CAA1B;AACA,SAAOG,MAAP;AACD,CAPD;;AASA,IAAIC,SAAJ;;AACA,MAAMC,QAAoB,GAAG,SAASA,QAAT,CAAkBL,QAAlB,EAA4BM,OAA5B,EAAqC;AAChE,MAAIF,SAAS,KAAKH,SAAlB,EAA6B;AAC3BG,IAAAA,SAAS,GAAGF,OAAO,CAAC,YAAD,CAAnB;AACD;;AAED,MAAI;AACF,UAAMC,MAAM,GAAGC,SAAS,CAACE,OAAD,CAAxB;AACA,WAAOH,MAAP;AACD,GAHD,CAGE,OAAOI,KAAP,EAAc;AACdA,IAAAA,KAAK,CAACC,OAAN,GAAiB,iBAAgBR,QAAS,MAAKO,KAAK,CAACC,OAAQ,EAA7D;AACA,UAAMD,KAAN;AACD;AACF,CAZD;;AAcA,IAAIE,IAAJ;;AACA,MAAMC,QAAoB,GAAG,SAASA,QAAT,CAAkBV,QAAlB,EAA4BM,OAA5B,EAAqC;AAChE,MAAIG,IAAI,KAAKR,SAAb,EAAwB;AACtBQ,IAAAA,IAAI,GAAGP,OAAO,CAAC,MAAD,CAAd;AACD;;AAED,MAAI;AACF,UAAMC,MAAM,GAAGM,IAAI,CAACE,KAAL,CAAWL,OAAX,EAAoB;AAAEM,MAAAA,YAAY,EAAE;AAAhB,KAApB,CAAf;AACA,WAAOT,MAAP;AACD,GAHD,CAGE,OAAOI,KAAP,EAAc;AACdA,IAAAA,KAAK,CAACC,OAAN,GAAiB,iBAAgBR,QAAS,MAAKO,KAAK,CAACC,OAAQ,EAA7D;AACA,UAAMD,KAAN;AACD;AACF,CAZD;;AAcA,MAAMM,OAAoB,GAAG;AAAEd,EAAAA,MAAF;AAAUM,EAAAA,QAAV;AAAoBK,EAAAA;AAApB,CAA7B","sourcesContent":["/* eslint-disable @typescript-eslint/no-require-imports */\n\nimport parseJsonType from 'parse-json';\nimport yamlType from 'yaml';\nimport importFreshType from 'import-fresh';\nimport { LoaderSync } from './index';\nimport { LoadersSync } from './types';\n\nlet importFresh: typeof importFreshType;\nconst loadJs: LoaderSync = function loadJs(filepath) {\n  if (importFresh === undefined) {\n    importFresh = require('import-fresh');\n  }\n\n  const result = importFresh(filepath);\n  return result;\n};\n\nlet parseJson: typeof parseJsonType;\nconst loadJson: LoaderSync = function loadJson(filepath, content) {\n  if (parseJson === undefined) {\n    parseJson = require('parse-json');\n  }\n\n  try {\n    const result = parseJson(content);\n    return result;\n  } catch (error) {\n    error.message = `JSON Error in ${filepath}:\\n${error.message}`;\n    throw error;\n  }\n};\n\nlet yaml: typeof yamlType;\nconst loadYaml: LoaderSync = function loadYaml(filepath, content) {\n  if (yaml === undefined) {\n    yaml = require('yaml');\n  }\n\n  try {\n    const result = yaml.parse(content, { prettyErrors: true });\n    return result;\n  } catch (error) {\n    error.message = `YAML Error in ${filepath}:\\n${error.message}`;\n    throw error;\n  }\n};\n\nconst loaders: LoadersSync = { loadJs, loadJson, loadYaml };\n\nexport { loaders };\n"],"file":"loaders.js"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/readFile.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/readFile.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/readFile.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,7 @@
+interface Options {
+    throwNotFound?: boolean;
+}
+declare function readFile(filepath: string, options?: Options): Promise<string | null>;
+declare function readFileSync(filepath: string, options?: Options): string | null;
+export { readFile, readFileSync };
+//# sourceMappingURL=readFile.d.ts.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/readFile.d.ts.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/readFile.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/readFile.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"file":"readFile.d.ts","sourceRoot":"","sources":["../src/readFile.ts"],"names":[],"mappings":"AAkBA,UAAU,OAAO;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,iBAAe,QAAQ,CACrB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,OAAY,GACpB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB;AAED,iBAAS,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE,OAAY,GAAG,MAAM,GAAG,IAAI,CAc5E;AAED,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/readFile.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/readFile.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/readFile.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,56 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.readFile = readFile;
+exports.readFileSync = readFileSync;
+
+var _fs = _interopRequireDefault(require("fs"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+async function fsReadFileAsync(pathname, encoding) {
+  return new Promise((resolve, reject) => {
+    _fs.default.readFile(pathname, encoding, (error, contents) => {
+      if (error) {
+        reject(error);
+        return;
+      }
+
+      resolve(contents);
+    });
+  });
+}
+
+async function readFile(filepath, options = {}) {
+  const throwNotFound = options.throwNotFound === true;
+
+  try {
+    const content = await fsReadFileAsync(filepath, 'utf8');
+    return content;
+  } catch (error) {
+    if (throwNotFound === false && error.code === 'ENOENT') {
+      return null;
+    }
+
+    throw error;
+  }
+}
+
+function readFileSync(filepath, options = {}) {
+  const throwNotFound = options.throwNotFound === true;
+
+  try {
+    const content = _fs.default.readFileSync(filepath, 'utf8');
+
+    return content;
+  } catch (error) {
+    if (throwNotFound === false && error.code === 'ENOENT') {
+      return null;
+    }
+
+    throw error;
+  }
+}
+//# sourceMappingURL=readFile.js.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/readFile.js.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/readFile.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/readFile.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"sources":["../src/readFile.ts"],"names":["fsReadFileAsync","pathname","encoding","Promise","resolve","reject","fs","readFile","error","contents","filepath","options","throwNotFound","content","code","readFileSync"],"mappings":";;;;;;;;AAAA;;;;AAEA,eAAeA,eAAf,CACEC,QADF,EAEEC,QAFF,EAGmB;AACjB,SAAO,IAAIC,OAAJ,CAAY,CAACC,OAAD,EAAUC,MAAV,KAA2B;AAC5CC,gBAAGC,QAAH,CAAYN,QAAZ,EAAsBC,QAAtB,EAAgC,CAACM,KAAD,EAAQC,QAAR,KAA2B;AACzD,UAAID,KAAJ,EAAW;AACTH,QAAAA,MAAM,CAACG,KAAD,CAAN;AACA;AACD;;AAEDJ,MAAAA,OAAO,CAACK,QAAD,CAAP;AACD,KAPD;AAQD,GATM,CAAP;AAUD;;AAMD,eAAeF,QAAf,CACEG,QADF,EAEEC,OAAgB,GAAG,EAFrB,EAG0B;AACxB,QAAMC,aAAa,GAAGD,OAAO,CAACC,aAAR,KAA0B,IAAhD;;AAEA,MAAI;AACF,UAAMC,OAAO,GAAG,MAAMb,eAAe,CAACU,QAAD,EAAW,MAAX,CAArC;AAEA,WAAOG,OAAP;AACD,GAJD,CAIE,OAAOL,KAAP,EAAc;AACd,QAAII,aAAa,KAAK,KAAlB,IAA2BJ,KAAK,CAACM,IAAN,KAAe,QAA9C,EAAwD;AACtD,aAAO,IAAP;AACD;;AAED,UAAMN,KAAN;AACD;AACF;;AAED,SAASO,YAAT,CAAsBL,QAAtB,EAAwCC,OAAgB,GAAG,EAA3D,EAA8E;AAC5E,QAAMC,aAAa,GAAGD,OAAO,CAACC,aAAR,KAA0B,IAAhD;;AAEA,MAAI;AACF,UAAMC,OAAO,GAAGP,YAAGS,YAAH,CAAgBL,QAAhB,EAA0B,MAA1B,CAAhB;;AAEA,WAAOG,OAAP;AACD,GAJD,CAIE,OAAOL,KAAP,EAAc;AACd,QAAII,aAAa,KAAK,KAAlB,IAA2BJ,KAAK,CAACM,IAAN,KAAe,QAA9C,EAAwD;AACtD,aAAO,IAAP;AACD;;AAED,UAAMN,KAAN;AACD;AACF","sourcesContent":["import fs from 'fs';\n\nasync function fsReadFileAsync(\n  pathname: string,\n  encoding: string,\n): Promise<string> {\n  return new Promise((resolve, reject): void => {\n    fs.readFile(pathname, encoding, (error, contents): void => {\n      if (error) {\n        reject(error);\n        return;\n      }\n\n      resolve(contents);\n    });\n  });\n}\n\ninterface Options {\n  throwNotFound?: boolean;\n}\n\nasync function readFile(\n  filepath: string,\n  options: Options = {},\n): Promise<string | null> {\n  const throwNotFound = options.throwNotFound === true;\n\n  try {\n    const content = await fsReadFileAsync(filepath, 'utf8');\n\n    return content;\n  } catch (error) {\n    if (throwNotFound === false && error.code === 'ENOENT') {\n      return null;\n    }\n\n    throw error;\n  }\n}\n\nfunction readFileSync(filepath: string, options: Options = {}): string | null {\n  const throwNotFound = options.throwNotFound === true;\n\n  try {\n    const content = fs.readFileSync(filepath, 'utf8');\n\n    return content;\n  } catch (error) {\n    if (throwNotFound === false && error.code === 'ENOENT') {\n      return null;\n    }\n\n    throw error;\n  }\n}\n\nexport { readFile, readFileSync };\n"],"file":"readFile.js"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/types.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/types.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/types.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,20 @@
+import { Loader, LoaderSync, Options, OptionsSync } from './index';
+export declare type Config = any;
+export declare type CosmiconfigResult = {
+    config: Config;
+    filepath: string;
+    isEmpty?: boolean;
+} | null;
+export interface ExplorerOptions extends Required<Options> {
+}
+export interface ExplorerOptionsSync extends Required<OptionsSync> {
+}
+export declare type Cache = Map<string, CosmiconfigResult>;
+export declare type LoadedFileContent = Config | null | undefined;
+export interface Loaders {
+    [key: string]: Loader;
+}
+export interface LoadersSync {
+    [key: string]: LoaderSync;
+}
+//# sourceMappingURL=types.d.ts.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/types.d.ts.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/types.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/types.d.ts.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGnE,oBAAY,MAAM,GAAG,GAAG,CAAC;AAEzB,oBAAY,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,GAAG,IAAI,CAAC;AAIT,MAAM,WAAW,eAAgB,SAAQ,QAAQ,CAAC,OAAO,CAAC;CAAG;AAC7D,MAAM,WAAW,mBAAoB,SAAQ,QAAQ,CAAC,WAAW,CAAC;CAAG;AAGrE,oBAAY,KAAK,GAAG,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAMnD,oBAAY,iBAAiB,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;AAE1D,MAAM,WAAW,OAAO;IACtB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC;CAC3B"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/types.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/types.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/types.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+"use strict";
+//# sourceMappingURL=types.js.map
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/types.js.map
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/types.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/dist/types.js.map	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1 @@
+{"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[],"file":"types.js"}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/package.json
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,148 @@
+{
+  "name": "cosmiconfig",
+  "version": "6.0.0",
+  "description": "Find and load configuration from a package.json property, rc file, or CommonJS module",
+  "main": "dist/index.js",
+  "types": "dist/index.d.ts",
+  "files": [
+    "dist"
+  ],
+  "scripts": {
+    "clean": "del-cli --dot=true \"./dist/**/*\"",
+    "build": "npm run clean && npm run build:compile && npm run build:types",
+    "build:compile": "cross-env NODE_ENV=production babel src -d dist --verbose --extensions .js,.ts --ignore \"**/**/*.test.js\",\"**/**/*.test.ts\" --source-maps",
+    "build:types": "cross-env NODE_ENV=production tsc --project tsconfig.types.json",
+    "dev": "npm run clean && npm run build:compile -- --watch",
+    "lint": "eslint --ext .js,.ts . && npm run lint:md",
+    "lint:fix": "eslint --ext .js,.ts . --fix",
+    "lint:md": "remark-preset-davidtheclark",
+    "format": "prettier \"**/*.{js,ts,json,yml,yaml}\" --write",
+    "format:md": "remark-preset-davidtheclark --format",
+    "format:check": "prettier \"**/*.{js,ts,json,yml,yaml}\" --check",
+    "typescript": "tsc",
+    "test": "jest --coverage",
+    "test:watch": "jest --watch",
+    "check:all": "npm run test && npm run typescript && npm run lint && npm run format:check",
+    "prepublishOnly": "npm run check:all && npm run build"
+  },
+  "husky": {
+    "hooks": {
+      "pre-commit": "lint-staged && npm run typescript && npm run test",
+      "pre-push": "npm run check:all"
+    }
+  },
+  "lint-staged": {
+    "*.{js,ts}": [
+      "eslint --fix",
+      "prettier --write",
+      "git add"
+    ],
+    "*.{json,yml,yaml}": [
+      "prettier --write",
+      "git add"
+    ],
+    "*.md": [
+      "remark-preset-davidtheclark",
+      "remark-preset-davidtheclark --format",
+      "git add"
+    ]
+  },
+  "repository": {
+    "type": "git",
+    "url": "git+https://github.com/davidtheclark/cosmiconfig.git"
+  },
+  "keywords": [
+    "load",
+    "configuration",
+    "config"
+  ],
+  "author": "David Clark <david.dave.clark@gmail.com>",
+  "contributors": [
+    "Bogdan Chadkin <trysound@yandex.ru>",
+    "Suhas Karanth <sudo.suhas@gmail.com>"
+  ],
+  "license": "MIT",
+  "bugs": {
+    "url": "https://github.com/davidtheclark/cosmiconfig/issues"
+  },
+  "homepage": "https://github.com/davidtheclark/cosmiconfig#readme",
+  "prettier": {
+    "trailingComma": "all",
+    "arrowParens": "always",
+    "singleQuote": true,
+    "printWidth": 80,
+    "tabWidth": 2
+  },
+  "jest": {
+    "testEnvironment": "node",
+    "collectCoverageFrom": [
+      "src/**/*.{js,ts}"
+    ],
+    "coverageReporters": [
+      "text",
+      "html",
+      "lcov"
+    ],
+    "coverageThreshold": {
+      "global": {
+        "branches": 100,
+        "functions": 100,
+        "lines": 100,
+        "statements": 100
+      }
+    },
+    "resetModules": true,
+    "resetMocks": true,
+    "restoreMocks": true
+  },
+  "babel": {
+    "presets": [
+      [
+        "@babel/preset-env",
+        {
+          "targets": {
+            "node": "8.9"
+          }
+        }
+      ],
+      "@babel/preset-typescript"
+    ]
+  },
+  "dependencies": {
+    "@types/parse-json": "^4.0.0",
+    "import-fresh": "^3.1.0",
+    "parse-json": "^5.0.0",
+    "path-type": "^4.0.0",
+    "yaml": "^1.7.2"
+  },
+  "devDependencies": {
+    "@babel/cli": "^7.6.4",
+    "@babel/core": "^7.6.4",
+    "@babel/preset-env": "^7.6.3",
+    "@babel/preset-typescript": "^7.6.0",
+    "@types/jest": "^24.0.19",
+    "@types/node": "^12.11.5",
+    "@typescript-eslint/eslint-plugin": "^2.5.0",
+    "@typescript-eslint/parser": "^2.5.0",
+    "cross-env": "^6.0.3",
+    "del": "^5.1.0",
+    "del-cli": "^3.0.0",
+    "eslint": "^6.5.1",
+    "eslint-config-davidtheclark-node": "^0.2.2",
+    "eslint-config-prettier": "^6.4.0",
+    "eslint-plugin-import": "^2.18.2",
+    "eslint-plugin-jest": "^22.20.0",
+    "eslint-plugin-node": "^10.0.0",
+    "husky": "^3.0.9",
+    "jest": "^24.9.0",
+    "lint-staged": "^9.4.2",
+    "make-dir": "^3.0.0",
+    "parent-module": "^2.0.0",
+    "prettier": "^1.18.2",
+    "remark-preset-davidtheclark": "^0.10.0",
+    "typescript": "^3.6.4"
+  },
+  "engines": {
+    "node": ">=8"
+  }
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/CHANGELOG.md
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/CHANGELOG.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/CHANGELOG.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,902 @@
+9.1.0 / 2021-01-19
+------------------
+
+- Add promise support for `fs.rm()` ([#841](https://github.com/jprichardson/node-fs-extra/issues/841), [#860](https://github.com/jprichardson/node-fs-extra/pull/860))
+- Upgrade universalify for performance improvments ([#825](https://github.com/jprichardson/node-fs-extra/pull/825))
+
+9.0.1 / 2020-06-03
+------------------
+
+- Fix issue with `ensureFile()` when used with Jest on Windows ([#804](https://github.com/jprichardson/node-fs-extra/issues/804), [#805](https://github.com/jprichardson/node-fs-extra/pull/805))
+- Remove unneeded `process.umask()` call ([#791](https://github.com/jprichardson/node-fs-extra/pull/791))
+- Docs improvements ([#753](https://github.com/jprichardson/node-fs-extra/pull/753), [#795](https://github.com/jprichardson/node-fs-extra/pull/795), [#797](https://github.com/jprichardson/node-fs-extra/pull/797))
+
+9.0.0 / 2020-03-19
+------------------
+
+### Breaking changes
+
+- Requires Node.js version 10 or greater ([#725](https://github.com/jprichardson/node-fs-extra/issues/725), [#751](https://github.com/jprichardson/node-fs-extra/pull/751))
+- Switched `ensureDir*` to use a fork of https://github.com/sindresorhus/make-dir to make use of native recursive `fs.mkdir` where possible ([#619](https://github.com/jprichardson/node-fs-extra/issues/619), [#756](https://github.com/jprichardson/node-fs-extra/pull/756))
+- Properly preserve `atime` for `copy*` with `preserveTimestamps` option ([#633](https://github.com/jprichardson/node-fs-extra/pull/633))
+
+**The following changes, allthough technically breaking, will not affect the vast majority of users:**
+
+- `outputJson` now outputs objects as they were when the function was called, even if they are mutated later ([#702](https://github.com/jprichardson/node-fs-extra/issues/702), [#768](https://github.com/jprichardson/node-fs-extra/pull/768))
+- Cannot pass `null` as an options parameter to `*Json*` methods ([#745](https://github.com/jprichardson/node-fs-extra/issues/745), [#768](https://github.com/jprichardson/node-fs-extra/pull/768))
+
+### Improvements
+
+- Add promise shims for `fs.writev` & `fs.opendir` ([#747](https://github.com/jprichardson/node-fs-extra/pull/747))
+- Better errors for `ensureFile` ([#696](https://github.com/jprichardson/node-fs-extra/issues/696), [#744](https://github.com/jprichardson/node-fs-extra/pull/744))
+- Better file comparison for older Node versions ([#694](https://github.com/jprichardson/node-fs-extra/pull/694))
+
+### Miscellaneous changes
+- Peformance optimizations ([#762](https://github.com/jprichardson/node-fs-extra/issues/762), [#764](https://github.com/jprichardson/node-fs-extra/pull/764))
+- Add missing documentation for aliases ([#758](https://github.com/jprichardson/node-fs-extra/issues/758), [#766](https://github.com/jprichardson/node-fs-extra/pull/766))
+- Update `universalify` dependency ([#767](https://github.com/jprichardson/node-fs-extra/pull/767))
+
+8.1.0 / 2019-06-28
+------------------
+
+- Add support for promisified `fs.realpath.native` in Node v9.2+ ([#650](https://github.com/jprichardson/node-fs-extra/issues/650), [#682](https://github.com/jprichardson/node-fs-extra/pull/682))
+- Update `graceful-fs` dependency ([#700](https://github.com/jprichardson/node-fs-extra/pull/700))
+- Use `graceful-fs` everywhere ([#700](https://github.com/jprichardson/node-fs-extra/pull/700))
+
+8.0.1 / 2019-05-13
+------------------
+
+- Fix bug `Maximum call stack size exceeded` error in `util/stat` ([#679](https://github.com/jprichardson/node-fs-extra/pull/679))
+
+8.0.0 / 2019-05-11
+------------------
+
+**NOTE:** Node.js v6 support is deprecated, and will be dropped in the next major release.
+
+- Use `renameSync()` under the hood in `moveSync()`
+- Fix bug with bind-mounted directories in `copy*()` ([#613](https://github.com/jprichardson/node-fs-extra/issues/613), [#618](https://github.com/jprichardson/node-fs-extra/pull/618))
+- Fix bug in `move()` with case-insensitive file systems
+- Use `fs.stat()`'s `bigint` option in `copy*()` & `move*()` where possible ([#657](https://github.com/jprichardson/node-fs-extra/issues/657))
+
+7.0.1 / 2018-11-07
+------------------
+
+- Fix `removeSync()` on Windows, in some cases, it would error out with `ENOTEMPTY` ([#646](https://github.com/jprichardson/node-fs-extra/pull/646))
+- Document `mode` option for `ensureDir*()` ([#587](https://github.com/jprichardson/node-fs-extra/pull/587))
+- Don't include documentation files in npm package tarball ([#642](https://github.com/jprichardson/node-fs-extra/issues/642), [#643](https://github.com/jprichardson/node-fs-extra/pull/643))
+
+7.0.0 / 2018-07-16
+------------------
+
+- **BREAKING:** Refine `copy*()` handling of symlinks to properly detect symlinks that point to the same file. ([#582](https://github.com/jprichardson/node-fs-extra/pull/582))
+- Fix bug with copying write-protected directories ([#600](https://github.com/jprichardson/node-fs-extra/pull/600))
+- Universalify `fs.lchmod()` ([#596](https://github.com/jprichardson/node-fs-extra/pull/596))
+- Add `engines` field to `package.json` ([#580](https://github.com/jprichardson/node-fs-extra/pull/580))
+
+6.0.1 / 2018-05-09
+------------------
+
+- Fix `fs.promises` `ExperimentalWarning` on Node v10.1.0 ([#578](https://github.com/jprichardson/node-fs-extra/pull/578))
+
+6.0.0 / 2018-05-01
+------------------
+
+- Drop support for Node.js versions 4, 5, & 7 ([#564](https://github.com/jprichardson/node-fs-extra/pull/564))
+- Rewrite `move` to use `fs.rename` where possible ([#549](https://github.com/jprichardson/node-fs-extra/pull/549))
+- Don't convert relative paths to absolute paths for `filter` ([#554](https://github.com/jprichardson/node-fs-extra/pull/554))
+- `copy*`'s behavior when `preserveTimestamps` is `false` has been OS-dependent since 5.0.0, but that's now explicitly noted in the docs ([#563](https://github.com/jprichardson/node-fs-extra/pull/563))
+- Fix subdirectory detection for `copy*` & `move*` ([#541](https://github.com/jprichardson/node-fs-extra/pull/541))
+- Handle case-insensitive paths correctly in `copy*` ([#568](https://github.com/jprichardson/node-fs-extra/pull/568))
+
+5.0.0 / 2017-12-11
+------------------
+
+Significant refactor of `copy()` & `copySync()`, including breaking changes. No changes to other functions in this release.
+
+Huge thanks to **[@manidlou](https://github.com/manidlou)** for doing most of the work on this release.
+
+- The `filter` option can no longer be a RegExp (must be a function). This was deprecated since fs-extra v1.0.0. [#512](https://github.com/jprichardson/node-fs-extra/pull/512)
+- `copy()`'s `filter` option can now be a function that returns a Promise. [#518](https://github.com/jprichardson/node-fs-extra/pull/518)
+- `copy()` & `copySync()` now use `fs.copyFile()`/`fs.copyFileSync()` in environments that support it (currently Node 8.5.0+). Older Node versions still get the old implementation. [#505](https://github.com/jprichardson/node-fs-extra/pull/505)
+- Don't allow copying a directory into itself. [#83](https://github.com/jprichardson/node-fs-extra/issues/83)
+- Handle copying between identical files. [#198](https://github.com/jprichardson/node-fs-extra/issues/198)
+- Error out when copying an empty folder to a path that already exists. [#464](https://github.com/jprichardson/node-fs-extra/issues/464)
+- Don't create `dest`'s parent if the `filter` function aborts the `copy()` operation. [#517](https://github.com/jprichardson/node-fs-extra/pull/517)
+- Fix `writeStream` not being closed if there was an error in `copy()`. [#516](https://github.com/jprichardson/node-fs-extra/pull/516)
+
+4.0.3 / 2017-12-05
+------------------
+
+- Fix wrong `chmod` values in `fs.remove()` [#501](https://github.com/jprichardson/node-fs-extra/pull/501)
+- Fix `TypeError` on systems that don't have some `fs` operations like `lchown` [#520](https://github.com/jprichardson/node-fs-extra/pull/520)
+
+4.0.2 / 2017-09-12
+------------------
+
+- Added `EOL` option to `writeJson*` & `outputJson*` (via upgrade to jsonfile v4)
+- Added promise support to [`fs.copyFile()`](https://nodejs.org/api/fs.html#fs_fs_copyfile_src_dest_flags_callback) in Node 8.5+
+- Added `.js` extension to `main` field in `package.json` for better tooling compatibility. [#485](https://github.com/jprichardson/node-fs-extra/pull/485)
+
+4.0.1 / 2017-07-31
+------------------
+
+### Fixed
+
+- Previously, `ensureFile()` & `ensureFileSync()` would do nothing if the path was a directory. Now, they error out for consistency with `ensureDir()`. [#465](https://github.com/jprichardson/node-fs-extra/issues/465), [#466](https://github.com/jprichardson/node-fs-extra/pull/466), [#470](https://github.com/jprichardson/node-fs-extra/issues/470)
+
+4.0.0 / 2017-07-14
+------------------
+
+### Changed
+
+- **BREAKING:** The promisified versions of `fs.read()` & `fs.write()` now return objects. See [the docs](docs/fs-read-write.md) for details. [#436](https://github.com/jprichardson/node-fs-extra/issues/436), [#449](https://github.com/jprichardson/node-fs-extra/pull/449)
+- `fs.move()` now errors out when destination is a subdirectory of source. [#458](https://github.com/jprichardson/node-fs-extra/pull/458)
+- Applied upstream fixes from `rimraf` to `fs.remove()` & `fs.removeSync()`. [#459](https://github.com/jprichardson/node-fs-extra/pull/459)
+
+### Fixed
+
+- Got `fs.outputJSONSync()` working again; it was broken due to refactoring. [#428](https://github.com/jprichardson/node-fs-extra/pull/428)
+
+Also clarified the docs in a few places.
+
+3.0.1 / 2017-05-04
+------------------
+
+- Fix bug in `move()` & `moveSync()` when source and destination are the same, and source does not exist. [#415](https://github.com/jprichardson/node-fs-extra/pull/415)
+
+3.0.0 / 2017-04-27
+------------------
+
+### Added
+
+- **BREAKING:** Added Promise support. All asynchronous native fs methods and fs-extra methods now return a promise if the callback is not passed. [#403](https://github.com/jprichardson/node-fs-extra/pull/403)
+- `pathExists()`, a replacement for the deprecated `fs.exists`. `pathExists` has a normal error-first callback signature. Also added `pathExistsSync`, an alias to `fs.existsSync`, for completeness. [#406](https://github.com/jprichardson/node-fs-extra/pull/406)
+
+### Removed
+
+- **BREAKING:** Removed support for setting the default spaces for `writeJson()`, `writeJsonSync()`, `outputJson()`, & `outputJsonSync()`. This was undocumented. [#402](https://github.com/jprichardson/node-fs-extra/pull/402)
+
+### Changed
+
+- Upgraded jsonfile dependency to v3.0.0:
+  - **BREAKING:** Changed behavior of `throws` option for `readJsonSync()`; now does not throw filesystem errors when `throws` is `false`.
+- **BREAKING:** `writeJson()`, `writeJsonSync()`, `outputJson()`, & `outputJsonSync()` now output minified JSON by default for consistency with `JSON.stringify()`; set the `spaces` option to `2` to override this new behavior. [#402](https://github.com/jprichardson/node-fs-extra/pull/402)
+- Use `Buffer.allocUnsafe()` instead of `new Buffer()` in environments that support it. [#394](https://github.com/jprichardson/node-fs-extra/pull/394)
+
+### Fixed
+
+- `removeSync()` silently failed on Windows in some cases. Now throws an `EBUSY` error. [#408](https://github.com/jprichardson/node-fs-extra/pull/408)
+
+2.1.2 / 2017-03-16
+------------------
+
+### Fixed
+
+- Weird windows bug that resulted in `ensureDir()`'s callback being called twice in some cases. This bug may have also affected `remove()`. See [#392](https://github.com/jprichardson/node-fs-extra/issues/392), [#393](https://github.com/jprichardson/node-fs-extra/pull/393)
+
+2.1.1 / 2017-03-15
+------------------
+
+### Fixed
+
+- Reverted [`5597bd`](https://github.com/jprichardson/node-fs-extra/commit/5597bd5b67f7d060f5f5bf26e9635be48330f5d7), this broke compatibility with Node.js versions v4+ but less than `v4.5.0`.
+- Remove `Buffer.alloc()` usage in `moveSync()`.
+
+2.1.0 / 2017-03-15
+------------------
+
+Thanks to [Mani Maghsoudlou (@manidlou)](https://github.com/manidlou) & [Jan Peer Stöcklmair (@JPeer264)](https://github.com/JPeer264) for their extraordinary help with this release!
+
+### Added
+- `moveSync()` See [#309], [#381](https://github.com/jprichardson/node-fs-extra/pull/381). ([@manidlou](https://github.com/manidlou))
+- `copy()` and `copySync()`'s `filter` option now gets the destination path passed as the second parameter. [#366](https://github.com/jprichardson/node-fs-extra/pull/366) ([@manidlou](https://github.com/manidlou))
+
+### Changed
+- Use `Buffer.alloc()` instead of deprecated `new Buffer()` in `copySync()`. [#380](https://github.com/jprichardson/node-fs-extra/pull/380) ([@manidlou](https://github.com/manidlou))
+- Refactored entire codebase to use ES6 features supported by Node.js v4+ [#355](https://github.com/jprichardson/node-fs-extra/issues/355). [(@JPeer264)](https://github.com/JPeer264)
+- Refactored docs. ([@manidlou](https://github.com/manidlou))
+
+### Fixed
+
+- `move()` shouldn't error out when source and dest are the same. [#377](https://github.com/jprichardson/node-fs-extra/issues/377), [#378](https://github.com/jprichardson/node-fs-extra/pull/378) ([@jdalton](https://github.com/jdalton))
+
+2.0.0 / 2017-01-16
+------------------
+
+### Removed
+- **BREAKING:** Removed support for Node `v0.12`. The Node foundation stopped officially supporting it
+on Jan 1st, 2017.
+- **BREAKING:** Remove `walk()` and `walkSync()`. `walkSync()` was only part of `fs-extra` for a little
+over two months. Use [klaw](https://github.com/jprichardson/node-klaw) instead of `walk()`, in fact, `walk()` was just
+an alias to klaw. For `walkSync()` use [klaw-sync](https://github.com/mawni/node-klaw-sync). See: [#338], [#339]
+
+### Changed
+- **BREAKING:** Renamed `clobber` to `overwrite`. This affects `copy()`, `copySync()`, and `move()`. [#330], [#333]
+- Moved docs, to `docs/`. [#340]
+
+### Fixed
+- Apply filters to directories in `copySync()` like in `copy()`. [#324]
+- A specific condition when disk is under heavy use, `copy()` can fail. [#326]
+
+
+1.0.0 / 2016-11-01
+------------------
+
+After five years of development, we finally have reach the 1.0.0 milestone! Big thanks goes
+to [Ryan Zim](https://github.com/RyanZim) for leading the charge on this release!
+
+### Added
+- `walkSync()`
+
+### Changed
+- **BREAKING**: dropped Node v0.10 support.
+- disabled `rimaf` globbing, wasn't used. [#280]
+- deprecate `copy()/copySync()` option `filter` if it's a `RegExp`. `filter` should now be a function.
+- inline `rimraf`. This is temporary and was done because `rimraf` depended upon the beefy `glob` which `fs-extra` does not use. [#300]
+
+### Fixed
+- bug fix proper closing of file handle on `utimesMillis()` [#271]
+- proper escaping of files with dollar signs [#291]
+- `copySync()` failed if user didn't own file. [#199], [#301]
+
+
+0.30.0 / 2016-04-28
+-------------------
+- Brought back Node v0.10 support. I didn't realize there was still demand. Official support will end **2016-10-01**.
+
+0.29.0 / 2016-04-27
+-------------------
+- **BREAKING**: removed support for Node v0.10. If you still want to use Node v0.10, everything should work except for `ensureLink()/ensureSymlink()`. Node v0.12 is still supported but will be dropped in the near future as well.
+
+0.28.0 / 2016-04-17
+-------------------
+- **BREAKING**: removed `createOutputStream()`. Use https://www.npmjs.com/package/create-output-stream. See: [#192][#192]
+- `mkdirs()/mkdirsSync()` check for invalid win32 path chars. See: [#209][#209], [#237][#237]
+- `mkdirs()/mkdirsSync()` if drive not mounted, error. See: [#93][#93]
+
+0.27.0 / 2016-04-15
+-------------------
+- add `dereference` option to `copySync()`. [#235][#235]
+
+0.26.7 / 2016-03-16
+-------------------
+- fixed `copy()` if source and dest are the same. [#230][#230]
+
+0.26.6 / 2016-03-15
+-------------------
+- fixed if `emptyDir()` does not have a callback: [#229][#229]
+
+0.26.5 / 2016-01-27
+-------------------
+- `copy()` with two arguments (w/o callback) was broken. See: [#215][#215]
+
+0.26.4 / 2016-01-05
+-------------------
+- `copySync()` made `preserveTimestamps` default consistent with `copy()` which is `false`. See: [#208][#208]
+
+0.26.3 / 2015-12-17
+-------------------
+- fixed `copy()` hangup in copying blockDevice / characterDevice / `/dev/null`. See: [#193][#193]
+
+0.26.2 / 2015-11-02
+-------------------
+- fixed `outputJson{Sync}()` spacing adherence to `fs.spaces`
+
+0.26.1 / 2015-11-02
+-------------------
+- fixed `copySync()` when `clogger=true` and the destination is read only. See: [#190][#190]
+
+0.26.0 / 2015-10-25
+-------------------
+- extracted the `walk()` function into its own module [`klaw`](https://github.com/jprichardson/node-klaw).
+
+0.25.0 / 2015-10-24
+-------------------
+- now has a file walker `walk()`
+
+0.24.0 / 2015-08-28
+-------------------
+- removed alias `delete()` and `deleteSync()`. See: [#171][#171]
+
+0.23.1 / 2015-08-07
+-------------------
+- Better handling of errors for `move()` when moving across devices. [#170][#170]
+- `ensureSymlink()` and `ensureLink()` should not throw errors if link exists. [#169][#169]
+
+0.23.0 / 2015-08-06
+-------------------
+- added `ensureLink{Sync}()` and `ensureSymlink{Sync}()`. See: [#165][#165]
+
+0.22.1 / 2015-07-09
+-------------------
+- Prevent calling `hasMillisResSync()` on module load. See: [#149][#149].
+Fixes regression that was introduced in `0.21.0`.
+
+0.22.0 / 2015-07-09
+-------------------
+- preserve permissions / ownership in `copy()`. See: [#54][#54]
+
+0.21.0 / 2015-07-04
+-------------------
+- add option to preserve timestamps in `copy()` and `copySync()`. See: [#141][#141]
+- updated `graceful-fs@3.x` to `4.x`. This brings in features from `amazing-graceful-fs` (much cleaner code / less hacks)
+
+0.20.1 / 2015-06-23
+-------------------
+- fixed regression caused by latest jsonfile update: See: https://github.com/jprichardson/node-jsonfile/issues/26
+
+0.20.0 / 2015-06-19
+-------------------
+- removed `jsonfile` aliases with `File` in the name, they weren't documented and probably weren't in use e.g.
+this package had both `fs.readJsonFile` and `fs.readJson` that were aliases to each other, now use `fs.readJson`.
+- preliminary walker created. Intentionally not documented. If you use it, it will almost certainly change and break your code.
+- started moving tests inline
+- upgraded to `jsonfile@2.1.0`, can now pass JSON revivers/replacers to `readJson()`, `writeJson()`, `outputJson()`
+
+0.19.0 / 2015-06-08
+-------------------
+- `fs.copy()` had support for Node v0.8, dropped support
+
+0.18.4 / 2015-05-22
+-------------------
+- fixed license field according to this: [#136][#136] and https://github.com/npm/npm/releases/tag/v2.10.0
+
+0.18.3 / 2015-05-08
+-------------------
+- bugfix: handle `EEXIST` when clobbering on some Linux systems. [#134][#134]
+
+0.18.2 / 2015-04-17
+-------------------
+- bugfix: allow `F_OK` ([#120][#120])
+
+0.18.1 / 2015-04-15
+-------------------
+- improved windows support for `move()` a bit. https://github.com/jprichardson/node-fs-extra/commit/92838980f25dc2ee4ec46b43ee14d3c4a1d30c1b
+- fixed a lot of tests for Windows (appveyor)
+
+0.18.0 / 2015-03-31
+-------------------
+- added `emptyDir()` and `emptyDirSync()`
+
+0.17.0 / 2015-03-28
+-------------------
+- `copySync` added `clobber` option (before always would clobber, now if `clobber` is `false` it throws an error if the destination exists).
+**Only works with files at the moment.**
+- `createOutputStream()` added. See: [#118][#118]
+
+0.16.5 / 2015-03-08
+-------------------
+- fixed `fs.move` when `clobber` is `true` and destination is a directory, it should clobber. [#114][#114]
+
+0.16.4 / 2015-03-01
+-------------------
+- `fs.mkdirs` fix infinite loop on Windows. See: See https://github.com/substack/node-mkdirp/pull/74 and https://github.com/substack/node-mkdirp/issues/66
+
+0.16.3 / 2015-01-28
+-------------------
+- reverted https://github.com/jprichardson/node-fs-extra/commit/1ee77c8a805eba5b99382a2591ff99667847c9c9
+
+
+0.16.2 / 2015-01-28
+-------------------
+- fixed `fs.copy` for Node v0.8 (support is temporary and will be removed in the near future)
+
+0.16.1 / 2015-01-28
+-------------------
+- if `setImmediate` is not available, fall back to `process.nextTick`
+
+0.16.0 / 2015-01-28
+-------------------
+- bugfix `fs.move()` into itself. Closes [#104]
+- bugfix `fs.move()` moving directory across device. Closes [#108]
+- added coveralls support
+- bugfix: nasty multiple callback `fs.copy()` bug. Closes [#98]
+- misc fs.copy code cleanups
+
+0.15.0 / 2015-01-21
+-------------------
+- dropped `ncp`, imported code in
+- because of previous, now supports `io.js`
+- `graceful-fs` is now a dependency
+
+0.14.0 / 2015-01-05
+-------------------
+- changed `copy`/`copySync` from `fs.copy(src, dest, [filters], callback)` to `fs.copy(src, dest, [options], callback)` [#100][#100]
+- removed mockfs tests for mkdirp (this may be temporary, but was getting in the way of other tests)
+
+0.13.0 / 2014-12-10
+-------------------
+- removed `touch` and `touchSync` methods (they didn't handle permissions like UNIX touch)
+- updated `"ncp": "^0.6.0"` to `"ncp": "^1.0.1"`
+- imported `mkdirp` => `minimist` and `mkdirp` are no longer dependences, should now appease people who wanted `mkdirp` to be `--use_strict` safe. See [#59]([#59][#59])
+
+0.12.0 / 2014-09-22
+-------------------
+- copy symlinks in `copySync()` [#85][#85]
+
+0.11.1 / 2014-09-02
+-------------------
+- bugfix `copySync()` preserve file permissions [#80][#80]
+
+0.11.0 / 2014-08-11
+-------------------
+- upgraded `"ncp": "^0.5.1"` to `"ncp": "^0.6.0"`
+- upgrade `jsonfile": "^1.2.0"` to `jsonfile": "^2.0.0"` => on write, json files now have `\n` at end. Also adds `options.throws` to `readJsonSync()`
+see https://github.com/jprichardson/node-jsonfile#readfilesyncfilename-options for more details.
+
+0.10.0 / 2014-06-29
+------------------
+* bugfix: upgaded `"jsonfile": "~1.1.0"` to `"jsonfile": "^1.2.0"`, bumped minor because of `jsonfile` dep change
+from `~` to `^`. [#67]
+
+0.9.1 / 2014-05-22
+------------------
+* removed Node.js `0.8.x` support, `0.9.0` was published moments ago and should have been done there
+
+0.9.0 / 2014-05-22
+------------------
+* upgraded `ncp` from `~0.4.2` to `^0.5.1`, [#58]
+* upgraded `rimraf` from `~2.2.6` to `^2.2.8`
+* upgraded `mkdirp` from `0.3.x` to `^0.5.0`
+* added methods `ensureFile()`, `ensureFileSync()`
+* added methods `ensureDir()`, `ensureDirSync()` [#31]
+* added `move()` method. From: https://github.com/andrewrk/node-mv
+
+
+0.8.1 / 2013-10-24
+------------------
+* copy failed to return an error to the callback if a file doesn't exist (ulikoehler [#38], [#39])
+
+0.8.0 / 2013-10-14
+------------------
+* `filter` implemented on `copy()` and `copySync()`. (Srirangan / [#36])
+
+0.7.1 / 2013-10-12
+------------------
+* `copySync()` implemented (Srirangan / [#33])
+* updated to the latest `jsonfile` version `1.1.0` which gives `options` params for the JSON methods. Closes [#32]
+
+0.7.0 / 2013-10-07
+------------------
+* update readme conventions
+* `copy()` now works if destination directory does not exist. Closes [#29]
+
+0.6.4 / 2013-09-05
+------------------
+* changed `homepage` field in package.json to remove NPM warning
+
+0.6.3 / 2013-06-28
+------------------
+* changed JSON spacing default from `4` to `2` to follow Node conventions
+* updated `jsonfile` dep
+* updated `rimraf` dep
+
+0.6.2 / 2013-06-28
+------------------
+* added .npmignore, [#25]
+
+0.6.1 / 2013-05-14
+------------------
+* modified for `strict` mode, closes [#24]
+* added `outputJson()/outputJsonSync()`, closes [#23]
+
+0.6.0 / 2013-03-18
+------------------
+* removed node 0.6 support
+* added node 0.10 support
+* upgraded to latest `ncp` and `rimraf`.
+* optional `graceful-fs` support. Closes [#17]
+
+
+0.5.0 / 2013-02-03
+------------------
+* Removed `readTextFile`.
+* Renamed `readJSONFile` to `readJSON` and `readJson`, same with write.
+* Restructured documentation a bit. Added roadmap.
+
+0.4.0 / 2013-01-28
+------------------
+* Set default spaces in `jsonfile` from 4 to 2.
+* Updated `testutil` deps for tests.
+* Renamed `touch()` to `createFile()`
+* Added `outputFile()` and `outputFileSync()`
+* Changed creation of testing diretories so the /tmp dir is not littered.
+* Added `readTextFile()` and `readTextFileSync()`.
+
+0.3.2 / 2012-11-01
+------------------
+* Added `touch()` and `touchSync()` methods.
+
+0.3.1 / 2012-10-11
+------------------
+* Fixed some stray globals.
+
+0.3.0 / 2012-10-09
+------------------
+* Removed all CoffeeScript from tests.
+* Renamed `mkdir` to `mkdirs`/`mkdirp`.
+
+0.2.1 / 2012-09-11
+------------------
+* Updated `rimraf` dep.
+
+0.2.0 / 2012-09-10
+------------------
+* Rewrote module into JavaScript. (Must still rewrite tests into JavaScript)
+* Added all methods of [jsonfile](https://github.com/jprichardson/node-jsonfile)
+* Added Travis-CI.
+
+0.1.3 / 2012-08-13
+------------------
+* Added method `readJSONFile`.
+
+0.1.2 / 2012-06-15
+------------------
+* Bug fix: `deleteSync()` didn't exist.
+* Verified Node v0.8 compatibility.
+
+0.1.1 / 2012-06-15
+------------------
+* Fixed bug in `remove()`/`delete()` that wouldn't execute the function if a callback wasn't passed.
+
+0.1.0 / 2012-05-31
+------------------
+* Renamed `copyFile()` to `copy()`. `copy()` can now copy directories (recursively) too.
+* Renamed `rmrf()` to `remove()`.
+* `remove()` aliased with `delete()`.
+* Added `mkdirp` capabilities. Named: `mkdir()`. Hides Node.js native `mkdir()`.
+* Instead of exporting the native `fs` module with new functions, I now copy over the native methods to a new object and export that instead.
+
+0.0.4 / 2012-03-14
+------------------
+* Removed CoffeeScript dependency
+
+0.0.3 / 2012-01-11
+------------------
+* Added methods rmrf and rmrfSync
+* Moved tests from Jasmine to Mocha
+
+
+[#344]: https://github.com/jprichardson/node-fs-extra/issues/344    "Licence Year"
+[#343]: https://github.com/jprichardson/node-fs-extra/pull/343      "Add klaw-sync link to readme"
+[#342]: https://github.com/jprichardson/node-fs-extra/pull/342      "allow preserveTimestamps when use move"
+[#341]: https://github.com/jprichardson/node-fs-extra/issues/341    "mkdirp(path.dirname(dest) in move() logic needs cleaning up [question]"
+[#340]: https://github.com/jprichardson/node-fs-extra/pull/340      "Move docs to seperate docs folder [documentation]"
+[#339]: https://github.com/jprichardson/node-fs-extra/pull/339      "Remove walk() & walkSync() [feature-walk]"
+[#338]: https://github.com/jprichardson/node-fs-extra/issues/338    "Remove walk() and walkSync() [feature-walk]"
+[#337]: https://github.com/jprichardson/node-fs-extra/issues/337    "copy doesn't return a yieldable value"
+[#336]: https://github.com/jprichardson/node-fs-extra/pull/336      "Docs enhanced walk sync [documentation, feature-walk]"
+[#335]: https://github.com/jprichardson/node-fs-extra/pull/335      "Refactor move() tests [feature-move]"
+[#334]: https://github.com/jprichardson/node-fs-extra/pull/334      "Cleanup lib/move/index.js [feature-move]"
+[#333]: https://github.com/jprichardson/node-fs-extra/pull/333      "Rename clobber to overwrite [feature-copy, feature-move]"
+[#332]: https://github.com/jprichardson/node-fs-extra/pull/332      "BREAKING: Drop Node v0.12 & io.js support"
+[#331]: https://github.com/jprichardson/node-fs-extra/issues/331    "Add support for chmodr [enhancement, future]"
+[#330]: https://github.com/jprichardson/node-fs-extra/pull/330      "BREAKING: Do not error when copy destination exists & clobber: false [feature-copy]"
+[#329]: https://github.com/jprichardson/node-fs-extra/issues/329    "Does .walk() scale to large directories? [question]"
+[#328]: https://github.com/jprichardson/node-fs-extra/issues/328    "Copying files corrupts [feature-copy, needs-confirmed]"
+[#327]: https://github.com/jprichardson/node-fs-extra/pull/327      "Use writeStream 'finish' event instead of 'close' [bug, feature-copy]"
+[#326]: https://github.com/jprichardson/node-fs-extra/issues/326    "fs.copy fails with chmod error when disk under heavy use [bug, feature-copy]"
+[#325]: https://github.com/jprichardson/node-fs-extra/issues/325    "ensureDir is difficult to promisify [enhancement]"
+[#324]: https://github.com/jprichardson/node-fs-extra/pull/324      "copySync() should apply filter to directories like copy() [bug, feature-copy]"
+[#323]: https://github.com/jprichardson/node-fs-extra/issues/323    "Support for `dest` being a directory when using `copy*()`?"
+[#322]: https://github.com/jprichardson/node-fs-extra/pull/322      "Add fs-promise as fs-extra-promise alternative"
+[#321]: https://github.com/jprichardson/node-fs-extra/issues/321    "fs.copy() with clobber set to false return EEXIST error [feature-copy]"
+[#320]: https://github.com/jprichardson/node-fs-extra/issues/320    "fs.copySync: Error: EPERM: operation not permitted, unlink "
+[#319]: https://github.com/jprichardson/node-fs-extra/issues/319    "Create directory if not exists"
+[#318]: https://github.com/jprichardson/node-fs-extra/issues/318    "Support glob patterns [enhancement, future]"
+[#317]: https://github.com/jprichardson/node-fs-extra/pull/317      "Adding copy sync test for src file without write perms"
+[#316]: https://github.com/jprichardson/node-fs-extra/pull/316      "Remove move()'s broken limit option [feature-move]"
+[#315]: https://github.com/jprichardson/node-fs-extra/pull/315      "Fix move clobber tests to work around graceful-fs bug."
+[#314]: https://github.com/jprichardson/node-fs-extra/issues/314    "move() limit option [documentation, enhancement, feature-move]"
+[#313]: https://github.com/jprichardson/node-fs-extra/pull/313      "Test that remove() ignores glob characters."
+[#312]: https://github.com/jprichardson/node-fs-extra/pull/312      "Enhance walkSync() to return items with path and stats [feature-walk]"
+[#311]: https://github.com/jprichardson/node-fs-extra/issues/311    "move() not work when dest name not provided [feature-move]"
+[#310]: https://github.com/jprichardson/node-fs-extra/issues/310    "Edit walkSync to return items like what walk emits [documentation, enhancement, feature-walk]"
+[#309]: https://github.com/jprichardson/node-fs-extra/issues/309    "moveSync support [enhancement, feature-move]"
+[#308]: https://github.com/jprichardson/node-fs-extra/pull/308      "Fix incorrect anchor link"
+[#307]: https://github.com/jprichardson/node-fs-extra/pull/307      "Fix coverage"
+[#306]: https://github.com/jprichardson/node-fs-extra/pull/306      "Update devDeps, fix lint error"
+[#305]: https://github.com/jprichardson/node-fs-extra/pull/305      "Re-add Coveralls"
+[#304]: https://github.com/jprichardson/node-fs-extra/pull/304      "Remove path-is-absolute [enhancement]"
+[#303]: https://github.com/jprichardson/node-fs-extra/pull/303      "Document copySync filter inconsistency [documentation, feature-copy]"
+[#302]: https://github.com/jprichardson/node-fs-extra/pull/302      "fix(console): depreciated -> deprecated"
+[#301]: https://github.com/jprichardson/node-fs-extra/pull/301      "Remove chmod call from copySync [feature-copy]"
+[#300]: https://github.com/jprichardson/node-fs-extra/pull/300      "Inline Rimraf [enhancement, feature-move, feature-remove]"
+[#299]: https://github.com/jprichardson/node-fs-extra/pull/299      "Warn when filter is a RegExp [feature-copy]"
+[#298]: https://github.com/jprichardson/node-fs-extra/issues/298    "API Docs [documentation]"
+[#297]: https://github.com/jprichardson/node-fs-extra/pull/297      "Warn about using preserveTimestamps on 32-bit node"
+[#296]: https://github.com/jprichardson/node-fs-extra/pull/296      "Improve EEXIST error message for copySync [enhancement]"
+[#295]: https://github.com/jprichardson/node-fs-extra/pull/295      "Depreciate using regular expressions for copy's filter option [documentation]"
+[#294]: https://github.com/jprichardson/node-fs-extra/pull/294      "BREAKING: Refactor lib/copy/ncp.js [feature-copy]"
+[#293]: https://github.com/jprichardson/node-fs-extra/pull/293      "Update CI configs"
+[#292]: https://github.com/jprichardson/node-fs-extra/issues/292    "Rewrite lib/copy/ncp.js [enhancement, feature-copy]"
+[#291]: https://github.com/jprichardson/node-fs-extra/pull/291      "Escape '$' in replacement string for async file copying"
+[#290]: https://github.com/jprichardson/node-fs-extra/issues/290    "Exclude files pattern while copying using copy.config.js [question]"
+[#289]: https://github.com/jprichardson/node-fs-extra/pull/289      "(Closes #271) lib/util/utimes: properly close file descriptors in the event of an error"
+[#288]: https://github.com/jprichardson/node-fs-extra/pull/288      "(Closes #271) lib/util/utimes: properly close file descriptors in the event of an error"
+[#287]: https://github.com/jprichardson/node-fs-extra/issues/287    "emptyDir() callback arguments are inconsistent [enhancement, feature-remove]"
+[#286]: https://github.com/jprichardson/node-fs-extra/pull/286      "Added walkSync function"
+[#285]: https://github.com/jprichardson/node-fs-extra/issues/285    "CITGM test failing on s390"
+[#284]: https://github.com/jprichardson/node-fs-extra/issues/284    "outputFile method is missing a check to determine if existing item is a folder or not"
+[#283]: https://github.com/jprichardson/node-fs-extra/pull/283      "Apply filter also on directories and symlinks for copySync()"
+[#282]: https://github.com/jprichardson/node-fs-extra/pull/282      "Apply filter also on directories and symlinks for copySync()"
+[#281]: https://github.com/jprichardson/node-fs-extra/issues/281    "remove function executes 'successfully' but doesn't do anything?"
+[#280]: https://github.com/jprichardson/node-fs-extra/pull/280      "Disable rimraf globbing"
+[#279]: https://github.com/jprichardson/node-fs-extra/issues/279    "Some code is vendored instead of included [awaiting-reply]"
+[#278]: https://github.com/jprichardson/node-fs-extra/issues/278    "copy() does not preserve file/directory ownership"
+[#277]: https://github.com/jprichardson/node-fs-extra/pull/277      "Mention defaults for clobber and dereference options"
+[#276]: https://github.com/jprichardson/node-fs-extra/issues/276    "Cannot connect to Shared Folder [awaiting-reply]"
+[#275]: https://github.com/jprichardson/node-fs-extra/issues/275    "EMFILE, too many open files on Mac OS with JSON API"
+[#274]: https://github.com/jprichardson/node-fs-extra/issues/274    "Use with memory-fs? [enhancement, future]"
+[#273]: https://github.com/jprichardson/node-fs-extra/pull/273      "tests: rename `remote.test.js` to `remove.test.js`"
+[#272]: https://github.com/jprichardson/node-fs-extra/issues/272    "Copy clobber flag never err even when true [bug, feature-copy]"
+[#271]: https://github.com/jprichardson/node-fs-extra/issues/271    "Unclosed file handle on futimes error"
+[#270]: https://github.com/jprichardson/node-fs-extra/issues/270    "copy not working as desired on Windows [feature-copy, platform-windows]"
+[#269]: https://github.com/jprichardson/node-fs-extra/issues/269    "Copying with preserveTimeStamps: true is inaccurate using 32bit node [feature-copy]"
+[#268]: https://github.com/jprichardson/node-fs-extra/pull/268      "port fix for mkdirp issue #111"
+[#267]: https://github.com/jprichardson/node-fs-extra/issues/267    "WARN deprecated wrench@1.5.9: wrench.js is deprecated!"
+[#266]: https://github.com/jprichardson/node-fs-extra/issues/266    "fs-extra"
+[#265]: https://github.com/jprichardson/node-fs-extra/issues/265    "Link the `fs.stat fs.exists` etc. methods for replace the `fs` module forever?"
+[#264]: https://github.com/jprichardson/node-fs-extra/issues/264    "Renaming a file using move fails when a file inside is open (at least on windows) [wont-fix]"
+[#263]: https://github.com/jprichardson/node-fs-extra/issues/263    "ENOSYS: function not implemented, link [needs-confirmed]"
+[#262]: https://github.com/jprichardson/node-fs-extra/issues/262    "Add .exists() and .existsSync()"
+[#261]: https://github.com/jprichardson/node-fs-extra/issues/261    "Cannot read property 'prototype' of undefined"
+[#260]: https://github.com/jprichardson/node-fs-extra/pull/260      "use more specific path for method require"
+[#259]: https://github.com/jprichardson/node-fs-extra/issues/259    "Feature Request: isEmpty"
+[#258]: https://github.com/jprichardson/node-fs-extra/issues/258    "copy files does not preserve file timestamp"
+[#257]: https://github.com/jprichardson/node-fs-extra/issues/257    "Copying a file on windows fails"
+[#256]: https://github.com/jprichardson/node-fs-extra/pull/256      "Updated Readme "
+[#255]: https://github.com/jprichardson/node-fs-extra/issues/255    "Update rimraf required version"
+[#254]: https://github.com/jprichardson/node-fs-extra/issues/254    "request for readTree, readTreeSync, walkSync method"
+[#253]: https://github.com/jprichardson/node-fs-extra/issues/253    "outputFile does not touch mtime when file exists"
+[#252]: https://github.com/jprichardson/node-fs-extra/pull/252      "Fixing problem when copying file with no write permission"
+[#251]: https://github.com/jprichardson/node-fs-extra/issues/251    "Just wanted to say thank you"
+[#250]: https://github.com/jprichardson/node-fs-extra/issues/250    "`fs.remove()` not removing files (works with `rm -rf`)"
+[#249]: https://github.com/jprichardson/node-fs-extra/issues/249    "Just a Question ... Remove Servers"
+[#248]: https://github.com/jprichardson/node-fs-extra/issues/248    "Allow option to not preserve permissions for copy"
+[#247]: https://github.com/jprichardson/node-fs-extra/issues/247    "Add TypeScript typing directly in the fs-extra package"
+[#246]: https://github.com/jprichardson/node-fs-extra/issues/246    "fse.remove() && fse.removeSync() don't throw error on ENOENT file"
+[#245]: https://github.com/jprichardson/node-fs-extra/issues/245    "filter for empty dir [enhancement]"
+[#244]: https://github.com/jprichardson/node-fs-extra/issues/244    "copySync doesn't apply the filter to directories"
+[#243]: https://github.com/jprichardson/node-fs-extra/issues/243    "Can I request fs.walk() to be synchronous?"
+[#242]: https://github.com/jprichardson/node-fs-extra/issues/242    "Accidentally truncates file names ending with $$ [bug, feature-copy]"
+[#241]: https://github.com/jprichardson/node-fs-extra/pull/241      "Remove link to createOutputStream"
+[#240]: https://github.com/jprichardson/node-fs-extra/issues/240    "walkSync request"
+[#239]: https://github.com/jprichardson/node-fs-extra/issues/239    "Depreciate regular expressions for copy's filter [documentation, feature-copy]"
+[#238]: https://github.com/jprichardson/node-fs-extra/issues/238    "Can't write to files while in a worker thread."
+[#237]: https://github.com/jprichardson/node-fs-extra/issues/237    ".ensureDir(..) fails silently when passed an invalid path..."
+[#236]: https://github.com/jprichardson/node-fs-extra/issues/236    "[Removed] Filed under wrong repo"
+[#235]: https://github.com/jprichardson/node-fs-extra/pull/235      "Adds symlink dereference option to `fse.copySync` (#191)"
+[#234]: https://github.com/jprichardson/node-fs-extra/issues/234    "ensureDirSync fails silent when EACCES: permission denied on travis-ci"
+[#233]: https://github.com/jprichardson/node-fs-extra/issues/233    "please make sure the first argument in callback is error object [feature-copy]"
+[#232]: https://github.com/jprichardson/node-fs-extra/issues/232    "Copy a folder content  to its child folder.  "
+[#231]: https://github.com/jprichardson/node-fs-extra/issues/231    "Adding read/write/output functions for YAML"
+[#230]: https://github.com/jprichardson/node-fs-extra/pull/230      "throw error if src and dest are the same to avoid zeroing out + test"
+[#229]: https://github.com/jprichardson/node-fs-extra/pull/229      "fix 'TypeError: callback is not a function' in emptyDir"
+[#228]: https://github.com/jprichardson/node-fs-extra/pull/228      "Throw error when target is empty so file is not accidentally zeroed out"
+[#227]: https://github.com/jprichardson/node-fs-extra/issues/227    "Uncatchable errors when there are invalid arguments [feature-move]"
+[#226]: https://github.com/jprichardson/node-fs-extra/issues/226    "Moving to the current directory"
+[#225]: https://github.com/jprichardson/node-fs-extra/issues/225    "EBUSY: resource busy or locked, unlink"
+[#224]: https://github.com/jprichardson/node-fs-extra/issues/224    "fse.copy ENOENT error"
+[#223]: https://github.com/jprichardson/node-fs-extra/issues/223    "Suspicious behavior of fs.existsSync"
+[#222]: https://github.com/jprichardson/node-fs-extra/pull/222      "A clearer description of emtpyDir function"
+[#221]: https://github.com/jprichardson/node-fs-extra/pull/221      "Update README.md"
+[#220]: https://github.com/jprichardson/node-fs-extra/pull/220      "Non-breaking feature: add option 'passStats' to copy methods."
+[#219]: https://github.com/jprichardson/node-fs-extra/pull/219      "Add closing parenthesis in copySync example"
+[#218]: https://github.com/jprichardson/node-fs-extra/pull/218      "fix #187 #70 options.filter bug"
+[#217]: https://github.com/jprichardson/node-fs-extra/pull/217      "fix #187 #70 options.filter bug"
+[#216]: https://github.com/jprichardson/node-fs-extra/pull/216      "fix #187 #70 options.filter bug"
+[#215]: https://github.com/jprichardson/node-fs-extra/pull/215      "fse.copy throws error when only src and dest provided [bug, documentation, feature-copy]"
+[#214]: https://github.com/jprichardson/node-fs-extra/pull/214      "Fixing copySync anchor tag"
+[#213]: https://github.com/jprichardson/node-fs-extra/issues/213    "Merge extfs with this repo"
+[#212]: https://github.com/jprichardson/node-fs-extra/pull/212      "Update year to 2016 in README.md and LICENSE"
+[#211]: https://github.com/jprichardson/node-fs-extra/issues/211    "Not copying all files"
+[#210]: https://github.com/jprichardson/node-fs-extra/issues/210    "copy/copySync behave differently when copying a symbolic file [bug, documentation, feature-copy]"
+[#209]: https://github.com/jprichardson/node-fs-extra/issues/209    "In Windows invalid directory name causes infinite loop in ensureDir(). [bug]"
+[#208]: https://github.com/jprichardson/node-fs-extra/pull/208      "fix options.preserveTimestamps to false in copy-sync by default [feature-copy]"
+[#207]: https://github.com/jprichardson/node-fs-extra/issues/207    "Add `compare` suite of functions"
+[#206]: https://github.com/jprichardson/node-fs-extra/issues/206    "outputFileSync"
+[#205]: https://github.com/jprichardson/node-fs-extra/issues/205    "fix documents about copy/copySync [documentation, feature-copy]"
+[#204]: https://github.com/jprichardson/node-fs-extra/pull/204      "allow copy of block and character device files"
+[#203]: https://github.com/jprichardson/node-fs-extra/issues/203    "copy method's argument options couldn't be undefined [bug, feature-copy]"
+[#202]: https://github.com/jprichardson/node-fs-extra/issues/202    "why there is not a walkSync method?"
+[#201]: https://github.com/jprichardson/node-fs-extra/issues/201    "clobber for directories [feature-copy, future]"
+[#200]: https://github.com/jprichardson/node-fs-extra/issues/200    "'copySync' doesn't work in sync"
+[#199]: https://github.com/jprichardson/node-fs-extra/issues/199    "fs.copySync fails if user does not own file [bug, feature-copy]"
+[#198]: https://github.com/jprichardson/node-fs-extra/issues/198    "handle copying between identical files [feature-copy]"
+[#197]: https://github.com/jprichardson/node-fs-extra/issues/197    "Missing documentation for `outputFile` `options` 3rd parameter [documentation]"
+[#196]: https://github.com/jprichardson/node-fs-extra/issues/196    "copy filter: async function and/or function called with `fs.stat` result [future]"
+[#195]: https://github.com/jprichardson/node-fs-extra/issues/195    "How to override with outputFile?"
+[#194]: https://github.com/jprichardson/node-fs-extra/pull/194      "allow ensureFile(Sync) to provide data to be written to created file"
+[#193]: https://github.com/jprichardson/node-fs-extra/issues/193    "`fs.copy` fails silently if source file is /dev/null [bug, feature-copy]"
+[#192]: https://github.com/jprichardson/node-fs-extra/issues/192    "Remove fs.createOutputStream()"
+[#191]: https://github.com/jprichardson/node-fs-extra/issues/191    "How to copy symlinks to target as normal folders [feature-copy]"
+[#190]: https://github.com/jprichardson/node-fs-extra/pull/190      "copySync to overwrite destination file if readonly and clobber true"
+[#189]: https://github.com/jprichardson/node-fs-extra/pull/189      "move.test fix to support CRLF on Windows"
+[#188]: https://github.com/jprichardson/node-fs-extra/issues/188    "move.test failing on windows platform"
+[#187]: https://github.com/jprichardson/node-fs-extra/issues/187    "Not filter each file, stops on first false [feature-copy]"
+[#186]: https://github.com/jprichardson/node-fs-extra/issues/186    "Do you need a .size() function in this module? [future]"
+[#185]: https://github.com/jprichardson/node-fs-extra/issues/185    "Doesn't work on NodeJS v4.x"
+[#184]: https://github.com/jprichardson/node-fs-extra/issues/184    "CLI equivalent for fs-extra"
+[#183]: https://github.com/jprichardson/node-fs-extra/issues/183    "with clobber true, copy and copySync behave differently if destination file is read only [bug, feature-copy]"
+[#182]: https://github.com/jprichardson/node-fs-extra/issues/182    "ensureDir(dir, callback) second callback parameter not specified"
+[#181]: https://github.com/jprichardson/node-fs-extra/issues/181    "Add ability to remove file securely [enhancement, wont-fix]"
+[#180]: https://github.com/jprichardson/node-fs-extra/issues/180    "Filter option doesn't work the same way in copy and copySync [bug, feature-copy]"
+[#179]: https://github.com/jprichardson/node-fs-extra/issues/179    "Include opendir"
+[#178]: https://github.com/jprichardson/node-fs-extra/issues/178    "ENOTEMPTY is thrown on removeSync "
+[#177]: https://github.com/jprichardson/node-fs-extra/issues/177    "fix `remove()` wildcards (introduced by rimraf) [feature-remove]"
+[#176]: https://github.com/jprichardson/node-fs-extra/issues/176    "createOutputStream doesn't emit 'end' event"
+[#175]: https://github.com/jprichardson/node-fs-extra/issues/175    "[Feature Request].moveSync support [feature-move, future]"
+[#174]: https://github.com/jprichardson/node-fs-extra/pull/174      "Fix copy formatting and document options.filter"
+[#173]: https://github.com/jprichardson/node-fs-extra/issues/173    "Feature Request: writeJson should mkdirs"
+[#172]: https://github.com/jprichardson/node-fs-extra/issues/172    "rename `clobber` flags to `overwrite`"
+[#171]: https://github.com/jprichardson/node-fs-extra/issues/171    "remove unnecessary aliases"
+[#170]: https://github.com/jprichardson/node-fs-extra/pull/170      "More robust handling of errors moving across virtual drives"
+[#169]: https://github.com/jprichardson/node-fs-extra/pull/169      "suppress ensureLink & ensureSymlink dest exists error"
+[#168]: https://github.com/jprichardson/node-fs-extra/pull/168      "suppress ensurelink dest exists error"
+[#167]: https://github.com/jprichardson/node-fs-extra/pull/167      "Adds basic (string, buffer) support for ensureFile content [future]"
+[#166]: https://github.com/jprichardson/node-fs-extra/pull/166      "Adds basic (string, buffer) support for ensureFile content"
+[#165]: https://github.com/jprichardson/node-fs-extra/pull/165      "ensure for link & symlink"
+[#164]: https://github.com/jprichardson/node-fs-extra/issues/164    "Feature Request: ensureFile to take optional argument for file content"
+[#163]: https://github.com/jprichardson/node-fs-extra/issues/163    "ouputJson not formatted out of the box [bug]"
+[#162]: https://github.com/jprichardson/node-fs-extra/pull/162      "ensure symlink & link"
+[#161]: https://github.com/jprichardson/node-fs-extra/pull/161      "ensure symlink & link"
+[#160]: https://github.com/jprichardson/node-fs-extra/pull/160      "ensure symlink & link"
+[#159]: https://github.com/jprichardson/node-fs-extra/pull/159      "ensure symlink & link"
+[#158]: https://github.com/jprichardson/node-fs-extra/issues/158    "Feature Request: ensureLink and ensureSymlink methods"
+[#157]: https://github.com/jprichardson/node-fs-extra/issues/157    "writeJson isn't formatted"
+[#156]: https://github.com/jprichardson/node-fs-extra/issues/156    "Promise.promisifyAll doesn't work for some methods"
+[#155]: https://github.com/jprichardson/node-fs-extra/issues/155    "Readme"
+[#154]: https://github.com/jprichardson/node-fs-extra/issues/154    "/tmp/millis-test-sync"
+[#153]: https://github.com/jprichardson/node-fs-extra/pull/153      "Make preserveTimes also work on read-only files. Closes #152"
+[#152]: https://github.com/jprichardson/node-fs-extra/issues/152    "fs.copy fails for read-only files with preserveTimestamp=true [feature-copy]"
+[#151]: https://github.com/jprichardson/node-fs-extra/issues/151    "TOC does not work correctly on npm [documentation]"
+[#150]: https://github.com/jprichardson/node-fs-extra/issues/150    "Remove test file fixtures, create with code."
+[#149]: https://github.com/jprichardson/node-fs-extra/issues/149    "/tmp/millis-test-sync"
+[#148]: https://github.com/jprichardson/node-fs-extra/issues/148    "split out `Sync` methods in documentation"
+[#147]: https://github.com/jprichardson/node-fs-extra/issues/147    "Adding rmdirIfEmpty"
+[#146]: https://github.com/jprichardson/node-fs-extra/pull/146      "ensure test.js works"
+[#145]: https://github.com/jprichardson/node-fs-extra/issues/145    "Add `fs.exists` and `fs.existsSync` if it doesn't exist."
+[#144]: https://github.com/jprichardson/node-fs-extra/issues/144    "tests failing"
+[#143]: https://github.com/jprichardson/node-fs-extra/issues/143    "update graceful-fs"
+[#142]: https://github.com/jprichardson/node-fs-extra/issues/142    "PrependFile Feature"
+[#141]: https://github.com/jprichardson/node-fs-extra/pull/141      "Add option to preserve timestamps"
+[#140]: https://github.com/jprichardson/node-fs-extra/issues/140    "Json file reading fails with 'utf8'"
+[#139]: https://github.com/jprichardson/node-fs-extra/pull/139      "Preserve file timestamp on copy. Closes #138"
+[#138]: https://github.com/jprichardson/node-fs-extra/issues/138    "Preserve timestamps on copying files"
+[#137]: https://github.com/jprichardson/node-fs-extra/issues/137    "outputFile/outputJson: Unexpected end of input"
+[#136]: https://github.com/jprichardson/node-fs-extra/pull/136      "Update license attribute"
+[#135]: https://github.com/jprichardson/node-fs-extra/issues/135    "emptyDir throws Error if no callback is provided"
+[#134]: https://github.com/jprichardson/node-fs-extra/pull/134      "Handle EEXIST error when clobbering dir"
+[#133]: https://github.com/jprichardson/node-fs-extra/pull/133      "Travis runs with `sudo: false`"
+[#132]: https://github.com/jprichardson/node-fs-extra/pull/132      "isDirectory method"
+[#131]: https://github.com/jprichardson/node-fs-extra/issues/131    "copySync is not working iojs 1.8.4 on linux [feature-copy]"
+[#130]: https://github.com/jprichardson/node-fs-extra/pull/130      "Please review additional features."
+[#129]: https://github.com/jprichardson/node-fs-extra/pull/129      "can you review this feature?"
+[#128]: https://github.com/jprichardson/node-fs-extra/issues/128    "fsExtra.move(filepath, newPath) broken;"
+[#127]: https://github.com/jprichardson/node-fs-extra/issues/127    "consider using fs.access to remove deprecated warnings for fs.exists"
+[#126]: https://github.com/jprichardson/node-fs-extra/issues/126    " TypeError: Object #<Object> has no method 'access'"
+[#125]: https://github.com/jprichardson/node-fs-extra/issues/125    "Question: What do the *Sync function do different from non-sync"
+[#124]: https://github.com/jprichardson/node-fs-extra/issues/124    "move with clobber option 'ENOTEMPTY'"
+[#123]: https://github.com/jprichardson/node-fs-extra/issues/123    "Only copy the content of a directory"
+[#122]: https://github.com/jprichardson/node-fs-extra/pull/122      "Update section links in README to match current section ids."
+[#121]: https://github.com/jprichardson/node-fs-extra/issues/121    "emptyDir is undefined"
+[#120]: https://github.com/jprichardson/node-fs-extra/issues/120    "usage bug caused by shallow cloning methods of 'graceful-fs'"
+[#119]: https://github.com/jprichardson/node-fs-extra/issues/119    "mkdirs and ensureDir never invoke callback and consume CPU indefinitely if provided a path with invalid characters on Windows"
+[#118]: https://github.com/jprichardson/node-fs-extra/pull/118      "createOutputStream"
+[#117]: https://github.com/jprichardson/node-fs-extra/pull/117      "Fixed issue with slash separated paths on windows"
+[#116]: https://github.com/jprichardson/node-fs-extra/issues/116    "copySync can only copy directories not files [documentation, feature-copy]"
+[#115]: https://github.com/jprichardson/node-fs-extra/issues/115    ".Copy & .CopySync [feature-copy]"
+[#114]: https://github.com/jprichardson/node-fs-extra/issues/114    "Fails to move (rename) directory to non-empty directory even with clobber: true"
+[#113]: https://github.com/jprichardson/node-fs-extra/issues/113    "fs.copy seems to callback early if the destination file already exists"
+[#112]: https://github.com/jprichardson/node-fs-extra/pull/112      "Copying a file into an existing directory"
+[#111]: https://github.com/jprichardson/node-fs-extra/pull/111      "Moving a file into an existing directory "
+[#110]: https://github.com/jprichardson/node-fs-extra/pull/110      "Moving a file into an existing directory"
+[#109]: https://github.com/jprichardson/node-fs-extra/issues/109    "fs.move across windows drives fails"
+[#108]: https://github.com/jprichardson/node-fs-extra/issues/108    "fse.move directories across multiple devices doesn't work"
+[#107]: https://github.com/jprichardson/node-fs-extra/pull/107      "Check if dest path is an existing dir and copy or move source in it"
+[#106]: https://github.com/jprichardson/node-fs-extra/issues/106    "fse.copySync crashes while copying across devices D: [feature-copy]"
+[#105]: https://github.com/jprichardson/node-fs-extra/issues/105    "fs.copy hangs on iojs"
+[#104]: https://github.com/jprichardson/node-fs-extra/issues/104    "fse.move deletes folders [bug]"
+[#103]: https://github.com/jprichardson/node-fs-extra/issues/103    "Error: EMFILE with copy"
+[#102]: https://github.com/jprichardson/node-fs-extra/issues/102    "touch / touchSync was removed ?"
+[#101]: https://github.com/jprichardson/node-fs-extra/issues/101    "fs-extra promisified"
+[#100]: https://github.com/jprichardson/node-fs-extra/pull/100      "copy: options object or filter to pass to ncp"
+[#99]: https://github.com/jprichardson/node-fs-extra/issues/99      "ensureDir() modes [future]"
+[#98]: https://github.com/jprichardson/node-fs-extra/issues/98      "fs.copy() incorrect async behavior [bug]"
+[#97]: https://github.com/jprichardson/node-fs-extra/pull/97        "use path.join; fix copySync bug"
+[#96]: https://github.com/jprichardson/node-fs-extra/issues/96      "destFolderExists in copySync is always undefined."
+[#95]: https://github.com/jprichardson/node-fs-extra/pull/95        "Using graceful-ncp instead of ncp"
+[#94]: https://github.com/jprichardson/node-fs-extra/issues/94      "Error: EEXIST, file already exists '../mkdirp/bin/cmd.js' on fs.copySync() [enhancement, feature-copy]"
+[#93]: https://github.com/jprichardson/node-fs-extra/issues/93      "Confusing error if drive not mounted [enhancement]"
+[#92]: https://github.com/jprichardson/node-fs-extra/issues/92      "Problems with Bluebird"
+[#91]: https://github.com/jprichardson/node-fs-extra/issues/91      "fs.copySync('/test', '/haha') is different with 'cp -r /test /haha' [enhancement]"
+[#90]: https://github.com/jprichardson/node-fs-extra/issues/90      "Folder creation and file copy is Happening in 64 bit machine but not in 32 bit machine"
+[#89]: https://github.com/jprichardson/node-fs-extra/issues/89      "Error: EEXIST using fs-extra's fs.copy to copy a directory on Windows"
+[#88]: https://github.com/jprichardson/node-fs-extra/issues/88      "Stacking those libraries"
+[#87]: https://github.com/jprichardson/node-fs-extra/issues/87      "createWriteStream + outputFile = ?"
+[#86]: https://github.com/jprichardson/node-fs-extra/issues/86      "no moveSync?"
+[#85]: https://github.com/jprichardson/node-fs-extra/pull/85        "Copy symlinks in copySync"
+[#84]: https://github.com/jprichardson/node-fs-extra/issues/84      "Push latest version to npm ?"
+[#83]: https://github.com/jprichardson/node-fs-extra/issues/83      "Prevent copying a directory into itself [feature-copy]"
+[#82]: https://github.com/jprichardson/node-fs-extra/pull/82        "README updates for move"
+[#81]: https://github.com/jprichardson/node-fs-extra/issues/81      "fd leak after fs.move"
+[#80]: https://github.com/jprichardson/node-fs-extra/pull/80        "Preserve file mode in copySync"
+[#79]: https://github.com/jprichardson/node-fs-extra/issues/79      "fs.copy only .html file empty"
+[#78]: https://github.com/jprichardson/node-fs-extra/pull/78        "copySync was not applying filters to directories"
+[#77]: https://github.com/jprichardson/node-fs-extra/issues/77      "Create README reference to bluebird"
+[#76]: https://github.com/jprichardson/node-fs-extra/issues/76      "Create README reference to typescript"
+[#75]: https://github.com/jprichardson/node-fs-extra/issues/75      "add glob as a dep? [question]"
+[#74]: https://github.com/jprichardson/node-fs-extra/pull/74        "including new emptydir module"
+[#73]: https://github.com/jprichardson/node-fs-extra/pull/73        "add dependency status in readme"
+[#72]: https://github.com/jprichardson/node-fs-extra/pull/72        "Use svg instead of png to get better image quality"
+[#71]: https://github.com/jprichardson/node-fs-extra/issues/71      "fse.copy not working on Windows 7 x64 OS, but, copySync does work"
+[#70]: https://github.com/jprichardson/node-fs-extra/issues/70      "Not filter each file, stops on first false [bug]"
+[#69]: https://github.com/jprichardson/node-fs-extra/issues/69      "How to check if folder exist and read the folder name"
+[#68]: https://github.com/jprichardson/node-fs-extra/issues/68      "consider flag to readJsonSync (throw false) [enhancement]"
+[#67]: https://github.com/jprichardson/node-fs-extra/issues/67      "docs for readJson incorrectly states that is accepts options"
+[#66]: https://github.com/jprichardson/node-fs-extra/issues/66      "ENAMETOOLONG"
+[#65]: https://github.com/jprichardson/node-fs-extra/issues/65      "exclude filter in fs.copy"
+[#64]: https://github.com/jprichardson/node-fs-extra/issues/64      "Announce: mfs - monitor your fs-extra calls"
+[#63]: https://github.com/jprichardson/node-fs-extra/issues/63      "Walk"
+[#62]: https://github.com/jprichardson/node-fs-extra/issues/62      "npm install fs-extra doesn't work"
+[#61]: https://github.com/jprichardson/node-fs-extra/issues/61      "No longer supports node 0.8 due to use of `^` in package.json dependencies"
+[#60]: https://github.com/jprichardson/node-fs-extra/issues/60      "chmod & chown for mkdirs"
+[#59]: https://github.com/jprichardson/node-fs-extra/issues/59      "Consider including mkdirp and making fs-extra '--use_strict' safe [question]"
+[#58]: https://github.com/jprichardson/node-fs-extra/issues/58      "Stack trace not included in fs.copy error"
+[#57]: https://github.com/jprichardson/node-fs-extra/issues/57      "Possible to include wildcards in delete?"
+[#56]: https://github.com/jprichardson/node-fs-extra/issues/56      "Crash when have no access to write to destination file in copy "
+[#55]: https://github.com/jprichardson/node-fs-extra/issues/55      "Is it possible to have any console output similar to Grunt copy module?"
+[#54]: https://github.com/jprichardson/node-fs-extra/issues/54      "`copy` does not preserve file ownership and permissons"
+[#53]: https://github.com/jprichardson/node-fs-extra/issues/53      "outputFile() - ability to write data in appending mode"
+[#52]: https://github.com/jprichardson/node-fs-extra/pull/52        "This fixes (what I think) is a bug in copySync"
+[#51]: https://github.com/jprichardson/node-fs-extra/pull/51        "Add a Bitdeli Badge to README"
+[#50]: https://github.com/jprichardson/node-fs-extra/issues/50      "Replace mechanism in createFile"
+[#49]: https://github.com/jprichardson/node-fs-extra/pull/49        "update rimraf to v2.2.6"
+[#48]: https://github.com/jprichardson/node-fs-extra/issues/48      "fs.copy issue [bug]"
+[#47]: https://github.com/jprichardson/node-fs-extra/issues/47      "Bug in copy - callback called on readStream 'close' - Fixed in ncp 0.5.0"
+[#46]: https://github.com/jprichardson/node-fs-extra/pull/46        "update copyright year"
+[#45]: https://github.com/jprichardson/node-fs-extra/pull/45        "Added note about fse.outputFile() being the one that overwrites"
+[#44]: https://github.com/jprichardson/node-fs-extra/pull/44        "Proposal: Stream support"
+[#43]: https://github.com/jprichardson/node-fs-extra/issues/43      "Better error reporting "
+[#42]: https://github.com/jprichardson/node-fs-extra/issues/42      "Performance issue?"
+[#41]: https://github.com/jprichardson/node-fs-extra/pull/41        "There does seem to be a synchronous version now"
+[#40]: https://github.com/jprichardson/node-fs-extra/issues/40      "fs.copy throw unexplained error ENOENT, utime "
+[#39]: https://github.com/jprichardson/node-fs-extra/pull/39        "Added regression test for copy() return callback on error"
+[#38]: https://github.com/jprichardson/node-fs-extra/pull/38        "Return err in copy() fstat cb, because stat could be undefined or null"
+[#37]: https://github.com/jprichardson/node-fs-extra/issues/37      "Maybe include a line reader? [enhancement, question]"
+[#36]: https://github.com/jprichardson/node-fs-extra/pull/36        "`filter` parameter `fs.copy` and `fs.copySync`"
+[#35]: https://github.com/jprichardson/node-fs-extra/pull/35        "`filter` parameter `fs.copy` and `fs.copySync` "
+[#34]: https://github.com/jprichardson/node-fs-extra/issues/34      "update docs to include options for JSON methods [enhancement]"
+[#33]: https://github.com/jprichardson/node-fs-extra/pull/33        "fs_extra.copySync"
+[#32]: https://github.com/jprichardson/node-fs-extra/issues/32      "update to latest jsonfile [enhancement]"
+[#31]: https://github.com/jprichardson/node-fs-extra/issues/31      "Add ensure methods [enhancement]"
+[#30]: https://github.com/jprichardson/node-fs-extra/issues/30      "update package.json optional dep `graceful-fs`"
+[#29]: https://github.com/jprichardson/node-fs-extra/issues/29      "Copy failing if dest directory doesn't exist. Is this intended?"
+[#28]: https://github.com/jprichardson/node-fs-extra/issues/28      "homepage field must be a string url. Deleted."
+[#27]: https://github.com/jprichardson/node-fs-extra/issues/27      "Update Readme"
+[#26]: https://github.com/jprichardson/node-fs-extra/issues/26      "Add readdir recursive method. [enhancement]"
+[#25]: https://github.com/jprichardson/node-fs-extra/pull/25        "adding an `.npmignore` file"
+[#24]: https://github.com/jprichardson/node-fs-extra/issues/24      "[bug] cannot run in strict mode [bug]"
+[#23]: https://github.com/jprichardson/node-fs-extra/issues/23      "`writeJSON()` should create parent directories"
+[#22]: https://github.com/jprichardson/node-fs-extra/pull/22        "Add a limit option to mkdirs()"
+[#21]: https://github.com/jprichardson/node-fs-extra/issues/21      "touch() in 0.10.0"
+[#20]: https://github.com/jprichardson/node-fs-extra/issues/20      "fs.remove yields callback before directory is really deleted"
+[#19]: https://github.com/jprichardson/node-fs-extra/issues/19      "fs.copy err is empty array"
+[#18]: https://github.com/jprichardson/node-fs-extra/pull/18        "Exposed copyFile Function"
+[#17]: https://github.com/jprichardson/node-fs-extra/issues/17      "Use `require('graceful-fs')` if found instead of `require('fs')`"
+[#16]: https://github.com/jprichardson/node-fs-extra/pull/16        "Update README.md"
+[#15]: https://github.com/jprichardson/node-fs-extra/issues/15      "Implement cp -r but sync aka copySync. [enhancement]"
+[#14]: https://github.com/jprichardson/node-fs-extra/issues/14      "fs.mkdirSync is broken in 0.3.1"
+[#13]: https://github.com/jprichardson/node-fs-extra/issues/13      "Thoughts on including a directory tree / file watcher? [enhancement, question]"
+[#12]: https://github.com/jprichardson/node-fs-extra/issues/12      "copyFile & copyFileSync are global"
+[#11]: https://github.com/jprichardson/node-fs-extra/issues/11      "Thoughts on including a file walker? [enhancement, question]"
+[#10]: https://github.com/jprichardson/node-fs-extra/issues/10      "move / moveFile API [enhancement]"
+[#9]: https://github.com/jprichardson/node-fs-extra/issues/9        "don't import normal fs stuff into fs-extra"
+[#8]: https://github.com/jprichardson/node-fs-extra/pull/8          "Update rimraf to latest version"
+[#6]: https://github.com/jprichardson/node-fs-extra/issues/6        "Remove CoffeeScript development dependency"
+[#5]: https://github.com/jprichardson/node-fs-extra/issues/5        "comments on naming"
+[#4]: https://github.com/jprichardson/node-fs-extra/issues/4        "version bump to 0.2"
+[#3]: https://github.com/jprichardson/node-fs-extra/pull/3          "Hi! I fixed some code for you!"
+[#2]: https://github.com/jprichardson/node-fs-extra/issues/2        "Merge with fs.extra and mkdirp"
+[#1]: https://github.com/jprichardson/node-fs-extra/issues/1        "file-extra npm !exist"
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/LICENSE
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,15 @@
+(The MIT License)
+
+Copyright (c) 2011-2017 JP Richardson
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files
+(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,
+ merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS
+OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/README.md
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,264 @@
+Node.js: fs-extra
+=================
+
+`fs-extra` adds file system methods that aren't included in the native `fs` module and adds promise support to the `fs` methods. It also uses [`graceful-fs`](https://github.com/isaacs/node-graceful-fs) to prevent `EMFILE` errors. It should be a drop in replacement for `fs`.
+
+[![npm Package](https://img.shields.io/npm/v/fs-extra.svg)](https://www.npmjs.org/package/fs-extra)
+[![License](https://img.shields.io/npm/l/express.svg)](https://github.com/jprichardson/node-fs-extra/blob/master/LICENSE)
+[![build status](https://img.shields.io/travis/jprichardson/node-fs-extra/master.svg)](http://travis-ci.org/jprichardson/node-fs-extra)
+[![windows Build status](https://img.shields.io/appveyor/ci/jprichardson/node-fs-extra/master.svg?label=windows%20build)](https://ci.appveyor.com/project/jprichardson/node-fs-extra/branch/master)
+[![downloads per month](http://img.shields.io/npm/dm/fs-extra.svg)](https://www.npmjs.org/package/fs-extra)
+[![Coverage Status](https://img.shields.io/coveralls/github/jprichardson/node-fs-extra/master.svg)](https://coveralls.io/github/jprichardson/node-fs-extra)
+[![JavaScript Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://standardjs.com)
+
+Why?
+----
+
+I got tired of including `mkdirp`, `rimraf`, and `ncp` in most of my projects.
+
+
+
+
+Installation
+------------
+
+    npm install fs-extra
+
+
+
+Usage
+-----
+
+`fs-extra` is a drop in replacement for native `fs`. All methods in `fs` are attached to `fs-extra`. All `fs` methods return promises if the callback isn't passed.
+
+You don't ever need to include the original `fs` module again:
+
+```js
+const fs = require('fs') // this is no longer necessary
+```
+
+you can now do this:
+
+```js
+const fs = require('fs-extra')
+```
+
+or if you prefer to make it clear that you're using `fs-extra` and not `fs`, you may want
+to name your `fs` variable `fse` like so:
+
+```js
+const fse = require('fs-extra')
+```
+
+you can also keep both, but it's redundant:
+
+```js
+const fs = require('fs')
+const fse = require('fs-extra')
+```
+
+Sync vs Async vs Async/Await
+-------------
+Most methods are async by default. All async methods will return a promise if the callback isn't passed.
+
+Sync methods on the other hand will throw if an error occurs.
+
+Also Async/Await will throw an error if one occurs.
+
+Example:
+
+```js
+const fs = require('fs-extra')
+
+// Async with promises:
+fs.copy('/tmp/myfile', '/tmp/mynewfile')
+  .then(() => console.log('success!'))
+  .catch(err => console.error(err))
+
+// Async with callbacks:
+fs.copy('/tmp/myfile', '/tmp/mynewfile', err => {
+  if (err) return console.error(err)
+  console.log('success!')
+})
+
+// Sync:
+try {
+  fs.copySync('/tmp/myfile', '/tmp/mynewfile')
+  console.log('success!')
+} catch (err) {
+  console.error(err)
+}
+
+// Async/Await:
+async function copyFiles () {
+  try {
+    await fs.copy('/tmp/myfile', '/tmp/mynewfile')
+    console.log('success!')
+  } catch (err) {
+    console.error(err)
+  }
+}
+
+copyFiles()
+```
+
+
+Methods
+-------
+
+### Async
+
+- [copy](docs/copy.md)
+- [emptyDir](docs/emptyDir.md)
+- [ensureFile](docs/ensureFile.md)
+- [ensureDir](docs/ensureDir.md)
+- [ensureLink](docs/ensureLink.md)
+- [ensureSymlink](docs/ensureSymlink.md)
+- [mkdirp](docs/ensureDir.md)
+- [mkdirs](docs/ensureDir.md)
+- [move](docs/move.md)
+- [outputFile](docs/outputFile.md)
+- [outputJson](docs/outputJson.md)
+- [pathExists](docs/pathExists.md)
+- [readJson](docs/readJson.md)
+- [remove](docs/remove.md)
+- [writeJson](docs/writeJson.md)
+
+### Sync
+
+- [copySync](docs/copy-sync.md)
+- [emptyDirSync](docs/emptyDir-sync.md)
+- [ensureFileSync](docs/ensureFile-sync.md)
+- [ensureDirSync](docs/ensureDir-sync.md)
+- [ensureLinkSync](docs/ensureLink-sync.md)
+- [ensureSymlinkSync](docs/ensureSymlink-sync.md)
+- [mkdirpSync](docs/ensureDir-sync.md)
+- [mkdirsSync](docs/ensureDir-sync.md)
+- [moveSync](docs/move-sync.md)
+- [outputFileSync](docs/outputFile-sync.md)
+- [outputJsonSync](docs/outputJson-sync.md)
+- [pathExistsSync](docs/pathExists-sync.md)
+- [readJsonSync](docs/readJson-sync.md)
+- [removeSync](docs/remove-sync.md)
+- [writeJsonSync](docs/writeJson-sync.md)
+
+
+**NOTE:** You can still use the native Node.js methods. They are promisified and copied over to `fs-extra`. See [notes on `fs.read()`, `fs.write()`, & `fs.writev()`](docs/fs-read-write-writev.md)
+
+### What happened to `walk()` and `walkSync()`?
+
+They were removed from `fs-extra` in v2.0.0. If you need the functionality, `walk` and `walkSync` are available as separate packages, [`klaw`](https://github.com/jprichardson/node-klaw) and [`klaw-sync`](https://github.com/manidlou/node-klaw-sync).
+
+
+Third Party
+-----------
+
+### CLI
+
+[fse-cli](https://www.npmjs.com/package/@atao60/fse-cli) allows you to run `fs-extra` from a console or from [npm](https://www.npmjs.com) scripts.
+
+### TypeScript
+
+If you like TypeScript, you can use `fs-extra` with it: https://github.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/fs-extra
+
+
+### File / Directory Watching
+
+If you want to watch for changes to files or directories, then you should use [chokidar](https://github.com/paulmillr/chokidar).
+
+### Obtain Filesystem (Devices, Partitions) Information
+
+[fs-filesystem](https://github.com/arthurintelligence/node-fs-filesystem) allows you to read the state of the filesystem of the host on which it is run. It returns information about both the devices and the partitions (volumes) of the system.
+
+### Misc.
+
+- [fs-extra-debug](https://github.com/jdxcode/fs-extra-debug) - Send your fs-extra calls to [debug](https://npmjs.org/package/debug).
+- [mfs](https://github.com/cadorn/mfs) - Monitor your fs-extra calls.
+
+
+
+Hacking on fs-extra
+-------------------
+
+Wanna hack on `fs-extra`? Great! Your help is needed! [fs-extra is one of the most depended upon Node.js packages](http://nodei.co/npm/fs-extra.png?downloads=true&downloadRank=true&stars=true). This project
+uses [JavaScript Standard Style](https://github.com/feross/standard) - if the name or style choices bother you,
+you're gonna have to get over it :) If `standard` is good enough for `npm`, it's good enough for `fs-extra`.
+
+[![js-standard-style](https://cdn.rawgit.com/feross/standard/master/badge.svg)](https://github.com/feross/standard)
+
+What's needed?
+- First, take a look at existing issues. Those are probably going to be where the priority lies.
+- More tests for edge cases. Specifically on different platforms. There can never be enough tests.
+- Improve test coverage. See coveralls output for more info.
+
+Note: If you make any big changes, **you should definitely file an issue for discussion first.**
+
+### Running the Test Suite
+
+fs-extra contains hundreds of tests.
+
+- `npm run lint`: runs the linter ([standard](http://standardjs.com/))
+- `npm run unit`: runs the unit tests
+- `npm test`: runs both the linter and the tests
+
+
+### Windows
+
+If you run the tests on the Windows and receive a lot of symbolic link `EPERM` permission errors, it's
+because on Windows you need elevated privilege to create symbolic links. You can add this to your Windows's
+account by following the instructions here: http://superuser.com/questions/104845/permission-to-make-symbolic-links-in-windows-7
+However, I didn't have much luck doing this.
+
+Since I develop on Mac OS X, I use VMWare Fusion for Windows testing. I create a shared folder that I map to a drive on Windows.
+I open the `Node.js command prompt` and run as `Administrator`. I then map the network drive running the following command:
+
+    net use z: "\\vmware-host\Shared Folders"
+
+I can then navigate to my `fs-extra` directory and run the tests.
+
+
+Naming
+------
+
+I put a lot of thought into the naming of these functions. Inspired by @coolaj86's request. So he deserves much of the credit for raising the issue. See discussion(s) here:
+
+* https://github.com/jprichardson/node-fs-extra/issues/2
+* https://github.com/flatiron/utile/issues/11
+* https://github.com/ryanmcgrath/wrench-js/issues/29
+* https://github.com/substack/node-mkdirp/issues/17
+
+First, I believe that in as many cases as possible, the [Node.js naming schemes](http://nodejs.org/api/fs.html) should be chosen. However, there are problems with the Node.js own naming schemes.
+
+For example, `fs.readFile()` and `fs.readdir()`: the **F** is capitalized in *File* and the **d** is not capitalized in *dir*. Perhaps a bit pedantic, but they should still be consistent. Also, Node.js has chosen a lot of POSIX naming schemes, which I believe is great. See: `fs.mkdir()`, `fs.rmdir()`, `fs.chown()`, etc.
+
+We have a dilemma though. How do you consistently name methods that perform the following POSIX commands: `cp`, `cp -r`, `mkdir -p`, and `rm -rf`?
+
+My perspective: when in doubt, err on the side of simplicity. A directory is just a hierarchical grouping of directories and files. Consider that for a moment. So when you want to copy it or remove it, in most cases you'll want to copy or remove all of its contents. When you want to create a directory, if the directory that it's suppose to be contained in does not exist, then in most cases you'll want to create that too.
+
+So, if you want to remove a file or a directory regardless of whether it has contents, just call `fs.remove(path)`. If you want to copy a file or a directory whether it has contents, just call `fs.copy(source, destination)`. If you want to create a directory regardless of whether its parent directories exist, just call `fs.mkdirs(path)` or `fs.mkdirp(path)`.
+
+
+Credit
+------
+
+`fs-extra` wouldn't be possible without using the modules from the following authors:
+
+- [Isaac Shlueter](https://github.com/isaacs)
+- [Charlie McConnel](https://github.com/avianflu)
+- [James Halliday](https://github.com/substack)
+- [Andrew Kelley](https://github.com/andrewrk)
+
+
+
+
+License
+-------
+
+Licensed under MIT
+
+Copyright (c) 2011-2017 [JP Richardson](https://github.com/jprichardson)
+
+[1]: http://nodejs.org/docs/latest/api/fs.html
+
+
+[jsonfile]: https://github.com/jprichardson/node-jsonfile
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/copy-sync/copy-sync.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/copy-sync/copy-sync.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/copy-sync/copy-sync.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,166 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdirsSync = require('../mkdirs').mkdirsSync
+const utimesMillisSync = require('../util/utimes').utimesMillisSync
+const stat = require('../util/stat')
+
+function copySync (src, dest, opts) {
+  if (typeof opts === 'function') {
+    opts = { filter: opts }
+  }
+
+  opts = opts || {}
+  opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
+  opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber
+
+  // Warn about using preserveTimestamps on 32-bit node
+  if (opts.preserveTimestamps && process.arch === 'ia32') {
+    console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
+    see https://github.com/jprichardson/node-fs-extra/issues/269`)
+  }
+
+  const { srcStat, destStat } = stat.checkPathsSync(src, dest, 'copy')
+  stat.checkParentPathsSync(src, srcStat, dest, 'copy')
+  return handleFilterAndCopy(destStat, src, dest, opts)
+}
+
+function handleFilterAndCopy (destStat, src, dest, opts) {
+  if (opts.filter && !opts.filter(src, dest)) return
+  const destParent = path.dirname(dest)
+  if (!fs.existsSync(destParent)) mkdirsSync(destParent)
+  return startCopy(destStat, src, dest, opts)
+}
+
+function startCopy (destStat, src, dest, opts) {
+  if (opts.filter && !opts.filter(src, dest)) return
+  return getStats(destStat, src, dest, opts)
+}
+
+function getStats (destStat, src, dest, opts) {
+  const statSync = opts.dereference ? fs.statSync : fs.lstatSync
+  const srcStat = statSync(src)
+
+  if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts)
+  else if (srcStat.isFile() ||
+           srcStat.isCharacterDevice() ||
+           srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts)
+  else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts)
+}
+
+function onFile (srcStat, destStat, src, dest, opts) {
+  if (!destStat) return copyFile(srcStat, src, dest, opts)
+  return mayCopyFile(srcStat, src, dest, opts)
+}
+
+function mayCopyFile (srcStat, src, dest, opts) {
+  if (opts.overwrite) {
+    fs.unlinkSync(dest)
+    return copyFile(srcStat, src, dest, opts)
+  } else if (opts.errorOnExist) {
+    throw new Error(`'${dest}' already exists`)
+  }
+}
+
+function copyFile (srcStat, src, dest, opts) {
+  fs.copyFileSync(src, dest)
+  if (opts.preserveTimestamps) handleTimestamps(srcStat.mode, src, dest)
+  return setDestMode(dest, srcStat.mode)
+}
+
+function handleTimestamps (srcMode, src, dest) {
+  // Make sure the file is writable before setting the timestamp
+  // otherwise open fails with EPERM when invoked with 'r+'
+  // (through utimes call)
+  if (fileIsNotWritable(srcMode)) makeFileWritable(dest, srcMode)
+  return setDestTimestamps(src, dest)
+}
+
+function fileIsNotWritable (srcMode) {
+  return (srcMode & 0o200) === 0
+}
+
+function makeFileWritable (dest, srcMode) {
+  return setDestMode(dest, srcMode | 0o200)
+}
+
+function setDestMode (dest, srcMode) {
+  return fs.chmodSync(dest, srcMode)
+}
+
+function setDestTimestamps (src, dest) {
+  // The initial srcStat.atime cannot be trusted
+  // because it is modified by the read(2) system call
+  // (See https://nodejs.org/api/fs.html#fs_stat_time_values)
+  const updatedSrcStat = fs.statSync(src)
+  return utimesMillisSync(dest, updatedSrcStat.atime, updatedSrcStat.mtime)
+}
+
+function onDir (srcStat, destStat, src, dest, opts) {
+  if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts)
+  if (destStat && !destStat.isDirectory()) {
+    throw new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`)
+  }
+  return copyDir(src, dest, opts)
+}
+
+function mkDirAndCopy (srcMode, src, dest, opts) {
+  fs.mkdirSync(dest)
+  copyDir(src, dest, opts)
+  return setDestMode(dest, srcMode)
+}
+
+function copyDir (src, dest, opts) {
+  fs.readdirSync(src).forEach(item => copyDirItem(item, src, dest, opts))
+}
+
+function copyDirItem (item, src, dest, opts) {
+  const srcItem = path.join(src, item)
+  const destItem = path.join(dest, item)
+  const { destStat } = stat.checkPathsSync(srcItem, destItem, 'copy')
+  return startCopy(destStat, srcItem, destItem, opts)
+}
+
+function onLink (destStat, src, dest, opts) {
+  let resolvedSrc = fs.readlinkSync(src)
+  if (opts.dereference) {
+    resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
+  }
+
+  if (!destStat) {
+    return fs.symlinkSync(resolvedSrc, dest)
+  } else {
+    let resolvedDest
+    try {
+      resolvedDest = fs.readlinkSync(dest)
+    } catch (err) {
+      // dest exists and is a regular file or directory,
+      // Windows may throw UNKNOWN error. If dest already exists,
+      // fs throws error anyway, so no need to guard against it here.
+      if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlinkSync(resolvedSrc, dest)
+      throw err
+    }
+    if (opts.dereference) {
+      resolvedDest = path.resolve(process.cwd(), resolvedDest)
+    }
+    if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
+      throw new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`)
+    }
+
+    // prevent copy if src is a subdir of dest since unlinking
+    // dest in this case would result in removing src contents
+    // and therefore a broken symlink would be created.
+    if (fs.statSync(dest).isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
+      throw new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`)
+    }
+    return copyLink(resolvedSrc, dest)
+  }
+}
+
+function copyLink (resolvedSrc, dest) {
+  fs.unlinkSync(dest)
+  return fs.symlinkSync(resolvedSrc, dest)
+}
+
+module.exports = copySync
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/copy-sync/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/copy-sync/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/copy-sync/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+'use strict'
+
+module.exports = {
+  copySync: require('./copy-sync')
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/copy/copy.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/copy/copy.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/copy/copy.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,232 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdirs = require('../mkdirs').mkdirs
+const pathExists = require('../path-exists').pathExists
+const utimesMillis = require('../util/utimes').utimesMillis
+const stat = require('../util/stat')
+
+function copy (src, dest, opts, cb) {
+  if (typeof opts === 'function' && !cb) {
+    cb = opts
+    opts = {}
+  } else if (typeof opts === 'function') {
+    opts = { filter: opts }
+  }
+
+  cb = cb || function () {}
+  opts = opts || {}
+
+  opts.clobber = 'clobber' in opts ? !!opts.clobber : true // default to true for now
+  opts.overwrite = 'overwrite' in opts ? !!opts.overwrite : opts.clobber // overwrite falls back to clobber
+
+  // Warn about using preserveTimestamps on 32-bit node
+  if (opts.preserveTimestamps && process.arch === 'ia32') {
+    console.warn(`fs-extra: Using the preserveTimestamps option in 32-bit node is not recommended;\n
+    see https://github.com/jprichardson/node-fs-extra/issues/269`)
+  }
+
+  stat.checkPaths(src, dest, 'copy', (err, stats) => {
+    if (err) return cb(err)
+    const { srcStat, destStat } = stats
+    stat.checkParentPaths(src, srcStat, dest, 'copy', err => {
+      if (err) return cb(err)
+      if (opts.filter) return handleFilter(checkParentDir, destStat, src, dest, opts, cb)
+      return checkParentDir(destStat, src, dest, opts, cb)
+    })
+  })
+}
+
+function checkParentDir (destStat, src, dest, opts, cb) {
+  const destParent = path.dirname(dest)
+  pathExists(destParent, (err, dirExists) => {
+    if (err) return cb(err)
+    if (dirExists) return startCopy(destStat, src, dest, opts, cb)
+    mkdirs(destParent, err => {
+      if (err) return cb(err)
+      return startCopy(destStat, src, dest, opts, cb)
+    })
+  })
+}
+
+function handleFilter (onInclude, destStat, src, dest, opts, cb) {
+  Promise.resolve(opts.filter(src, dest)).then(include => {
+    if (include) return onInclude(destStat, src, dest, opts, cb)
+    return cb()
+  }, error => cb(error))
+}
+
+function startCopy (destStat, src, dest, opts, cb) {
+  if (opts.filter) return handleFilter(getStats, destStat, src, dest, opts, cb)
+  return getStats(destStat, src, dest, opts, cb)
+}
+
+function getStats (destStat, src, dest, opts, cb) {
+  const stat = opts.dereference ? fs.stat : fs.lstat
+  stat(src, (err, srcStat) => {
+    if (err) return cb(err)
+
+    if (srcStat.isDirectory()) return onDir(srcStat, destStat, src, dest, opts, cb)
+    else if (srcStat.isFile() ||
+             srcStat.isCharacterDevice() ||
+             srcStat.isBlockDevice()) return onFile(srcStat, destStat, src, dest, opts, cb)
+    else if (srcStat.isSymbolicLink()) return onLink(destStat, src, dest, opts, cb)
+  })
+}
+
+function onFile (srcStat, destStat, src, dest, opts, cb) {
+  if (!destStat) return copyFile(srcStat, src, dest, opts, cb)
+  return mayCopyFile(srcStat, src, dest, opts, cb)
+}
+
+function mayCopyFile (srcStat, src, dest, opts, cb) {
+  if (opts.overwrite) {
+    fs.unlink(dest, err => {
+      if (err) return cb(err)
+      return copyFile(srcStat, src, dest, opts, cb)
+    })
+  } else if (opts.errorOnExist) {
+    return cb(new Error(`'${dest}' already exists`))
+  } else return cb()
+}
+
+function copyFile (srcStat, src, dest, opts, cb) {
+  fs.copyFile(src, dest, err => {
+    if (err) return cb(err)
+    if (opts.preserveTimestamps) return handleTimestampsAndMode(srcStat.mode, src, dest, cb)
+    return setDestMode(dest, srcStat.mode, cb)
+  })
+}
+
+function handleTimestampsAndMode (srcMode, src, dest, cb) {
+  // Make sure the file is writable before setting the timestamp
+  // otherwise open fails with EPERM when invoked with 'r+'
+  // (through utimes call)
+  if (fileIsNotWritable(srcMode)) {
+    return makeFileWritable(dest, srcMode, err => {
+      if (err) return cb(err)
+      return setDestTimestampsAndMode(srcMode, src, dest, cb)
+    })
+  }
+  return setDestTimestampsAndMode(srcMode, src, dest, cb)
+}
+
+function fileIsNotWritable (srcMode) {
+  return (srcMode & 0o200) === 0
+}
+
+function makeFileWritable (dest, srcMode, cb) {
+  return setDestMode(dest, srcMode | 0o200, cb)
+}
+
+function setDestTimestampsAndMode (srcMode, src, dest, cb) {
+  setDestTimestamps(src, dest, err => {
+    if (err) return cb(err)
+    return setDestMode(dest, srcMode, cb)
+  })
+}
+
+function setDestMode (dest, srcMode, cb) {
+  return fs.chmod(dest, srcMode, cb)
+}
+
+function setDestTimestamps (src, dest, cb) {
+  // The initial srcStat.atime cannot be trusted
+  // because it is modified by the read(2) system call
+  // (See https://nodejs.org/api/fs.html#fs_stat_time_values)
+  fs.stat(src, (err, updatedSrcStat) => {
+    if (err) return cb(err)
+    return utimesMillis(dest, updatedSrcStat.atime, updatedSrcStat.mtime, cb)
+  })
+}
+
+function onDir (srcStat, destStat, src, dest, opts, cb) {
+  if (!destStat) return mkDirAndCopy(srcStat.mode, src, dest, opts, cb)
+  if (destStat && !destStat.isDirectory()) {
+    return cb(new Error(`Cannot overwrite non-directory '${dest}' with directory '${src}'.`))
+  }
+  return copyDir(src, dest, opts, cb)
+}
+
+function mkDirAndCopy (srcMode, src, dest, opts, cb) {
+  fs.mkdir(dest, err => {
+    if (err) return cb(err)
+    copyDir(src, dest, opts, err => {
+      if (err) return cb(err)
+      return setDestMode(dest, srcMode, cb)
+    })
+  })
+}
+
+function copyDir (src, dest, opts, cb) {
+  fs.readdir(src, (err, items) => {
+    if (err) return cb(err)
+    return copyDirItems(items, src, dest, opts, cb)
+  })
+}
+
+function copyDirItems (items, src, dest, opts, cb) {
+  const item = items.pop()
+  if (!item) return cb()
+  return copyDirItem(items, item, src, dest, opts, cb)
+}
+
+function copyDirItem (items, item, src, dest, opts, cb) {
+  const srcItem = path.join(src, item)
+  const destItem = path.join(dest, item)
+  stat.checkPaths(srcItem, destItem, 'copy', (err, stats) => {
+    if (err) return cb(err)
+    const { destStat } = stats
+    startCopy(destStat, srcItem, destItem, opts, err => {
+      if (err) return cb(err)
+      return copyDirItems(items, src, dest, opts, cb)
+    })
+  })
+}
+
+function onLink (destStat, src, dest, opts, cb) {
+  fs.readlink(src, (err, resolvedSrc) => {
+    if (err) return cb(err)
+    if (opts.dereference) {
+      resolvedSrc = path.resolve(process.cwd(), resolvedSrc)
+    }
+
+    if (!destStat) {
+      return fs.symlink(resolvedSrc, dest, cb)
+    } else {
+      fs.readlink(dest, (err, resolvedDest) => {
+        if (err) {
+          // dest exists and is a regular file or directory,
+          // Windows may throw UNKNOWN error. If dest already exists,
+          // fs throws error anyway, so no need to guard against it here.
+          if (err.code === 'EINVAL' || err.code === 'UNKNOWN') return fs.symlink(resolvedSrc, dest, cb)
+          return cb(err)
+        }
+        if (opts.dereference) {
+          resolvedDest = path.resolve(process.cwd(), resolvedDest)
+        }
+        if (stat.isSrcSubdir(resolvedSrc, resolvedDest)) {
+          return cb(new Error(`Cannot copy '${resolvedSrc}' to a subdirectory of itself, '${resolvedDest}'.`))
+        }
+
+        // do not copy if src is a subdir of dest since unlinking
+        // dest in this case would result in removing src contents
+        // and therefore a broken symlink would be created.
+        if (destStat.isDirectory() && stat.isSrcSubdir(resolvedDest, resolvedSrc)) {
+          return cb(new Error(`Cannot overwrite '${resolvedDest}' with '${resolvedSrc}'.`))
+        }
+        return copyLink(resolvedSrc, dest, cb)
+      })
+    }
+  })
+}
+
+function copyLink (resolvedSrc, dest, cb) {
+  fs.unlink(dest, err => {
+    if (err) return cb(err)
+    return fs.symlink(resolvedSrc, dest, cb)
+  })
+}
+
+module.exports = copy
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/copy/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/copy/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/copy/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+module.exports = {
+  copy: u(require('./copy'))
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/empty/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/empty/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/empty/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,48 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdir = require('../mkdirs')
+const remove = require('../remove')
+
+const emptyDir = u(function emptyDir (dir, callback) {
+  callback = callback || function () {}
+  fs.readdir(dir, (err, items) => {
+    if (err) return mkdir.mkdirs(dir, callback)
+
+    items = items.map(item => path.join(dir, item))
+
+    deleteItem()
+
+    function deleteItem () {
+      const item = items.pop()
+      if (!item) return callback()
+      remove.remove(item, err => {
+        if (err) return callback(err)
+        deleteItem()
+      })
+    }
+  })
+})
+
+function emptyDirSync (dir) {
+  let items
+  try {
+    items = fs.readdirSync(dir)
+  } catch {
+    return mkdir.mkdirsSync(dir)
+  }
+
+  items.forEach(item => {
+    item = path.join(dir, item)
+    remove.removeSync(item)
+  })
+}
+
+module.exports = {
+  emptyDirSync,
+  emptydirSync: emptyDirSync,
+  emptyDir,
+  emptydir: emptyDir
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/file.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/file.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/file.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,69 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const path = require('path')
+const fs = require('graceful-fs')
+const mkdir = require('../mkdirs')
+
+function createFile (file, callback) {
+  function makeFile () {
+    fs.writeFile(file, '', err => {
+      if (err) return callback(err)
+      callback()
+    })
+  }
+
+  fs.stat(file, (err, stats) => { // eslint-disable-line handle-callback-err
+    if (!err && stats.isFile()) return callback()
+    const dir = path.dirname(file)
+    fs.stat(dir, (err, stats) => {
+      if (err) {
+        // if the directory doesn't exist, make it
+        if (err.code === 'ENOENT') {
+          return mkdir.mkdirs(dir, err => {
+            if (err) return callback(err)
+            makeFile()
+          })
+        }
+        return callback(err)
+      }
+
+      if (stats.isDirectory()) makeFile()
+      else {
+        // parent is not a directory
+        // This is just to cause an internal ENOTDIR error to be thrown
+        fs.readdir(dir, err => {
+          if (err) return callback(err)
+        })
+      }
+    })
+  })
+}
+
+function createFileSync (file) {
+  let stats
+  try {
+    stats = fs.statSync(file)
+  } catch {}
+  if (stats && stats.isFile()) return
+
+  const dir = path.dirname(file)
+  try {
+    if (!fs.statSync(dir).isDirectory()) {
+      // parent is not a directory
+      // This is just to cause an internal ENOTDIR error to be thrown
+      fs.readdirSync(dir)
+    }
+  } catch (err) {
+    // If the stat call above failed because the directory doesn't exist, create it
+    if (err && err.code === 'ENOENT') mkdir.mkdirsSync(dir)
+    else throw err
+  }
+
+  fs.writeFileSync(file, '')
+}
+
+module.exports = {
+  createFile: u(createFile),
+  createFileSync
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,23 @@
+'use strict'
+
+const file = require('./file')
+const link = require('./link')
+const symlink = require('./symlink')
+
+module.exports = {
+  // file
+  createFile: file.createFile,
+  createFileSync: file.createFileSync,
+  ensureFile: file.createFile,
+  ensureFileSync: file.createFileSync,
+  // link
+  createLink: link.createLink,
+  createLinkSync: link.createLinkSync,
+  ensureLink: link.createLink,
+  ensureLinkSync: link.createLinkSync,
+  // symlink
+  createSymlink: symlink.createSymlink,
+  createSymlinkSync: symlink.createSymlinkSync,
+  ensureSymlink: symlink.createSymlink,
+  ensureSymlinkSync: symlink.createSymlinkSync
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/link.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/link.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/link.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,61 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const path = require('path')
+const fs = require('graceful-fs')
+const mkdir = require('../mkdirs')
+const pathExists = require('../path-exists').pathExists
+
+function createLink (srcpath, dstpath, callback) {
+  function makeLink (srcpath, dstpath) {
+    fs.link(srcpath, dstpath, err => {
+      if (err) return callback(err)
+      callback(null)
+    })
+  }
+
+  pathExists(dstpath, (err, destinationExists) => {
+    if (err) return callback(err)
+    if (destinationExists) return callback(null)
+    fs.lstat(srcpath, (err) => {
+      if (err) {
+        err.message = err.message.replace('lstat', 'ensureLink')
+        return callback(err)
+      }
+
+      const dir = path.dirname(dstpath)
+      pathExists(dir, (err, dirExists) => {
+        if (err) return callback(err)
+        if (dirExists) return makeLink(srcpath, dstpath)
+        mkdir.mkdirs(dir, err => {
+          if (err) return callback(err)
+          makeLink(srcpath, dstpath)
+        })
+      })
+    })
+  })
+}
+
+function createLinkSync (srcpath, dstpath) {
+  const destinationExists = fs.existsSync(dstpath)
+  if (destinationExists) return undefined
+
+  try {
+    fs.lstatSync(srcpath)
+  } catch (err) {
+    err.message = err.message.replace('lstat', 'ensureLink')
+    throw err
+  }
+
+  const dir = path.dirname(dstpath)
+  const dirExists = fs.existsSync(dir)
+  if (dirExists) return fs.linkSync(srcpath, dstpath)
+  mkdir.mkdirsSync(dir)
+
+  return fs.linkSync(srcpath, dstpath)
+}
+
+module.exports = {
+  createLink: u(createLink),
+  createLinkSync
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/symlink-paths.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/symlink-paths.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/symlink-paths.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,99 @@
+'use strict'
+
+const path = require('path')
+const fs = require('graceful-fs')
+const pathExists = require('../path-exists').pathExists
+
+/**
+ * Function that returns two types of paths, one relative to symlink, and one
+ * relative to the current working directory. Checks if path is absolute or
+ * relative. If the path is relative, this function checks if the path is
+ * relative to symlink or relative to current working directory. This is an
+ * initiative to find a smarter `srcpath` to supply when building symlinks.
+ * This allows you to determine which path to use out of one of three possible
+ * types of source paths. The first is an absolute path. This is detected by
+ * `path.isAbsolute()`. When an absolute path is provided, it is checked to
+ * see if it exists. If it does it's used, if not an error is returned
+ * (callback)/ thrown (sync). The other two options for `srcpath` are a
+ * relative url. By default Node's `fs.symlink` works by creating a symlink
+ * using `dstpath` and expects the `srcpath` to be relative to the newly
+ * created symlink. If you provide a `srcpath` that does not exist on the file
+ * system it results in a broken symlink. To minimize this, the function
+ * checks to see if the 'relative to symlink' source file exists, and if it
+ * does it will use it. If it does not, it checks if there's a file that
+ * exists that is relative to the current working directory, if does its used.
+ * This preserves the expectations of the original fs.symlink spec and adds
+ * the ability to pass in `relative to current working direcotry` paths.
+ */
+
+function symlinkPaths (srcpath, dstpath, callback) {
+  if (path.isAbsolute(srcpath)) {
+    return fs.lstat(srcpath, (err) => {
+      if (err) {
+        err.message = err.message.replace('lstat', 'ensureSymlink')
+        return callback(err)
+      }
+      return callback(null, {
+        toCwd: srcpath,
+        toDst: srcpath
+      })
+    })
+  } else {
+    const dstdir = path.dirname(dstpath)
+    const relativeToDst = path.join(dstdir, srcpath)
+    return pathExists(relativeToDst, (err, exists) => {
+      if (err) return callback(err)
+      if (exists) {
+        return callback(null, {
+          toCwd: relativeToDst,
+          toDst: srcpath
+        })
+      } else {
+        return fs.lstat(srcpath, (err) => {
+          if (err) {
+            err.message = err.message.replace('lstat', 'ensureSymlink')
+            return callback(err)
+          }
+          return callback(null, {
+            toCwd: srcpath,
+            toDst: path.relative(dstdir, srcpath)
+          })
+        })
+      }
+    })
+  }
+}
+
+function symlinkPathsSync (srcpath, dstpath) {
+  let exists
+  if (path.isAbsolute(srcpath)) {
+    exists = fs.existsSync(srcpath)
+    if (!exists) throw new Error('absolute srcpath does not exist')
+    return {
+      toCwd: srcpath,
+      toDst: srcpath
+    }
+  } else {
+    const dstdir = path.dirname(dstpath)
+    const relativeToDst = path.join(dstdir, srcpath)
+    exists = fs.existsSync(relativeToDst)
+    if (exists) {
+      return {
+        toCwd: relativeToDst,
+        toDst: srcpath
+      }
+    } else {
+      exists = fs.existsSync(srcpath)
+      if (!exists) throw new Error('relative srcpath does not exist')
+      return {
+        toCwd: srcpath,
+        toDst: path.relative(dstdir, srcpath)
+      }
+    }
+  }
+}
+
+module.exports = {
+  symlinkPaths,
+  symlinkPathsSync
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/symlink-type.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/symlink-type.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/symlink-type.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,31 @@
+'use strict'
+
+const fs = require('graceful-fs')
+
+function symlinkType (srcpath, type, callback) {
+  callback = (typeof type === 'function') ? type : callback
+  type = (typeof type === 'function') ? false : type
+  if (type) return callback(null, type)
+  fs.lstat(srcpath, (err, stats) => {
+    if (err) return callback(null, 'file')
+    type = (stats && stats.isDirectory()) ? 'dir' : 'file'
+    callback(null, type)
+  })
+}
+
+function symlinkTypeSync (srcpath, type) {
+  let stats
+
+  if (type) return type
+  try {
+    stats = fs.lstatSync(srcpath)
+  } catch {
+    return 'file'
+  }
+  return (stats && stats.isDirectory()) ? 'dir' : 'file'
+}
+
+module.exports = {
+  symlinkType,
+  symlinkTypeSync
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/symlink.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/symlink.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/ensure/symlink.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,63 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const path = require('path')
+const fs = require('graceful-fs')
+const _mkdirs = require('../mkdirs')
+const mkdirs = _mkdirs.mkdirs
+const mkdirsSync = _mkdirs.mkdirsSync
+
+const _symlinkPaths = require('./symlink-paths')
+const symlinkPaths = _symlinkPaths.symlinkPaths
+const symlinkPathsSync = _symlinkPaths.symlinkPathsSync
+
+const _symlinkType = require('./symlink-type')
+const symlinkType = _symlinkType.symlinkType
+const symlinkTypeSync = _symlinkType.symlinkTypeSync
+
+const pathExists = require('../path-exists').pathExists
+
+function createSymlink (srcpath, dstpath, type, callback) {
+  callback = (typeof type === 'function') ? type : callback
+  type = (typeof type === 'function') ? false : type
+
+  pathExists(dstpath, (err, destinationExists) => {
+    if (err) return callback(err)
+    if (destinationExists) return callback(null)
+    symlinkPaths(srcpath, dstpath, (err, relative) => {
+      if (err) return callback(err)
+      srcpath = relative.toDst
+      symlinkType(relative.toCwd, type, (err, type) => {
+        if (err) return callback(err)
+        const dir = path.dirname(dstpath)
+        pathExists(dir, (err, dirExists) => {
+          if (err) return callback(err)
+          if (dirExists) return fs.symlink(srcpath, dstpath, type, callback)
+          mkdirs(dir, err => {
+            if (err) return callback(err)
+            fs.symlink(srcpath, dstpath, type, callback)
+          })
+        })
+      })
+    })
+  })
+}
+
+function createSymlinkSync (srcpath, dstpath, type) {
+  const destinationExists = fs.existsSync(dstpath)
+  if (destinationExists) return undefined
+
+  const relative = symlinkPathsSync(srcpath, dstpath)
+  srcpath = relative.toDst
+  type = symlinkTypeSync(relative.toCwd, type)
+  const dir = path.dirname(dstpath)
+  const exists = fs.existsSync(dir)
+  if (exists) return fs.symlinkSync(srcpath, dstpath, type)
+  mkdirsSync(dir)
+  return fs.symlinkSync(srcpath, dstpath, type)
+}
+
+module.exports = {
+  createSymlink: u(createSymlink),
+  createSymlinkSync
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/fs/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/fs/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/fs/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,130 @@
+'use strict'
+// This is adapted from https://github.com/normalize/mz
+// Copyright (c) 2014-2016 Jonathan Ong me@jongleberry.com and Contributors
+const u = require('universalify').fromCallback
+const fs = require('graceful-fs')
+
+const api = [
+  'access',
+  'appendFile',
+  'chmod',
+  'chown',
+  'close',
+  'copyFile',
+  'fchmod',
+  'fchown',
+  'fdatasync',
+  'fstat',
+  'fsync',
+  'ftruncate',
+  'futimes',
+  'lchmod',
+  'lchown',
+  'link',
+  'lstat',
+  'mkdir',
+  'mkdtemp',
+  'open',
+  'opendir',
+  'readdir',
+  'readFile',
+  'readlink',
+  'realpath',
+  'rename',
+  'rm',
+  'rmdir',
+  'stat',
+  'symlink',
+  'truncate',
+  'unlink',
+  'utimes',
+  'writeFile'
+].filter(key => {
+  // Some commands are not available on some systems. Ex:
+  // fs.opendir was added in Node.js v12.12.0
+  // fs.rm was added in Node.js v14.14.0
+  // fs.lchown is not available on at least some Linux
+  return typeof fs[key] === 'function'
+})
+
+// Export all keys:
+Object.keys(fs).forEach(key => {
+  if (key === 'promises') {
+    // fs.promises is a getter property that triggers ExperimentalWarning
+    // Don't re-export it here, the getter is defined in "lib/index.js"
+    return
+  }
+  exports[key] = fs[key]
+})
+
+// Universalify async methods:
+api.forEach(method => {
+  exports[method] = u(fs[method])
+})
+
+// We differ from mz/fs in that we still ship the old, broken, fs.exists()
+// since we are a drop-in replacement for the native module
+exports.exists = function (filename, callback) {
+  if (typeof callback === 'function') {
+    return fs.exists(filename, callback)
+  }
+  return new Promise(resolve => {
+    return fs.exists(filename, resolve)
+  })
+}
+
+// fs.read(), fs.write(), & fs.writev() need special treatment due to multiple callback args
+
+exports.read = function (fd, buffer, offset, length, position, callback) {
+  if (typeof callback === 'function') {
+    return fs.read(fd, buffer, offset, length, position, callback)
+  }
+  return new Promise((resolve, reject) => {
+    fs.read(fd, buffer, offset, length, position, (err, bytesRead, buffer) => {
+      if (err) return reject(err)
+      resolve({ bytesRead, buffer })
+    })
+  })
+}
+
+// Function signature can be
+// fs.write(fd, buffer[, offset[, length[, position]]], callback)
+// OR
+// fs.write(fd, string[, position[, encoding]], callback)
+// We need to handle both cases, so we use ...args
+exports.write = function (fd, buffer, ...args) {
+  if (typeof args[args.length - 1] === 'function') {
+    return fs.write(fd, buffer, ...args)
+  }
+
+  return new Promise((resolve, reject) => {
+    fs.write(fd, buffer, ...args, (err, bytesWritten, buffer) => {
+      if (err) return reject(err)
+      resolve({ bytesWritten, buffer })
+    })
+  })
+}
+
+// fs.writev only available in Node v12.9.0+
+if (typeof fs.writev === 'function') {
+  // Function signature is
+  // s.writev(fd, buffers[, position], callback)
+  // We need to handle the optional arg, so we use ...args
+  exports.writev = function (fd, buffers, ...args) {
+    if (typeof args[args.length - 1] === 'function') {
+      return fs.writev(fd, buffers, ...args)
+    }
+
+    return new Promise((resolve, reject) => {
+      fs.writev(fd, buffers, ...args, (err, bytesWritten, buffers) => {
+        if (err) return reject(err)
+        resolve({ bytesWritten, buffers })
+      })
+    })
+  }
+}
+
+// fs.realpath.native only available in Node v9.2+
+if (typeof fs.realpath.native === 'function') {
+  exports.realpath.native = u(fs.realpath.native)
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,27 @@
+'use strict'
+
+module.exports = {
+  // Export promiseified graceful-fs:
+  ...require('./fs'),
+  // Export extra methods:
+  ...require('./copy-sync'),
+  ...require('./copy'),
+  ...require('./empty'),
+  ...require('./ensure'),
+  ...require('./json'),
+  ...require('./mkdirs'),
+  ...require('./move-sync'),
+  ...require('./move'),
+  ...require('./output'),
+  ...require('./path-exists'),
+  ...require('./remove')
+}
+
+// Export fs.promises as a getter property so that we don't trigger
+// ExperimentalWarning before fs.promises is actually accessed.
+const fs = require('fs')
+if (Object.getOwnPropertyDescriptor(fs, 'promises')) {
+  Object.defineProperty(module.exports, 'promises', {
+    get () { return fs.promises }
+  })
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/json/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/json/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/json/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,16 @@
+'use strict'
+
+const u = require('universalify').fromPromise
+const jsonFile = require('./jsonfile')
+
+jsonFile.outputJson = u(require('./output-json'))
+jsonFile.outputJsonSync = require('./output-json-sync')
+// aliases
+jsonFile.outputJSON = jsonFile.outputJson
+jsonFile.outputJSONSync = jsonFile.outputJsonSync
+jsonFile.writeJSON = jsonFile.writeJson
+jsonFile.writeJSONSync = jsonFile.writeJsonSync
+jsonFile.readJSON = jsonFile.readJson
+jsonFile.readJSONSync = jsonFile.readJsonSync
+
+module.exports = jsonFile
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/json/jsonfile.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/json/jsonfile.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/json/jsonfile.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,11 @@
+'use strict'
+
+const jsonFile = require('jsonfile')
+
+module.exports = {
+  // jsonfile exports
+  readJson: jsonFile.readFile,
+  readJsonSync: jsonFile.readFileSync,
+  writeJson: jsonFile.writeFile,
+  writeJsonSync: jsonFile.writeFileSync
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/json/output-json-sync.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/json/output-json-sync.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/json/output-json-sync.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,12 @@
+'use strict'
+
+const { stringify } = require('jsonfile/utils')
+const { outputFileSync } = require('../output')
+
+function outputJsonSync (file, data, options) {
+  const str = stringify(data, options)
+
+  outputFileSync(file, str, options)
+}
+
+module.exports = outputJsonSync
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/json/output-json.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/json/output-json.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/json/output-json.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,12 @@
+'use strict'
+
+const { stringify } = require('jsonfile/utils')
+const { outputFile } = require('../output')
+
+async function outputJson (file, data, options = {}) {
+  const str = stringify(data, options)
+
+  await outputFile(file, str, options)
+}
+
+module.exports = outputJson
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/mkdirs/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/mkdirs/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/mkdirs/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,14 @@
+'use strict'
+const u = require('universalify').fromPromise
+const { makeDir: _makeDir, makeDirSync } = require('./make-dir')
+const makeDir = u(_makeDir)
+
+module.exports = {
+  mkdirs: makeDir,
+  mkdirsSync: makeDirSync,
+  // alias
+  mkdirp: makeDir,
+  mkdirpSync: makeDirSync,
+  ensureDir: makeDir,
+  ensureDirSync: makeDirSync
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/mkdirs/make-dir.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/mkdirs/make-dir.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/mkdirs/make-dir.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,141 @@
+// Adapted from https://github.com/sindresorhus/make-dir
+// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
+// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+'use strict'
+const fs = require('../fs')
+const path = require('path')
+const atLeastNode = require('at-least-node')
+
+const useNativeRecursiveOption = atLeastNode('10.12.0')
+
+// https://github.com/nodejs/node/issues/8987
+// https://github.com/libuv/libuv/pull/1088
+const checkPath = pth => {
+  if (process.platform === 'win32') {
+    const pathHasInvalidWinCharacters = /[<>:"|?*]/.test(pth.replace(path.parse(pth).root, ''))
+
+    if (pathHasInvalidWinCharacters) {
+      const error = new Error(`Path contains invalid characters: ${pth}`)
+      error.code = 'EINVAL'
+      throw error
+    }
+  }
+}
+
+const processOptions = options => {
+  const defaults = { mode: 0o777 }
+  if (typeof options === 'number') options = { mode: options }
+  return { ...defaults, ...options }
+}
+
+const permissionError = pth => {
+  // This replicates the exception of `fs.mkdir` with native the
+  // `recusive` option when run on an invalid drive under Windows.
+  const error = new Error(`operation not permitted, mkdir '${pth}'`)
+  error.code = 'EPERM'
+  error.errno = -4048
+  error.path = pth
+  error.syscall = 'mkdir'
+  return error
+}
+
+module.exports.makeDir = async (input, options) => {
+  checkPath(input)
+  options = processOptions(options)
+
+  if (useNativeRecursiveOption) {
+    const pth = path.resolve(input)
+
+    return fs.mkdir(pth, {
+      mode: options.mode,
+      recursive: true
+    })
+  }
+
+  const make = async pth => {
+    try {
+      await fs.mkdir(pth, options.mode)
+    } catch (error) {
+      if (error.code === 'EPERM') {
+        throw error
+      }
+
+      if (error.code === 'ENOENT') {
+        if (path.dirname(pth) === pth) {
+          throw permissionError(pth)
+        }
+
+        if (error.message.includes('null bytes')) {
+          throw error
+        }
+
+        await make(path.dirname(pth))
+        return make(pth)
+      }
+
+      try {
+        const stats = await fs.stat(pth)
+        if (!stats.isDirectory()) {
+          // This error is never exposed to the user
+          // it is caught below, and the original error is thrown
+          throw new Error('The path is not a directory')
+        }
+      } catch {
+        throw error
+      }
+    }
+  }
+
+  return make(path.resolve(input))
+}
+
+module.exports.makeDirSync = (input, options) => {
+  checkPath(input)
+  options = processOptions(options)
+
+  if (useNativeRecursiveOption) {
+    const pth = path.resolve(input)
+
+    return fs.mkdirSync(pth, {
+      mode: options.mode,
+      recursive: true
+    })
+  }
+
+  const make = pth => {
+    try {
+      fs.mkdirSync(pth, options.mode)
+    } catch (error) {
+      if (error.code === 'EPERM') {
+        throw error
+      }
+
+      if (error.code === 'ENOENT') {
+        if (path.dirname(pth) === pth) {
+          throw permissionError(pth)
+        }
+
+        if (error.message.includes('null bytes')) {
+          throw error
+        }
+
+        make(path.dirname(pth))
+        return make(pth)
+      }
+
+      try {
+        if (!fs.statSync(pth).isDirectory()) {
+          // This error is never exposed to the user
+          // it is caught below, and the original error is thrown
+          throw new Error('The path is not a directory')
+        }
+      } catch {
+        throw error
+      }
+    }
+  }
+
+  return make(path.resolve(input))
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/move-sync/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/move-sync/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/move-sync/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+'use strict'
+
+module.exports = {
+  moveSync: require('./move-sync')
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/move-sync/move-sync.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/move-sync/move-sync.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/move-sync/move-sync.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,47 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const copySync = require('../copy-sync').copySync
+const removeSync = require('../remove').removeSync
+const mkdirpSync = require('../mkdirs').mkdirpSync
+const stat = require('../util/stat')
+
+function moveSync (src, dest, opts) {
+  opts = opts || {}
+  const overwrite = opts.overwrite || opts.clobber || false
+
+  const { srcStat } = stat.checkPathsSync(src, dest, 'move')
+  stat.checkParentPathsSync(src, srcStat, dest, 'move')
+  mkdirpSync(path.dirname(dest))
+  return doRename(src, dest, overwrite)
+}
+
+function doRename (src, dest, overwrite) {
+  if (overwrite) {
+    removeSync(dest)
+    return rename(src, dest, overwrite)
+  }
+  if (fs.existsSync(dest)) throw new Error('dest already exists.')
+  return rename(src, dest, overwrite)
+}
+
+function rename (src, dest, overwrite) {
+  try {
+    fs.renameSync(src, dest)
+  } catch (err) {
+    if (err.code !== 'EXDEV') throw err
+    return moveAcrossDevice(src, dest, overwrite)
+  }
+}
+
+function moveAcrossDevice (src, dest, overwrite) {
+  const opts = {
+    overwrite,
+    errorOnExist: true
+  }
+  copySync(src, dest, opts)
+  return removeSync(src)
+}
+
+module.exports = moveSync
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/move/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/move/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/move/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+module.exports = {
+  move: u(require('./move'))
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/move/move.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/move/move.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/move/move.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,65 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const copy = require('../copy').copy
+const remove = require('../remove').remove
+const mkdirp = require('../mkdirs').mkdirp
+const pathExists = require('../path-exists').pathExists
+const stat = require('../util/stat')
+
+function move (src, dest, opts, cb) {
+  if (typeof opts === 'function') {
+    cb = opts
+    opts = {}
+  }
+
+  const overwrite = opts.overwrite || opts.clobber || false
+
+  stat.checkPaths(src, dest, 'move', (err, stats) => {
+    if (err) return cb(err)
+    const { srcStat } = stats
+    stat.checkParentPaths(src, srcStat, dest, 'move', err => {
+      if (err) return cb(err)
+      mkdirp(path.dirname(dest), err => {
+        if (err) return cb(err)
+        return doRename(src, dest, overwrite, cb)
+      })
+    })
+  })
+}
+
+function doRename (src, dest, overwrite, cb) {
+  if (overwrite) {
+    return remove(dest, err => {
+      if (err) return cb(err)
+      return rename(src, dest, overwrite, cb)
+    })
+  }
+  pathExists(dest, (err, destExists) => {
+    if (err) return cb(err)
+    if (destExists) return cb(new Error('dest already exists.'))
+    return rename(src, dest, overwrite, cb)
+  })
+}
+
+function rename (src, dest, overwrite, cb) {
+  fs.rename(src, dest, err => {
+    if (!err) return cb()
+    if (err.code !== 'EXDEV') return cb(err)
+    return moveAcrossDevice(src, dest, overwrite, cb)
+  })
+}
+
+function moveAcrossDevice (src, dest, overwrite, cb) {
+  const opts = {
+    overwrite,
+    errorOnExist: true
+  }
+  copy(src, dest, opts, err => {
+    if (err) return cb(err)
+    return remove(src, cb)
+  })
+}
+
+module.exports = move
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/output/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/output/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/output/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,40 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const fs = require('graceful-fs')
+const path = require('path')
+const mkdir = require('../mkdirs')
+const pathExists = require('../path-exists').pathExists
+
+function outputFile (file, data, encoding, callback) {
+  if (typeof encoding === 'function') {
+    callback = encoding
+    encoding = 'utf8'
+  }
+
+  const dir = path.dirname(file)
+  pathExists(dir, (err, itDoes) => {
+    if (err) return callback(err)
+    if (itDoes) return fs.writeFile(file, data, encoding, callback)
+
+    mkdir.mkdirs(dir, err => {
+      if (err) return callback(err)
+
+      fs.writeFile(file, data, encoding, callback)
+    })
+  })
+}
+
+function outputFileSync (file, ...args) {
+  const dir = path.dirname(file)
+  if (fs.existsSync(dir)) {
+    return fs.writeFileSync(file, ...args)
+  }
+  mkdir.mkdirsSync(dir)
+  fs.writeFileSync(file, ...args)
+}
+
+module.exports = {
+  outputFile: u(outputFile),
+  outputFileSync
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/path-exists/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/path-exists/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/path-exists/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,12 @@
+'use strict'
+const u = require('universalify').fromPromise
+const fs = require('../fs')
+
+function pathExists (path) {
+  return fs.access(path).then(() => true).catch(() => false)
+}
+
+module.exports = {
+  pathExists: u(pathExists),
+  pathExistsSync: fs.existsSync
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/remove/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/remove/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/remove/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,9 @@
+'use strict'
+
+const u = require('universalify').fromCallback
+const rimraf = require('./rimraf')
+
+module.exports = {
+  remove: u(rimraf),
+  removeSync: rimraf.sync
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/remove/rimraf.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/remove/rimraf.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/remove/rimraf.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,302 @@
+'use strict'
+
+const fs = require('graceful-fs')
+const path = require('path')
+const assert = require('assert')
+
+const isWindows = (process.platform === 'win32')
+
+function defaults (options) {
+  const methods = [
+    'unlink',
+    'chmod',
+    'stat',
+    'lstat',
+    'rmdir',
+    'readdir'
+  ]
+  methods.forEach(m => {
+    options[m] = options[m] || fs[m]
+    m = m + 'Sync'
+    options[m] = options[m] || fs[m]
+  })
+
+  options.maxBusyTries = options.maxBusyTries || 3
+}
+
+function rimraf (p, options, cb) {
+  let busyTries = 0
+
+  if (typeof options === 'function') {
+    cb = options
+    options = {}
+  }
+
+  assert(p, 'rimraf: missing path')
+  assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
+  assert.strictEqual(typeof cb, 'function', 'rimraf: callback function required')
+  assert(options, 'rimraf: invalid options argument provided')
+  assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')
+
+  defaults(options)
+
+  rimraf_(p, options, function CB (er) {
+    if (er) {
+      if ((er.code === 'EBUSY' || er.code === 'ENOTEMPTY' || er.code === 'EPERM') &&
+          busyTries < options.maxBusyTries) {
+        busyTries++
+        const time = busyTries * 100
+        // try again, with the same exact callback as this one.
+        return setTimeout(() => rimraf_(p, options, CB), time)
+      }
+
+      // already gone
+      if (er.code === 'ENOENT') er = null
+    }
+
+    cb(er)
+  })
+}
+
+// Two possible strategies.
+// 1. Assume it's a file.  unlink it, then do the dir stuff on EPERM or EISDIR
+// 2. Assume it's a directory.  readdir, then do the file stuff on ENOTDIR
+//
+// Both result in an extra syscall when you guess wrong.  However, there
+// are likely far more normal files in the world than directories.  This
+// is based on the assumption that a the average number of files per
+// directory is >= 1.
+//
+// If anyone ever complains about this, then I guess the strategy could
+// be made configurable somehow.  But until then, YAGNI.
+function rimraf_ (p, options, cb) {
+  assert(p)
+  assert(options)
+  assert(typeof cb === 'function')
+
+  // sunos lets the root user unlink directories, which is... weird.
+  // so we have to lstat here and make sure it's not a dir.
+  options.lstat(p, (er, st) => {
+    if (er && er.code === 'ENOENT') {
+      return cb(null)
+    }
+
+    // Windows can EPERM on stat.  Life is suffering.
+    if (er && er.code === 'EPERM' && isWindows) {
+      return fixWinEPERM(p, options, er, cb)
+    }
+
+    if (st && st.isDirectory()) {
+      return rmdir(p, options, er, cb)
+    }
+
+    options.unlink(p, er => {
+      if (er) {
+        if (er.code === 'ENOENT') {
+          return cb(null)
+        }
+        if (er.code === 'EPERM') {
+          return (isWindows)
+            ? fixWinEPERM(p, options, er, cb)
+            : rmdir(p, options, er, cb)
+        }
+        if (er.code === 'EISDIR') {
+          return rmdir(p, options, er, cb)
+        }
+      }
+      return cb(er)
+    })
+  })
+}
+
+function fixWinEPERM (p, options, er, cb) {
+  assert(p)
+  assert(options)
+  assert(typeof cb === 'function')
+
+  options.chmod(p, 0o666, er2 => {
+    if (er2) {
+      cb(er2.code === 'ENOENT' ? null : er)
+    } else {
+      options.stat(p, (er3, stats) => {
+        if (er3) {
+          cb(er3.code === 'ENOENT' ? null : er)
+        } else if (stats.isDirectory()) {
+          rmdir(p, options, er, cb)
+        } else {
+          options.unlink(p, cb)
+        }
+      })
+    }
+  })
+}
+
+function fixWinEPERMSync (p, options, er) {
+  let stats
+
+  assert(p)
+  assert(options)
+
+  try {
+    options.chmodSync(p, 0o666)
+  } catch (er2) {
+    if (er2.code === 'ENOENT') {
+      return
+    } else {
+      throw er
+    }
+  }
+
+  try {
+    stats = options.statSync(p)
+  } catch (er3) {
+    if (er3.code === 'ENOENT') {
+      return
+    } else {
+      throw er
+    }
+  }
+
+  if (stats.isDirectory()) {
+    rmdirSync(p, options, er)
+  } else {
+    options.unlinkSync(p)
+  }
+}
+
+function rmdir (p, options, originalEr, cb) {
+  assert(p)
+  assert(options)
+  assert(typeof cb === 'function')
+
+  // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
+  // if we guessed wrong, and it's not a directory, then
+  // raise the original error.
+  options.rmdir(p, er => {
+    if (er && (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM')) {
+      rmkids(p, options, cb)
+    } else if (er && er.code === 'ENOTDIR') {
+      cb(originalEr)
+    } else {
+      cb(er)
+    }
+  })
+}
+
+function rmkids (p, options, cb) {
+  assert(p)
+  assert(options)
+  assert(typeof cb === 'function')
+
+  options.readdir(p, (er, files) => {
+    if (er) return cb(er)
+
+    let n = files.length
+    let errState
+
+    if (n === 0) return options.rmdir(p, cb)
+
+    files.forEach(f => {
+      rimraf(path.join(p, f), options, er => {
+        if (errState) {
+          return
+        }
+        if (er) return cb(errState = er)
+        if (--n === 0) {
+          options.rmdir(p, cb)
+        }
+      })
+    })
+  })
+}
+
+// this looks simpler, and is strictly *faster*, but will
+// tie up the JavaScript thread and fail on excessively
+// deep directory trees.
+function rimrafSync (p, options) {
+  let st
+
+  options = options || {}
+  defaults(options)
+
+  assert(p, 'rimraf: missing path')
+  assert.strictEqual(typeof p, 'string', 'rimraf: path should be a string')
+  assert(options, 'rimraf: missing options')
+  assert.strictEqual(typeof options, 'object', 'rimraf: options should be object')
+
+  try {
+    st = options.lstatSync(p)
+  } catch (er) {
+    if (er.code === 'ENOENT') {
+      return
+    }
+
+    // Windows can EPERM on stat.  Life is suffering.
+    if (er.code === 'EPERM' && isWindows) {
+      fixWinEPERMSync(p, options, er)
+    }
+  }
+
+  try {
+    // sunos lets the root user unlink directories, which is... weird.
+    if (st && st.isDirectory()) {
+      rmdirSync(p, options, null)
+    } else {
+      options.unlinkSync(p)
+    }
+  } catch (er) {
+    if (er.code === 'ENOENT') {
+      return
+    } else if (er.code === 'EPERM') {
+      return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
+    } else if (er.code !== 'EISDIR') {
+      throw er
+    }
+    rmdirSync(p, options, er)
+  }
+}
+
+function rmdirSync (p, options, originalEr) {
+  assert(p)
+  assert(options)
+
+  try {
+    options.rmdirSync(p)
+  } catch (er) {
+    if (er.code === 'ENOTDIR') {
+      throw originalEr
+    } else if (er.code === 'ENOTEMPTY' || er.code === 'EEXIST' || er.code === 'EPERM') {
+      rmkidsSync(p, options)
+    } else if (er.code !== 'ENOENT') {
+      throw er
+    }
+  }
+}
+
+function rmkidsSync (p, options) {
+  assert(p)
+  assert(options)
+  options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))
+
+  if (isWindows) {
+    // We only end up here once we got ENOTEMPTY at least once, and
+    // at this point, we are guaranteed to have removed all the kids.
+    // So, we know that it won't be ENOENT or ENOTDIR or anything else.
+    // try really hard to delete stuff on windows, because it has a
+    // PROFOUNDLY annoying habit of not closing handles promptly when
+    // files are deleted, resulting in spurious ENOTEMPTY errors.
+    const startTime = Date.now()
+    do {
+      try {
+        const ret = options.rmdirSync(p, options)
+        return ret
+      } catch {}
+    } while (Date.now() - startTime < 500) // give up after 500ms
+  } else {
+    const ret = options.rmdirSync(p, options)
+    return ret
+  }
+}
+
+module.exports = rimraf
+rimraf.sync = rimrafSync
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/util/stat.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/util/stat.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/util/stat.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,139 @@
+'use strict'
+
+const fs = require('../fs')
+const path = require('path')
+const util = require('util')
+const atLeastNode = require('at-least-node')
+
+const nodeSupportsBigInt = atLeastNode('10.5.0')
+const stat = (file) => nodeSupportsBigInt ? fs.stat(file, { bigint: true }) : fs.stat(file)
+const statSync = (file) => nodeSupportsBigInt ? fs.statSync(file, { bigint: true }) : fs.statSync(file)
+
+function getStats (src, dest) {
+  return Promise.all([
+    stat(src),
+    stat(dest).catch(err => {
+      if (err.code === 'ENOENT') return null
+      throw err
+    })
+  ]).then(([srcStat, destStat]) => ({ srcStat, destStat }))
+}
+
+function getStatsSync (src, dest) {
+  let destStat
+  const srcStat = statSync(src)
+  try {
+    destStat = statSync(dest)
+  } catch (err) {
+    if (err.code === 'ENOENT') return { srcStat, destStat: null }
+    throw err
+  }
+  return { srcStat, destStat }
+}
+
+function checkPaths (src, dest, funcName, cb) {
+  util.callbackify(getStats)(src, dest, (err, stats) => {
+    if (err) return cb(err)
+    const { srcStat, destStat } = stats
+    if (destStat && areIdentical(srcStat, destStat)) {
+      return cb(new Error('Source and destination must not be the same.'))
+    }
+    if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
+      return cb(new Error(errMsg(src, dest, funcName)))
+    }
+    return cb(null, { srcStat, destStat })
+  })
+}
+
+function checkPathsSync (src, dest, funcName) {
+  const { srcStat, destStat } = getStatsSync(src, dest)
+  if (destStat && areIdentical(srcStat, destStat)) {
+    throw new Error('Source and destination must not be the same.')
+  }
+  if (srcStat.isDirectory() && isSrcSubdir(src, dest)) {
+    throw new Error(errMsg(src, dest, funcName))
+  }
+  return { srcStat, destStat }
+}
+
+// recursively check if dest parent is a subdirectory of src.
+// It works for all file types including symlinks since it
+// checks the src and dest inodes. It starts from the deepest
+// parent and stops once it reaches the src parent or the root path.
+function checkParentPaths (src, srcStat, dest, funcName, cb) {
+  const srcParent = path.resolve(path.dirname(src))
+  const destParent = path.resolve(path.dirname(dest))
+  if (destParent === srcParent || destParent === path.parse(destParent).root) return cb()
+  const callback = (err, destStat) => {
+    if (err) {
+      if (err.code === 'ENOENT') return cb()
+      return cb(err)
+    }
+    if (areIdentical(srcStat, destStat)) {
+      return cb(new Error(errMsg(src, dest, funcName)))
+    }
+    return checkParentPaths(src, srcStat, destParent, funcName, cb)
+  }
+  if (nodeSupportsBigInt) fs.stat(destParent, { bigint: true }, callback)
+  else fs.stat(destParent, callback)
+}
+
+function checkParentPathsSync (src, srcStat, dest, funcName) {
+  const srcParent = path.resolve(path.dirname(src))
+  const destParent = path.resolve(path.dirname(dest))
+  if (destParent === srcParent || destParent === path.parse(destParent).root) return
+  let destStat
+  try {
+    destStat = statSync(destParent)
+  } catch (err) {
+    if (err.code === 'ENOENT') return
+    throw err
+  }
+  if (areIdentical(srcStat, destStat)) {
+    throw new Error(errMsg(src, dest, funcName))
+  }
+  return checkParentPathsSync(src, srcStat, destParent, funcName)
+}
+
+function areIdentical (srcStat, destStat) {
+  if (destStat.ino && destStat.dev && destStat.ino === srcStat.ino && destStat.dev === srcStat.dev) {
+    if (nodeSupportsBigInt || destStat.ino < Number.MAX_SAFE_INTEGER) {
+      // definitive answer
+      return true
+    }
+    // Use additional heuristics if we can't use 'bigint'.
+    // Different 'ino' could be represented the same if they are >= Number.MAX_SAFE_INTEGER
+    // See issue 657
+    if (destStat.size === srcStat.size &&
+        destStat.mode === srcStat.mode &&
+        destStat.nlink === srcStat.nlink &&
+        destStat.atimeMs === srcStat.atimeMs &&
+        destStat.mtimeMs === srcStat.mtimeMs &&
+        destStat.ctimeMs === srcStat.ctimeMs &&
+        destStat.birthtimeMs === srcStat.birthtimeMs) {
+      // heuristic answer
+      return true
+    }
+  }
+  return false
+}
+
+// return true if dest is a subdir of src, otherwise false.
+// It only checks the path strings.
+function isSrcSubdir (src, dest) {
+  const srcArr = path.resolve(src).split(path.sep).filter(i => i)
+  const destArr = path.resolve(dest).split(path.sep).filter(i => i)
+  return srcArr.reduce((acc, cur, i) => acc && destArr[i] === cur, true)
+}
+
+function errMsg (src, dest, funcName) {
+  return `Cannot ${funcName} '${src}' to a subdirectory of itself, '${dest}'.`
+}
+
+module.exports = {
+  checkPaths,
+  checkPathsSync,
+  checkParentPaths,
+  checkParentPathsSync,
+  isSrcSubdir
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/util/utimes.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/util/utimes.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/lib/util/utimes.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,26 @@
+'use strict'
+
+const fs = require('graceful-fs')
+
+function utimesMillis (path, atime, mtime, callback) {
+  // if (!HAS_MILLIS_RES) return fs.utimes(path, atime, mtime, callback)
+  fs.open(path, 'r+', (err, fd) => {
+    if (err) return callback(err)
+    fs.futimes(fd, atime, mtime, futimesErr => {
+      fs.close(fd, closeErr => {
+        if (callback) callback(futimesErr || closeErr)
+      })
+    })
+  })
+}
+
+function utimesMillisSync (path, atime, mtime) {
+  const fd = fs.openSync(path, 'r+')
+  fs.futimesSync(fd, atime, mtime)
+  return fs.closeSync(fd)
+}
+
+module.exports = {
+  utimesMillis,
+  utimesMillisSync
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/package.json
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,70 @@
+{
+  "name": "fs-extra",
+  "version": "9.1.0",
+  "description": "fs-extra contains methods that aren't included in the vanilla Node.js fs package. Such as recursive mkdir, copy, and remove.",
+  "engines": {
+    "node": ">=10"
+  },
+  "homepage": "https://github.com/jprichardson/node-fs-extra",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/jprichardson/node-fs-extra"
+  },
+  "keywords": [
+    "fs",
+    "file",
+    "file system",
+    "copy",
+    "directory",
+    "extra",
+    "mkdirp",
+    "mkdir",
+    "mkdirs",
+    "recursive",
+    "json",
+    "read",
+    "write",
+    "extra",
+    "delete",
+    "remove",
+    "touch",
+    "create",
+    "text",
+    "output",
+    "move",
+    "promise"
+  ],
+  "author": "JP Richardson <jprichardson@gmail.com>",
+  "license": "MIT",
+  "dependencies": {
+    "at-least-node": "^1.0.0",
+    "graceful-fs": "^4.2.0",
+    "jsonfile": "^6.0.1",
+    "universalify": "^2.0.0"
+  },
+  "devDependencies": {
+    "coveralls": "^3.0.0",
+    "klaw": "^2.1.1",
+    "klaw-sync": "^3.0.2",
+    "minimist": "^1.1.1",
+    "mocha": "^5.0.5",
+    "nyc": "^15.0.0",
+    "proxyquire": "^2.0.1",
+    "read-dir-files": "^0.1.1",
+    "standard": "^14.1.0"
+  },
+  "main": "./lib/index.js",
+  "files": [
+    "lib/",
+    "!lib/**/__tests__/"
+  ],
+  "scripts": {
+    "full-ci": "npm run lint && npm run coverage",
+    "coverage": "nyc -r lcovonly npm run unit",
+    "coveralls": "coveralls < coverage/lcov.info",
+    "lint": "standard",
+    "test-find": "find ./lib/**/__tests__ -name *.test.js | xargs mocha",
+    "test": "npm run lint && npm run unit",
+    "unit": "node test.js"
+  }
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/CHANGELOG.md
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/CHANGELOG.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/CHANGELOG.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,279 @@
+# Changelog
+
+All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
+
+## [2.7.0](https://github.com/webpack/schema-utils/compare/v2.6.6...v2.7.0) (2020-05-29)
+
+
+### Features
+
+* improve hints ([a36e535](https://github.com/webpack/schema-utils/commit/a36e535faca1b01e27c3bfa3c8bee9227c3f836c))
+* smart not case ([#101](https://github.com/webpack/schema-utils/issues/101)) ([698d8b0](https://github.com/webpack/schema-utils/commit/698d8b05462d86aadb217e25a45c7b953a79a52e))
+
+
+### Bug Fixes
+
+* move @types/json-schema from devDependencies to dependencies ([#97](https://github.com/webpack/schema-utils/issues/97)) ([#98](https://github.com/webpack/schema-utils/issues/98)) ([945e67d](https://github.com/webpack/schema-utils/commit/945e67db5e19baf7ec7df72813b0739dd56f950d))
+
+### [2.6.6](https://github.com/webpack/schema-utils/compare/v2.6.5...v2.6.6) (2020-04-17)
+
+
+### Bug Fixes
+
+* improve perf
+
+### [2.6.5](https://github.com/webpack/schema-utils/compare/v2.6.4...v2.6.5) (2020-03-11)
+
+
+### Bug Fixes
+
+* correct dots at end of sentence ([7284beb](https://github.com/webpack/schema-utils/commit/7284bebe00cd570f1bef2c15951a07b9794038e6))
+
+### [2.6.4](https://github.com/webpack/schema-utils/compare/v2.6.3...v2.6.4) (2020-01-17)
+
+
+### Bug Fixes
+
+* change `initialised` to `initialized` ([#87](https://github.com/webpack/schema-utils/issues/87)) ([70f12d3](https://github.com/webpack/schema-utils/commit/70f12d33a8eaa27249bc9c1a27f886724cf91ea7))
+
+### [2.6.3](https://github.com/webpack/schema-utils/compare/v2.6.2...v2.6.3) (2020-01-17)
+
+
+### Bug Fixes
+
+* prefer the `baseDataPath` option from arguments ([#86](https://github.com/webpack/schema-utils/issues/86)) ([e236859](https://github.com/webpack/schema-utils/commit/e236859e85b28e35e1294f86fc1ff596a5031cea))
+
+### [2.6.2](https://github.com/webpack/schema-utils/compare/v2.6.1...v2.6.2) (2020-01-14)
+
+
+### Bug Fixes
+
+* better handle Windows absolute paths ([#85](https://github.com/webpack/schema-utils/issues/85)) ([1fa2930](https://github.com/webpack/schema-utils/commit/1fa2930a161e907b9fc53a7233d605910afdb883))
+
+### [2.6.1](https://github.com/webpack/schema-utils/compare/v2.6.0...v2.6.1) (2019-11-28)
+
+
+### Bug Fixes
+
+* typescript declarations ([#84](https://github.com/webpack/schema-utils/issues/84)) ([89d55a9](https://github.com/webpack/schema-utils/commit/89d55a9a8edfa6a8ac8b112f226bb3154e260319))
+
+## [2.6.0](https://github.com/webpack/schema-utils/compare/v2.5.0...v2.6.0) (2019-11-27)
+
+
+### Features
+
+* support configuration via title ([#81](https://github.com/webpack/schema-utils/issues/81)) ([afddc10](https://github.com/webpack/schema-utils/commit/afddc109f6891cd37a9f1835d50862d119a072bf))
+
+
+### Bug Fixes
+
+* typescript definitions ([#70](https://github.com/webpack/schema-utils/issues/70)) ([f38158d](https://github.com/webpack/schema-utils/commit/f38158d6d040e2c701622778ae8122fb26a4f990))
+
+## [2.5.0](https://github.com/webpack/schema-utils/compare/v2.4.1...v2.5.0) (2019-10-15)
+
+
+### Bug Fixes
+
+* rework format for maxLength, minLength ([#67](https://github.com/webpack/schema-utils/issues/67)) ([0d12259](https://github.com/webpack/schema-utils/commit/0d12259))
+* support all cases with one number in range ([#64](https://github.com/webpack/schema-utils/issues/64)) ([7fc8069](https://github.com/webpack/schema-utils/commit/7fc8069))
+* typescript definition and export naming ([#69](https://github.com/webpack/schema-utils/issues/69)) ([a435b79](https://github.com/webpack/schema-utils/commit/a435b79))
+
+
+### Features
+
+* "smart" numbers range ([62fb107](https://github.com/webpack/schema-utils/commit/62fb107))
+
+### [2.4.1](https://github.com/webpack/schema-utils/compare/v2.4.0...v2.4.1) (2019-09-27)
+
+
+### Bug Fixes
+
+* publish definitions ([#58](https://github.com/webpack/schema-utils/issues/58)) ([1885faa](https://github.com/webpack/schema-utils/commit/1885faa))
+
+## [2.4.0](https://github.com/webpack/schema-utils/compare/v2.3.0...v2.4.0) (2019-09-26)
+
+
+### Features
+
+* better errors when the `type` keyword doesn't exist ([0988be2](https://github.com/webpack/schema-utils/commit/0988be2))
+* support $data reference ([#56](https://github.com/webpack/schema-utils/issues/56)) ([d2f11d6](https://github.com/webpack/schema-utils/commit/d2f11d6))
+* types definitions ([#52](https://github.com/webpack/schema-utils/issues/52)) ([facb431](https://github.com/webpack/schema-utils/commit/facb431))
+
+## [2.3.0](https://github.com/webpack/schema-utils/compare/v2.2.0...v2.3.0) (2019-09-26)
+
+
+### Features
+
+* support `not` keyword ([#53](https://github.com/webpack/schema-utils/issues/53)) ([765f458](https://github.com/webpack/schema-utils/commit/765f458))
+
+## [2.2.0](https://github.com/webpack/schema-utils/compare/v2.1.0...v2.2.0) (2019-09-02)
+
+
+### Features
+
+* better error output for `oneOf` and `anyOf` ([#48](https://github.com/webpack/schema-utils/issues/48)) ([#50](https://github.com/webpack/schema-utils/issues/50)) ([332242f](https://github.com/webpack/schema-utils/commit/332242f))
+
+## [2.1.0](https://github.com/webpack-contrib/schema-utils/compare/v2.0.1...v2.1.0) (2019-08-07)
+
+
+### Bug Fixes
+
+* throw error on sparse arrays ([#47](https://github.com/webpack-contrib/schema-utils/issues/47)) ([b85ac38](https://github.com/webpack-contrib/schema-utils/commit/b85ac38))
+
+
+### Features
+
+* export `ValidateError` ([#46](https://github.com/webpack-contrib/schema-utils/issues/46)) ([ff781d7](https://github.com/webpack-contrib/schema-utils/commit/ff781d7))
+
+
+
+### [2.0.1](https://github.com/webpack-contrib/schema-utils/compare/v2.0.0...v2.0.1) (2019-07-18)
+
+
+### Bug Fixes
+
+* error message for empty object ([#44](https://github.com/webpack-contrib/schema-utils/issues/44)) ([0b4b4a2](https://github.com/webpack-contrib/schema-utils/commit/0b4b4a2))
+
+
+
+### [2.0.0](https://github.com/webpack-contrib/schema-utils/compare/v1.0.0...v2.0.0) (2019-07-17)
+
+
+### BREAKING CHANGES
+
+* drop support for Node.js < 8.9.0
+* drop support `errorMessage`, please use `description` for links.
+* api was changed, please look documentation.
+* error messages was fully rewritten.
+
+
+<a name="1.0.0"></a>
+# [1.0.0](https://github.com/webpack-contrib/schema-utils/compare/v0.4.7...v1.0.0) (2018-08-07)
+
+
+### Features
+
+* **src:** add support for custom error messages ([#33](https://github.com/webpack-contrib/schema-utils/issues/33)) ([1cbe4ef](https://github.com/webpack-contrib/schema-utils/commit/1cbe4ef))
+
+
+
+<a name="0.4.7"></a>
+## [0.4.7](https://github.com/webpack-contrib/schema-utils/compare/v0.4.6...v0.4.7) (2018-08-07)
+
+
+### Bug Fixes
+
+* **src:** `node >= v4.0.0` support ([#32](https://github.com/webpack-contrib/schema-utils/issues/32)) ([cb13dd4](https://github.com/webpack-contrib/schema-utils/commit/cb13dd4))
+
+
+
+<a name="0.4.6"></a>
+## [0.4.6](https://github.com/webpack-contrib/schema-utils/compare/v0.4.5...v0.4.6) (2018-08-06)
+
+
+### Bug Fixes
+
+* **package:** remove lockfile ([#28](https://github.com/webpack-contrib/schema-utils/issues/28)) ([69f1a81](https://github.com/webpack-contrib/schema-utils/commit/69f1a81))
+* **package:** remove unnecessary `webpack` dependency ([#26](https://github.com/webpack-contrib/schema-utils/issues/26)) ([532eaa5](https://github.com/webpack-contrib/schema-utils/commit/532eaa5))
+
+
+
+<a name="0.4.5"></a>
+## [0.4.5](https://github.com/webpack-contrib/schema-utils/compare/v0.4.4...v0.4.5) (2018-02-13)
+
+
+### Bug Fixes
+
+* **CHANGELOG:** update broken links ([4483b9f](https://github.com/webpack-contrib/schema-utils/commit/4483b9f))
+* **package:** update broken links ([f2494ba](https://github.com/webpack-contrib/schema-utils/commit/f2494ba))
+
+
+
+<a name="0.4.4"></a>
+## [0.4.4](https://github.com/webpack-contrib/schema-utils/compare/v0.4.3...v0.4.4) (2018-02-13)
+
+
+### Bug Fixes
+
+* **package:** update `dependencies` ([#22](https://github.com/webpack-contrib/schema-utils/issues/22)) ([3aecac6](https://github.com/webpack-contrib/schema-utils/commit/3aecac6))
+
+
+
+<a name="0.4.3"></a>
+## [0.4.3](https://github.com/webpack-contrib/schema-utils/compare/v0.4.2...v0.4.3) (2017-12-14)
+
+
+### Bug Fixes
+
+* **validateOptions:** throw `err` instead of `process.exit(1)` ([#17](https://github.com/webpack-contrib/schema-utils/issues/17)) ([c595eda](https://github.com/webpack-contrib/schema-utils/commit/c595eda))
+* **ValidationError:** never return `this` in the ctor ([#16](https://github.com/webpack-contrib/schema-utils/issues/16)) ([c723791](https://github.com/webpack-contrib/schema-utils/commit/c723791))
+
+
+
+<a name="0.4.2"></a>
+## [0.4.2](https://github.com/webpack-contrib/schema-utils/compare/v0.4.1...v0.4.2) (2017-11-09)
+
+
+### Bug Fixes
+
+* **validateOptions:** catch `ValidationError` and handle it internally ([#15](https://github.com/webpack-contrib/schema-utils/issues/15)) ([9c5ef5e](https://github.com/webpack-contrib/schema-utils/commit/9c5ef5e))
+
+
+
+<a name="0.4.1"></a>
+## [0.4.1](https://github.com/webpack-contrib/schema-utils/compare/v0.4.0...v0.4.1) (2017-11-03)
+
+
+### Bug Fixes
+
+* **ValidationError:** use `Error.captureStackTrace` for `err.stack` handling ([#14](https://github.com/webpack-contrib/schema-utils/issues/14)) ([a6fb974](https://github.com/webpack-contrib/schema-utils/commit/a6fb974))
+
+
+
+<a name="0.4.0"></a>
+# [0.4.0](https://github.com/webpack-contrib/schema-utils/compare/v0.3.0...v0.4.0) (2017-10-28)
+
+
+### Features
+
+* add support for `typeof`, `instanceof` (`{Function\|RegExp}`) ([#10](https://github.com/webpack-contrib/schema-utils/issues/10)) ([9f01816](https://github.com/webpack-contrib/schema-utils/commit/9f01816))
+
+
+
+<a name="0.3.0"></a>
+# [0.3.0](https://github.com/webpack-contrib/schema-utils/compare/v0.2.1...v0.3.0) (2017-04-29)
+
+
+### Features
+
+* add ValidationError ([#8](https://github.com/webpack-contrib/schema-utils/issues/8)) ([d48f0fb](https://github.com/webpack-contrib/schema-utils/commit/d48f0fb))
+
+
+
+<a name="0.2.1"></a>
+## [0.2.1](https://github.com/webpack-contrib/schema-utils/compare/v0.2.0...v0.2.1) (2017-03-13)
+
+
+### Bug Fixes
+
+* Include .babelrc to `files` ([28f0363](https://github.com/webpack-contrib/schema-utils/commit/28f0363))
+* Include source to `files` ([43b0f2f](https://github.com/webpack-contrib/schema-utils/commit/43b0f2f))
+
+
+
+<a name="0.2.0"></a>
+# [0.2.0](https://github.com/webpack-contrib/schema-utils/compare/v0.1.0...v0.2.0) (2017-03-12)
+
+<a name="0.1.0"></a>
+# 0.1.0 (2017-03-07)
+
+
+### Features
+
+* **validations:** add validateOptions module ([ae9b47b](https://github.com/webpack-contrib/schema-utils/commit/ae9b47b))
+
+
+
+# Change Log
+
+All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/LICENSE
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,20 @@
+Copyright JS Foundation and other contributors
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/README.md
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,276 @@
+<div align="center">
+  <a href="http://json-schema.org">
+    <img width="160" height="160"
+      src="https://raw.githubusercontent.com/webpack-contrib/schema-utils/master/.github/assets/logo.png">
+  </a>
+  <a href="https://github.com/webpack/webpack">
+    <img width="200" height="200"
+      src="https://webpack.js.org/assets/icon-square-big.svg">
+  </a>
+</div>
+
+[![npm][npm]][npm-url]
+[![node][node]][node-url]
+[![deps][deps]][deps-url]
+[![tests][tests]][tests-url]
+[![coverage][cover]][cover-url]
+[![chat][chat]][chat-url]
+[![size][size]][size-url]
+
+# schema-utils
+
+Package for validate options in loaders and plugins.
+
+## Getting Started
+
+To begin, you'll need to install `schema-utils`:
+
+```console
+npm install schema-utils
+```
+
+## API
+
+**schema.json**
+
+```json
+{
+  "type": "object",
+  "properties": {
+    "option": {
+      "type": ["boolean"]
+    }
+  },
+  "additionalProperties": false
+}
+```
+
+```js
+import schema from './path/to/schema.json';
+import validate from 'schema-utils';
+
+const options = { option: true };
+const configuration = { name: 'Loader Name/Plugin Name/Name' };
+
+validate(schema, options, configuration);
+```
+
+### `schema`
+
+Type: `String`
+
+JSON schema.
+
+Simple example of schema:
+
+```json
+{
+  "type": "object",
+  "properties": {
+    "name": {
+      "description": "This is description of option.",
+      "type": "string"
+    }
+  },
+  "additionalProperties": false
+}
+```
+
+### `options`
+
+Type: `Object`
+
+Object with options.
+
+```js
+validate(
+  schema,
+  {
+    name: 123,
+  },
+  { name: 'MyPlugin' }
+);
+```
+
+### `configuration`
+
+Allow to configure validator.
+
+There is an alternative method to configure the `name` and`baseDataPath` options via the `title` property in the schema.
+For example:
+
+```json
+{
+  "title": "My Loader options",
+  "type": "object",
+  "properties": {
+    "name": {
+      "description": "This is description of option.",
+      "type": "string"
+    }
+  },
+  "additionalProperties": false
+}
+```
+
+The last word used for the `baseDataPath` option, other words used for the `name` option.
+Based on the example above the `name` option equals `My Loader`, the `baseDataPath` option equals `options`.
+
+#### `name`
+
+Type: `Object`
+Default: `"Object"`
+
+Allow to setup name in validation errors.
+
+```js
+validate(schema, options, { name: 'MyPlugin' });
+```
+
+```shell
+Invalid configuration object. MyPlugin has been initialised using a configuration object that does not match the API schema.
+ - configuration.optionName should be a integer.
+```
+
+#### `baseDataPath`
+
+Type: `String`
+Default: `"configuration"`
+
+Allow to setup base data path in validation errors.
+
+```js
+validate(schema, options, { name: 'MyPlugin', baseDataPath: 'options' });
+```
+
+```shell
+Invalid options object. MyPlugin has been initialised using an options object that does not match the API schema.
+ - options.optionName should be a integer.
+```
+
+#### `postFormatter`
+
+Type: `Function`
+Default: `undefined`
+
+Allow to reformat errors.
+
+```js
+validate(schema, options, {
+  name: 'MyPlugin',
+  postFormatter: (formattedError, error) => {
+    if (error.keyword === 'type') {
+      return `${formattedError}\nAdditional Information.`;
+    }
+
+    return formattedError;
+  },
+});
+```
+
+```shell
+Invalid options object. MyPlugin has been initialized using an options object that does not match the API schema.
+ - options.optionName should be a integer.
+   Additional Information.
+```
+
+## Examples
+
+**schema.json**
+
+```json
+{
+  "type": "object",
+  "properties": {
+    "name": {
+      "type": "string"
+    },
+    "test": {
+      "anyOf": [
+        { "type": "array" },
+        { "type": "string" },
+        { "instanceof": "RegExp" }
+      ]
+    },
+    "transform": {
+      "instanceof": "Function"
+    },
+    "sourceMap": {
+      "type": "boolean"
+    }
+  },
+  "additionalProperties": false
+}
+```
+
+### `Loader`
+
+```js
+import { getOptions } from 'loader-utils';
+import validateOptions from 'schema-utils';
+
+import schema from 'path/to/schema.json';
+
+function loader(src, map) {
+  const options = getOptions(this) || {};
+
+  validateOptions(schema, options, {
+    name: 'Loader Name',
+    baseDataPath: 'options',
+  });
+
+  // Code...
+}
+
+export default loader;
+```
+
+### `Plugin`
+
+```js
+import validateOptions from 'schema-utils';
+
+import schema from 'path/to/schema.json';
+
+class Plugin {
+  constructor(options) {
+    validateOptions(schema, options, {
+      name: 'Plugin Name',
+      baseDataPath: 'options',
+    });
+
+    this.options = options;
+  }
+
+  apply(compiler) {
+    // Code...
+  }
+}
+
+export default Plugin;
+```
+
+## Contributing
+
+Please take a moment to read our contributing guidelines if you haven't yet done so.
+
+[CONTRIBUTING](./.github/CONTRIBUTING.md)
+
+## License
+
+[MIT](./LICENSE)
+
+[npm]: https://img.shields.io/npm/v/schema-utils.svg
+[npm-url]: https://npmjs.com/package/schema-utils
+[node]: https://img.shields.io/node/v/schema-utils.svg
+[node-url]: https://nodejs.org
+[deps]: https://david-dm.org/webpack/schema-utils.svg
+[deps-url]: https://david-dm.org/webpack/schema-utils
+[tests]: https://github.com/webpack/schema-utils/workflows/schema-utils/badge.svg
+[tests-url]: https://github.com/webpack/schema-utils/actions
+[cover]: https://codecov.io/gh/webpack/schema-utils/branch/master/graph/badge.svg
+[cover-url]: https://codecov.io/gh/webpack/schema-utils
+[chat]: https://badges.gitter.im/webpack/webpack.svg
+[chat-url]: https://gitter.im/webpack/webpack
+[size]: https://packagephobia.now.sh/badge?p=schema-utils
+[size-url]: https://packagephobia.now.sh/result?p=schema-utils
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/ValidationError.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/ValidationError.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/ValidationError.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,88 @@
+export default ValidationError;
+export type JSONSchema6 = import('json-schema').JSONSchema6;
+export type JSONSchema7 = import('json-schema').JSONSchema7;
+export type Schema =
+  | (import('json-schema').JSONSchema4 & import('./validate').Extend)
+  | (import('json-schema').JSONSchema6 & import('./validate').Extend)
+  | (import('json-schema').JSONSchema7 & import('./validate').Extend);
+export type ValidationErrorConfiguration = {
+  name?: string | undefined;
+  baseDataPath?: string | undefined;
+  postFormatter?: import('./validate').PostFormatter | undefined;
+};
+export type PostFormatter = (
+  formattedError: string,
+  error: import('ajv').ErrorObject & {
+    children?: import('ajv').ErrorObject[] | undefined;
+  }
+) => string;
+export type SchemaUtilErrorObject = import('ajv').ErrorObject & {
+  children?: import('ajv').ErrorObject[] | undefined;
+};
+export type SPECIFICITY = number;
+declare class ValidationError extends Error {
+  /**
+   * @param {Array<SchemaUtilErrorObject>} errors
+   * @param {Schema} schema
+   * @param {ValidationErrorConfiguration} configuration
+   */
+  constructor(
+    errors: Array<SchemaUtilErrorObject>,
+    schema: Schema,
+    configuration?: ValidationErrorConfiguration
+  );
+  /** @type {Array<SchemaUtilErrorObject>} */
+  errors: Array<SchemaUtilErrorObject>;
+  /** @type {Schema} */
+  schema: Schema;
+  /** @type {string} */
+  headerName: string;
+  /** @type {string} */
+  baseDataPath: string;
+  /** @type {PostFormatter | null} */
+  postFormatter: PostFormatter | null;
+  /**
+   * @param {string} path
+   * @returns {Schema}
+   */
+  getSchemaPart(path: string): Schema;
+  /**
+   * @param {Schema} schema
+   * @param {boolean} logic
+   * @param {Array<Object>} prevSchemas
+   * @returns {string}
+   */
+  formatSchema(
+    schema: Schema,
+    logic?: boolean,
+    prevSchemas?: Array<Object>
+  ): string;
+  /**
+   * @param {Schema=} schemaPart
+   * @param {(boolean | Array<string>)=} additionalPath
+   * @param {boolean=} needDot
+   * @param {boolean=} logic
+   * @returns {string}
+   */
+  getSchemaPartText(
+    schemaPart?: Schema | undefined,
+    additionalPath?: (boolean | Array<string>) | undefined,
+    needDot?: boolean | undefined,
+    logic?: boolean | undefined
+  ): string;
+  /**
+   * @param {Schema=} schemaPart
+   * @returns {string}
+   */
+  getSchemaPartDescription(schemaPart?: Schema | undefined): string;
+  /**
+   * @param {SchemaUtilErrorObject} error
+   * @returns {string}
+   */
+  formatValidationError(error: SchemaUtilErrorObject): string;
+  /**
+   * @param {Array<SchemaUtilErrorObject>} errors
+   * @returns {string}
+   */
+  formatValidationErrors(errors: Array<SchemaUtilErrorObject>): string;
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/index.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/index.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,2 @@
+declare const _exports: typeof import('./validate').default;
+export = _exports;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/keywords/absolutePath.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/keywords/absolutePath.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/keywords/absolutePath.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,12 @@
+export default addAbsolutePathKeyword;
+export type Ajv = import('ajv').Ajv;
+export type ValidateFunction = import('ajv').ValidateFunction;
+export type SchemaUtilErrorObject = import('ajv').ErrorObject & {
+  children?: import('ajv').ErrorObject[] | undefined;
+};
+/**
+ *
+ * @param {Ajv} ajv
+ * @returns {Ajv}
+ */
+declare function addAbsolutePathKeyword(ajv: Ajv): Ajv;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/util/Range.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/util/Range.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/util/Range.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,82 @@
+export = Range;
+/**
+ * @typedef {[number, boolean]} RangeValue
+ */
+/**
+ * @callback RangeValueCallback
+ * @param {RangeValue} rangeValue
+ * @returns {boolean}
+ */
+declare class Range {
+  /**
+   * @param {"left" | "right"} side
+   * @param {boolean} exclusive
+   * @returns {">" | ">=" | "<" | "<="}
+   */
+  static getOperator(
+    side: 'left' | 'right',
+    exclusive: boolean
+  ): '>' | '>=' | '<' | '<=';
+  /**
+   * @param {number} value
+   * @param {boolean} logic is not logic applied
+   * @param {boolean} exclusive is range exclusive
+   * @returns {string}
+   */
+  static formatRight(value: number, logic: boolean, exclusive: boolean): string;
+  /**
+   * @param {number} value
+   * @param {boolean} logic is not logic applied
+   * @param {boolean} exclusive is range exclusive
+   * @returns {string}
+   */
+  static formatLeft(value: number, logic: boolean, exclusive: boolean): string;
+  /**
+   * @param {number} start left side value
+   * @param {number} end right side value
+   * @param {boolean} startExclusive is range exclusive from left side
+   * @param {boolean} endExclusive is range exclusive from right side
+   * @param {boolean} logic is not logic applied
+   * @returns {string}
+   */
+  static formatRange(
+    start: number,
+    end: number,
+    startExclusive: boolean,
+    endExclusive: boolean,
+    logic: boolean
+  ): string;
+  /**
+   * @param {Array<RangeValue>} values
+   * @param {boolean} logic is not logic applied
+   * @return {RangeValue} computed value and it's exclusive flag
+   */
+  static getRangeValue(
+    values: Array<RangeValue>,
+    logic: boolean
+  ): [number, boolean];
+  /** @type {Array<RangeValue>} */
+  _left: Array<RangeValue>;
+  /** @type {Array<RangeValue>} */
+  _right: Array<RangeValue>;
+  /**
+   * @param {number} value
+   * @param {boolean=} exclusive
+   */
+  left(value: number, exclusive?: boolean | undefined): void;
+  /**
+   * @param {number} value
+   * @param {boolean=} exclusive
+   */
+  right(value: number, exclusive?: boolean | undefined): void;
+  /**
+   * @param {boolean} logic is not logic applied
+   * @return {string} "smart" range string representation
+   */
+  format(logic?: boolean): string;
+}
+declare namespace Range {
+  export { RangeValue, RangeValueCallback };
+}
+type RangeValue = [number, boolean];
+type RangeValueCallback = (rangeValue: [number, boolean]) => boolean;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/util/hints.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/util/hints.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/util/hints.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,6 @@
+export function stringHints(schema: Schema, logic: boolean): string[];
+export function numberHints(schema: Schema, logic: boolean): string[];
+export type Schema =
+  | (import('json-schema').JSONSchema4 & import('../validate').Extend)
+  | (import('json-schema').JSONSchema6 & import('../validate').Extend)
+  | (import('json-schema').JSONSchema7 & import('../validate').Extend);
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/validate.d.ts
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/validate.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/declarations/validate.d.ts	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,44 @@
+export default validate;
+export type JSONSchema4 = import('json-schema').JSONSchema4;
+export type JSONSchema6 = import('json-schema').JSONSchema6;
+export type JSONSchema7 = import('json-schema').JSONSchema7;
+export type ErrorObject = Ajv.ErrorObject;
+export type Extend = {
+  formatMinimum?: number | undefined;
+  formatMaximum?: number | undefined;
+  formatExclusiveMinimum?: boolean | undefined;
+  formatExclusiveMaximum?: boolean | undefined;
+};
+export type Schema =
+  | (import('json-schema').JSONSchema4 & Extend)
+  | (import('json-schema').JSONSchema6 & Extend)
+  | (import('json-schema').JSONSchema7 & Extend);
+export type SchemaUtilErrorObject = Ajv.ErrorObject & {
+  children?: Ajv.ErrorObject[] | undefined;
+};
+export type PostFormatter = (
+  formattedError: string,
+  error: SchemaUtilErrorObject
+) => string;
+export type ValidationErrorConfiguration = {
+  name?: string | undefined;
+  baseDataPath?: string | undefined;
+  postFormatter?: PostFormatter | undefined;
+};
+/**
+ * @param {Schema} schema
+ * @param {Array<object> | object} options
+ * @param {ValidationErrorConfiguration=} configuration
+ * @returns {void}
+ */
+declare function validate(
+  schema: Schema,
+  options: Array<object> | object,
+  configuration?: ValidationErrorConfiguration | undefined
+): void;
+declare namespace validate {
+  export { ValidationError };
+  export { ValidationError as ValidateError };
+}
+import Ajv from 'ajv';
+import ValidationError from './ValidationError';
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/ValidationError.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/ValidationError.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/ValidationError.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,1261 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = void 0;
+
+const {
+  stringHints,
+  numberHints
+} = require('./util/hints');
+/** @typedef {import("json-schema").JSONSchema6} JSONSchema6 */
+
+/** @typedef {import("json-schema").JSONSchema7} JSONSchema7 */
+
+/** @typedef {import("./validate").Schema} Schema */
+
+/** @typedef {import("./validate").ValidationErrorConfiguration} ValidationErrorConfiguration */
+
+/** @typedef {import("./validate").PostFormatter} PostFormatter */
+
+/** @typedef {import("./validate").SchemaUtilErrorObject} SchemaUtilErrorObject */
+
+/** @enum {number} */
+
+
+const SPECIFICITY = {
+  type: 1,
+  not: 1,
+  oneOf: 1,
+  anyOf: 1,
+  if: 1,
+  enum: 1,
+  const: 1,
+  instanceof: 1,
+  required: 2,
+  pattern: 2,
+  patternRequired: 2,
+  format: 2,
+  formatMinimum: 2,
+  formatMaximum: 2,
+  minimum: 2,
+  exclusiveMinimum: 2,
+  maximum: 2,
+  exclusiveMaximum: 2,
+  multipleOf: 2,
+  uniqueItems: 2,
+  contains: 2,
+  minLength: 2,
+  maxLength: 2,
+  minItems: 2,
+  maxItems: 2,
+  minProperties: 2,
+  maxProperties: 2,
+  dependencies: 2,
+  propertyNames: 2,
+  additionalItems: 2,
+  additionalProperties: 2,
+  absolutePath: 2
+};
+/**
+ *
+ * @param {Array<SchemaUtilErrorObject>} array
+ * @param {(item: SchemaUtilErrorObject) => number} fn
+ * @returns {Array<SchemaUtilErrorObject>}
+ */
+
+function filterMax(array, fn) {
+  const evaluatedMax = array.reduce((max, item) => Math.max(max, fn(item)), 0);
+  return array.filter(item => fn(item) === evaluatedMax);
+}
+/**
+ *
+ * @param {Array<SchemaUtilErrorObject>} children
+ * @returns {Array<SchemaUtilErrorObject>}
+ */
+
+
+function filterChildren(children) {
+  let newChildren = children;
+  newChildren = filterMax(newChildren,
+  /**
+   *
+   * @param {SchemaUtilErrorObject} error
+   * @returns {number}
+   */
+  error => error.dataPath ? error.dataPath.length : 0);
+  newChildren = filterMax(newChildren,
+  /**
+   * @param {SchemaUtilErrorObject} error
+   * @returns {number}
+   */
+  error => SPECIFICITY[
+  /** @type {keyof typeof SPECIFICITY} */
+  error.keyword] || 2);
+  return newChildren;
+}
+/**
+ * Find all children errors
+ * @param {Array<SchemaUtilErrorObject>} children
+ * @param {Array<string>} schemaPaths
+ * @return {number} returns index of first child
+ */
+
+
+function findAllChildren(children, schemaPaths) {
+  let i = children.length - 1;
+
+  const predicate =
+  /**
+   * @param {string} schemaPath
+   * @returns {boolean}
+   */
+  schemaPath => children[i].schemaPath.indexOf(schemaPath) !== 0;
+
+  while (i > -1 && !schemaPaths.every(predicate)) {
+    if (children[i].keyword === 'anyOf' || children[i].keyword === 'oneOf') {
+      const refs = extractRefs(children[i]);
+      const childrenStart = findAllChildren(children.slice(0, i), refs.concat(children[i].schemaPath));
+      i = childrenStart - 1;
+    } else {
+      i -= 1;
+    }
+  }
+
+  return i + 1;
+}
+/**
+ * Extracts all refs from schema
+ * @param {SchemaUtilErrorObject} error
+ * @return {Array<string>}
+ */
+
+
+function extractRefs(error) {
+  const {
+    schema
+  } = error;
+
+  if (!Array.isArray(schema)) {
+    return [];
+  }
+
+  return schema.map(({
+    $ref
+  }) => $ref).filter(s => s);
+}
+/**
+ * Groups children by their first level parent (assuming that error is root)
+ * @param {Array<SchemaUtilErrorObject>} children
+ * @return {Array<SchemaUtilErrorObject>}
+ */
+
+
+function groupChildrenByFirstChild(children) {
+  const result = [];
+  let i = children.length - 1;
+
+  while (i > 0) {
+    const child = children[i];
+
+    if (child.keyword === 'anyOf' || child.keyword === 'oneOf') {
+      const refs = extractRefs(child);
+      const childrenStart = findAllChildren(children.slice(0, i), refs.concat(child.schemaPath));
+
+      if (childrenStart !== i) {
+        result.push(Object.assign({}, child, {
+          children: children.slice(childrenStart, i)
+        }));
+        i = childrenStart;
+      } else {
+        result.push(child);
+      }
+    } else {
+      result.push(child);
+    }
+
+    i -= 1;
+  }
+
+  if (i === 0) {
+    result.push(children[i]);
+  }
+
+  return result.reverse();
+}
+/**
+ * @param {string} str
+ * @param {string} prefix
+ * @returns {string}
+ */
+
+
+function indent(str, prefix) {
+  return str.replace(/\n(?!$)/g, `\n${prefix}`);
+}
+/**
+ * @param {Schema} schema
+ * @returns {schema is (Schema & {not: Schema})}
+ */
+
+
+function hasNotInSchema(schema) {
+  return !!schema.not;
+}
+/**
+ * @param {Schema} schema
+ * @return {Schema}
+ */
+
+
+function findFirstTypedSchema(schema) {
+  if (hasNotInSchema(schema)) {
+    return findFirstTypedSchema(schema.not);
+  }
+
+  return schema;
+}
+/**
+ * @param {Schema} schema
+ * @return {boolean}
+ */
+
+
+function canApplyNot(schema) {
+  const typedSchema = findFirstTypedSchema(schema);
+  return likeNumber(typedSchema) || likeInteger(typedSchema) || likeString(typedSchema) || likeNull(typedSchema) || likeBoolean(typedSchema);
+}
+/**
+ * @param {any} maybeObj
+ * @returns {boolean}
+ */
+
+
+function isObject(maybeObj) {
+  return typeof maybeObj === 'object' && maybeObj !== null;
+}
+/**
+ * @param {Schema} schema
+ * @returns {boolean}
+ */
+
+
+function likeNumber(schema) {
+  return schema.type === 'number' || typeof schema.minimum !== 'undefined' || typeof schema.exclusiveMinimum !== 'undefined' || typeof schema.maximum !== 'undefined' || typeof schema.exclusiveMaximum !== 'undefined' || typeof schema.multipleOf !== 'undefined';
+}
+/**
+ * @param {Schema} schema
+ * @returns {boolean}
+ */
+
+
+function likeInteger(schema) {
+  return schema.type === 'integer' || typeof schema.minimum !== 'undefined' || typeof schema.exclusiveMinimum !== 'undefined' || typeof schema.maximum !== 'undefined' || typeof schema.exclusiveMaximum !== 'undefined' || typeof schema.multipleOf !== 'undefined';
+}
+/**
+ * @param {Schema} schema
+ * @returns {boolean}
+ */
+
+
+function likeString(schema) {
+  return schema.type === 'string' || typeof schema.minLength !== 'undefined' || typeof schema.maxLength !== 'undefined' || typeof schema.pattern !== 'undefined' || typeof schema.format !== 'undefined' || typeof schema.formatMinimum !== 'undefined' || typeof schema.formatMaximum !== 'undefined';
+}
+/**
+ * @param {Schema} schema
+ * @returns {boolean}
+ */
+
+
+function likeBoolean(schema) {
+  return schema.type === 'boolean';
+}
+/**
+ * @param {Schema} schema
+ * @returns {boolean}
+ */
+
+
+function likeArray(schema) {
+  return schema.type === 'array' || typeof schema.minItems === 'number' || typeof schema.maxItems === 'number' || typeof schema.uniqueItems !== 'undefined' || typeof schema.items !== 'undefined' || typeof schema.additionalItems !== 'undefined' || typeof schema.contains !== 'undefined';
+}
+/**
+ * @param {Schema & {patternRequired?: Array<string>}} schema
+ * @returns {boolean}
+ */
+
+
+function likeObject(schema) {
+  return schema.type === 'object' || typeof schema.minProperties !== 'undefined' || typeof schema.maxProperties !== 'undefined' || typeof schema.required !== 'undefined' || typeof schema.properties !== 'undefined' || typeof schema.patternProperties !== 'undefined' || typeof schema.additionalProperties !== 'undefined' || typeof schema.dependencies !== 'undefined' || typeof schema.propertyNames !== 'undefined' || typeof schema.patternRequired !== 'undefined';
+}
+/**
+ * @param {Schema} schema
+ * @returns {boolean}
+ */
+
+
+function likeNull(schema) {
+  return schema.type === 'null';
+}
+/**
+ * @param {string} type
+ * @returns {string}
+ */
+
+
+function getArticle(type) {
+  if (/^[aeiou]/i.test(type)) {
+    return 'an';
+  }
+
+  return 'a';
+}
+/**
+ * @param {Schema=} schema
+ * @returns {string}
+ */
+
+
+function getSchemaNonTypes(schema) {
+  if (!schema) {
+    return '';
+  }
+
+  if (!schema.type) {
+    if (likeNumber(schema) || likeInteger(schema)) {
+      return ' | should be any non-number';
+    }
+
+    if (likeString(schema)) {
+      return ' | should be any non-string';
+    }
+
+    if (likeArray(schema)) {
+      return ' | should be any non-array';
+    }
+
+    if (likeObject(schema)) {
+      return ' | should be any non-object';
+    }
+  }
+
+  return '';
+}
+/**
+ * @param {Array<string>} hints
+ * @returns {string}
+ */
+
+
+function formatHints(hints) {
+  return hints.length > 0 ? `(${hints.join(', ')})` : '';
+}
+/**
+ * @param {Schema} schema
+ * @param {boolean} logic
+ * @returns {string[]}
+ */
+
+
+function getHints(schema, logic) {
+  if (likeNumber(schema) || likeInteger(schema)) {
+    return numberHints(schema, logic);
+  } else if (likeString(schema)) {
+    return stringHints(schema, logic);
+  }
+
+  return [];
+}
+
+class ValidationError extends Error {
+  /**
+   * @param {Array<SchemaUtilErrorObject>} errors
+   * @param {Schema} schema
+   * @param {ValidationErrorConfiguration} configuration
+   */
+  constructor(errors, schema, configuration = {}) {
+    super();
+    /** @type {string} */
+
+    this.name = 'ValidationError';
+    /** @type {Array<SchemaUtilErrorObject>} */
+
+    this.errors = errors;
+    /** @type {Schema} */
+
+    this.schema = schema;
+    let headerNameFromSchema;
+    let baseDataPathFromSchema;
+
+    if (schema.title && (!configuration.name || !configuration.baseDataPath)) {
+      const splittedTitleFromSchema = schema.title.match(/^(.+) (.+)$/);
+
+      if (splittedTitleFromSchema) {
+        if (!configuration.name) {
+          [, headerNameFromSchema] = splittedTitleFromSchema;
+        }
+
+        if (!configuration.baseDataPath) {
+          [,, baseDataPathFromSchema] = splittedTitleFromSchema;
+        }
+      }
+    }
+    /** @type {string} */
+
+
+    this.headerName = configuration.name || headerNameFromSchema || 'Object';
+    /** @type {string} */
+
+    this.baseDataPath = configuration.baseDataPath || baseDataPathFromSchema || 'configuration';
+    /** @type {PostFormatter | null} */
+
+    this.postFormatter = configuration.postFormatter || null;
+    const header = `Invalid ${this.baseDataPath} object. ${this.headerName} has been initialized using ${getArticle(this.baseDataPath)} ${this.baseDataPath} object that does not match the API schema.\n`;
+    /** @type {string} */
+
+    this.message = `${header}${this.formatValidationErrors(errors)}`;
+    Error.captureStackTrace(this, this.constructor);
+  }
+  /**
+   * @param {string} path
+   * @returns {Schema}
+   */
+
+
+  getSchemaPart(path) {
+    const newPath = path.split('/');
+    let schemaPart = this.schema;
+
+    for (let i = 1; i < newPath.length; i++) {
+      const inner = schemaPart[
+      /** @type {keyof Schema} */
+      newPath[i]];
+
+      if (!inner) {
+        break;
+      }
+
+      schemaPart = inner;
+    }
+
+    return schemaPart;
+  }
+  /**
+   * @param {Schema} schema
+   * @param {boolean} logic
+   * @param {Array<Object>} prevSchemas
+   * @returns {string}
+   */
+
+
+  formatSchema(schema, logic = true, prevSchemas = []) {
+    let newLogic = logic;
+
+    const formatInnerSchema =
+    /**
+     *
+     * @param {Object} innerSchema
+     * @param {boolean=} addSelf
+     * @returns {string}
+     */
+    (innerSchema, addSelf) => {
+      if (!addSelf) {
+        return this.formatSchema(innerSchema, newLogic, prevSchemas);
+      }
+
+      if (prevSchemas.includes(innerSchema)) {
+        return '(recursive)';
+      }
+
+      return this.formatSchema(innerSchema, newLogic, prevSchemas.concat(schema));
+    };
+
+    if (hasNotInSchema(schema) && !likeObject(schema)) {
+      if (canApplyNot(schema.not)) {
+        newLogic = !logic;
+        return formatInnerSchema(schema.not);
+      }
+
+      const needApplyLogicHere = !schema.not.not;
+      const prefix = logic ? '' : 'non ';
+      newLogic = !logic;
+      return needApplyLogicHere ? prefix + formatInnerSchema(schema.not) : formatInnerSchema(schema.not);
+    }
+
+    if (
+    /** @type {Schema & {instanceof: string | Array<string>}} */
+    schema.instanceof) {
+      const {
+        instanceof: value
+      } =
+      /** @type {Schema & {instanceof: string | Array<string>}} */
+      schema;
+      const values = !Array.isArray(value) ? [value] : value;
+      return values.map(
+      /**
+       * @param {string} item
+       * @returns {string}
+       */
+      item => item === 'Function' ? 'function' : item).join(' | ');
+    }
+
+    if (schema.enum) {
+      return (
+        /** @type {Array<any>} */
+        schema.enum.map(item => JSON.stringify(item)).join(' | ')
+      );
+    }
+
+    if (typeof schema.const !== 'undefined') {
+      return JSON.stringify(schema.const);
+    }
+
+    if (schema.oneOf) {
+      return (
+        /** @type {Array<Schema>} */
+        schema.oneOf.map(item => formatInnerSchema(item, true)).join(' | ')
+      );
+    }
+
+    if (schema.anyOf) {
+      return (
+        /** @type {Array<Schema>} */
+        schema.anyOf.map(item => formatInnerSchema(item, true)).join(' | ')
+      );
+    }
+
+    if (schema.allOf) {
+      return (
+        /** @type {Array<Schema>} */
+        schema.allOf.map(item => formatInnerSchema(item, true)).join(' & ')
+      );
+    }
+
+    if (
+    /** @type {JSONSchema7} */
+    schema.if) {
+      const {
+        if: ifValue,
+        then: thenValue,
+        else: elseValue
+      } =
+      /** @type {JSONSchema7} */
+      schema;
+      return `${ifValue ? `if ${formatInnerSchema(ifValue)}` : ''}${thenValue ? ` then ${formatInnerSchema(thenValue)}` : ''}${elseValue ? ` else ${formatInnerSchema(elseValue)}` : ''}`;
+    }
+
+    if (schema.$ref) {
+      return formatInnerSchema(this.getSchemaPart(schema.$ref), true);
+    }
+
+    if (likeNumber(schema) || likeInteger(schema)) {
+      const [type, ...hints] = getHints(schema, logic);
+      const str = `${type}${hints.length > 0 ? ` ${formatHints(hints)}` : ''}`;
+      return logic ? str : hints.length > 0 ? `non-${type} | ${str}` : `non-${type}`;
+    }
+
+    if (likeString(schema)) {
+      const [type, ...hints] = getHints(schema, logic);
+      const str = `${type}${hints.length > 0 ? ` ${formatHints(hints)}` : ''}`;
+      return logic ? str : str === 'string' ? 'non-string' : `non-string | ${str}`;
+    }
+
+    if (likeBoolean(schema)) {
+      return `${logic ? '' : 'non-'}boolean`;
+    }
+
+    if (likeArray(schema)) {
+      // not logic already applied in formatValidationError
+      newLogic = true;
+      const hints = [];
+
+      if (typeof schema.minItems === 'number') {
+        hints.push(`should not have fewer than ${schema.minItems} item${schema.minItems > 1 ? 's' : ''}`);
+      }
+
+      if (typeof schema.maxItems === 'number') {
+        hints.push(`should not have more than ${schema.maxItems} item${schema.maxItems > 1 ? 's' : ''}`);
+      }
+
+      if (schema.uniqueItems) {
+        hints.push('should not have duplicate items');
+      }
+
+      const hasAdditionalItems = typeof schema.additionalItems === 'undefined' || Boolean(schema.additionalItems);
+      let items = '';
+
+      if (schema.items) {
+        if (Array.isArray(schema.items) && schema.items.length > 0) {
+          items = `${
+          /** @type {Array<Schema>} */
+          schema.items.map(item => formatInnerSchema(item)).join(', ')}`;
+
+          if (hasAdditionalItems) {
+            if (schema.additionalItems && isObject(schema.additionalItems) && Object.keys(schema.additionalItems).length > 0) {
+              hints.push(`additional items should be ${formatInnerSchema(schema.additionalItems)}`);
+            }
+          }
+        } else if (schema.items && Object.keys(schema.items).length > 0) {
+          // "additionalItems" is ignored
+          items = `${formatInnerSchema(schema.items)}`;
+        } else {
+          // Fallback for empty `items` value
+          items = 'any';
+        }
+      } else {
+        // "additionalItems" is ignored
+        items = 'any';
+      }
+
+      if (schema.contains && Object.keys(schema.contains).length > 0) {
+        hints.push(`should contains at least one ${this.formatSchema(schema.contains)} item`);
+      }
+
+      return `[${items}${hasAdditionalItems ? ', ...' : ''}]${hints.length > 0 ? ` (${hints.join(', ')})` : ''}`;
+    }
+
+    if (likeObject(schema)) {
+      // not logic already applied in formatValidationError
+      newLogic = true;
+      const hints = [];
+
+      if (typeof schema.minProperties === 'number') {
+        hints.push(`should not have fewer than ${schema.minProperties} ${schema.minProperties > 1 ? 'properties' : 'property'}`);
+      }
+
+      if (typeof schema.maxProperties === 'number') {
+        hints.push(`should not have more than ${schema.maxProperties} ${schema.minProperties && schema.minProperties > 1 ? 'properties' : 'property'}`);
+      }
+
+      if (schema.patternProperties && Object.keys(schema.patternProperties).length > 0) {
+        const patternProperties = Object.keys(schema.patternProperties);
+        hints.push(`additional property names should match pattern${patternProperties.length > 1 ? 's' : ''} ${patternProperties.map(pattern => JSON.stringify(pattern)).join(' | ')}`);
+      }
+
+      const properties = schema.properties ? Object.keys(schema.properties) : [];
+      const required = schema.required ? schema.required : [];
+      const allProperties = [...new Set(
+      /** @type {Array<string>} */
+      [].concat(required).concat(properties))];
+      const objectStructure = allProperties.map(property => {
+        const isRequired = required.includes(property); // Some properties need quotes, maybe we should add check
+        // Maybe we should output type of property (`foo: string`), but it is looks very unreadable
+
+        return `${property}${isRequired ? '' : '?'}`;
+      }).concat(typeof schema.additionalProperties === 'undefined' || Boolean(schema.additionalProperties) ? schema.additionalProperties && isObject(schema.additionalProperties) ? [`<key>: ${formatInnerSchema(schema.additionalProperties)}`] : ['…'] : []).join(', ');
+      const {
+        dependencies,
+        propertyNames,
+        patternRequired
+      } =
+      /** @type {Schema & {patternRequired?: Array<string>;}} */
+      schema;
+
+      if (dependencies) {
+        Object.keys(dependencies).forEach(dependencyName => {
+          const dependency = dependencies[dependencyName];
+
+          if (Array.isArray(dependency)) {
+            hints.push(`should have ${dependency.length > 1 ? 'properties' : 'property'} ${dependency.map(dep => `'${dep}'`).join(', ')} when property '${dependencyName}' is present`);
+          } else {
+            hints.push(`should be valid according to the schema ${formatInnerSchema(dependency)} when property '${dependencyName}' is present`);
+          }
+        });
+      }
+
+      if (propertyNames && Object.keys(propertyNames).length > 0) {
+        hints.push(`each property name should match format ${JSON.stringify(schema.propertyNames.format)}`);
+      }
+
+      if (patternRequired && patternRequired.length > 0) {
+        hints.push(`should have property matching pattern ${patternRequired.map(
+        /**
+         * @param {string} item
+         * @returns {string}
+         */
+        item => JSON.stringify(item))}`);
+      }
+
+      return `object {${objectStructure ? ` ${objectStructure} ` : ''}}${hints.length > 0 ? ` (${hints.join(', ')})` : ''}`;
+    }
+
+    if (likeNull(schema)) {
+      return `${logic ? '' : 'non-'}null`;
+    }
+
+    if (Array.isArray(schema.type)) {
+      // not logic already applied in formatValidationError
+      return `${schema.type.join(' | ')}`;
+    } // Fallback for unknown keywords
+    // not logic already applied in formatValidationError
+
+    /* istanbul ignore next */
+
+
+    return JSON.stringify(schema, null, 2);
+  }
+  /**
+   * @param {Schema=} schemaPart
+   * @param {(boolean | Array<string>)=} additionalPath
+   * @param {boolean=} needDot
+   * @param {boolean=} logic
+   * @returns {string}
+   */
+
+
+  getSchemaPartText(schemaPart, additionalPath, needDot = false, logic = true) {
+    if (!schemaPart) {
+      return '';
+    }
+
+    if (Array.isArray(additionalPath)) {
+      for (let i = 0; i < additionalPath.length; i++) {
+        /** @type {Schema | undefined} */
+        const inner = schemaPart[
+        /** @type {keyof Schema} */
+        additionalPath[i]];
+
+        if (inner) {
+          // eslint-disable-next-line no-param-reassign
+          schemaPart = inner;
+        } else {
+          break;
+        }
+      }
+    }
+
+    while (schemaPart.$ref) {
+      // eslint-disable-next-line no-param-reassign
+      schemaPart = this.getSchemaPart(schemaPart.$ref);
+    }
+
+    let schemaText = `${this.formatSchema(schemaPart, logic)}${needDot ? '.' : ''}`;
+
+    if (schemaPart.description) {
+      schemaText += `\n-> ${schemaPart.description}`;
+    }
+
+    return schemaText;
+  }
+  /**
+   * @param {Schema=} schemaPart
+   * @returns {string}
+   */
+
+
+  getSchemaPartDescription(schemaPart) {
+    if (!schemaPart) {
+      return '';
+    }
+
+    while (schemaPart.$ref) {
+      // eslint-disable-next-line no-param-reassign
+      schemaPart = this.getSchemaPart(schemaPart.$ref);
+    }
+
+    if (schemaPart.description) {
+      return `\n-> ${schemaPart.description}`;
+    }
+
+    return '';
+  }
+  /**
+   * @param {SchemaUtilErrorObject} error
+   * @returns {string}
+   */
+
+
+  formatValidationError(error) {
+    const {
+      keyword,
+      dataPath: errorDataPath
+    } = error;
+    const dataPath = `${this.baseDataPath}${errorDataPath}`;
+
+    switch (keyword) {
+      case 'type':
+        {
+          const {
+            parentSchema,
+            params
+          } = error; // eslint-disable-next-line default-case
+
+          switch (
+          /** @type {import("ajv").TypeParams} */
+          params.type) {
+            case 'number':
+              return `${dataPath} should be a ${this.getSchemaPartText(parentSchema, false, true)}`;
+
+            case 'integer':
+              return `${dataPath} should be a ${this.getSchemaPartText(parentSchema, false, true)}`;
+
+            case 'string':
+              return `${dataPath} should be a ${this.getSchemaPartText(parentSchema, false, true)}`;
+
+            case 'boolean':
+              return `${dataPath} should be a ${this.getSchemaPartText(parentSchema, false, true)}`;
+
+            case 'array':
+              return `${dataPath} should be an array:\n${this.getSchemaPartText(parentSchema)}`;
+
+            case 'object':
+              return `${dataPath} should be an object:\n${this.getSchemaPartText(parentSchema)}`;
+
+            case 'null':
+              return `${dataPath} should be a ${this.getSchemaPartText(parentSchema, false, true)}`;
+
+            default:
+              return `${dataPath} should be:\n${this.getSchemaPartText(parentSchema)}`;
+          }
+        }
+
+      case 'instanceof':
+        {
+          const {
+            parentSchema
+          } = error;
+          return `${dataPath} should be an instance of ${this.getSchemaPartText(parentSchema, false, true)}`;
+        }
+
+      case 'pattern':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            pattern
+          } =
+          /** @type {import("ajv").PatternParams} */
+          params;
+          return `${dataPath} should match pattern ${JSON.stringify(pattern)}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'format':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            format
+          } =
+          /** @type {import("ajv").FormatParams} */
+          params;
+          return `${dataPath} should match format ${JSON.stringify(format)}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'formatMinimum':
+      case 'formatMaximum':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            comparison,
+            limit
+          } =
+          /** @type {import("ajv").ComparisonParams} */
+          params;
+          return `${dataPath} should be ${comparison} ${JSON.stringify(limit)}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'minimum':
+      case 'maximum':
+      case 'exclusiveMinimum':
+      case 'exclusiveMaximum':
+        {
+          const {
+            parentSchema,
+            params
+          } = error;
+          const {
+            comparison,
+            limit
+          } =
+          /** @type {import("ajv").ComparisonParams} */
+          params;
+          const [, ...hints] = getHints(
+          /** @type {Schema} */
+          parentSchema, true);
+
+          if (hints.length === 0) {
+            hints.push(`should be ${comparison} ${limit}`);
+          }
+
+          return `${dataPath} ${hints.join(' ')}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'multipleOf':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            multipleOf
+          } =
+          /** @type {import("ajv").MultipleOfParams} */
+          params;
+          return `${dataPath} should be multiple of ${multipleOf}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'patternRequired':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            missingPattern
+          } =
+          /** @type {import("ajv").PatternRequiredParams} */
+          params;
+          return `${dataPath} should have property matching pattern ${JSON.stringify(missingPattern)}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'minLength':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            limit
+          } =
+          /** @type {import("ajv").LimitParams} */
+          params;
+
+          if (limit === 1) {
+            return `${dataPath} should be an non-empty string${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+          }
+
+          const length = limit - 1;
+          return `${dataPath} should be longer than ${length} character${length > 1 ? 's' : ''}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'minItems':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            limit
+          } =
+          /** @type {import("ajv").LimitParams} */
+          params;
+
+          if (limit === 1) {
+            return `${dataPath} should be an non-empty array${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+          }
+
+          return `${dataPath} should not have fewer than ${limit} items${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'minProperties':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            limit
+          } =
+          /** @type {import("ajv").LimitParams} */
+          params;
+
+          if (limit === 1) {
+            return `${dataPath} should be an non-empty object${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+          }
+
+          return `${dataPath} should not have fewer than ${limit} properties${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'maxLength':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            limit
+          } =
+          /** @type {import("ajv").LimitParams} */
+          params;
+          const max = limit + 1;
+          return `${dataPath} should be shorter than ${max} character${max > 1 ? 's' : ''}${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'maxItems':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            limit
+          } =
+          /** @type {import("ajv").LimitParams} */
+          params;
+          return `${dataPath} should not have more than ${limit} items${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'maxProperties':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            limit
+          } =
+          /** @type {import("ajv").LimitParams} */
+          params;
+          return `${dataPath} should not have more than ${limit} properties${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'uniqueItems':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            i
+          } =
+          /** @type {import("ajv").UniqueItemsParams} */
+          params;
+          return `${dataPath} should not contain the item '${error.data[i]}' twice${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'additionalItems':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            limit
+          } =
+          /** @type {import("ajv").LimitParams} */
+          params;
+          return `${dataPath} should not have more than ${limit} items${getSchemaNonTypes(parentSchema)}. These items are valid:\n${this.getSchemaPartText(parentSchema)}`;
+        }
+
+      case 'contains':
+        {
+          const {
+            parentSchema
+          } = error;
+          return `${dataPath} should contains at least one ${this.getSchemaPartText(parentSchema, ['contains'])} item${getSchemaNonTypes(parentSchema)}.`;
+        }
+
+      case 'required':
+        {
+          const {
+            parentSchema,
+            params
+          } = error;
+          const missingProperty =
+          /** @type {import("ajv").DependenciesParams} */
+          params.missingProperty.replace(/^\./, '');
+          const hasProperty = parentSchema && Boolean(
+          /** @type {Schema} */
+          parentSchema.properties &&
+          /** @type {Schema} */
+          parentSchema.properties[missingProperty]);
+          return `${dataPath} misses the property '${missingProperty}'${getSchemaNonTypes(parentSchema)}.${hasProperty ? ` Should be:\n${this.getSchemaPartText(parentSchema, ['properties', missingProperty])}` : this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'additionalProperties':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            additionalProperty
+          } =
+          /** @type {import("ajv").AdditionalPropertiesParams} */
+          params;
+          return `${dataPath} has an unknown property '${additionalProperty}'${getSchemaNonTypes(parentSchema)}. These properties are valid:\n${this.getSchemaPartText(parentSchema)}`;
+        }
+
+      case 'dependencies':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            property,
+            deps
+          } =
+          /** @type {import("ajv").DependenciesParams} */
+          params;
+          const dependencies = deps.split(',').map(
+          /**
+           * @param {string} dep
+           * @returns {string}
+           */
+          dep => `'${dep.trim()}'`).join(', ');
+          return `${dataPath} should have properties ${dependencies} when property '${property}' is present${getSchemaNonTypes(parentSchema)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'propertyNames':
+        {
+          const {
+            params,
+            parentSchema,
+            schema
+          } = error;
+          const {
+            propertyName
+          } =
+          /** @type {import("ajv").PropertyNamesParams} */
+          params;
+          return `${dataPath} property name '${propertyName}' is invalid${getSchemaNonTypes(parentSchema)}. Property names should be match format ${JSON.stringify(schema.format)}.${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      case 'enum':
+        {
+          const {
+            parentSchema
+          } = error;
+
+          if (parentSchema &&
+          /** @type {Schema} */
+          parentSchema.enum &&
+          /** @type {Schema} */
+          parentSchema.enum.length === 1) {
+            return `${dataPath} should be ${this.getSchemaPartText(parentSchema, false, true)}`;
+          }
+
+          return `${dataPath} should be one of these:\n${this.getSchemaPartText(parentSchema)}`;
+        }
+
+      case 'const':
+        {
+          const {
+            parentSchema
+          } = error;
+          return `${dataPath} should be equal to constant ${this.getSchemaPartText(parentSchema, false, true)}`;
+        }
+
+      case 'not':
+        {
+          const postfix = likeObject(
+          /** @type {Schema} */
+          error.parentSchema) ? `\n${this.getSchemaPartText(error.parentSchema)}` : '';
+          const schemaOutput = this.getSchemaPartText(error.schema, false, false, false);
+
+          if (canApplyNot(error.schema)) {
+            return `${dataPath} should be any ${schemaOutput}${postfix}.`;
+          }
+
+          const {
+            schema,
+            parentSchema
+          } = error;
+          return `${dataPath} should not be ${this.getSchemaPartText(schema, false, true)}${parentSchema && likeObject(parentSchema) ? `\n${this.getSchemaPartText(parentSchema)}` : ''}`;
+        }
+
+      case 'oneOf':
+      case 'anyOf':
+        {
+          const {
+            parentSchema,
+            children
+          } = error;
+
+          if (children && children.length > 0) {
+            if (error.schema.length === 1) {
+              const lastChild = children[children.length - 1];
+              const remainingChildren = children.slice(0, children.length - 1);
+              return this.formatValidationError(Object.assign({}, lastChild, {
+                children: remainingChildren,
+                parentSchema: Object.assign({}, parentSchema, lastChild.parentSchema)
+              }));
+            }
+
+            let filteredChildren = filterChildren(children);
+
+            if (filteredChildren.length === 1) {
+              return this.formatValidationError(filteredChildren[0]);
+            }
+
+            filteredChildren = groupChildrenByFirstChild(filteredChildren);
+            return `${dataPath} should be one of these:\n${this.getSchemaPartText(parentSchema)}\nDetails:\n${filteredChildren.map(
+            /**
+             * @param {SchemaUtilErrorObject} nestedError
+             * @returns {string}
+             */
+            nestedError => ` * ${indent(this.formatValidationError(nestedError), '   ')}`).join('\n')}`;
+          }
+
+          return `${dataPath} should be one of these:\n${this.getSchemaPartText(parentSchema)}`;
+        }
+
+      case 'if':
+        {
+          const {
+            params,
+            parentSchema
+          } = error;
+          const {
+            failingKeyword
+          } =
+          /** @type {import("ajv").IfParams} */
+          params;
+          return `${dataPath} should match "${failingKeyword}" schema:\n${this.getSchemaPartText(parentSchema, [failingKeyword])}`;
+        }
+
+      case 'absolutePath':
+        {
+          const {
+            message,
+            parentSchema
+          } = error;
+          return `${dataPath}: ${message}${this.getSchemaPartDescription(parentSchema)}`;
+        }
+
+      /* istanbul ignore next */
+
+      default:
+        {
+          const {
+            message,
+            parentSchema
+          } = error;
+          const ErrorInJSON = JSON.stringify(error, null, 2); // For `custom`, `false schema`, `$ref` keywords
+          // Fallback for unknown keywords
+
+          return `${dataPath} ${message} (${ErrorInJSON}).\n${this.getSchemaPartText(parentSchema, false)}`;
+        }
+    }
+  }
+  /**
+   * @param {Array<SchemaUtilErrorObject>} errors
+   * @returns {string}
+   */
+
+
+  formatValidationErrors(errors) {
+    return errors.map(error => {
+      let formattedError = this.formatValidationError(error);
+
+      if (this.postFormatter) {
+        formattedError = this.postFormatter(formattedError, error);
+      }
+
+      return ` - ${indent(formattedError, '   ')}`;
+    }).join('\n');
+  }
+
+}
+
+var _default = ValidationError;
+exports.default = _default;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,5 @@
+"use strict";
+
+const validate = require('./validate');
+
+module.exports = validate.default;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/keywords/absolutePath.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/keywords/absolutePath.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/keywords/absolutePath.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,93 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = void 0;
+
+/** @typedef {import("ajv").Ajv} Ajv */
+
+/** @typedef {import("ajv").ValidateFunction} ValidateFunction */
+
+/** @typedef {import("../validate").SchemaUtilErrorObject} SchemaUtilErrorObject */
+
+/**
+ * @param {string} message
+ * @param {object} schema
+ * @param {string} data
+ * @returns {SchemaUtilErrorObject}
+ */
+function errorMessage(message, schema, data) {
+  return {
+    // @ts-ignore
+    // eslint-disable-next-line no-undefined
+    dataPath: undefined,
+    // @ts-ignore
+    // eslint-disable-next-line no-undefined
+    schemaPath: undefined,
+    keyword: 'absolutePath',
+    params: {
+      absolutePath: data
+    },
+    message,
+    parentSchema: schema
+  };
+}
+/**
+ * @param {boolean} shouldBeAbsolute
+ * @param {object} schema
+ * @param {string} data
+ * @returns {SchemaUtilErrorObject}
+ */
+
+
+function getErrorFor(shouldBeAbsolute, schema, data) {
+  const message = shouldBeAbsolute ? `The provided value ${JSON.stringify(data)} is not an absolute path!` : `A relative path is expected. However, the provided value ${JSON.stringify(data)} is an absolute path!`;
+  return errorMessage(message, schema, data);
+}
+/**
+ *
+ * @param {Ajv} ajv
+ * @returns {Ajv}
+ */
+
+
+function addAbsolutePathKeyword(ajv) {
+  ajv.addKeyword('absolutePath', {
+    errors: true,
+    type: 'string',
+
+    compile(schema, parentSchema) {
+      /** @type {ValidateFunction} */
+      const callback = data => {
+        let passes = true;
+        const isExclamationMarkPresent = data.includes('!');
+
+        if (isExclamationMarkPresent) {
+          callback.errors = [errorMessage(`The provided value ${JSON.stringify(data)} contains exclamation mark (!) which is not allowed because it's reserved for loader syntax.`, parentSchema, data)];
+          passes = false;
+        } // ?:[A-Za-z]:\\ - Windows absolute path
+        // \\\\ - Windows network absolute path
+        // \/ - Unix-like OS absolute path
+
+
+        const isCorrectAbsolutePath = schema === /^(?:[A-Za-z]:(\\|\/)|\\\\|\/)/.test(data);
+
+        if (!isCorrectAbsolutePath) {
+          callback.errors = [getErrorFor(schema, parentSchema, data)];
+          passes = false;
+        }
+
+        return passes;
+      };
+
+      callback.errors = [];
+      return callback;
+    }
+
+  });
+  return ajv;
+}
+
+var _default = addAbsolutePathKeyword;
+exports.default = _default;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/util/Range.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/util/Range.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/util/Range.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,163 @@
+"use strict";
+
+/**
+ * @typedef {[number, boolean]} RangeValue
+ */
+
+/**
+ * @callback RangeValueCallback
+ * @param {RangeValue} rangeValue
+ * @returns {boolean}
+ */
+class Range {
+  /**
+   * @param {"left" | "right"} side
+   * @param {boolean} exclusive
+   * @returns {">" | ">=" | "<" | "<="}
+   */
+  static getOperator(side, exclusive) {
+    if (side === 'left') {
+      return exclusive ? '>' : '>=';
+    }
+
+    return exclusive ? '<' : '<=';
+  }
+  /**
+   * @param {number} value
+   * @param {boolean} logic is not logic applied
+   * @param {boolean} exclusive is range exclusive
+   * @returns {string}
+   */
+
+
+  static formatRight(value, logic, exclusive) {
+    if (logic === false) {
+      return Range.formatLeft(value, !logic, !exclusive);
+    }
+
+    return `should be ${Range.getOperator('right', exclusive)} ${value}`;
+  }
+  /**
+   * @param {number} value
+   * @param {boolean} logic is not logic applied
+   * @param {boolean} exclusive is range exclusive
+   * @returns {string}
+   */
+
+
+  static formatLeft(value, logic, exclusive) {
+    if (logic === false) {
+      return Range.formatRight(value, !logic, !exclusive);
+    }
+
+    return `should be ${Range.getOperator('left', exclusive)} ${value}`;
+  }
+  /**
+   * @param {number} start left side value
+   * @param {number} end right side value
+   * @param {boolean} startExclusive is range exclusive from left side
+   * @param {boolean} endExclusive is range exclusive from right side
+   * @param {boolean} logic is not logic applied
+   * @returns {string}
+   */
+
+
+  static formatRange(start, end, startExclusive, endExclusive, logic) {
+    let result = 'should be';
+    result += ` ${Range.getOperator(logic ? 'left' : 'right', logic ? startExclusive : !startExclusive)} ${start} `;
+    result += logic ? 'and' : 'or';
+    result += ` ${Range.getOperator(logic ? 'right' : 'left', logic ? endExclusive : !endExclusive)} ${end}`;
+    return result;
+  }
+  /**
+   * @param {Array<RangeValue>} values
+   * @param {boolean} logic is not logic applied
+   * @return {RangeValue} computed value and it's exclusive flag
+   */
+
+
+  static getRangeValue(values, logic) {
+    let minMax = logic ? Infinity : -Infinity;
+    let j = -1;
+    const predicate = logic ?
+    /** @type {RangeValueCallback} */
+    ([value]) => value <= minMax :
+    /** @type {RangeValueCallback} */
+    ([value]) => value >= minMax;
+
+    for (let i = 0; i < values.length; i++) {
+      if (predicate(values[i])) {
+        [minMax] = values[i];
+        j = i;
+      }
+    }
+
+    if (j > -1) {
+      return values[j];
+    }
+
+    return [Infinity, true];
+  }
+
+  constructor() {
+    /** @type {Array<RangeValue>} */
+    this._left = [];
+    /** @type {Array<RangeValue>} */
+
+    this._right = [];
+  }
+  /**
+   * @param {number} value
+   * @param {boolean=} exclusive
+   */
+
+
+  left(value, exclusive = false) {
+    this._left.push([value, exclusive]);
+  }
+  /**
+   * @param {number} value
+   * @param {boolean=} exclusive
+   */
+
+
+  right(value, exclusive = false) {
+    this._right.push([value, exclusive]);
+  }
+  /**
+   * @param {boolean} logic is not logic applied
+   * @return {string} "smart" range string representation
+   */
+
+
+  format(logic = true) {
+    const [start, leftExclusive] = Range.getRangeValue(this._left, logic);
+    const [end, rightExclusive] = Range.getRangeValue(this._right, !logic);
+
+    if (!Number.isFinite(start) && !Number.isFinite(end)) {
+      return '';
+    }
+
+    const realStart = leftExclusive ? start + 1 : start;
+    const realEnd = rightExclusive ? end - 1 : end; // e.g. 5 < x < 7, 5 < x <= 6, 6 <= x <= 6
+
+    if (realStart === realEnd) {
+      return `should be ${logic ? '' : '!'}= ${realStart}`;
+    } // e.g. 4 < x < ∞
+
+
+    if (Number.isFinite(start) && !Number.isFinite(end)) {
+      return Range.formatLeft(start, logic, leftExclusive);
+    } // e.g. ∞ < x < 4
+
+
+    if (!Number.isFinite(start) && Number.isFinite(end)) {
+      return Range.formatRight(end, logic, rightExclusive);
+    }
+
+    return Range.formatRange(start, end, leftExclusive, rightExclusive, logic);
+  }
+
+}
+
+module.exports = Range;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/util/hints.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/util/hints.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/util/hints.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,105 @@
+"use strict";
+
+const Range = require('./Range');
+/** @typedef {import("../validate").Schema} Schema */
+
+/**
+ * @param {Schema} schema
+ * @param {boolean} logic
+ * @return {string[]}
+ */
+
+
+module.exports.stringHints = function stringHints(schema, logic) {
+  const hints = [];
+  let type = 'string';
+  const currentSchema = { ...schema
+  };
+
+  if (!logic) {
+    const tmpLength = currentSchema.minLength;
+    const tmpFormat = currentSchema.formatMinimum;
+    const tmpExclusive = currentSchema.formatExclusiveMaximum;
+    currentSchema.minLength = currentSchema.maxLength;
+    currentSchema.maxLength = tmpLength;
+    currentSchema.formatMinimum = currentSchema.formatMaximum;
+    currentSchema.formatMaximum = tmpFormat;
+    currentSchema.formatExclusiveMaximum = !currentSchema.formatExclusiveMinimum;
+    currentSchema.formatExclusiveMinimum = !tmpExclusive;
+  }
+
+  if (typeof currentSchema.minLength === 'number') {
+    if (currentSchema.minLength === 1) {
+      type = 'non-empty string';
+    } else {
+      const length = Math.max(currentSchema.minLength - 1, 0);
+      hints.push(`should be longer than ${length} character${length > 1 ? 's' : ''}`);
+    }
+  }
+
+  if (typeof currentSchema.maxLength === 'number') {
+    if (currentSchema.maxLength === 0) {
+      type = 'empty string';
+    } else {
+      const length = currentSchema.maxLength + 1;
+      hints.push(`should be shorter than ${length} character${length > 1 ? 's' : ''}`);
+    }
+  }
+
+  if (currentSchema.pattern) {
+    hints.push(`should${logic ? '' : ' not'} match pattern ${JSON.stringify(currentSchema.pattern)}`);
+  }
+
+  if (currentSchema.format) {
+    hints.push(`should${logic ? '' : ' not'} match format ${JSON.stringify(currentSchema.format)}`);
+  }
+
+  if (currentSchema.formatMinimum) {
+    hints.push(`should be ${currentSchema.formatExclusiveMinimum ? '>' : '>='} ${JSON.stringify(currentSchema.formatMinimum)}`);
+  }
+
+  if (currentSchema.formatMaximum) {
+    hints.push(`should be ${currentSchema.formatExclusiveMaximum ? '<' : '<='} ${JSON.stringify(currentSchema.formatMaximum)}`);
+  }
+
+  return [type].concat(hints);
+};
+/**
+ * @param {Schema} schema
+ * @param {boolean} logic
+ * @return {string[]}
+ */
+
+
+module.exports.numberHints = function numberHints(schema, logic) {
+  const hints = [schema.type === 'integer' ? 'integer' : 'number'];
+  const range = new Range();
+
+  if (typeof schema.minimum === 'number') {
+    range.left(schema.minimum);
+  }
+
+  if (typeof schema.exclusiveMinimum === 'number') {
+    range.left(schema.exclusiveMinimum, true);
+  }
+
+  if (typeof schema.maximum === 'number') {
+    range.right(schema.maximum);
+  }
+
+  if (typeof schema.exclusiveMaximum === 'number') {
+    range.right(schema.exclusiveMaximum, true);
+  }
+
+  const rangeFormat = range.format(logic);
+
+  if (rangeFormat) {
+    hints.push(rangeFormat);
+  }
+
+  if (typeof schema.multipleOf === 'number') {
+    hints.push(`should${logic ? '' : ' not'} be multiple of ${schema.multipleOf}`);
+  }
+
+  return hints;
+};
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/validate.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/validate.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/dist/validate.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,160 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+  value: true
+});
+exports.default = void 0;
+
+var _ajv = _interopRequireDefault(require("ajv"));
+
+var _ajvKeywords = _interopRequireDefault(require("ajv-keywords"));
+
+var _absolutePath = _interopRequireDefault(require("./keywords/absolutePath"));
+
+var _ValidationError = _interopRequireDefault(require("./ValidationError"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+/** @typedef {import("json-schema").JSONSchema4} JSONSchema4 */
+
+/** @typedef {import("json-schema").JSONSchema6} JSONSchema6 */
+
+/** @typedef {import("json-schema").JSONSchema7} JSONSchema7 */
+
+/** @typedef {import("ajv").ErrorObject} ErrorObject */
+
+/**
+ * @typedef {Object} Extend
+ * @property {number=} formatMinimum
+ * @property {number=} formatMaximum
+ * @property {boolean=} formatExclusiveMinimum
+ * @property {boolean=} formatExclusiveMaximum
+ */
+
+/** @typedef {(JSONSchema4 | JSONSchema6 | JSONSchema7) & Extend} Schema */
+
+/** @typedef {ErrorObject & { children?: Array<ErrorObject>}} SchemaUtilErrorObject */
+
+/**
+ * @callback PostFormatter
+ * @param {string} formattedError
+ * @param {SchemaUtilErrorObject} error
+ * @returns {string}
+ */
+
+/**
+ * @typedef {Object} ValidationErrorConfiguration
+ * @property {string=} name
+ * @property {string=} baseDataPath
+ * @property {PostFormatter=} postFormatter
+ */
+const ajv = new _ajv.default({
+  allErrors: true,
+  verbose: true,
+  $data: true
+});
+(0, _ajvKeywords.default)(ajv, ['instanceof', 'formatMinimum', 'formatMaximum', 'patternRequired']); // Custom keywords
+
+(0, _absolutePath.default)(ajv);
+/**
+ * @param {Schema} schema
+ * @param {Array<object> | object} options
+ * @param {ValidationErrorConfiguration=} configuration
+ * @returns {void}
+ */
+
+function validate(schema, options, configuration) {
+  let errors = [];
+
+  if (Array.isArray(options)) {
+    errors = Array.from(options, nestedOptions => validateObject(schema, nestedOptions));
+    errors.forEach((list, idx) => {
+      const applyPrefix =
+      /**
+       * @param {SchemaUtilErrorObject} error
+       */
+      error => {
+        // eslint-disable-next-line no-param-reassign
+        error.dataPath = `[${idx}]${error.dataPath}`;
+
+        if (error.children) {
+          error.children.forEach(applyPrefix);
+        }
+      };
+
+      list.forEach(applyPrefix);
+    });
+    errors = errors.reduce((arr, items) => {
+      arr.push(...items);
+      return arr;
+    }, []);
+  } else {
+    errors = validateObject(schema, options);
+  }
+
+  if (errors.length > 0) {
+    throw new _ValidationError.default(errors, schema, configuration);
+  }
+}
+/**
+ * @param {Schema} schema
+ * @param {Array<object> | object} options
+ * @returns {Array<SchemaUtilErrorObject>}
+ */
+
+
+function validateObject(schema, options) {
+  const compiledSchema = ajv.compile(schema);
+  const valid = compiledSchema(options);
+  if (valid) return [];
+  return compiledSchema.errors ? filterErrors(compiledSchema.errors) : [];
+}
+/**
+ * @param {Array<ErrorObject>} errors
+ * @returns {Array<SchemaUtilErrorObject>}
+ */
+
+
+function filterErrors(errors) {
+  /** @type {Array<SchemaUtilErrorObject>} */
+  let newErrors = [];
+
+  for (const error of
+  /** @type {Array<SchemaUtilErrorObject>} */
+  errors) {
+    const {
+      dataPath
+    } = error;
+    /** @type {Array<SchemaUtilErrorObject>} */
+
+    let children = [];
+    newErrors = newErrors.filter(oldError => {
+      if (oldError.dataPath.includes(dataPath)) {
+        if (oldError.children) {
+          children = children.concat(oldError.children.slice(0));
+        } // eslint-disable-next-line no-undefined, no-param-reassign
+
+
+        oldError.children = undefined;
+        children.push(oldError);
+        return false;
+      }
+
+      return true;
+    });
+
+    if (children.length) {
+      error.children = children;
+    }
+
+    newErrors.push(error);
+  }
+
+  return newErrors;
+} // TODO change after resolve https://github.com/microsoft/TypeScript/issues/34994
+
+
+validate.ValidationError = _ValidationError.default;
+validate.ValidateError = _ValidationError.default;
+var _default = validate;
+exports.default = _default;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/package.json
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,76 @@
+{
+  "name": "schema-utils",
+  "version": "2.7.0",
+  "description": "webpack Validation Utils",
+  "license": "MIT",
+  "repository": "webpack/schema-utils",
+  "author": "webpack Contrib (https://github.com/webpack-contrib)",
+  "homepage": "https://github.com/webpack/schema-utils",
+  "bugs": "https://github.com/webpack/schema-utils/issues",
+  "funding": {
+    "type": "opencollective",
+    "url": "https://opencollective.com/webpack"
+  },
+  "main": "dist/index.js",
+  "types": "declarations/index.d.ts",
+  "engines": {
+    "node": ">= 8.9.0"
+  },
+  "scripts": {
+    "start": "npm run build -- -w",
+    "clean": "del-cli dist declarations",
+    "prebuild": "npm run clean",
+    "build:types": "tsc --declaration --emitDeclarationOnly --outDir declarations && prettier \"declarations/**/*.ts\" --write",
+    "build:code": "cross-env NODE_ENV=production babel src -d dist --copy-files",
+    "build": "npm-run-all -p \"build:**\"",
+    "commitlint": "commitlint --from=master",
+    "security": "npm audit",
+    "lint:prettier": "prettier \"{**/*,*}.{js,json,md,yml,css,ts}\" --list-different",
+    "lint:js": "eslint --cache .",
+    "lint:types": "tsc --pretty --noEmit",
+    "lint": "npm-run-all -l -p \"lint:**\"",
+    "test:only": "cross-env NODE_ENV=test jest",
+    "test:watch": "npm run test:only -- --watch",
+    "test:coverage": "npm run test:only -- --collectCoverageFrom=\"src/**/*.js\" --coverage",
+    "pretest": "npm run lint",
+    "test": "npm run test:coverage",
+    "prepare": "npm run build",
+    "release": "standard-version",
+    "defaults": "webpack-defaults"
+  },
+  "files": [
+    "dist",
+    "declarations"
+  ],
+  "dependencies": {
+    "ajv": "^6.12.2",
+    "ajv-keywords": "^3.4.1",
+    "@types/json-schema": "^7.0.4"
+  },
+  "devDependencies": {
+    "@babel/cli": "^7.10.1",
+    "@babel/core": "^7.10.1",
+    "@babel/preset-env": "^7.10.1",
+    "@commitlint/cli": "^8.3.5",
+    "@commitlint/config-conventional": "^8.3.4",
+    "@webpack-contrib/defaults": "^6.3.0",
+    "@webpack-contrib/eslint-config-webpack": "^3.0.0",
+    "babel-jest": "^25.5.1",
+    "cross-env": "^6.0.3",
+    "del": "^5.1.0",
+    "del-cli": "^3.0.1",
+    "eslint": "^6.8.0",
+    "eslint-config-prettier": "^6.11.0",
+    "eslint-plugin-import": "^2.20.2",
+    "husky": "^4.2.5",
+    "jest": "^25.5.4",
+    "lint-staged": "^10.2.7",
+    "npm-run-all": "^4.1.5",
+    "prettier": "^1.19.1",
+    "standard-version": "^8.0.0",
+    "typescript": "^3.9.3"
+  },
+  "keywords": [
+    "webpack"
+  ]
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/LICENSE
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/LICENSE	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,21 @@
+The MIT License
+
+Copyright (c) Tobias Koppers @sokra
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/README.md
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/README.md	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,294 @@
+# Tapable
+
+The tapable package expose many Hook classes, which can be used to create hooks for plugins.
+
+``` javascript
+const {
+	SyncHook,
+	SyncBailHook,
+	SyncWaterfallHook,
+	SyncLoopHook,
+	AsyncParallelHook,
+	AsyncParallelBailHook,
+	AsyncSeriesHook,
+	AsyncSeriesBailHook,
+	AsyncSeriesWaterfallHook
+ } = require("tapable");
+```
+
+## Installation
+
+``` shell
+npm install --save tapable
+```
+
+## Usage
+
+All Hook constructors take one optional argument, which is a list of argument names as strings.
+
+``` js
+const hook = new SyncHook(["arg1", "arg2", "arg3"]);
+```
+
+The best practice is to expose all hooks of a class in a `hooks` property:
+
+``` js
+class Car {
+	constructor() {
+		this.hooks = {
+			accelerate: new SyncHook(["newSpeed"]),
+			brake: new SyncHook(),
+			calculateRoutes: new AsyncParallelHook(["source", "target", "routesList"])
+		};
+	}
+
+	/* ... */
+}
+```
+
+Other people can now use these hooks:
+
+``` js
+const myCar = new Car();
+
+// Use the tap method to add a consument
+myCar.hooks.brake.tap("WarningLampPlugin", () => warningLamp.on());
+```
+
+It's required to pass a name to identify the plugin/reason.
+
+You may receive arguments:
+
+``` js
+myCar.hooks.accelerate.tap("LoggerPlugin", newSpeed => console.log(`Accelerating to ${newSpeed}`));
+```
+
+For sync hooks, `tap` is the only valid method to add a plugin. Async hooks also support async plugins:
+
+``` js
+myCar.hooks.calculateRoutes.tapPromise("GoogleMapsPlugin", (source, target, routesList) => {
+	// return a promise
+	return google.maps.findRoute(source, target).then(route => {
+		routesList.add(route);
+	});
+});
+myCar.hooks.calculateRoutes.tapAsync("BingMapsPlugin", (source, target, routesList, callback) => {
+	bing.findRoute(source, target, (err, route) => {
+		if(err) return callback(err);
+		routesList.add(route);
+		// call the callback
+		callback();
+	});
+});
+
+// You can still use sync plugins
+myCar.hooks.calculateRoutes.tap("CachedRoutesPlugin", (source, target, routesList) => {
+	const cachedRoute = cache.get(source, target);
+	if(cachedRoute)
+		routesList.add(cachedRoute);
+})
+```
+
+The class declaring these hooks need to call them:
+
+``` js
+class Car {
+	/* ... */
+
+	setSpeed(newSpeed) {
+		this.hooks.accelerate.call(newSpeed);
+	}
+
+	useNavigationSystemPromise(source, target) {
+		const routesList = new List();
+		return this.hooks.calculateRoutes.promise(source, target, routesList).then(() => {
+			return routesList.getRoutes();
+		});
+	}
+
+	useNavigationSystemAsync(source, target, callback) {
+		const routesList = new List();
+		this.hooks.calculateRoutes.callAsync(source, target, routesList, err => {
+			if(err) return callback(err);
+			callback(null, routesList.getRoutes());
+		});
+	}
+}
+```
+
+The Hook will compile a method with the most efficient way of running your plugins. It generates code depending on:
+* The number of registered plugins (none, one, many)
+* The kind of registered plugins (sync, async, promise)
+* The used call method (sync, async, promise)
+* The number of arguments
+* Whether interception is used
+
+This ensures fastest possible execution.
+
+## Hook types
+
+Each hook can be tapped with one or several functions. How they are executed depends on the hook type:
+
+* Basic hook (without “Waterfall”, “Bail” or “Loop” in its name). This hook simply calls every function it tapped in a row.
+
+* __Waterfall__. A waterfall hook also calls each tapped function in a row. Unlike the basic hook, it passes a return value from each function to the next function.
+
+* __Bail__. A bail hook allows exiting early. When any of the tapped function returns anything, the bail hook will stop executing the remaining ones.
+
+* __Loop__. TODO
+
+Additionally, hooks can be synchronous or asynchronous. To reflect this, there’re “Sync”, “AsyncSeries”, and “AsyncParallel” hook classes:
+
+* __Sync__. A sync hook can only be tapped with synchronous functions (using `myHook.tap()`).
+
+* __AsyncSeries__. An async-series hook can be tapped with synchronous, callback-based and promise-based functions (using `myHook.tap()`, `myHook.tapAsync()` and `myHook.tapPromise()`). They call each async method in a row.
+
+* __AsyncParallel__. An async-parallel hook can also be tapped with synchronous, callback-based and promise-based functions (using `myHook.tap()`, `myHook.tapAsync()` and `myHook.tapPromise()`). However, they run each async method in parallel.
+
+The hook type is reflected in its class name. E.g., `AsyncSeriesWaterfallHook` allows asynchronous functions and runs them in series, passing each function’s return value into the next function.
+
+
+## Interception
+
+All Hooks offer an additional interception API:
+
+``` js
+myCar.hooks.calculateRoutes.intercept({
+	call: (source, target, routesList) => {
+		console.log("Starting to calculate routes");
+	},
+	register: (tapInfo) => {
+		// tapInfo = { type: "promise", name: "GoogleMapsPlugin", fn: ... }
+		console.log(`${tapInfo.name} is doing its job`);
+		return tapInfo; // may return a new tapInfo object
+	}
+})
+```
+
+**call**: `(...args) => void` Adding `call` to your interceptor will trigger when hooks are triggered. You have access to the hooks arguments.
+
+**tap**: `(tap: Tap) => void` Adding `tap` to your interceptor will trigger when a plugin taps into a hook. Provided is the `Tap` object. `Tap` object can't be changed.
+
+**loop**: `(...args) => void` Adding `loop` to your interceptor will trigger for each loop of a looping hook.
+
+**register**: `(tap: Tap) => Tap | undefined` Adding `register` to your interceptor will trigger for each added `Tap` and allows to modify it.
+
+## Context
+
+Plugins and interceptors can opt-in to access an optional `context` object, which can be used to pass arbitrary values to subsequent plugins and interceptors.
+
+``` js
+myCar.hooks.accelerate.intercept({
+	context: true,
+	tap: (context, tapInfo) => {
+		// tapInfo = { type: "sync", name: "NoisePlugin", fn: ... }
+		console.log(`${tapInfo.name} is doing it's job`);
+
+		// `context` starts as an empty object if at least one plugin uses `context: true`.
+		// If no plugins use `context: true`, then `context` is undefined.
+		if (context) {
+			// Arbitrary properties can be added to `context`, which plugins can then access.
+			context.hasMuffler = true;
+		}
+	}
+});
+
+myCar.hooks.accelerate.tap({
+	name: "NoisePlugin",
+	context: true
+}, (context, newSpeed) => {
+	if (context && context.hasMuffler) {
+		console.log("Silence...");
+	} else {
+		console.log("Vroom!");
+	}
+});
+```
+
+## HookMap
+
+A HookMap is a helper class for a Map with Hooks
+
+``` js
+const keyedHook = new HookMap(key => new SyncHook(["arg"]))
+```
+
+``` js
+keyedHook.tap("some-key", "MyPlugin", (arg) => { /* ... */ });
+keyedHook.tapAsync("some-key", "MyPlugin", (arg, callback) => { /* ... */ });
+keyedHook.tapPromise("some-key", "MyPlugin", (arg) => { /* ... */ });
+```
+
+``` js
+const hook = keyedHook.get("some-key");
+if(hook !== undefined) {
+	hook.callAsync("arg", err => { /* ... */ });
+}
+```
+
+## Hook/HookMap interface
+
+Public:
+
+``` ts
+interface Hook {
+	tap: (name: string | Tap, fn: (context?, ...args) => Result) => void,
+	tapAsync: (name: string | Tap, fn: (context?, ...args, callback: (err, result: Result) => void) => void) => void,
+	tapPromise: (name: string | Tap, fn: (context?, ...args) => Promise<Result>) => void,
+	intercept: (interceptor: HookInterceptor) => void
+}
+
+interface HookInterceptor {
+	call: (context?, ...args) => void,
+	loop: (context?, ...args) => void,
+	tap: (context?, tap: Tap) => void,
+	register: (tap: Tap) => Tap,
+	context: boolean
+}
+
+interface HookMap {
+	for: (key: any) => Hook,
+	tap: (key: any, name: string | Tap, fn: (context?, ...args) => Result) => void,
+	tapAsync: (key: any, name: string | Tap, fn: (context?, ...args, callback: (err, result: Result) => void) => void) => void,
+	tapPromise: (key: any, name: string | Tap, fn: (context?, ...args) => Promise<Result>) => void,
+	intercept: (interceptor: HookMapInterceptor) => void
+}
+
+interface HookMapInterceptor {
+	factory: (key: any, hook: Hook) => Hook
+}
+
+interface Tap {
+	name: string,
+	type: string
+	fn: Function,
+	stage: number,
+	context: boolean
+}
+```
+
+Protected (only for the class containing the hook):
+
+``` ts
+interface Hook {
+	isUsed: () => boolean,
+	call: (...args) => Result,
+	promise: (...args) => Promise<Result>,
+	callAsync: (...args, callback: (err, result: Result) => void) => void,
+}
+
+interface HookMap {
+	get: (key: any) => Hook | undefined,
+	for: (key: any) => Hook
+}
+```
+
+## MultiHook
+
+A helper Hook-like class to redirect taps to multiple other hooks:
+
+``` js
+const { MultiHook } = require("tapable");
+
+this.hooks.allHooks = new MultiHook([this.hooks.hookA, this.hooks.hookB]);
+```
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncParallelBailHook.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncParallelBailHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncParallelBailHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,80 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const Hook = require("./Hook");
+const HookCodeFactory = require("./HookCodeFactory");
+
+class AsyncParallelBailHookCodeFactory extends HookCodeFactory {
+	content({ onError, onResult, onDone }) {
+		let code = "";
+		code += `var _results = new Array(${this.options.taps.length});\n`;
+		code += "var _checkDone = () => {\n";
+		code += "for(var i = 0; i < _results.length; i++) {\n";
+		code += "var item = _results[i];\n";
+		code += "if(item === undefined) return false;\n";
+		code += "if(item.result !== undefined) {\n";
+		code += onResult("item.result");
+		code += "return true;\n";
+		code += "}\n";
+		code += "if(item.error) {\n";
+		code += onError("item.error");
+		code += "return true;\n";
+		code += "}\n";
+		code += "}\n";
+		code += "return false;\n";
+		code += "}\n";
+		code += this.callTapsParallel({
+			onError: (i, err, done, doneBreak) => {
+				let code = "";
+				code += `if(${i} < _results.length && ((_results.length = ${i +
+					1}), (_results[${i}] = { error: ${err} }), _checkDone())) {\n`;
+				code += doneBreak(true);
+				code += "} else {\n";
+				code += done();
+				code += "}\n";
+				return code;
+			},
+			onResult: (i, result, done, doneBreak) => {
+				let code = "";
+				code += `if(${i} < _results.length && (${result} !== undefined && (_results.length = ${i +
+					1}), (_results[${i}] = { result: ${result} }), _checkDone())) {\n`;
+				code += doneBreak(true);
+				code += "} else {\n";
+				code += done();
+				code += "}\n";
+				return code;
+			},
+			onTap: (i, run, done, doneBreak) => {
+				let code = "";
+				if (i > 0) {
+					code += `if(${i} >= _results.length) {\n`;
+					code += done();
+					code += "} else {\n";
+				}
+				code += run();
+				if (i > 0) code += "}\n";
+				return code;
+			},
+			onDone
+		});
+		return code;
+	}
+}
+
+const factory = new AsyncParallelBailHookCodeFactory();
+
+class AsyncParallelBailHook extends Hook {
+	compile(options) {
+		factory.setup(this, options);
+		return factory.create(options);
+	}
+}
+
+Object.defineProperties(AsyncParallelBailHook.prototype, {
+	_call: { value: undefined, configurable: true, writable: true }
+});
+
+module.exports = AsyncParallelBailHook;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncParallelHook.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncParallelHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncParallelHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,32 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const Hook = require("./Hook");
+const HookCodeFactory = require("./HookCodeFactory");
+
+class AsyncParallelHookCodeFactory extends HookCodeFactory {
+	content({ onError, onDone }) {
+		return this.callTapsParallel({
+			onError: (i, err, done, doneBreak) => onError(err) + doneBreak(true),
+			onDone
+		});
+	}
+}
+
+const factory = new AsyncParallelHookCodeFactory();
+
+class AsyncParallelHook extends Hook {
+	compile(options) {
+		factory.setup(this, options);
+		return factory.create(options);
+	}
+}
+
+Object.defineProperties(AsyncParallelHook.prototype, {
+	_call: { value: undefined, configurable: true, writable: true }
+});
+
+module.exports = AsyncParallelHook;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncSeriesBailHook.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncSeriesBailHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncSeriesBailHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,37 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const Hook = require("./Hook");
+const HookCodeFactory = require("./HookCodeFactory");
+
+class AsyncSeriesBailHookCodeFactory extends HookCodeFactory {
+	content({ onError, onResult, resultReturns, onDone }) {
+		return this.callTapsSeries({
+			onError: (i, err, next, doneBreak) => onError(err) + doneBreak(true),
+			onResult: (i, result, next) =>
+				`if(${result} !== undefined) {\n${onResult(
+					result
+				)};\n} else {\n${next()}}\n`,
+			resultReturns,
+			onDone
+		});
+	}
+}
+
+const factory = new AsyncSeriesBailHookCodeFactory();
+
+class AsyncSeriesBailHook extends Hook {
+	compile(options) {
+		factory.setup(this, options);
+		return factory.create(options);
+	}
+}
+
+Object.defineProperties(AsyncSeriesBailHook.prototype, {
+	_call: { value: undefined, configurable: true, writable: true }
+});
+
+module.exports = AsyncSeriesBailHook;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncSeriesHook.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncSeriesHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncSeriesHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,32 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const Hook = require("./Hook");
+const HookCodeFactory = require("./HookCodeFactory");
+
+class AsyncSeriesHookCodeFactory extends HookCodeFactory {
+	content({ onError, onDone }) {
+		return this.callTapsSeries({
+			onError: (i, err, next, doneBreak) => onError(err) + doneBreak(true),
+			onDone
+		});
+	}
+}
+
+const factory = new AsyncSeriesHookCodeFactory();
+
+class AsyncSeriesHook extends Hook {
+	compile(options) {
+		factory.setup(this, options);
+		return factory.create(options);
+	}
+}
+
+Object.defineProperties(AsyncSeriesHook.prototype, {
+	_call: { value: undefined, configurable: true, writable: true }
+});
+
+module.exports = AsyncSeriesHook;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncSeriesLoopHook.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncSeriesLoopHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncSeriesLoopHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,32 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const Hook = require("./Hook");
+const HookCodeFactory = require("./HookCodeFactory");
+
+class AsyncSeriesLoopHookCodeFactory extends HookCodeFactory {
+	content({ onError, onDone }) {
+		return this.callTapsLooping({
+			onError: (i, err, next, doneBreak) => onError(err) + doneBreak(true),
+			onDone
+		});
+	}
+}
+
+const factory = new AsyncSeriesLoopHookCodeFactory();
+
+class AsyncSeriesLoopHook extends Hook {
+	compile(options) {
+		factory.setup(this, options);
+		return factory.create(options);
+	}
+}
+
+Object.defineProperties(AsyncSeriesLoopHook.prototype, {
+	_call: { value: undefined, configurable: true, writable: true }
+});
+
+module.exports = AsyncSeriesLoopHook;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncSeriesWaterfallHook.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncSeriesWaterfallHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/AsyncSeriesWaterfallHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,46 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const Hook = require("./Hook");
+const HookCodeFactory = require("./HookCodeFactory");
+
+class AsyncSeriesWaterfallHookCodeFactory extends HookCodeFactory {
+	content({ onError, onResult, onDone }) {
+		return this.callTapsSeries({
+			onError: (i, err, next, doneBreak) => onError(err) + doneBreak(true),
+			onResult: (i, result, next) => {
+				let code = "";
+				code += `if(${result} !== undefined) {\n`;
+				code += `${this._args[0]} = ${result};\n`;
+				code += `}\n`;
+				code += next();
+				return code;
+			},
+			onDone: () => onResult(this._args[0])
+		});
+	}
+}
+
+const factory = new AsyncSeriesWaterfallHookCodeFactory();
+
+class AsyncSeriesWaterfallHook extends Hook {
+	constructor(args) {
+		super(args);
+		if (args.length < 1)
+			throw new Error("Waterfall hooks must have at least one argument");
+	}
+
+	compile(options) {
+		factory.setup(this, options);
+		return factory.create(options);
+	}
+}
+
+Object.defineProperties(AsyncSeriesWaterfallHook.prototype, {
+	_call: { value: undefined, configurable: true, writable: true }
+});
+
+module.exports = AsyncSeriesWaterfallHook;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/Hook.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/Hook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/Hook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,176 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+class Hook {
+	constructor(args) {
+		if (!Array.isArray(args)) args = [];
+		this._args = args;
+		this.taps = [];
+		this.interceptors = [];
+		this.call = this._call;
+		this.promise = this._promise;
+		this.callAsync = this._callAsync;
+		this._x = undefined;
+	}
+
+	compile(options) {
+		throw new Error("Abstract: should be overriden");
+	}
+
+	_createCall(type) {
+		return this.compile({
+			taps: this.taps,
+			interceptors: this.interceptors,
+			args: this._args,
+			type: type
+		});
+	}
+
+	tap(options, fn) {
+		if (typeof options === "string") options = { name: options };
+		if (typeof options !== "object" || options === null)
+			throw new Error(
+				"Invalid arguments to tap(options: Object, fn: function)"
+			);
+		options = Object.assign({ type: "sync", fn: fn }, options);
+		if (typeof options.name !== "string" || options.name === "")
+			throw new Error("Missing name for tap");
+		options = this._runRegisterInterceptors(options);
+		this._insert(options);
+	}
+
+	tapAsync(options, fn) {
+		if (typeof options === "string") options = { name: options };
+		if (typeof options !== "object" || options === null)
+			throw new Error(
+				"Invalid arguments to tapAsync(options: Object, fn: function)"
+			);
+		options = Object.assign({ type: "async", fn: fn }, options);
+		if (typeof options.name !== "string" || options.name === "")
+			throw new Error("Missing name for tapAsync");
+		options = this._runRegisterInterceptors(options);
+		this._insert(options);
+	}
+
+	tapPromise(options, fn) {
+		if (typeof options === "string") options = { name: options };
+		if (typeof options !== "object" || options === null)
+			throw new Error(
+				"Invalid arguments to tapPromise(options: Object, fn: function)"
+			);
+		options = Object.assign({ type: "promise", fn: fn }, options);
+		if (typeof options.name !== "string" || options.name === "")
+			throw new Error("Missing name for tapPromise");
+		options = this._runRegisterInterceptors(options);
+		this._insert(options);
+	}
+
+	_runRegisterInterceptors(options) {
+		for (const interceptor of this.interceptors) {
+			if (interceptor.register) {
+				const newOptions = interceptor.register(options);
+				if (newOptions !== undefined) options = newOptions;
+			}
+		}
+		return options;
+	}
+
+	withOptions(options) {
+		const mergeOptions = opt =>
+			Object.assign({}, options, typeof opt === "string" ? { name: opt } : opt);
+
+		// Prevent creating endless prototype chains
+		options = Object.assign({}, options, this._withOptions);
+		const base = this._withOptionsBase || this;
+		const newHook = Object.create(base);
+
+		(newHook.tapAsync = (opt, fn) => base.tapAsync(mergeOptions(opt), fn)),
+			(newHook.tap = (opt, fn) => base.tap(mergeOptions(opt), fn));
+		newHook.tapPromise = (opt, fn) => base.tapPromise(mergeOptions(opt), fn);
+		newHook._withOptions = options;
+		newHook._withOptionsBase = base;
+		return newHook;
+	}
+
+	isUsed() {
+		return this.taps.length > 0 || this.interceptors.length > 0;
+	}
+
+	intercept(interceptor) {
+		this._resetCompilation();
+		this.interceptors.push(Object.assign({}, interceptor));
+		if (interceptor.register) {
+			for (let i = 0; i < this.taps.length; i++)
+				this.taps[i] = interceptor.register(this.taps[i]);
+		}
+	}
+
+	_resetCompilation() {
+		this.call = this._call;
+		this.callAsync = this._callAsync;
+		this.promise = this._promise;
+	}
+
+	_insert(item) {
+		this._resetCompilation();
+		let before;
+		if (typeof item.before === "string") before = new Set([item.before]);
+		else if (Array.isArray(item.before)) {
+			before = new Set(item.before);
+		}
+		let stage = 0;
+		if (typeof item.stage === "number") stage = item.stage;
+		let i = this.taps.length;
+		while (i > 0) {
+			i--;
+			const x = this.taps[i];
+			this.taps[i + 1] = x;
+			const xStage = x.stage || 0;
+			if (before) {
+				if (before.has(x.name)) {
+					before.delete(x.name);
+					continue;
+				}
+				if (before.size > 0) {
+					continue;
+				}
+			}
+			if (xStage > stage) {
+				continue;
+			}
+			i++;
+			break;
+		}
+		this.taps[i] = item;
+	}
+}
+
+function createCompileDelegate(name, type) {
+	return function lazyCompileHook(...args) {
+		this[name] = this._createCall(type);
+		return this[name](...args);
+	};
+}
+
+Object.defineProperties(Hook.prototype, {
+	_call: {
+		value: createCompileDelegate("call", "sync"),
+		configurable: true,
+		writable: true
+	},
+	_promise: {
+		value: createCompileDelegate("promise", "promise"),
+		configurable: true,
+		writable: true
+	},
+	_callAsync: {
+		value: createCompileDelegate("callAsync", "async"),
+		configurable: true,
+		writable: true
+	}
+});
+
+module.exports = Hook;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/HookCodeFactory.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/HookCodeFactory.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/HookCodeFactory.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,407 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+class HookCodeFactory {
+	constructor(config) {
+		this.config = config;
+		this.options = undefined;
+		this._args = undefined;
+	}
+
+	create(options) {
+		this.init(options);
+		let fn;
+		switch (this.options.type) {
+			case "sync":
+				fn = new Function(
+					this.args(),
+					'"use strict";\n' +
+						this.header() +
+						this.content({
+							onError: err => `throw ${err};\n`,
+							onResult: result => `return ${result};\n`,
+							resultReturns: true,
+							onDone: () => "",
+							rethrowIfPossible: true
+						})
+				);
+				break;
+			case "async":
+				fn = new Function(
+					this.args({
+						after: "_callback"
+					}),
+					'"use strict";\n' +
+						this.header() +
+						this.content({
+							onError: err => `_callback(${err});\n`,
+							onResult: result => `_callback(null, ${result});\n`,
+							onDone: () => "_callback();\n"
+						})
+				);
+				break;
+			case "promise":
+				let errorHelperUsed = false;
+				const content = this.content({
+					onError: err => {
+						errorHelperUsed = true;
+						return `_error(${err});\n`;
+					},
+					onResult: result => `_resolve(${result});\n`,
+					onDone: () => "_resolve();\n"
+				});
+				let code = "";
+				code += '"use strict";\n';
+				code += "return new Promise((_resolve, _reject) => {\n";
+				if (errorHelperUsed) {
+					code += "var _sync = true;\n";
+					code += "function _error(_err) {\n";
+					code += "if(_sync)\n";
+					code += "_resolve(Promise.resolve().then(() => { throw _err; }));\n";
+					code += "else\n";
+					code += "_reject(_err);\n";
+					code += "};\n";
+				}
+				code += this.header();
+				code += content;
+				if (errorHelperUsed) {
+					code += "_sync = false;\n";
+				}
+				code += "});\n";
+				fn = new Function(this.args(), code);
+				break;
+		}
+		this.deinit();
+		return fn;
+	}
+
+	setup(instance, options) {
+		instance._x = options.taps.map(t => t.fn);
+	}
+
+	/**
+	 * @param {{ type: "sync" | "promise" | "async", taps: Array<Tap>, interceptors: Array<Interceptor> }} options
+	 */
+	init(options) {
+		this.options = options;
+		this._args = options.args.slice();
+	}
+
+	deinit() {
+		this.options = undefined;
+		this._args = undefined;
+	}
+
+	header() {
+		let code = "";
+		if (this.needContext()) {
+			code += "var _context = {};\n";
+		} else {
+			code += "var _context;\n";
+		}
+		code += "var _x = this._x;\n";
+		if (this.options.interceptors.length > 0) {
+			code += "var _taps = this.taps;\n";
+			code += "var _interceptors = this.interceptors;\n";
+		}
+		for (let i = 0; i < this.options.interceptors.length; i++) {
+			const interceptor = this.options.interceptors[i];
+			if (interceptor.call) {
+				code += `${this.getInterceptor(i)}.call(${this.args({
+					before: interceptor.context ? "_context" : undefined
+				})});\n`;
+			}
+		}
+		return code;
+	}
+
+	needContext() {
+		for (const tap of this.options.taps) if (tap.context) return true;
+		return false;
+	}
+
+	callTap(tapIndex, { onError, onResult, onDone, rethrowIfPossible }) {
+		let code = "";
+		let hasTapCached = false;
+		for (let i = 0; i < this.options.interceptors.length; i++) {
+			const interceptor = this.options.interceptors[i];
+			if (interceptor.tap) {
+				if (!hasTapCached) {
+					code += `var _tap${tapIndex} = ${this.getTap(tapIndex)};\n`;
+					hasTapCached = true;
+				}
+				code += `${this.getInterceptor(i)}.tap(${
+					interceptor.context ? "_context, " : ""
+				}_tap${tapIndex});\n`;
+			}
+		}
+		code += `var _fn${tapIndex} = ${this.getTapFn(tapIndex)};\n`;
+		const tap = this.options.taps[tapIndex];
+		switch (tap.type) {
+			case "sync":
+				if (!rethrowIfPossible) {
+					code += `var _hasError${tapIndex} = false;\n`;
+					code += "try {\n";
+				}
+				if (onResult) {
+					code += `var _result${tapIndex} = _fn${tapIndex}(${this.args({
+						before: tap.context ? "_context" : undefined
+					})});\n`;
+				} else {
+					code += `_fn${tapIndex}(${this.args({
+						before: tap.context ? "_context" : undefined
+					})});\n`;
+				}
+				if (!rethrowIfPossible) {
+					code += "} catch(_err) {\n";
+					code += `_hasError${tapIndex} = true;\n`;
+					code += onError("_err");
+					code += "}\n";
+					code += `if(!_hasError${tapIndex}) {\n`;
+				}
+				if (onResult) {
+					code += onResult(`_result${tapIndex}`);
+				}
+				if (onDone) {
+					code += onDone();
+				}
+				if (!rethrowIfPossible) {
+					code += "}\n";
+				}
+				break;
+			case "async":
+				let cbCode = "";
+				if (onResult) cbCode += `(_err${tapIndex}, _result${tapIndex}) => {\n`;
+				else cbCode += `_err${tapIndex} => {\n`;
+				cbCode += `if(_err${tapIndex}) {\n`;
+				cbCode += onError(`_err${tapIndex}`);
+				cbCode += "} else {\n";
+				if (onResult) {
+					cbCode += onResult(`_result${tapIndex}`);
+				}
+				if (onDone) {
+					cbCode += onDone();
+				}
+				cbCode += "}\n";
+				cbCode += "}";
+				code += `_fn${tapIndex}(${this.args({
+					before: tap.context ? "_context" : undefined,
+					after: cbCode
+				})});\n`;
+				break;
+			case "promise":
+				code += `var _hasResult${tapIndex} = false;\n`;
+				code += `var _promise${tapIndex} = _fn${tapIndex}(${this.args({
+					before: tap.context ? "_context" : undefined
+				})});\n`;
+				code += `if (!_promise${tapIndex} || !_promise${tapIndex}.then)\n`;
+				code += `  throw new Error('Tap function (tapPromise) did not return promise (returned ' + _promise${tapIndex} + ')');\n`;
+				code += `_promise${tapIndex}.then(_result${tapIndex} => {\n`;
+				code += `_hasResult${tapIndex} = true;\n`;
+				if (onResult) {
+					code += onResult(`_result${tapIndex}`);
+				}
+				if (onDone) {
+					code += onDone();
+				}
+				code += `}, _err${tapIndex} => {\n`;
+				code += `if(_hasResult${tapIndex}) throw _err${tapIndex};\n`;
+				code += onError(`_err${tapIndex}`);
+				code += "});\n";
+				break;
+		}
+		return code;
+	}
+
+	callTapsSeries({
+		onError,
+		onResult,
+		resultReturns,
+		onDone,
+		doneReturns,
+		rethrowIfPossible
+	}) {
+		if (this.options.taps.length === 0) return onDone();
+		const firstAsync = this.options.taps.findIndex(t => t.type !== "sync");
+		const somethingReturns = resultReturns || doneReturns || false;
+		let code = "";
+		let current = onDone;
+		for (let j = this.options.taps.length - 1; j >= 0; j--) {
+			const i = j;
+			const unroll = current !== onDone && this.options.taps[i].type !== "sync";
+			if (unroll) {
+				code += `function _next${i}() {\n`;
+				code += current();
+				code += `}\n`;
+				current = () => `${somethingReturns ? "return " : ""}_next${i}();\n`;
+			}
+			const done = current;
+			const doneBreak = skipDone => {
+				if (skipDone) return "";
+				return onDone();
+			};
+			const content = this.callTap(i, {
+				onError: error => onError(i, error, done, doneBreak),
+				onResult:
+					onResult &&
+					(result => {
+						return onResult(i, result, done, doneBreak);
+					}),
+				onDone: !onResult && done,
+				rethrowIfPossible:
+					rethrowIfPossible && (firstAsync < 0 || i < firstAsync)
+			});
+			current = () => content;
+		}
+		code += current();
+		return code;
+	}
+
+	callTapsLooping({ onError, onDone, rethrowIfPossible }) {
+		if (this.options.taps.length === 0) return onDone();
+		const syncOnly = this.options.taps.every(t => t.type === "sync");
+		let code = "";
+		if (!syncOnly) {
+			code += "var _looper = () => {\n";
+			code += "var _loopAsync = false;\n";
+		}
+		code += "var _loop;\n";
+		code += "do {\n";
+		code += "_loop = false;\n";
+		for (let i = 0; i < this.options.interceptors.length; i++) {
+			const interceptor = this.options.interceptors[i];
+			if (interceptor.loop) {
+				code += `${this.getInterceptor(i)}.loop(${this.args({
+					before: interceptor.context ? "_context" : undefined
+				})});\n`;
+			}
+		}
+		code += this.callTapsSeries({
+			onError,
+			onResult: (i, result, next, doneBreak) => {
+				let code = "";
+				code += `if(${result} !== undefined) {\n`;
+				code += "_loop = true;\n";
+				if (!syncOnly) code += "if(_loopAsync) _looper();\n";
+				code += doneBreak(true);
+				code += `} else {\n`;
+				code += next();
+				code += `}\n`;
+				return code;
+			},
+			onDone:
+				onDone &&
+				(() => {
+					let code = "";
+					code += "if(!_loop) {\n";
+					code += onDone();
+					code += "}\n";
+					return code;
+				}),
+			rethrowIfPossible: rethrowIfPossible && syncOnly
+		});
+		code += "} while(_loop);\n";
+		if (!syncOnly) {
+			code += "_loopAsync = true;\n";
+			code += "};\n";
+			code += "_looper();\n";
+		}
+		return code;
+	}
+
+	callTapsParallel({
+		onError,
+		onResult,
+		onDone,
+		rethrowIfPossible,
+		onTap = (i, run) => run()
+	}) {
+		if (this.options.taps.length <= 1) {
+			return this.callTapsSeries({
+				onError,
+				onResult,
+				onDone,
+				rethrowIfPossible
+			});
+		}
+		let code = "";
+		code += "do {\n";
+		code += `var _counter = ${this.options.taps.length};\n`;
+		if (onDone) {
+			code += "var _done = () => {\n";
+			code += onDone();
+			code += "};\n";
+		}
+		for (let i = 0; i < this.options.taps.length; i++) {
+			const done = () => {
+				if (onDone) return "if(--_counter === 0) _done();\n";
+				else return "--_counter;";
+			};
+			const doneBreak = skipDone => {
+				if (skipDone || !onDone) return "_counter = 0;\n";
+				else return "_counter = 0;\n_done();\n";
+			};
+			code += "if(_counter <= 0) break;\n";
+			code += onTap(
+				i,
+				() =>
+					this.callTap(i, {
+						onError: error => {
+							let code = "";
+							code += "if(_counter > 0) {\n";
+							code += onError(i, error, done, doneBreak);
+							code += "}\n";
+							return code;
+						},
+						onResult:
+							onResult &&
+							(result => {
+								let code = "";
+								code += "if(_counter > 0) {\n";
+								code += onResult(i, result, done, doneBreak);
+								code += "}\n";
+								return code;
+							}),
+						onDone:
+							!onResult &&
+							(() => {
+								return done();
+							}),
+						rethrowIfPossible
+					}),
+				done,
+				doneBreak
+			);
+		}
+		code += "} while(false);\n";
+		return code;
+	}
+
+	args({ before, after } = {}) {
+		let allArgs = this._args;
+		if (before) allArgs = [before].concat(allArgs);
+		if (after) allArgs = allArgs.concat(after);
+		if (allArgs.length === 0) {
+			return "";
+		} else {
+			return allArgs.join(", ");
+		}
+	}
+
+	getTapFn(idx) {
+		return `_x[${idx}]`;
+	}
+
+	getTap(idx) {
+		return `_taps[${idx}]`;
+	}
+
+	getInterceptor(idx) {
+		return `_interceptors[${idx}]`;
+	}
+}
+
+module.exports = HookCodeFactory;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/HookMap.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/HookMap.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/HookMap.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,56 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+class HookMap {
+	constructor(factory) {
+		this._map = new Map();
+		this._factory = factory;
+		this._interceptors = [];
+	}
+
+	get(key) {
+		return this._map.get(key);
+	}
+
+	for(key) {
+		const hook = this.get(key);
+		if (hook !== undefined) {
+			return hook;
+		}
+		let newHook = this._factory(key);
+		const interceptors = this._interceptors;
+		for (let i = 0; i < interceptors.length; i++) {
+			newHook = interceptors[i].factory(key, newHook);
+		}
+		this._map.set(key, newHook);
+		return newHook;
+	}
+
+	intercept(interceptor) {
+		this._interceptors.push(
+			Object.assign(
+				{
+					factory: (key, hook) => hook
+				},
+				interceptor
+			)
+		);
+	}
+
+	tap(key, options, fn) {
+		return this.for(key).tap(options, fn);
+	}
+
+	tapAsync(key, options, fn) {
+		return this.for(key).tapAsync(options, fn);
+	}
+
+	tapPromise(key, options, fn) {
+		return this.for(key).tapPromise(options, fn);
+	}
+}
+
+module.exports = HookMap;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/MultiHook.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/MultiHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/MultiHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,50 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const Hook = require("./Hook");
+
+class MultiHook {
+	constructor(hooks) {
+		this.hooks = hooks;
+	}
+
+	tap(options, fn) {
+		for (const hook of this.hooks) {
+			hook.tap(options, fn);
+		}
+	}
+
+	tapAsync(options, fn) {
+		for (const hook of this.hooks) {
+			hook.tapAsync(options, fn);
+		}
+	}
+
+	tapPromise(options, fn) {
+		for (const hook of this.hooks) {
+			hook.tapPromise(options, fn);
+		}
+	}
+
+	isUsed() {
+		for (const hook of this.hooks) {
+			if (hook.isUsed()) return true;
+		}
+		return false;
+	}
+
+	intercept(interceptor) {
+		for (const hook of this.hooks) {
+			hook.intercept(interceptor);
+		}
+	}
+
+	withOptions(options) {
+		return new MultiHook(this.hooks.map(h => h.withOptions(options)));
+	}
+}
+
+module.exports = MultiHook;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/SyncBailHook.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/SyncBailHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/SyncBailHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,42 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const Hook = require("./Hook");
+const HookCodeFactory = require("./HookCodeFactory");
+
+class SyncBailHookCodeFactory extends HookCodeFactory {
+	content({ onError, onResult, resultReturns, onDone, rethrowIfPossible }) {
+		return this.callTapsSeries({
+			onError: (i, err) => onError(err),
+			onResult: (i, result, next) =>
+				`if(${result} !== undefined) {\n${onResult(
+					result
+				)};\n} else {\n${next()}}\n`,
+			resultReturns,
+			onDone,
+			rethrowIfPossible
+		});
+	}
+}
+
+const factory = new SyncBailHookCodeFactory();
+
+class SyncBailHook extends Hook {
+	tapAsync() {
+		throw new Error("tapAsync is not supported on a SyncBailHook");
+	}
+
+	tapPromise() {
+		throw new Error("tapPromise is not supported on a SyncBailHook");
+	}
+
+	compile(options) {
+		factory.setup(this, options);
+		return factory.create(options);
+	}
+}
+
+module.exports = SyncBailHook;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/SyncHook.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/SyncHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/SyncHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,37 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const Hook = require("./Hook");
+const HookCodeFactory = require("./HookCodeFactory");
+
+class SyncHookCodeFactory extends HookCodeFactory {
+	content({ onError, onDone, rethrowIfPossible }) {
+		return this.callTapsSeries({
+			onError: (i, err) => onError(err),
+			onDone,
+			rethrowIfPossible
+		});
+	}
+}
+
+const factory = new SyncHookCodeFactory();
+
+class SyncHook extends Hook {
+	tapAsync() {
+		throw new Error("tapAsync is not supported on a SyncHook");
+	}
+
+	tapPromise() {
+		throw new Error("tapPromise is not supported on a SyncHook");
+	}
+
+	compile(options) {
+		factory.setup(this, options);
+		return factory.create(options);
+	}
+}
+
+module.exports = SyncHook;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/SyncLoopHook.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/SyncLoopHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/SyncLoopHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,37 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const Hook = require("./Hook");
+const HookCodeFactory = require("./HookCodeFactory");
+
+class SyncLoopHookCodeFactory extends HookCodeFactory {
+	content({ onError, onDone, rethrowIfPossible }) {
+		return this.callTapsLooping({
+			onError: (i, err) => onError(err),
+			onDone,
+			rethrowIfPossible
+		});
+	}
+}
+
+const factory = new SyncLoopHookCodeFactory();
+
+class SyncLoopHook extends Hook {
+	tapAsync() {
+		throw new Error("tapAsync is not supported on a SyncLoopHook");
+	}
+
+	tapPromise() {
+		throw new Error("tapPromise is not supported on a SyncLoopHook");
+	}
+
+	compile(options) {
+		factory.setup(this, options);
+		return factory.create(options);
+	}
+}
+
+module.exports = SyncLoopHook;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/SyncWaterfallHook.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/SyncWaterfallHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/SyncWaterfallHook.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,52 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const Hook = require("./Hook");
+const HookCodeFactory = require("./HookCodeFactory");
+
+class SyncWaterfallHookCodeFactory extends HookCodeFactory {
+	content({ onError, onResult, resultReturns, rethrowIfPossible }) {
+		return this.callTapsSeries({
+			onError: (i, err) => onError(err),
+			onResult: (i, result, next) => {
+				let code = "";
+				code += `if(${result} !== undefined) {\n`;
+				code += `${this._args[0]} = ${result};\n`;
+				code += `}\n`;
+				code += next();
+				return code;
+			},
+			onDone: () => onResult(this._args[0]),
+			doneReturns: resultReturns,
+			rethrowIfPossible
+		});
+	}
+}
+
+const factory = new SyncWaterfallHookCodeFactory();
+
+class SyncWaterfallHook extends Hook {
+	constructor(args) {
+		super(args);
+		if (args.length < 1)
+			throw new Error("Waterfall hooks must have at least one argument");
+	}
+
+	tapAsync() {
+		throw new Error("tapAsync is not supported on a SyncWaterfallHook");
+	}
+
+	tapPromise() {
+		throw new Error("tapPromise is not supported on a SyncWaterfallHook");
+	}
+
+	compile(options) {
+		factory.setup(this, options);
+		return factory.create(options);
+	}
+}
+
+module.exports = SyncWaterfallHook;
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/Tapable.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/Tapable.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/Tapable.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,81 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+const util = require("util");
+const SyncBailHook = require("./SyncBailHook");
+
+function Tapable() {
+	this._pluginCompat = new SyncBailHook(["options"]);
+	this._pluginCompat.tap(
+		{
+			name: "Tapable camelCase",
+			stage: 100
+		},
+		options => {
+			options.names.add(
+				options.name.replace(/[- ]([a-z])/g, (str, ch) => ch.toUpperCase())
+			);
+		}
+	);
+	this._pluginCompat.tap(
+		{
+			name: "Tapable this.hooks",
+			stage: 200
+		},
+		options => {
+			let hook;
+			for (const name of options.names) {
+				hook = this.hooks[name];
+				if (hook !== undefined) {
+					break;
+				}
+			}
+			if (hook !== undefined) {
+				const tapOpt = {
+					name: options.fn.name || "unnamed compat plugin",
+					stage: options.stage || 0
+				};
+				if (options.async) hook.tapAsync(tapOpt, options.fn);
+				else hook.tap(tapOpt, options.fn);
+				return true;
+			}
+		}
+	);
+}
+module.exports = Tapable;
+
+Tapable.addCompatLayer = function addCompatLayer(instance) {
+	Tapable.call(instance);
+	instance.plugin = Tapable.prototype.plugin;
+	instance.apply = Tapable.prototype.apply;
+};
+
+Tapable.prototype.plugin = util.deprecate(function plugin(name, fn) {
+	if (Array.isArray(name)) {
+		name.forEach(function(name) {
+			this.plugin(name, fn);
+		}, this);
+		return;
+	}
+	const result = this._pluginCompat.call({
+		name: name,
+		fn: fn,
+		names: new Set([name])
+	});
+	if (!result) {
+		throw new Error(
+			`Plugin could not be registered at '${name}'. Hook was not found.\n` +
+				"BREAKING CHANGE: There need to exist a hook at 'this.hooks'. " +
+				"To create a compatibility layer for this hook, hook into 'this._pluginCompat'."
+		);
+	}
+}, "Tapable.plugin is deprecated. Use new API on `.hooks` instead");
+
+Tapable.prototype.apply = util.deprecate(function apply() {
+	for (var i = 0; i < arguments.length; i++) {
+		arguments[i].apply(this);
+	}
+}, "Tapable.apply is deprecated. Call apply on the plugin directly instead");
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/index.js
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/lib/index.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,19 @@
+/*
+	MIT License http://www.opensource.org/licenses/mit-license.php
+	Author Tobias Koppers @sokra
+*/
+"use strict";
+
+exports.__esModule = true;
+exports.Tapable = require("./Tapable");
+exports.SyncHook = require("./SyncHook");
+exports.SyncBailHook = require("./SyncBailHook");
+exports.SyncWaterfallHook = require("./SyncWaterfallHook");
+exports.SyncLoopHook = require("./SyncLoopHook");
+exports.AsyncParallelHook = require("./AsyncParallelHook");
+exports.AsyncParallelBailHook = require("./AsyncParallelBailHook");
+exports.AsyncSeriesHook = require("./AsyncSeriesHook");
+exports.AsyncSeriesBailHook = require("./AsyncSeriesBailHook");
+exports.AsyncSeriesWaterfallHook = require("./AsyncSeriesWaterfallHook");
+exports.HookMap = require("./HookMap");
+exports.MultiHook = require("./MultiHook");
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/package.json
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,39 @@
+{
+  "name": "tapable",
+  "version": "1.1.3",
+  "author": "Tobias Koppers @sokra",
+  "description": "Just a little module for plugins.",
+  "license": "MIT",
+  "repository": {
+    "type": "git",
+    "url": "http://github.com/webpack/tapable.git"
+  },
+  "devDependencies": {
+    "babel-core": "^6.26.0",
+    "babel-jest": "^21.0.2",
+    "babel-polyfill": "^6.26.0",
+    "babel-preset-env": "^1.6.0",
+    "codecov": "^2.3.0",
+    "jest": "^21.0.4",
+    "prettier": "^1.13.2"
+  },
+  "engines": {
+    "node": ">=6"
+  },
+  "files": [
+    "lib",
+    "!lib/__tests__"
+  ],
+  "homepage": "https://github.com/webpack/tapable",
+  "main": "lib/index.js",
+  "scripts": {
+    "test": "jest",
+    "travis": "jest --coverage && codecov",
+    "pretty": "prettier --write lib/*.js lib/__tests__/*.js"
+  },
+  "jest": {
+    "transform": {
+      "__tests__[\\\\/].+\\.js$": "babel-jest"
+    }
+  }
+}
Index: frontend/node_modules/fork-ts-checker-webpack-plugin/package.json
===================================================================
--- frontend/node_modules/fork-ts-checker-webpack-plugin/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/fork-ts-checker-webpack-plugin/package.json	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,138 @@
+{
+  "name": "fork-ts-checker-webpack-plugin",
+  "version": "6.5.3",
+  "description": "Runs typescript type checker and linter on separate process.",
+  "keywords": [
+    "fast",
+    "fork",
+    "linter",
+    "webpack",
+    "plugin",
+    "ts-loader",
+    "typescript",
+    "webpack"
+  ],
+  "bugs": {
+    "url": "https://github.com/TypeStrong/fork-ts-checker-webpack-plugin/issues"
+  },
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/TypeStrong/fork-ts-checker-webpack-plugin.git"
+  },
+  "license": "MIT",
+  "author": "Piotr Oleś <piotrek.oles@gmail.com>",
+  "contributors": [
+    "Piotr Oleś <piotrek.oles@gmail.com> (https://github.com/piotr-oles)",
+    "John Reilly <johnny_reilly@hotmail.com> (https://blog.johnnyreilly.com)"
+  ],
+  "files": [
+    "lib"
+  ],
+  "main": "lib/index.js",
+  "types": "lib/index.d.ts",
+  "scripts": {
+    "build": "cross-env rimraf lib && cross-env tsc --version && cross-env tsc",
+    "lint": "cross-env eslint ./src ./test --ext .ts",
+    "test": "yarn build && yarn test:unit && yarn test:e2e",
+    "test:unit": "cross-env jest --config=test/unit/jest.config.js",
+    "test:e2e": "npm pack && cross-env jest --config=test/e2e/jest.config.js --ci -i -b",
+    "precommit": "cross-env lint-staged && yarn build && yarn test:unit",
+    "commit": "cross-env git-cz",
+    "semantic-release": "semantic-release"
+  },
+  "husky": {
+    "hooks": {
+      "pre-commit": "lint-staged && yarn build && yarn test:unit",
+      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
+    }
+  },
+  "commitlint": {
+    "extends": [
+      "@commitlint/config-conventional"
+    ]
+  },
+  "lint-staged": {
+    "*.ts": "eslint --fix"
+  },
+  "config": {
+    "commitizen": {
+      "path": "cz-conventional-changelog"
+    }
+  },
+  "dependencies": {
+    "@babel/code-frame": "^7.8.3",
+    "@types/json-schema": "^7.0.5",
+    "chalk": "^4.1.0",
+    "chokidar": "^3.4.2",
+    "cosmiconfig": "^6.0.0",
+    "deepmerge": "^4.2.2",
+    "fs-extra": "^9.0.0",
+    "glob": "^7.1.6",
+    "memfs": "^3.1.2",
+    "minimatch": "^3.0.4",
+    "schema-utils": "2.7.0",
+    "semver": "^7.3.2",
+    "tapable": "^1.0.0"
+  },
+  "peerDependencies": {
+    "eslint": ">= 6",
+    "typescript": ">= 2.7",
+    "webpack": ">= 4",
+    "vue-template-compiler": "*"
+  },
+  "peerDependenciesMeta": {
+    "eslint": {
+      "optional": true
+    },
+    "vue-template-compiler": {
+      "optional": true
+    }
+  },
+  "devDependencies": {
+    "@commitlint/config-conventional": "^11.0.0",
+    "@semantic-release/commit-analyzer": "^8.0.1",
+    "@semantic-release/exec": "^5.0.0",
+    "@semantic-release/github": "^7.1.1",
+    "@semantic-release/npm": "^7.0.6",
+    "@semantic-release/release-notes-generator": "^9.0.1",
+    "@types/babel__code-frame": "^7.0.2",
+    "@types/cross-spawn": "^6.0.2",
+    "@types/eslint": "^7.2.4",
+    "@types/fs-extra": "^9.0.2",
+    "@types/jest": "^26.0.14",
+    "@types/minimatch": "^3.0.1",
+    "@types/mock-fs": "^4.13.0",
+    "@types/node": "^14.11.10",
+    "@types/rimraf": "^3.0.0",
+    "@types/semver": "^7.3.4",
+    "@types/webpack": "^4.41.22",
+    "@typescript-eslint/eslint-plugin": "^2.27.0",
+    "@typescript-eslint/parser": "^2.27.0",
+    "commitlint": "^11.0.0",
+    "cross-env": "^7.0.2",
+    "cross-spawn": "^7.0.3",
+    "eslint": "^6.8.0",
+    "eslint-config-prettier": "^6.13.0",
+    "eslint-plugin-node": "^11.1.0",
+    "eslint-plugin-prettier": "^3.1.4",
+    "git-cz": "^4.7.1",
+    "husky": "^4.3.0",
+    "jest": "^26.5.3",
+    "jest-circus": "^26.5.3",
+    "jest-environment-node": "^26.5.2",
+    "lint-staged": "^10.4.2",
+    "mock-fs": "^4.13.0",
+    "prettier": "^2.1.2",
+    "rimraf": "^3.0.2",
+    "semantic-release": "^17.2.1",
+    "strip-ansi": "^6.0.0",
+    "tree-kill": "^1.2.2",
+    "ts-jest": "^26.4.1",
+    "typescript": "^3.8.3",
+    "webpack": "^4.42.1"
+  },
+  "engines": {
+    "node": ">=10",
+    "yarn": ">=1.0.0"
+  }
+}
