├── .eslintrc.js ├── .github └── workflows │ ├── ci.yml │ └── publish.yml ├── .gitignore ├── .nvmrc ├── .prettierignore ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── babel.config.js ├── codecov.yml ├── example ├── dist │ └── index.html ├── package.json ├── src │ └── index.tsx ├── tsconfig.json ├── webpack.config.js └── yarn.lock ├── jest.config.js ├── package.json ├── public.package.json ├── src ├── index.tsx └── test.tsx ├── tsconfig.json └── yarn.lock /.eslintrc.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-undef 2 | module.exports = { 3 | root: true, 4 | ignorePatterns: ["dist", "example"], 5 | plugins: ["@typescript-eslint"], 6 | extends: [ 7 | "eslint:recommended", 8 | "plugin:@typescript-eslint/recommended", 9 | "plugin:react-hooks/recommended", 10 | "prettier", 11 | ], 12 | overrides: [ 13 | { 14 | files: ["*.ts{,x}"], 15 | parser: "@typescript-eslint/parser", 16 | parserOptions: { 17 | // eslint-disable-next-line no-undef 18 | tsconfigRootDir: __dirname, 19 | project: ["./tsconfig.json"], 20 | }, 21 | extends: [ 22 | "plugin:@typescript-eslint/recommended-requiring-type-checking", 23 | ], 24 | rules: { 25 | "@typescript-eslint/prefer-nullish-coalescing": "error", 26 | "@typescript-eslint/no-unnecessary-condition": "error", 27 | "@typescript-eslint/prefer-optional-chain": "error", 28 | }, 29 | }, 30 | ], 31 | }; 32 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | on: 3 | push: 4 | branches: 5 | - main 6 | pull_request: 7 | jobs: 8 | ci: 9 | name: "Lint and Test" 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - uses: actions/setup-node@v2 14 | with: 15 | node-version: "16.x" 16 | cache: "yarn" 17 | - run: yarn 18 | - run: yarn package:build 19 | - run: yarn lint 20 | - run: yarn test:ci && yarn codecov --token=$CODECOV_TOKEN 21 | env: 22 | CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} 23 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish NPM Package 2 | on: 3 | release: 4 | types: [created] 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - uses: actions/checkout@v2 10 | - uses: actions/setup-node@v2 11 | with: 12 | node-version: "16.x" 13 | cache: "yarn" 14 | registry-url: "https://registry.npmjs.org" 15 | - run: yarn package:build 16 | - run: cd dist && npm publish 17 | env: 18 | NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist/* 3 | example/dist/* 4 | !example/dist/index.html 5 | 6 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 20.9.0 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist 2 | 3 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## v3.0.0 4 | 5 | ```js 6 | const [error] = useErrorBoundary(); 7 | ``` 8 | 9 | - The `error` wrapping that was introduced in v2 has been removed. `error` will now be the error that was caught without any wrapping for thrown primitives. The types have been updated to `unknown` to reflect that thrown JavaScript errors may be any type not just instances of `Error`. 10 | 11 | - `withErrorBoundary` now propagates the wrapped component display name for improved debugging with React dev tools. It will display as `WithErrorBoundary(${Component.displayName})`. 12 | 13 | ## v2.0.1 14 | 15 | Publish CommonJS and ESM. 16 | 17 | ## v2.0.0 18 | 19 | ```js 20 | const [error] = useErrorBoundary(); 21 | ``` 22 | 23 | `error` is now the error that was caught or `undefined` if nothing errored. Previously `error` was a boolean value. Providing access to the error rather 24 | than a boolean makes it more ergonomic to render UI in response to the caught error. Special thanks to @davwheat for the contribution. 25 | 26 | If something other than an instance of `Error` is thrown, it will be wrapped in an `Error` object by calling `new Error()` on the thrown value. A warning will log when this occurs: while you _may_ throw any value in JavaScript, you _should_ only throw instances of Error. This ensures a stack trace is collected is that all errors conform to a unified interface. This wrapping may be removed in a future v3 release of this library. 27 | 28 | ## v1.0.2 29 | 30 | Internal: remove unnecessary files when publishing to npm registry. 31 | 32 | ## v1.0.1 33 | 34 | Internal: fix CI publishes. 35 | 36 | ## v1.0.0 37 | 38 | No API changes. This library will now follow [semantic versioning](https://docs.npmjs.com/about-semantic-versioning). 39 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 👫 2 | 3 | Thanks for helping make this project better! 4 | 5 | ## Report an Issue 🐛 6 | 7 | If you find a bug or want to discuss a new feature, please [create a new issue](https://github.com/tatethurston/react-use-error-boundary/issues). If you'd prefer to keep things private, feel free to [email me](mailto:tatethurston@gmail.com?subject=react-use-error-boundary). 8 | 9 | ## Contributing Code with Pull Requests 🎁 10 | 11 | Please create a [pull request](https://github.com/tatethurston/react-use-error-boundary/pulls). Expect a few iterations and some discussion before your pull request is merged. If you want to take things in a new direction, feel free to fork and iterate without hindrance! 12 | 13 | ## Code of Conduct 🧐 14 | 15 | My expectations for myself and others is to strive to build a diverse, inclusive, safe community. 16 | 17 | For more guidance, check out [thoughtbot's code of conduct](https://thoughtbot.com/open-source-code-of-conduct). 18 | 19 | ## Licensing 📃 20 | 21 | See the project's [MIT License](https://github.com/tatethurston/react-use-error-boundary/blob/master/LICENSE). 22 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Tate Thurston 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # react-use-error-boundary 2 | 3 |
A React error boundary hook for function components
4 | 5 |
6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | ## What is this? 🧐 27 | 28 | React 16 introduced [Error Boundaries](https://reactjs.org/docs/error-boundaries.html). As of React 18, there still is [no equivalent hook](https://reactjs.org/docs/hooks-faq.html#do-hooks-cover-all-use-cases-for-classes) for function components. 29 | 30 | This library draws inspiration from Preact's [useErrorBoundary](https://preactjs.com/guide/v10/hooks/#useerrorboundary) and attempts to recreate a similar API. 31 | 32 | ## Installation & Usage 📦 33 | 34 | 1. Add this package to your project: 35 | - `yarn add react-use-error-boundary` 36 | 37 | Just trying things out or want to skip the build step? Use the unpkg URL: 38 | 39 | ``` 40 | 41 | ``` 42 | 43 | ## Examples 🚀 44 | 45 | Whenever the component or a child component throws an error you can use this hook to catch the error and display an error UI to the user. 46 | 47 | ```jsx 48 | // error = The error that was caught or `undefined` if nothing 49 | // errored. If something other than an instance of `Error` 50 | // was thrown, it will be wrapped in an `Error` object by calling 51 | // `new Error()` on the thrown value. 52 | // 53 | // resetError = Call this function to mark an error as resolved. It's 54 | // up to your app to decide what that means and if it is possible 55 | // to recover from errors. 56 | // 57 | const [error, resetError] = useErrorBoundary(); 58 | ``` 59 | 60 | For application monitoring, it's often useful to notify a service of any errors. `useErrorBoundary` accepts an optional callback that will be invoked when an error is encountered. The callback is invoked with `error` and `errorInfor` which are identical to [React's componentDidCatch arguments](https://reactjs.org/docs/error-boundaries.html). Identical to React, `error` is the error that was thrown, and `errorInfo` is the component stack trace. 61 | 62 | ```jsx 63 | const [error] = useErrorBoundary((error, errorInfo) => 64 | logErrorToMyService(error, errorInfo) 65 | ); 66 | ``` 67 | 68 | A full example may look like this: 69 | 70 | ```jsx 71 | import { withErrorBoundary, useErrorBoundary } from "react-use-error-boundary"; 72 | 73 | const App = withErrorBoundary(({ children }) => { 74 | const [error, resetError] = useErrorBoundary( 75 | // You can optionally log the error to an error reporting service 76 | (error, errorInfo) => logErrorToMyService(error, errorInfo) 77 | ); 78 | 79 | if (error) { 80 | return ( 81 |
82 |

{error.message}

83 | 84 |
85 | ); 86 | } 87 | 88 | return
{children}
; 89 | }); 90 | ``` 91 | 92 | Note that in addition to the hook, the component must be wrapped with `withErrorBoundary`. This function wraps the component with an Error Boundary and a context provider. 93 | 94 | This was done to avoid hooking into React internals, which would otherwise be required. The hope is that the eventual React hook solution will present a similar API, and users can easily migrate by removing the `withErrorBoundary` wrapper. 95 | 96 | Alternatively, the `` component from this library may be placed in your component tree, above each component using `useErrorBoundary`, instead of wrapping the component with `withErrorBoundary`: 97 | 98 | ```jsx 99 | import { 100 | ErrorBoundaryContext, 101 | useErrorBoundary, 102 | } from "react-use-error-boundary"; 103 | 104 | const App = ({ children }) => { 105 | // ... see function body in example above 106 | }; 107 | 108 | export default ( 109 | 110 | 111 | 112 | ); 113 | ``` 114 | 115 | For a full project example take a look at the [example](https://github.com/tatethurston/react-use-error-boundary/blob/main/example). 116 | 117 | ## Known Limitations ⚠️ 118 | 119 | Because React recreates the component tree from scratch after catching an error, the component using the `useErrorBoundary` hook is always remounted after an error is encountered. This means any state will be reinitialized: `useState` and `useRef` hooks will be reinitialized to their initial value and will _not_ persist across caught errors. Any values that need to be preserved across error catching must be lifted into a parent component above the component wrapped in `withErrorBoundary`. 120 | 121 | ## Highlights 122 | 123 | 🌲 [Tree shakeable](https://webpack.js.org/guides/tree-shaking/). Ships [ES Modules](https://webpack.js.org/guides/ecma-script-modules/). 124 | 125 | 🎁 Zero run time dependencies 126 | 127 | 🦶 Small footprint [673 B minified and gzipped](https://bundlephobia.com/result?p=react-use-error-boundary@2.0.0) 128 | 129 | 🪐 Isomorphic / Universal -- safe to run in any JS context: the browser or on a server 130 | 131 | 🛠 This library follows [semantic versioning](https://docs.npmjs.com/about-semantic-versioning) 132 | 133 | ## Contributing 👫 134 | 135 | PR's and issues welcomed! For more guidance check out [CONTRIBUTING.md](https://github.com/tatethurston/react-use-error-boundary/blob/master/CONTRIBUTING.md) 136 | 137 | ## Licensing 📃 138 | 139 | See the project's [MIT License](https://github.com/tatethurston/react-use-error-boundary/blob/master/LICENSE). 140 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-undef 2 | module.exports = { 3 | presets: [ 4 | ["@babel/preset-env", { targets: { node: "current" } }], 5 | "@babel/preset-typescript", 6 | "@babel/preset-react", 7 | ], 8 | }; 9 | -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | coverage: 2 | status: 3 | project: 4 | default: 5 | target: auto 6 | threshold: 10% 7 | -------------------------------------------------------------------------------- /example/dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | react-use-error-boundary-example 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "example", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "yarn webpack && open dist/index.html" 8 | }, 9 | "author": "Tate Thurston ", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "@types/react-dom": "^17.0.11", 13 | "ts-loader": "^9.2.6", 14 | "typescript": "^4.5.5", 15 | "webpack": "^5.66.0", 16 | "webpack-cli": "^4.9.1" 17 | }, 18 | "dependencies": { 19 | "react": "^18.2.0", 20 | "react-dom": "^18.2.0", 21 | "react-use-error-boundary": "file:../dist" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /example/src/index.tsx: -------------------------------------------------------------------------------- 1 | import React, { FC, useState } from "react"; 2 | import { withErrorBoundary, useErrorBoundary } from "react-use-error-boundary"; 3 | import { render } from "react-dom"; 4 | 5 | const ThrowError: FC = () => { 6 | throw new Error("Bombs away 💣"); 7 | }; 8 | 9 | const App: FC = withErrorBoundary(() => { 10 | const [shouldThrow, setShouldThrow] = useState(false); 11 | const [error, resetError] = useErrorBoundary((error, errorInfo) => { 12 | console.info("componentDidCatch handler called"); 13 | console.error(error); 14 | console.error(errorInfo); 15 | }); 16 | 17 | if (error) { 18 | const message = error instanceof Error ? error.message : (error as string); 19 | return ( 20 | <> 21 |
Error: {message}
22 | 30 | 31 | ); 32 | } 33 | 34 | return ( 35 | <> 36 |
Happy Path
37 | {shouldThrow && } 38 | 45 | 46 | ); 47 | }); 48 | 49 | render(, document.getElementById("app")); 50 | -------------------------------------------------------------------------------- /example/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "esModuleInterop": true, 4 | "jsx": "react", 5 | "forceConsistentCasingInFileNames": true, 6 | "isolatedModules": true, 7 | "module": "ESNext", 8 | "moduleResolution": "node", 9 | "noEmitOnError": false, 10 | "outDir": "dist", 11 | "removeComments": true, 12 | "resolveJsonModule": true, 13 | "rootDir": "src", 14 | "skipLibCheck": true, 15 | "sourceMap": true, 16 | "strict": true, 17 | "target": "ESNext", 18 | "declaration": true 19 | }, 20 | "include": ["src"] 21 | } 22 | -------------------------------------------------------------------------------- /example/webpack.config.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | 3 | module.exports = { 4 | entry: "./src/index.tsx", 5 | mode: "production", 6 | module: { 7 | rules: [ 8 | { 9 | test: /\.tsx?$/, 10 | use: "ts-loader", 11 | exclude: /node_modules/, 12 | }, 13 | ], 14 | }, 15 | resolve: { 16 | extensions: [".tsx", ".ts", ".js"], 17 | }, 18 | output: { 19 | filename: "main.js", 20 | path: path.resolve(__dirname, "dist"), 21 | }, 22 | }; 23 | -------------------------------------------------------------------------------- /example/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@discoveryjs/json-ext@^0.5.0": 6 | version "0.5.6" 7 | resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" 8 | integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== 9 | 10 | "@types/eslint-scope@^3.7.0": 11 | version "3.7.3" 12 | resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" 13 | integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== 14 | dependencies: 15 | "@types/eslint" "*" 16 | "@types/estree" "*" 17 | 18 | "@types/eslint@*": 19 | version "8.4.0" 20 | resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.0.tgz#95712d5b32fd99a0d9493c31c6197ea7471c3ba6" 21 | integrity sha512-JUYa/5JwoqikCy7O7jKtuNe9Z4ZZt615G+1EKfaDGSNEpzaA2OwbV/G1v08Oa7fd1XzlFoSCvt9ePl9/6FyAug== 22 | dependencies: 23 | "@types/estree" "*" 24 | "@types/json-schema" "*" 25 | 26 | "@types/estree@*", "@types/estree@^0.0.50": 27 | version "0.0.50" 28 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" 29 | integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== 30 | 31 | "@types/json-schema@*", "@types/json-schema@^7.0.8": 32 | version "7.0.9" 33 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" 34 | integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== 35 | 36 | "@types/node@*": 37 | version "17.0.10" 38 | resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.10.tgz#616f16e9d3a2a3d618136b1be244315d95bd7cab" 39 | integrity sha512-S/3xB4KzyFxYGCppyDt68yzBU9ysL88lSdIah4D6cptdcltc4NCPCAMc0+PCpg/lLIyC7IPvj2Z52OJWeIUkog== 40 | 41 | "@types/prop-types@*": 42 | version "15.7.4" 43 | resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.4.tgz#fcf7205c25dff795ee79af1e30da2c9790808f11" 44 | integrity sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ== 45 | 46 | "@types/react-dom@^17.0.11": 47 | version "17.0.11" 48 | resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.11.tgz#e1eadc3c5e86bdb5f7684e00274ae228e7bcc466" 49 | integrity sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q== 50 | dependencies: 51 | "@types/react" "*" 52 | 53 | "@types/react@*": 54 | version "17.0.38" 55 | resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.38.tgz#f24249fefd89357d5fa71f739a686b8d7c7202bd" 56 | integrity sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ== 57 | dependencies: 58 | "@types/prop-types" "*" 59 | "@types/scheduler" "*" 60 | csstype "^3.0.2" 61 | 62 | "@types/scheduler@*": 63 | version "0.16.2" 64 | resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" 65 | integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== 66 | 67 | "@webassemblyjs/ast@1.11.1": 68 | version "1.11.1" 69 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" 70 | integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw== 71 | dependencies: 72 | "@webassemblyjs/helper-numbers" "1.11.1" 73 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 74 | 75 | "@webassemblyjs/floating-point-hex-parser@1.11.1": 76 | version "1.11.1" 77 | resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f" 78 | integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ== 79 | 80 | "@webassemblyjs/helper-api-error@1.11.1": 81 | version "1.11.1" 82 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16" 83 | integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg== 84 | 85 | "@webassemblyjs/helper-buffer@1.11.1": 86 | version "1.11.1" 87 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5" 88 | integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA== 89 | 90 | "@webassemblyjs/helper-numbers@1.11.1": 91 | version "1.11.1" 92 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae" 93 | integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ== 94 | dependencies: 95 | "@webassemblyjs/floating-point-hex-parser" "1.11.1" 96 | "@webassemblyjs/helper-api-error" "1.11.1" 97 | "@xtuc/long" "4.2.2" 98 | 99 | "@webassemblyjs/helper-wasm-bytecode@1.11.1": 100 | version "1.11.1" 101 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1" 102 | integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q== 103 | 104 | "@webassemblyjs/helper-wasm-section@1.11.1": 105 | version "1.11.1" 106 | resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a" 107 | integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg== 108 | dependencies: 109 | "@webassemblyjs/ast" "1.11.1" 110 | "@webassemblyjs/helper-buffer" "1.11.1" 111 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 112 | "@webassemblyjs/wasm-gen" "1.11.1" 113 | 114 | "@webassemblyjs/ieee754@1.11.1": 115 | version "1.11.1" 116 | resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614" 117 | integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ== 118 | dependencies: 119 | "@xtuc/ieee754" "^1.2.0" 120 | 121 | "@webassemblyjs/leb128@1.11.1": 122 | version "1.11.1" 123 | resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5" 124 | integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw== 125 | dependencies: 126 | "@xtuc/long" "4.2.2" 127 | 128 | "@webassemblyjs/utf8@1.11.1": 129 | version "1.11.1" 130 | resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff" 131 | integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ== 132 | 133 | "@webassemblyjs/wasm-edit@1.11.1": 134 | version "1.11.1" 135 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6" 136 | integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA== 137 | dependencies: 138 | "@webassemblyjs/ast" "1.11.1" 139 | "@webassemblyjs/helper-buffer" "1.11.1" 140 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 141 | "@webassemblyjs/helper-wasm-section" "1.11.1" 142 | "@webassemblyjs/wasm-gen" "1.11.1" 143 | "@webassemblyjs/wasm-opt" "1.11.1" 144 | "@webassemblyjs/wasm-parser" "1.11.1" 145 | "@webassemblyjs/wast-printer" "1.11.1" 146 | 147 | "@webassemblyjs/wasm-gen@1.11.1": 148 | version "1.11.1" 149 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76" 150 | integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA== 151 | dependencies: 152 | "@webassemblyjs/ast" "1.11.1" 153 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 154 | "@webassemblyjs/ieee754" "1.11.1" 155 | "@webassemblyjs/leb128" "1.11.1" 156 | "@webassemblyjs/utf8" "1.11.1" 157 | 158 | "@webassemblyjs/wasm-opt@1.11.1": 159 | version "1.11.1" 160 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2" 161 | integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw== 162 | dependencies: 163 | "@webassemblyjs/ast" "1.11.1" 164 | "@webassemblyjs/helper-buffer" "1.11.1" 165 | "@webassemblyjs/wasm-gen" "1.11.1" 166 | "@webassemblyjs/wasm-parser" "1.11.1" 167 | 168 | "@webassemblyjs/wasm-parser@1.11.1": 169 | version "1.11.1" 170 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199" 171 | integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA== 172 | dependencies: 173 | "@webassemblyjs/ast" "1.11.1" 174 | "@webassemblyjs/helper-api-error" "1.11.1" 175 | "@webassemblyjs/helper-wasm-bytecode" "1.11.1" 176 | "@webassemblyjs/ieee754" "1.11.1" 177 | "@webassemblyjs/leb128" "1.11.1" 178 | "@webassemblyjs/utf8" "1.11.1" 179 | 180 | "@webassemblyjs/wast-printer@1.11.1": 181 | version "1.11.1" 182 | resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0" 183 | integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg== 184 | dependencies: 185 | "@webassemblyjs/ast" "1.11.1" 186 | "@xtuc/long" "4.2.2" 187 | 188 | "@webpack-cli/configtest@^1.1.0": 189 | version "1.1.0" 190 | resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.0.tgz#8342bef0badfb7dfd3b576f2574ab80c725be043" 191 | integrity sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg== 192 | 193 | "@webpack-cli/info@^1.4.0": 194 | version "1.4.0" 195 | resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.0.tgz#b9179c3227ab09cbbb149aa733475fcf99430223" 196 | integrity sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw== 197 | dependencies: 198 | envinfo "^7.7.3" 199 | 200 | "@webpack-cli/serve@^1.6.0": 201 | version "1.6.0" 202 | resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.0.tgz#2c275aa05c895eccebbfc34cfb223c6e8bd591a2" 203 | integrity sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA== 204 | 205 | "@xtuc/ieee754@^1.2.0": 206 | version "1.2.0" 207 | resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" 208 | integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== 209 | 210 | "@xtuc/long@4.2.2": 211 | version "4.2.2" 212 | resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" 213 | integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== 214 | 215 | acorn-import-assertions@^1.7.6: 216 | version "1.8.0" 217 | resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" 218 | integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== 219 | 220 | acorn@^8.4.1: 221 | version "8.7.0" 222 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.0.tgz#90951fde0f8f09df93549481e5fc141445b791cf" 223 | integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ== 224 | 225 | ajv-keywords@^3.5.2: 226 | version "3.5.2" 227 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" 228 | integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== 229 | 230 | ajv@^6.12.5: 231 | version "6.12.6" 232 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 233 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 234 | dependencies: 235 | fast-deep-equal "^3.1.1" 236 | fast-json-stable-stringify "^2.0.0" 237 | json-schema-traverse "^0.4.1" 238 | uri-js "^4.2.2" 239 | 240 | ansi-styles@^4.1.0: 241 | version "4.3.0" 242 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 243 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 244 | dependencies: 245 | color-convert "^2.0.1" 246 | 247 | braces@^3.0.1: 248 | version "3.0.2" 249 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 250 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 251 | dependencies: 252 | fill-range "^7.0.1" 253 | 254 | browserslist@^4.14.5: 255 | version "4.19.1" 256 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" 257 | integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== 258 | dependencies: 259 | caniuse-lite "^1.0.30001286" 260 | electron-to-chromium "^1.4.17" 261 | escalade "^3.1.1" 262 | node-releases "^2.0.1" 263 | picocolors "^1.0.0" 264 | 265 | buffer-from@^1.0.0: 266 | version "1.1.2" 267 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 268 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 269 | 270 | caniuse-lite@^1.0.30001286: 271 | version "1.0.30001300" 272 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz#11ab6c57d3eb6f964cba950401fd00a146786468" 273 | integrity sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA== 274 | 275 | chalk@^4.1.0: 276 | version "4.1.2" 277 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 278 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 279 | dependencies: 280 | ansi-styles "^4.1.0" 281 | supports-color "^7.1.0" 282 | 283 | chrome-trace-event@^1.0.2: 284 | version "1.0.3" 285 | resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" 286 | integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== 287 | 288 | clone-deep@^4.0.1: 289 | version "4.0.1" 290 | resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" 291 | integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== 292 | dependencies: 293 | is-plain-object "^2.0.4" 294 | kind-of "^6.0.2" 295 | shallow-clone "^3.0.0" 296 | 297 | color-convert@^2.0.1: 298 | version "2.0.1" 299 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 300 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 301 | dependencies: 302 | color-name "~1.1.4" 303 | 304 | color-name@~1.1.4: 305 | version "1.1.4" 306 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 307 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 308 | 309 | colorette@^2.0.14: 310 | version "2.0.16" 311 | resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" 312 | integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== 313 | 314 | commander@^2.20.0: 315 | version "2.20.3" 316 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 317 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 318 | 319 | commander@^7.0.0: 320 | version "7.2.0" 321 | resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" 322 | integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== 323 | 324 | cross-spawn@^7.0.3: 325 | version "7.0.3" 326 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 327 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 328 | dependencies: 329 | path-key "^3.1.0" 330 | shebang-command "^2.0.0" 331 | which "^2.0.1" 332 | 333 | csstype@^3.0.2: 334 | version "3.0.10" 335 | resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.10.tgz#2ad3a7bed70f35b965707c092e5f30b327c290e5" 336 | integrity sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA== 337 | 338 | electron-to-chromium@^1.4.17: 339 | version "1.4.49" 340 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.49.tgz#5b6a3dc032590beef4be485a4b0b3fe7d0e3dfd7" 341 | integrity sha512-k/0t1TRfonHIp8TJKfjBu2cKj8MqYTiEpOhci+q7CVEE5xnCQnx1pTa+V8b/sdhe4S3PR4p4iceEQWhGrKQORQ== 342 | 343 | enhanced-resolve@^5.0.0, enhanced-resolve@^5.8.3: 344 | version "5.8.3" 345 | resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" 346 | integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== 347 | dependencies: 348 | graceful-fs "^4.2.4" 349 | tapable "^2.2.0" 350 | 351 | envinfo@^7.7.3: 352 | version "7.8.1" 353 | resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" 354 | integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== 355 | 356 | es-module-lexer@^0.9.0: 357 | version "0.9.3" 358 | resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19" 359 | integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ== 360 | 361 | escalade@^3.1.1: 362 | version "3.1.1" 363 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 364 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 365 | 366 | eslint-scope@5.1.1: 367 | version "5.1.1" 368 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" 369 | integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== 370 | dependencies: 371 | esrecurse "^4.3.0" 372 | estraverse "^4.1.1" 373 | 374 | esrecurse@^4.3.0: 375 | version "4.3.0" 376 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 377 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 378 | dependencies: 379 | estraverse "^5.2.0" 380 | 381 | estraverse@^4.1.1: 382 | version "4.3.0" 383 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" 384 | integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== 385 | 386 | estraverse@^5.2.0: 387 | version "5.3.0" 388 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 389 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 390 | 391 | events@^3.2.0: 392 | version "3.3.0" 393 | resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" 394 | integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== 395 | 396 | execa@^5.0.0: 397 | version "5.1.1" 398 | resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" 399 | integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== 400 | dependencies: 401 | cross-spawn "^7.0.3" 402 | get-stream "^6.0.0" 403 | human-signals "^2.1.0" 404 | is-stream "^2.0.0" 405 | merge-stream "^2.0.0" 406 | npm-run-path "^4.0.1" 407 | onetime "^5.1.2" 408 | signal-exit "^3.0.3" 409 | strip-final-newline "^2.0.0" 410 | 411 | fast-deep-equal@^3.1.1: 412 | version "3.1.3" 413 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 414 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 415 | 416 | fast-json-stable-stringify@^2.0.0: 417 | version "2.1.0" 418 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 419 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 420 | 421 | fastest-levenshtein@^1.0.12: 422 | version "1.0.12" 423 | resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" 424 | integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== 425 | 426 | fill-range@^7.0.1: 427 | version "7.0.1" 428 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 429 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 430 | dependencies: 431 | to-regex-range "^5.0.1" 432 | 433 | find-up@^4.0.0: 434 | version "4.1.0" 435 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 436 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 437 | dependencies: 438 | locate-path "^5.0.0" 439 | path-exists "^4.0.0" 440 | 441 | function-bind@^1.1.1: 442 | version "1.1.1" 443 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 444 | integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== 445 | 446 | get-stream@^6.0.0: 447 | version "6.0.1" 448 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 449 | integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 450 | 451 | glob-to-regexp@^0.4.1: 452 | version "0.4.1" 453 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" 454 | integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== 455 | 456 | graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: 457 | version "4.2.9" 458 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" 459 | integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== 460 | 461 | has-flag@^4.0.0: 462 | version "4.0.0" 463 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 464 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 465 | 466 | has@^1.0.3: 467 | version "1.0.3" 468 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" 469 | integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== 470 | dependencies: 471 | function-bind "^1.1.1" 472 | 473 | human-signals@^2.1.0: 474 | version "2.1.0" 475 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" 476 | integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== 477 | 478 | import-local@^3.0.2: 479 | version "3.1.0" 480 | resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4" 481 | integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== 482 | dependencies: 483 | pkg-dir "^4.2.0" 484 | resolve-cwd "^3.0.0" 485 | 486 | interpret@^2.2.0: 487 | version "2.2.0" 488 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" 489 | integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== 490 | 491 | is-core-module@^2.8.0: 492 | version "2.8.1" 493 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" 494 | integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== 495 | dependencies: 496 | has "^1.0.3" 497 | 498 | is-number@^7.0.0: 499 | version "7.0.0" 500 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 501 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 502 | 503 | is-plain-object@^2.0.4: 504 | version "2.0.4" 505 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 506 | integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== 507 | dependencies: 508 | isobject "^3.0.1" 509 | 510 | is-stream@^2.0.0: 511 | version "2.0.1" 512 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 513 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 514 | 515 | isexe@^2.0.0: 516 | version "2.0.0" 517 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 518 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 519 | 520 | isobject@^3.0.1: 521 | version "3.0.1" 522 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 523 | integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= 524 | 525 | jest-worker@^27.4.1: 526 | version "27.4.6" 527 | resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.4.6.tgz#5d2d93db419566cb680752ca0792780e71b3273e" 528 | integrity sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw== 529 | dependencies: 530 | "@types/node" "*" 531 | merge-stream "^2.0.0" 532 | supports-color "^8.0.0" 533 | 534 | "js-tokens@^3.0.0 || ^4.0.0": 535 | version "4.0.0" 536 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 537 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 538 | 539 | json-parse-better-errors@^1.0.2: 540 | version "1.0.2" 541 | resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" 542 | integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== 543 | 544 | json-schema-traverse@^0.4.1: 545 | version "0.4.1" 546 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 547 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 548 | 549 | kind-of@^6.0.2: 550 | version "6.0.3" 551 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" 552 | integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== 553 | 554 | loader-runner@^4.2.0: 555 | version "4.2.0" 556 | resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" 557 | integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== 558 | 559 | locate-path@^5.0.0: 560 | version "5.0.0" 561 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 562 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 563 | dependencies: 564 | p-locate "^4.1.0" 565 | 566 | loose-envify@^1.1.0: 567 | version "1.4.0" 568 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" 569 | integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== 570 | dependencies: 571 | js-tokens "^3.0.0 || ^4.0.0" 572 | 573 | lru-cache@^6.0.0: 574 | version "6.0.0" 575 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 576 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 577 | dependencies: 578 | yallist "^4.0.0" 579 | 580 | merge-stream@^2.0.0: 581 | version "2.0.0" 582 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 583 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 584 | 585 | micromatch@^4.0.0: 586 | version "4.0.4" 587 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" 588 | integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== 589 | dependencies: 590 | braces "^3.0.1" 591 | picomatch "^2.2.3" 592 | 593 | mime-db@1.51.0: 594 | version "1.51.0" 595 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" 596 | integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== 597 | 598 | mime-types@^2.1.27: 599 | version "2.1.34" 600 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" 601 | integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== 602 | dependencies: 603 | mime-db "1.51.0" 604 | 605 | mimic-fn@^2.1.0: 606 | version "2.1.0" 607 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 608 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 609 | 610 | neo-async@^2.6.2: 611 | version "2.6.2" 612 | resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" 613 | integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== 614 | 615 | node-releases@^2.0.1: 616 | version "2.0.1" 617 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" 618 | integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== 619 | 620 | npm-run-path@^4.0.1: 621 | version "4.0.1" 622 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 623 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 624 | dependencies: 625 | path-key "^3.0.0" 626 | 627 | onetime@^5.1.2: 628 | version "5.1.2" 629 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 630 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 631 | dependencies: 632 | mimic-fn "^2.1.0" 633 | 634 | p-limit@^2.2.0: 635 | version "2.3.0" 636 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 637 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 638 | dependencies: 639 | p-try "^2.0.0" 640 | 641 | p-locate@^4.1.0: 642 | version "4.1.0" 643 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 644 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 645 | dependencies: 646 | p-limit "^2.2.0" 647 | 648 | p-try@^2.0.0: 649 | version "2.2.0" 650 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 651 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 652 | 653 | path-exists@^4.0.0: 654 | version "4.0.0" 655 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 656 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 657 | 658 | path-key@^3.0.0, path-key@^3.1.0: 659 | version "3.1.1" 660 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 661 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 662 | 663 | path-parse@^1.0.7: 664 | version "1.0.7" 665 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 666 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 667 | 668 | picocolors@^1.0.0: 669 | version "1.0.0" 670 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 671 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 672 | 673 | picomatch@^2.2.3: 674 | version "2.3.1" 675 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 676 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 677 | 678 | pkg-dir@^4.2.0: 679 | version "4.2.0" 680 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 681 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 682 | dependencies: 683 | find-up "^4.0.0" 684 | 685 | punycode@^2.1.0: 686 | version "2.1.1" 687 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 688 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 689 | 690 | randombytes@^2.1.0: 691 | version "2.1.0" 692 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 693 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 694 | dependencies: 695 | safe-buffer "^5.1.0" 696 | 697 | react-dom@^18.2.0: 698 | version "18.2.0" 699 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" 700 | integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== 701 | dependencies: 702 | loose-envify "^1.1.0" 703 | scheduler "^0.23.0" 704 | 705 | "react-use-error-boundary@file:../dist": 706 | version "3.0.0" 707 | 708 | react@^18.2.0: 709 | version "18.2.0" 710 | resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" 711 | integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== 712 | dependencies: 713 | loose-envify "^1.1.0" 714 | 715 | rechoir@^0.7.0: 716 | version "0.7.1" 717 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" 718 | integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== 719 | dependencies: 720 | resolve "^1.9.0" 721 | 722 | resolve-cwd@^3.0.0: 723 | version "3.0.0" 724 | resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" 725 | integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== 726 | dependencies: 727 | resolve-from "^5.0.0" 728 | 729 | resolve-from@^5.0.0: 730 | version "5.0.0" 731 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 732 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 733 | 734 | resolve@^1.9.0: 735 | version "1.21.0" 736 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f" 737 | integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA== 738 | dependencies: 739 | is-core-module "^2.8.0" 740 | path-parse "^1.0.7" 741 | supports-preserve-symlinks-flag "^1.0.0" 742 | 743 | safe-buffer@^5.1.0: 744 | version "5.2.1" 745 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 746 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 747 | 748 | scheduler@^0.23.0: 749 | version "0.23.0" 750 | resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" 751 | integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== 752 | dependencies: 753 | loose-envify "^1.1.0" 754 | 755 | schema-utils@^3.1.0, schema-utils@^3.1.1: 756 | version "3.1.1" 757 | resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" 758 | integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== 759 | dependencies: 760 | "@types/json-schema" "^7.0.8" 761 | ajv "^6.12.5" 762 | ajv-keywords "^3.5.2" 763 | 764 | semver@^7.3.4: 765 | version "7.3.5" 766 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" 767 | integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== 768 | dependencies: 769 | lru-cache "^6.0.0" 770 | 771 | serialize-javascript@^6.0.0: 772 | version "6.0.0" 773 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 774 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 775 | dependencies: 776 | randombytes "^2.1.0" 777 | 778 | shallow-clone@^3.0.0: 779 | version "3.0.1" 780 | resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" 781 | integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== 782 | dependencies: 783 | kind-of "^6.0.2" 784 | 785 | shebang-command@^2.0.0: 786 | version "2.0.0" 787 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 788 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 789 | dependencies: 790 | shebang-regex "^3.0.0" 791 | 792 | shebang-regex@^3.0.0: 793 | version "3.0.0" 794 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 795 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 796 | 797 | signal-exit@^3.0.3: 798 | version "3.0.6" 799 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" 800 | integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== 801 | 802 | source-map-support@~0.5.20: 803 | version "0.5.21" 804 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" 805 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== 806 | dependencies: 807 | buffer-from "^1.0.0" 808 | source-map "^0.6.0" 809 | 810 | source-map@^0.6.0, source-map@^0.6.1: 811 | version "0.6.1" 812 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 813 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 814 | 815 | source-map@~0.7.2: 816 | version "0.7.3" 817 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" 818 | integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== 819 | 820 | strip-final-newline@^2.0.0: 821 | version "2.0.0" 822 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 823 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 824 | 825 | supports-color@^7.1.0: 826 | version "7.2.0" 827 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 828 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 829 | dependencies: 830 | has-flag "^4.0.0" 831 | 832 | supports-color@^8.0.0: 833 | version "8.1.1" 834 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 835 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 836 | dependencies: 837 | has-flag "^4.0.0" 838 | 839 | supports-preserve-symlinks-flag@^1.0.0: 840 | version "1.0.0" 841 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 842 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 843 | 844 | tapable@^2.1.1, tapable@^2.2.0: 845 | version "2.2.1" 846 | resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" 847 | integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== 848 | 849 | terser-webpack-plugin@^5.1.3: 850 | version "5.3.0" 851 | resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz#21641326486ecf91d8054161c816e464435bae9f" 852 | integrity sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ== 853 | dependencies: 854 | jest-worker "^27.4.1" 855 | schema-utils "^3.1.1" 856 | serialize-javascript "^6.0.0" 857 | source-map "^0.6.1" 858 | terser "^5.7.2" 859 | 860 | terser@^5.7.2: 861 | version "5.10.0" 862 | resolved "https://registry.yarnpkg.com/terser/-/terser-5.10.0.tgz#b86390809c0389105eb0a0b62397563096ddafcc" 863 | integrity sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA== 864 | dependencies: 865 | commander "^2.20.0" 866 | source-map "~0.7.2" 867 | source-map-support "~0.5.20" 868 | 869 | to-regex-range@^5.0.1: 870 | version "5.0.1" 871 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 872 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 873 | dependencies: 874 | is-number "^7.0.0" 875 | 876 | ts-loader@^9.2.6: 877 | version "9.2.6" 878 | resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-9.2.6.tgz#9937c4dd0a1e3dbbb5e433f8102a6601c6615d74" 879 | integrity sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw== 880 | dependencies: 881 | chalk "^4.1.0" 882 | enhanced-resolve "^5.0.0" 883 | micromatch "^4.0.0" 884 | semver "^7.3.4" 885 | 886 | typescript@^4.5.5: 887 | version "4.5.5" 888 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.5.tgz#d8c953832d28924a9e3d37c73d729c846c5896f3" 889 | integrity sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA== 890 | 891 | uri-js@^4.2.2: 892 | version "4.4.1" 893 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 894 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 895 | dependencies: 896 | punycode "^2.1.0" 897 | 898 | watchpack@^2.3.1: 899 | version "2.3.1" 900 | resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" 901 | integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== 902 | dependencies: 903 | glob-to-regexp "^0.4.1" 904 | graceful-fs "^4.1.2" 905 | 906 | webpack-cli@^4.9.1: 907 | version "4.9.1" 908 | resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.1.tgz#b64be825e2d1b130f285c314caa3b1ba9a4632b3" 909 | integrity sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ== 910 | dependencies: 911 | "@discoveryjs/json-ext" "^0.5.0" 912 | "@webpack-cli/configtest" "^1.1.0" 913 | "@webpack-cli/info" "^1.4.0" 914 | "@webpack-cli/serve" "^1.6.0" 915 | colorette "^2.0.14" 916 | commander "^7.0.0" 917 | execa "^5.0.0" 918 | fastest-levenshtein "^1.0.12" 919 | import-local "^3.0.2" 920 | interpret "^2.2.0" 921 | rechoir "^0.7.0" 922 | webpack-merge "^5.7.3" 923 | 924 | webpack-merge@^5.7.3: 925 | version "5.8.0" 926 | resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" 927 | integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== 928 | dependencies: 929 | clone-deep "^4.0.1" 930 | wildcard "^2.0.0" 931 | 932 | webpack-sources@^3.2.2: 933 | version "3.2.3" 934 | resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" 935 | integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== 936 | 937 | webpack@^5.66.0: 938 | version "5.66.0" 939 | resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.66.0.tgz#789bf36287f407fc92b3e2d6f978ddff1bfc2dbb" 940 | integrity sha512-NJNtGT7IKpGzdW7Iwpn/09OXz9inIkeIQ/ibY6B+MdV1x6+uReqz/5z1L89ezWnpPDWpXF0TY5PCYKQdWVn8Vg== 941 | dependencies: 942 | "@types/eslint-scope" "^3.7.0" 943 | "@types/estree" "^0.0.50" 944 | "@webassemblyjs/ast" "1.11.1" 945 | "@webassemblyjs/wasm-edit" "1.11.1" 946 | "@webassemblyjs/wasm-parser" "1.11.1" 947 | acorn "^8.4.1" 948 | acorn-import-assertions "^1.7.6" 949 | browserslist "^4.14.5" 950 | chrome-trace-event "^1.0.2" 951 | enhanced-resolve "^5.8.3" 952 | es-module-lexer "^0.9.0" 953 | eslint-scope "5.1.1" 954 | events "^3.2.0" 955 | glob-to-regexp "^0.4.1" 956 | graceful-fs "^4.2.9" 957 | json-parse-better-errors "^1.0.2" 958 | loader-runner "^4.2.0" 959 | mime-types "^2.1.27" 960 | neo-async "^2.6.2" 961 | schema-utils "^3.1.0" 962 | tapable "^2.1.1" 963 | terser-webpack-plugin "^5.1.3" 964 | watchpack "^2.3.1" 965 | webpack-sources "^3.2.2" 966 | 967 | which@^2.0.1: 968 | version "2.0.2" 969 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 970 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 971 | dependencies: 972 | isexe "^2.0.0" 973 | 974 | wildcard@^2.0.0: 975 | version "2.0.0" 976 | resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" 977 | integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== 978 | 979 | yallist@^4.0.0: 980 | version "4.0.0" 981 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 982 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 983 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line no-undef 2 | module.exports = { 3 | clearMocks: true, 4 | coverageDirectory: "coverage", 5 | testEnvironment: "jsdom", 6 | }; 7 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-use-error-boundary-development", 3 | "license": "MIT", 4 | "author": "Tate ", 5 | "homepage": "https://github.com/tatethurston/react-use-error-boundary#readme", 6 | "repository": { 7 | "type": "git", 8 | "url": "git+https://github.com/tatethurston/react-use-error-boundary.git" 9 | }, 10 | "bugs": { 11 | "url": "https://github.com/tatethurston/react-use-error-boundary/issues" 12 | }, 13 | "scripts": { 14 | "build:commonjs": "yarn tsc --module commonjs --outDir dist/cjs", 15 | "build:module": "yarn tsc", 16 | "build:watch": "yarn build --watch", 17 | "clean": "rm -rf dist/*", 18 | "lint": "yarn typecheck && prettier --check . && prettier-package-json --list-different package.json && eslint .", 19 | "lint:fix": "prettier --write . && prettier-package-json --write package.json && eslint --fix .", 20 | "lint:fix:md": "prettier --write '*.md'", 21 | "lint:fix:package": "prettier-package-json --write package.json", 22 | "lint:fix:ts": "eslint --fix './src/**/*.ts{,x}'", 23 | "package:build": "yarn install && yarn clean && yarn build:commonjs && yarn build:module && yarn package:prune && yarn package:copy:files", 24 | "package:copy:files": "cp ./LICENSE ./README.md dist/ && cp ./public.package.json dist/package.json", 25 | "package:prune": "find dist -name test.* -delete", 26 | "test": "jest src/*", 27 | "test:ci": "yarn test --coverage", 28 | "typecheck": "yarn tsc --noEmit && (cd example && yarn && yarn tsc --noEmit)", 29 | "typecheck:watch": "yarn typecheck --watch" 30 | }, 31 | "devDependencies": { 32 | "@babel/preset-env": "^7.18.2", 33 | "@babel/preset-react": "^7.17.12", 34 | "@babel/preset-typescript": "^7.17.12", 35 | "@testing-library/react": "^13.3.0", 36 | "@testing-library/user-event": "^14.2.1", 37 | "@types/jest": "^28.1.3", 38 | "@types/node": "^18.0.0", 39 | "@types/react": "^18.0.14", 40 | "@typescript-eslint/eslint-plugin": "^5.29.0", 41 | "@typescript-eslint/parser": "^5.29.0", 42 | "babel-loader": "^8.2.5", 43 | "codecov": "^3.8.3", 44 | "eslint": "^8.18.0", 45 | "eslint-config-prettier": "^8.5.0", 46 | "eslint-plugin-react-hooks": "^4.6.0", 47 | "husky": "^4.3.0", 48 | "jest": "^28.1.1", 49 | "jest-environment-jsdom": "^28.1.1", 50 | "prettier": "^2.7.1", 51 | "prettier-package-json": "^2.6.3", 52 | "react": "^18.2.0", 53 | "react-dom": "^18.2.0", 54 | "typescript": "^4.7.4" 55 | }, 56 | "husky": { 57 | "hooks": { 58 | "pre-commit": "yarn lint:fix" 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /public.package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-use-error-boundary", 3 | "version": "3.0.0", 4 | "description": "A React error boundary hook for function components", 5 | "license": "MIT", 6 | "author": "Tate ", 7 | "homepage": "https://github.com/tatethurston/react-use-error-boundary#readme", 8 | "repository": { 9 | "type": "git", 10 | "url": "git+https://github.com/tatethurston/react-use-error-boundary.git" 11 | }, 12 | "bugs": { 13 | "url": "https://github.com/tatethurston/react-use-error-boundary/issues" 14 | }, 15 | "sideEffects": false, 16 | "types": "index.d.ts", 17 | "peerDependencies": { 18 | "react": ">= 16.8" 19 | }, 20 | "main": "./cjs/index.js", 21 | "module": "./index.js", 22 | "exports": { 23 | "./package.json": "./package.json", 24 | ".": { 25 | "import": "./index.js", 26 | "module": "./index.js", 27 | "default": "./cjs/index.js" 28 | } 29 | }, 30 | "keywords": [ 31 | "componentDidCatch", 32 | "error boundary hook", 33 | "react error boundary", 34 | "react hook", 35 | "useErrorBoundary" 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /src/index.tsx: -------------------------------------------------------------------------------- 1 | import React, { 2 | Component, 3 | useState, 4 | useCallback, 5 | createContext, 6 | useContext, 7 | MutableRefObject, 8 | useMemo, 9 | useRef, 10 | ComponentType, 11 | ReactNode, 12 | PropsWithChildren, 13 | ReactElement, 14 | ErrorInfo, 15 | } from "react"; 16 | 17 | type ComponentDidCatch = (error: unknown, errorInfo: ErrorInfo) => void; 18 | 19 | interface ErrorBoundaryProps { 20 | error: unknown | undefined; 21 | onError: ComponentDidCatch; 22 | } 23 | 24 | class ErrorBoundary extends Component> { 25 | displayName = "ReactUseErrorBoundary"; 26 | 27 | componentDidCatch( 28 | ...args: Parameters> 29 | ) { 30 | // silence React warning: 31 | // ErrorBoundary: Error boundaries should implement getDerivedStateFromError(). In that method, return a state update to display an error message or fallback UI 32 | this.setState({}); 33 | this.props.onError(...args); 34 | } 35 | 36 | render() { 37 | return this.props.children; 38 | } 39 | } 40 | 41 | const noop = () => false; 42 | 43 | interface ErrorBoundaryCtx { 44 | componentDidCatch: MutableRefObject; 45 | error: unknown | undefined; 46 | setError: (error: Error | undefined) => void; 47 | } 48 | 49 | const errorBoundaryContext = createContext({ 50 | componentDidCatch: { current: undefined }, 51 | error: undefined, 52 | setError: noop, 53 | }); 54 | 55 | // eslint-disable-next-line @typescript-eslint/ban-types 56 | export function ErrorBoundaryContext({ 57 | children, 58 | }: { 59 | children?: ReactNode | undefined; 60 | }) { 61 | const [error, setError] = useState(); 62 | const componentDidCatch = useRef(); 63 | const ctx = useMemo( 64 | () => ({ 65 | componentDidCatch, 66 | error, 67 | setError, 68 | }), 69 | [error] 70 | ); 71 | return ( 72 | 73 | { 76 | setError(error); 77 | componentDidCatch.current?.(error, errorInfo); 78 | }} 79 | > 80 | {children} 81 | 82 | 83 | ); 84 | } 85 | ErrorBoundaryContext.displayName = "ReactUseErrorBoundaryContext"; 86 | 87 | export function withErrorBoundary>( 88 | WrappedComponent: ComponentType 89 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 90 | ): (props: PropsWithChildren) => ReactElement { 91 | function WithErrorBoundary(props: Props) { 92 | return ( 93 | 94 | 95 | 96 | ); 97 | } 98 | WithErrorBoundary.displayName = `WithErrorBoundary(${ 99 | // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition 100 | WrappedComponent.displayName ?? WrappedComponent.name ?? "Component" 101 | })`; 102 | 103 | return WithErrorBoundary; 104 | } 105 | 106 | type UseErrorBoundaryReturn = [ 107 | error: unknown | undefined, 108 | resetError: () => void 109 | ]; 110 | 111 | export function useErrorBoundary( 112 | componentDidCatch?: ComponentDidCatch 113 | ): UseErrorBoundaryReturn { 114 | const ctx = useContext(errorBoundaryContext); 115 | ctx.componentDidCatch.current = componentDidCatch; 116 | const resetError = useCallback(() => { 117 | ctx.setError(undefined); 118 | // eslint-disable-next-line react-hooks/exhaustive-deps 119 | }, []); 120 | 121 | return [ctx.error, resetError]; 122 | } 123 | -------------------------------------------------------------------------------- /src/test.tsx: -------------------------------------------------------------------------------- 1 | import React, { FC, useState } from "react"; 2 | import { useErrorBoundary, withErrorBoundary } from "."; 3 | import { render, screen } from "@testing-library/react"; 4 | import userEvent from "@testing-library/user-event"; 5 | 6 | // suppress error boundary console errors in test output 7 | jest.spyOn(global.console, "error").mockImplementation(); 8 | jest.spyOn(global.console, "warn").mockImplementation(); 9 | 10 | const ThrowError: FC = () => { 11 | throw new Error("Bombs away 💣"); 12 | }; 13 | 14 | const HappyPath: FC = () =>
Happy Path
; 15 | 16 | describe(useErrorBoundary, () => { 17 | it("invokes the componentDidCatch handler when there is an error", () => { 18 | const componentDidCatch = jest.fn(); 19 | 20 | const Example: FC = withErrorBoundary(() => { 21 | const [error] = useErrorBoundary(componentDidCatch); 22 | if (error) { 23 | return null; 24 | } 25 | 26 | return ; 27 | }); 28 | 29 | render(); 30 | 31 | expect(componentDidCatch).toHaveBeenCalledTimes(1); 32 | }); 33 | 34 | it("thrown primitives", () => { 35 | let error; 36 | 37 | const ThrowNonError: FC = () => { 38 | throw "Bombs away 💣"; 39 | }; 40 | 41 | const Example: FC = withErrorBoundary(() => { 42 | [error] = useErrorBoundary(); 43 | if (error) { 44 | return

Error: {error as string}

; 45 | } 46 | 47 | return ; 48 | }); 49 | 50 | render(); 51 | 52 | expect(screen.queryByText(/Error:/)).toMatchInlineSnapshot(` 53 |

54 | Error: 55 | Bombs away 💣 56 |

57 | `); 58 | }); 59 | 60 | it("does not invoke the componentDidCatch handler when there is not an error", () => { 61 | const componentDidCatch = jest.fn(); 62 | 63 | const Example: FC = withErrorBoundary(() => { 64 | const [error] = useErrorBoundary(componentDidCatch); 65 | if (error) { 66 | return null; 67 | } 68 | 69 | return ; 70 | }); 71 | 72 | render(); 73 | 74 | expect(componentDidCatch).toHaveBeenCalledTimes(0); 75 | }); 76 | 77 | it("invoking resetError handler resets the error state", async () => { 78 | const Example: FC = withErrorBoundary(() => { 79 | const [shouldThrow, setShouldThrow] = useState(false); 80 | const [error, resetError] = useErrorBoundary(); 81 | 82 | if (error) { 83 | return ( 84 | <> 85 |
Error
86 | 94 | 95 | ); 96 | } 97 | 98 | return ( 99 | <> 100 |
Happy Path
101 | {shouldThrow && } 102 | 109 | 110 | ); 111 | }); 112 | 113 | render(); 114 | expect(screen.queryByText("Happy Path")).not.toBeNull(); 115 | expect(screen.queryByText("Error")).toBeNull(); 116 | 117 | await userEvent.click(screen.getByText("Throw Error")); 118 | 119 | expect(screen.queryByText("Happy Path")).toBeNull(); 120 | expect(screen.queryByText("Error")).not.toBeNull(); 121 | 122 | await userEvent.click(screen.getByText("Reset Error")); 123 | 124 | expect(screen.queryByText("Happy Path")).not.toBeNull(); 125 | expect(screen.queryByText("Error")).toBeNull(); 126 | }); 127 | }); 128 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": false, 4 | "declaration": true, 5 | "esModuleInterop": true, 6 | "forceConsistentCasingInFileNames": true, 7 | "isolatedModules": true, 8 | "jsx": "react", 9 | "module": "ESNext", 10 | "moduleResolution": "Node", 11 | "noEmitOnError": false, 12 | "outDir": "dist", 13 | "removeComments": true, 14 | "resolveJsonModule": true, 15 | "rootDir": "src", 16 | "skipLibCheck": true, 17 | "sourceMap": false, 18 | "strict": true, 19 | "target": "ESNext" 20 | }, 21 | "include": ["src"] 22 | } 23 | --------------------------------------------------------------------------------