├── .github └── workflows │ └── test.yml ├── .gitignore ├── LICENSE ├── README.md ├── package.json ├── plugin ├── package.json ├── pnpm-global │ └── 5 │ │ └── pnpm-lock.yaml ├── rollup.config.js ├── src │ ├── index.ts │ ├── rwc.ts │ ├── utils │ │ ├── index.ts │ │ ├── react.ts │ │ └── viteWorker.ts │ ├── vite.ts │ └── vite │ │ ├── handleImports.ts │ │ ├── registerComponents.ts │ │ ├── workerComponent.ts │ │ └── workerFile.ts └── tsconfig.json ├── pnpm-global └── 5 │ └── pnpm-lock.yaml ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── test ├── utils.ts └── vite │ ├── App.tsx │ ├── Hello.worker.tsx │ ├── TextBox.tsx │ ├── basic.test.tsx │ ├── index.html │ ├── main.tsx │ ├── package.json │ ├── tsconfig.json │ └── vite.config.ts └── tsconfig.json /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Test 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | 8 | pull_request: 9 | branches: 10 | - main 11 | 12 | jobs: 13 | build: 14 | runs-on: ${{ matrix.os }} 15 | 16 | timeout-minutes: 6 17 | 18 | strategy: 19 | matrix: 20 | node-version: [16.x, 14] # 14 21 | os: [ubuntu-latest, windows-latest, macos-latest] # mac 22 | fail-fast: false 23 | 24 | steps: 25 | - uses: actions/checkout@v2 26 | 27 | - name: Install pnpm 28 | uses: pnpm/action-setup@v2.0.1 29 | with: 30 | version: 6.23.5 31 | 32 | - name: Set node version to ${{ matrix.node_version }} 33 | uses: actions/setup-node@v2 34 | with: 35 | node-version: ${{ matrix.node_version }} 36 | cache: "pnpm" 37 | 38 | - name: Install 39 | run: pnpm i 40 | 41 | - name: Build 42 | run: pnpm run build 43 | 44 | - name: Test 45 | run: pnpm run test:ci 46 | 47 | - name: Lint 48 | run: pnpm run lint --if-present 49 | 50 | - name: TypeCheck 51 | run: pnpm run typecheck 52 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | dist 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 M. Bagher Abiat 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-worker-components-plugin ⚡ 2 | 3 | ![](https://img.shields.io/static/v1?label=mode&message=experimental&color=red) 4 | 5 | > *something like react server components, but web workers instead of a server* 6 | 7 | **react-worker-components-plugin** is a plugin that renders components in web workers and not in the main thread, which helps in rendering blocking components in a non-blocking way. This project is based on the experimental [react-worker-components](https://github.com/dai-shi/react-worker-components). 8 | 9 | - ⚡ Fast 10 | - 💥 Powered by `Suspense` 11 | - 🔥 Easy to use 12 | 13 |
14 | 15 | You just need to create a file with a name that contains `.worker.`, in case you want to render its components in a Worker. 16 | 17 | ## Example 18 | [Try online (Stackblitz)](https://stackblitz.com/edit/vitejs-vite-eneunr) 19 | 20 | ### `Fib.worker.tsx` 21 | ```tsx 22 | const fib = (i: number): number => { 23 | const result = i <= 1 ? i : fib(i - 1) + fib(i - 2); 24 | return result; 25 | }; 26 | 27 | export const Fib = ({ num, children }) => { 28 | const fibNum = fib(num); 29 | 30 | return ( 31 |
32 | fib of number {num}: {fibNum} 33 | {children} 34 |
35 | ); 36 | }; 37 | ``` 38 | ### `App.tsx` 39 | ```tsx 40 | import { Fib } from './Fib.worker' 41 | 42 | function App() { 43 | const [count, setCount] = useState(40); 44 | return ( 45 |
46 |

Workers

47 | Count: {count} 48 | 51 | 58 | Loading...
}> 59 | 60 | 61 | 62 | ); 63 | } 64 | 65 | export default App; 66 | 67 | ``` 68 | 69 | ![chrome-capture](https://user-images.githubusercontent.com/37929992/153716004-8e4bd404-47ce-4a60-8931-db11018a4967.gif) 70 | 71 | 72 | ## Install 73 | ``` 74 | npm install -D react-worker-components-plugin 75 | ``` 76 | ## Plugins 77 | ### Vite 78 | This plugin for now works in Vite, and it's tested properly there. 79 | ```js 80 | // vite.config.js 81 | import { defineConfig } from "vite"; 82 | import { vite as rwc } from "react-worker-components-plugin"; 83 | 84 | export default defineConfig({ 85 | plugins: [rwc()] 86 | }); 87 | ``` 88 | 89 | ### Next/Webpack/... 90 | It's planned to support other bundlers, any help is appreciated in that case! 91 | 92 | ## Contributing 93 | Please try the plugin, find issues, report and fix them by sending Pull requests and issues! I appreciate that. 94 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@react-worker-components-plugin/monorepo", 3 | "version": "0.0.0", 4 | "private": true, 5 | "type": "module", 6 | "scripts": { 7 | "build": "pnpm -r run build", 8 | "dev": "pnpm -r --parallel run dev", 9 | "test:core": "vitest -r test/basic", 10 | "test:all": "cross-env pnpm -r --stream run test --", 11 | "test:ci": "cross-env CI=true pnpm -r --stream run test --", 12 | "typecheck": "pnpm -r --parallel run typecheck", 13 | "lint": "echo TODO" 14 | }, 15 | "devDependencies": { 16 | "@rollup/plugin-alias": "^3.1.9", 17 | "@rollup/plugin-commonjs": "^21.0.1", 18 | "@rollup/plugin-json": "^4.1.0", 19 | "@rollup/plugin-node-resolve": "^13.1.2", 20 | "@testing-library/jest-dom": "^5.16.1", 21 | "@testing-library/react": "^12.1.2", 22 | "@testing-library/react-hooks": "^7.0.2", 23 | "@testing-library/user-event": "^13.5.0", 24 | "@types/mime": "^2.0.3", 25 | "@types/react": "^17.0.38", 26 | "@types/react-dom": "^17.0.11", 27 | "@types/shelljs": "^0.8.10", 28 | "@vitejs/plugin-react": "^1.1.3", 29 | "buffer-es6": "^4.9.3", 30 | "cross-env": "^7.0.3", 31 | "execa": "^6.0.0", 32 | "kill-port": "^1.6.1", 33 | "magic-string": "^0.25.7", 34 | "process-es6": "^0.11.6", 35 | "puppeteer": "^13.0.1", 36 | "react": "^17.0.2", 37 | "react-dom": "^17.0.2", 38 | "rimraf": "^3.0.2", 39 | "rollup": "2.52.2", 40 | "rollup-plugin-dts": "^4.1.0", 41 | "rollup-plugin-esbuild": "^4.8.2", 42 | "shelljs": "^0.8.4", 43 | "typescript": "^4.5.4", 44 | "utility-types": "^3.10.0", 45 | "vite": "^2.7.10", 46 | "vitest": "^0.0.118" 47 | }, 48 | "dependencies": { 49 | "react-worker-components": "^0.1.0" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /plugin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-worker-components-plugin", 3 | "version": "0.0.0", 4 | "type": "module", 5 | "scripts": { 6 | "build": "rimraf dist && rollup -c", 7 | "dev": "rollup -c -w", 8 | "typecheck": "tsc --noEmit" 9 | }, 10 | "module": "./dist/index.js", 11 | "types": "./dist/index.d.ts", 12 | "exports": { 13 | ".": { 14 | "import": "./dist/index.js", 15 | "types": "./dist/index.d.ts", 16 | "default": "./dist/index.js" 17 | }, 18 | "./vite": { 19 | "import": "./dist/vite.js", 20 | "types": "./dist/vite.d.ts", 21 | "default": "./dist/vite.js" 22 | }, 23 | "./rwc": { 24 | "import": "./dist/rwc.js", 25 | "default": "./dist/rwc.js" 26 | } 27 | }, 28 | "files": [ 29 | "dist", 30 | "bin", 31 | "*.d.ts" 32 | ], 33 | "repository": { 34 | "type": "git", 35 | "url": "git+https://github.com/aslemammad/react-worker-components-plugin.git" 36 | }, 37 | "license": "MIT", 38 | "bugs": { 39 | "url": "https://github.com/aslemammad/react-worker-components-plugin/issues" 40 | }, 41 | "homepage": "https://github.com/aslemammad/react-worker-components-plugin#readme", 42 | "devDependencies": { 43 | "aslemammad-react-worker-components": "^0.1.1", 44 | "react-worker-components": "^0.1.0", 45 | "typescript": "^4.5.3", 46 | "vite": "2.7.0" 47 | }, 48 | "peerDependencies": { 49 | "vite": "*" 50 | }, 51 | "engines": { 52 | "node": ">=14.0.0" 53 | }, 54 | "dependencies": { 55 | "chalk": "^5.0.0", 56 | "es-module-lexer": "^0.9.3", 57 | "mime": "^3.0.0" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /plugin/pnpm-global/5/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | react-worker-components: ^0.1.0 5 | 6 | dependencies: 7 | react-worker-components: link:../../../../.nvm/versions/node/v16.5.0/pnpm-global/5/node_modules/react-worker-components 8 | -------------------------------------------------------------------------------- /plugin/rollup.config.js: -------------------------------------------------------------------------------- 1 | import esbuild from "rollup-plugin-esbuild"; 2 | import dts from "rollup-plugin-dts"; 3 | import resolve from "@rollup/plugin-node-resolve"; 4 | import commonjs from "@rollup/plugin-commonjs"; 5 | import json from "@rollup/plugin-json"; 6 | import alias from "@rollup/plugin-alias"; 7 | import pkg from "./package.json"; 8 | 9 | const entry = ["src/vite.ts", "src/rwc.ts", "src/index.ts"]; 10 | 11 | const external = [ 12 | ...Object.keys(pkg.dependencies || []), 13 | ...Object.keys(pkg.peerDependencies || []), 14 | 'react', 15 | 'react-dom' 16 | ]; 17 | 18 | export default [ 19 | { 20 | input: entry, 21 | watch: { 22 | chokidar: { 23 | usePolling: true, 24 | }, 25 | }, 26 | output: { 27 | sourcemap: 'inline', 28 | dir: "dist", 29 | format: "esm", 30 | }, 31 | external, 32 | plugins: [ 33 | alias({ 34 | entries: [{ find: /^node:(.+)$/, replacement: "$1" }], 35 | }), 36 | resolve({ 37 | preferBuiltins: true, 38 | }), 39 | json(), 40 | commonjs(), 41 | esbuild({ 42 | target: "node14", 43 | }), 44 | ], 45 | }, 46 | { 47 | watch: { 48 | chokidar: { 49 | usePolling: true, 50 | }, 51 | }, 52 | input: ["src/vite.ts"], 53 | output: { 54 | sourcemap: 'inline', 55 | file: "dist/vite.d.ts", 56 | format: "esm", 57 | }, 58 | external, 59 | plugins: [dts({ respectExternal: true })], 60 | }, 61 | { 62 | watch: { 63 | chokidar: { 64 | usePolling: true, 65 | }, 66 | }, 67 | input: ["src/index.ts"], 68 | output: { 69 | sourcemap: 'inline', 70 | file: "dist/index.d.ts", 71 | format: "esm", 72 | }, 73 | external, 74 | plugins: [dts({ respectExternal: true })], 75 | }, 76 | ]; 77 | -------------------------------------------------------------------------------- /plugin/src/index.ts: -------------------------------------------------------------------------------- 1 | export { default as vite } from "./vite"; 2 | -------------------------------------------------------------------------------- /plugin/src/rwc.ts: -------------------------------------------------------------------------------- 1 | export { expose, register, wrap } from "react-worker-components"; 2 | -------------------------------------------------------------------------------- /plugin/src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export function isWorkerComponent(id: string) { 2 | return id.includes(".worker."); 3 | } 4 | -------------------------------------------------------------------------------- /plugin/src/utils/react.ts: -------------------------------------------------------------------------------- 1 | export function isComponentishName(name: string) { 2 | return typeof name === "string" && name[0] >= "A" && name[0] <= "Z"; 3 | } 4 | -------------------------------------------------------------------------------- /plugin/src/utils/viteWorker.ts: -------------------------------------------------------------------------------- 1 | import { ResolvedConfig, Plugin, normalizePath } from "vite"; 2 | import mime from "mime/lite"; 3 | import fs, { promises as fsp } from "fs"; 4 | import { createHash } from "crypto"; 5 | import { parse as parseUrl, URLSearchParams, pathToFileURL, URL } from "url"; 6 | import type Rollup from "rollup"; 7 | import path from "path"; 8 | import { 9 | OutputOptions, 10 | PluginContext, 11 | RollupWarning, 12 | WarningHandler, 13 | } from "rollup"; 14 | import chalk from "chalk"; 15 | 16 | const warningIgnoreList = [`CIRCULAR_DEPENDENCY`, `THIS_IS_UNDEFINED`]; 17 | const dynamicImportWarningIgnoreList = [ 18 | `Unsupported expression`, 19 | `statically analyzed`, 20 | ]; 21 | export function onRollupWarning( 22 | warning: RollupWarning, 23 | warn: WarningHandler, 24 | config: ResolvedConfig 25 | ): void { 26 | if (warning.code === "UNRESOLVED_IMPORT") { 27 | const id = warning.source; 28 | const importer = warning.importer; 29 | // throw unless it's commonjs external... 30 | if (!importer || !/\?commonjs-external$/.test(importer)) { 31 | throw new Error( 32 | `[vite]: Rollup failed to resolve import "${id}" from "${importer}".\n` + 33 | `This is most likely unintended because it can break your application at runtime.\n` + 34 | `If you do want to externalize this module explicitly add it to\n` + 35 | `\`build.rollupOptions.external\`` 36 | ); 37 | } 38 | } 39 | 40 | if ( 41 | warning.plugin === "rollup-plugin-dynamic-import-variables" && 42 | dynamicImportWarningIgnoreList.some((msg) => warning.message.includes(msg)) 43 | ) { 44 | return; 45 | } 46 | 47 | if (!warningIgnoreList.includes(warning.code!)) { 48 | const userOnWarn = config.build.rollupOptions?.onwarn; 49 | if (userOnWarn) { 50 | userOnWarn(warning, warn); 51 | } else if (warning.code === "PLUGIN_WARNING") { 52 | config.logger.warn( 53 | `${chalk.bold.yellow(`[plugin:${warning.plugin}]`)} ${chalk.yellow( 54 | warning.message 55 | )}` 56 | ); 57 | } else { 58 | warn(warning); 59 | } 60 | } 61 | } 62 | export const ENV_PUBLIC_PATH = `/@vite/env`; 63 | export const FS_PREFIX = `/@fs/`; 64 | export const queryRE = /\?.*$/s; 65 | export const hashRE = /#.*$/s; 66 | export function injectQuery(url: string, queryToInject: string): string { 67 | // encode percents for consistent behavior with pathToFileURL 68 | // see #2614 for details 69 | let resolvedUrl = new URL(url.replace(/%/g, "%25"), "relative:///"); 70 | if (resolvedUrl.protocol !== "relative:") { 71 | resolvedUrl = pathToFileURL(url); 72 | } 73 | let { protocol, pathname, search, hash } = resolvedUrl; 74 | if (protocol === "file:") { 75 | pathname = pathname.slice(1); 76 | } 77 | pathname = decodeURIComponent(pathname); 78 | return `${pathname}?${queryToInject}${search ? `&` + search.slice(1) : ""}${ 79 | hash || "" 80 | }`; 81 | } 82 | export const cleanUrl = (url: string): string => 83 | url.replace(hashRE, "").replace(queryRE, ""); 84 | export function checkPublicFile( 85 | url: string, 86 | { publicDir }: ResolvedConfig 87 | ): string | undefined { 88 | // note if the file is in /public, the resolver would have returned it 89 | // as-is so it's not going to be a fully resolved path. 90 | if (!publicDir || !url.startsWith("/")) { 91 | return; 92 | } 93 | const publicFile = path.join(publicDir, cleanUrl(url)); 94 | if (fs.existsSync(publicFile)) { 95 | return publicFile; 96 | } else { 97 | return; 98 | } 99 | } 100 | 101 | /** 102 | * converts the source filepath of the asset to the output filename based on the assetFileNames option. \ 103 | * this function imitates the behavior of rollup.js. \ 104 | * https://rollupjs.org/guide/en/#outputassetfilenames 105 | * 106 | * @example 107 | * ```ts 108 | * const content = Buffer.from('text'); 109 | * const fileName = assetFileNamesToFileName( 110 | * 'assets/[name].[hash][extname]', 111 | * '/path/to/file.txt', 112 | * getAssetHash(content), 113 | * content 114 | * ) 115 | * // fileName: 'assets/file.982d9e3e.txt' 116 | * ``` 117 | * 118 | * @param assetFileNames filename pattern. e.g. `'assets/[name].[hash][extname]'` 119 | * @param file filepath of the asset 120 | * @param contentHash hash of the asset. used for `'[hash]'` placeholder 121 | * @param content content of the asset. passed to `assetFileNames` if `assetFileNames` is a function 122 | * @returns output filename 123 | */ 124 | export function assetFileNamesToFileName( 125 | assetFileNames: Exclude, 126 | file: string, 127 | contentHash: string, 128 | content: string | Buffer 129 | ): string { 130 | const basename = path.basename(file); 131 | 132 | // placeholders for `assetFileNames` 133 | // `hash` is slightly different from the rollup's one 134 | const extname = path.extname(basename); 135 | const ext = extname.substring(1); 136 | const name = basename.slice(0, -extname.length); 137 | const hash = contentHash; 138 | 139 | if (typeof assetFileNames === "function") { 140 | assetFileNames = assetFileNames({ 141 | name: file, 142 | source: content, 143 | type: "asset", 144 | }); 145 | if (typeof assetFileNames !== "string") { 146 | throw new TypeError("assetFileNames must return a string"); 147 | } 148 | } else if (typeof assetFileNames !== "string") { 149 | throw new TypeError("assetFileNames must be a string or a function"); 150 | } 151 | 152 | const fileName = assetFileNames.replace( 153 | /\[\w+\]/g, 154 | (placeholder: string): string => { 155 | switch (placeholder) { 156 | case "[ext]": 157 | return ext; 158 | 159 | case "[extname]": 160 | return extname; 161 | 162 | case "[hash]": 163 | return hash; 164 | 165 | case "[name]": 166 | return name; 167 | } 168 | throw new Error( 169 | `invalid placeholder ${placeholder} in assetFileNames "${assetFileNames}"` 170 | ); 171 | } 172 | ); 173 | 174 | return fileName; 175 | } 176 | const assetCache = new WeakMap>(); 177 | const assetHashToFilenameMap = new WeakMap< 178 | ResolvedConfig, 179 | Map 180 | >(); 181 | // save hashes of the files that has been emitted in build watch 182 | const emittedHashMap = new WeakMap>(); 183 | export function getAssetHash(content: Buffer): string { 184 | return createHash("sha256").update(content).digest("hex").slice(0, 8); 185 | } 186 | export async function fileToBuiltUrl( 187 | id: string, 188 | config: ResolvedConfig, 189 | pluginContext: PluginContext, 190 | skipPublicCheck = false 191 | ): Promise { 192 | if (!skipPublicCheck && checkPublicFile(id, config)) { 193 | return config.base + id.slice(1); 194 | } 195 | 196 | const cache = assetCache.get(config)!; 197 | const cached = cache.get(id); 198 | if (cached) { 199 | return cached; 200 | } 201 | 202 | const file = cleanUrl(id); 203 | const content = await fsp.readFile(file); 204 | 205 | let url: string; 206 | if ( 207 | config.build.lib || 208 | (!file.endsWith(".svg") && 209 | content.length < Number(config.build.assetsInlineLimit)) 210 | ) { 211 | // base64 inlined as a string 212 | url = `data:${mime.getType(file)};base64,${content.toString("base64")}`; 213 | } else { 214 | // emit as asset 215 | // rollup supports `import.meta.ROLLUP_FILE_URL_*`, but it generates code 216 | // that uses runtime url sniffing and it can be verbose when targeting 217 | // non-module format. It also fails to cascade the asset content change 218 | // into the chunk's hash, so we have to do our own content hashing here. 219 | // https://bundlers.tooling.report/hashing/asset-cascade/ 220 | // https://github.com/rollup/rollup/issues/3415 221 | const map = assetHashToFilenameMap.get(config)!; 222 | const contentHash = getAssetHash(content); 223 | const { search, hash } = parseUrl(id); 224 | const postfix = (search || "") + (hash || ""); 225 | const output = config.build?.rollupOptions?.output; 226 | const assetFileNames = 227 | (output && !Array.isArray(output) ? output.assetFileNames : undefined) ?? 228 | // defaults to '/[name].[hash][extname]' 229 | // slightly different from rollup's one ('assets/[name]-[hash][extname]') 230 | path.posix.join(config.build.assetsDir, "[name].[hash][extname]"); 231 | const fileName = assetFileNamesToFileName( 232 | assetFileNames, 233 | file, 234 | contentHash, 235 | content 236 | ); 237 | if (!map.has(contentHash)) { 238 | map.set(contentHash, fileName); 239 | } 240 | const emittedSet = emittedHashMap.get(config)!; 241 | if (!emittedSet.has(contentHash)) { 242 | const name = normalizePath(path.relative(config.root, file)); 243 | pluginContext.emitFile({ 244 | name, 245 | fileName, 246 | type: "asset", 247 | source: content, 248 | }); 249 | emittedSet.add(contentHash); 250 | } 251 | 252 | url = `__VITE_ASSET__${contentHash}__${postfix ? `$_${postfix}__` : ``}`; 253 | } 254 | 255 | cache.set(id, url); 256 | return url; 257 | } 258 | 259 | export function fileToDevUrl(id: string, config: ResolvedConfig) { 260 | let rtn: string; 261 | if (checkPublicFile(id, config)) { 262 | // in public dir, keep the url as-is 263 | rtn = id; 264 | } else if (id.startsWith(config.root)) { 265 | // in project root, infer short public path 266 | rtn = "/" + path.posix.relative(config.root, id); 267 | } else { 268 | // outside of project root, use absolute fs path 269 | // (this is special handled by the serve static middleware 270 | rtn = path.posix.join(FS_PREFIX + id); 271 | } 272 | const origin = config.server?.origin ?? ""; 273 | return origin + config.base + rtn.replace(/^\//, ""); 274 | } 275 | 276 | export function fileToUrl( 277 | id: string, 278 | config: ResolvedConfig, 279 | ctx: PluginContext 280 | ): string | Promise { 281 | if (config.command === "serve") { 282 | return fileToDevUrl(id, config); 283 | } else { 284 | return fileToBuiltUrl(id, config, ctx); 285 | } 286 | } 287 | export function parseWorkerRequest(id: string): Record | null { 288 | const { search } = parseUrl(id); 289 | if (!search) { 290 | return null; 291 | } 292 | return Object.fromEntries(new URLSearchParams(search.slice(1))); 293 | } 294 | 295 | const WorkerFileId = "worker_file"; 296 | 297 | export function webWorkerPlugin(config: ResolvedConfig): Plugin { 298 | const isBuild = config.command === "build"; 299 | 300 | return { 301 | name: "vite:worker", 302 | 303 | load(id) { 304 | if (isBuild) { 305 | const parsedQuery = parseWorkerRequest(id); 306 | if ( 307 | parsedQuery && 308 | (parsedQuery.worker ?? parsedQuery.sharedworker) != null 309 | ) { 310 | return ""; 311 | } 312 | } 313 | }, 314 | 315 | async transform(_, id) { 316 | const query = parseWorkerRequest(id); 317 | if (query && query[WorkerFileId] != null) { 318 | return { 319 | code: `import '${ENV_PUBLIC_PATH}'\n` + _, 320 | }; 321 | } 322 | if ( 323 | query == null || 324 | (query && (query.worker ?? query.sharedworker) == null) 325 | ) { 326 | return; 327 | } 328 | 329 | let url: string; 330 | if (isBuild) { 331 | // bundle the file as entry to support imports 332 | const rollup = require("rollup") as typeof Rollup; 333 | const bundle = await rollup.rollup({ 334 | input: cleanUrl(id), 335 | // plugins: await resolvePlugins({ ...config }, [], [], []), 336 | onwarn(warning, warn) { 337 | onRollupWarning(warning, warn, config); 338 | }, 339 | }); 340 | let code: string; 341 | try { 342 | const { output } = await bundle.generate({ 343 | format: "iife", 344 | sourcemap: config.build.sourcemap, 345 | }); 346 | code = output[0].code; 347 | } finally { 348 | await bundle.close(); 349 | } 350 | const content = Buffer.from(code); 351 | if (query.inline != null) { 352 | // inline as blob data url 353 | return `const encodedJs = "${content.toString("base64")}"; 354 | const blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], { type: "text/javascript;charset=utf-8" }); 355 | export default function WorkerWrapper() { 356 | const objURL = blob && (window.URL || window.webkitURL).createObjectURL(blob); 357 | try { 358 | return objURL ? new Worker(objURL) : new Worker("data:application/javascript;base64," + encodedJs, {type: "module"}); 359 | } finally { 360 | objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL); 361 | } 362 | }`; 363 | } else { 364 | const basename = path.parse(cleanUrl(id)).name; 365 | const contentHash = getAssetHash(content); 366 | const fileName = path.posix.join( 367 | config.build.assetsDir, 368 | `${basename}.${contentHash}.js` 369 | ); 370 | url = `__VITE_ASSET__${this.emitFile({ 371 | fileName, 372 | type: "asset", 373 | source: code, 374 | })}__`; 375 | } 376 | } else { 377 | url = await fileToUrl(cleanUrl(id), config, this); 378 | url = injectQuery(url, WorkerFileId); 379 | } 380 | 381 | const workerConstructor = 382 | query.sharedworker != null ? "SharedWorker" : "Worker"; 383 | const workerOptions = { type: "module" }; 384 | 385 | return `export default function WorkerWrapper() { 386 | return new ${workerConstructor}(${JSON.stringify( 387 | url 388 | )}, ${JSON.stringify(workerOptions, null, 2)}) 389 | }`; 390 | }, 391 | }; 392 | } 393 | -------------------------------------------------------------------------------- /plugin/src/vite.ts: -------------------------------------------------------------------------------- 1 | import type { Plugin } from "vite"; 2 | import workerComponent from "./vite/workerComponent"; 3 | import workerFile from "./vite/workerFile"; 4 | import handleImports from "./vite/handleImports"; 5 | import registerComponents from "./vite/registerComponents"; 6 | 7 | export default function plugin(): Plugin[] { 8 | return [ 9 | registerComponents(), 10 | workerFile(), 11 | handleImports(), 12 | workerComponent(), 13 | ]; 14 | } 15 | -------------------------------------------------------------------------------- /plugin/src/vite/handleImports.ts: -------------------------------------------------------------------------------- 1 | import { ImportSpecifier, parse } from "es-module-lexer"; 2 | import MagicString from "magic-string"; 3 | import type { Plugin } from "vite"; 4 | 5 | export default function handleImports(): Plugin { 6 | return { 7 | enforce: "post", 8 | name: "react-worker-components:handle_imports", 9 | 10 | async transform(src) { 11 | const imports = parse(src)[0]; 12 | const workerComponentImports = importsWorkerComponent(imports); 13 | if (workerComponentImports.length) { 14 | const s = new MagicString(src); 15 | let index = 0; 16 | for (const { 17 | ss: statementStart, 18 | se: statementEnd, 19 | n, 20 | } of workerComponentImports) { 21 | const importContent = /\{(.*?)\}/.exec( 22 | src.substring(statementStart, statementEnd) 23 | )?.[1]; 24 | 25 | const entries: Record = {}; 26 | 27 | importContent?.split(",")?.forEach((i) => { 28 | if (i.includes("as")) { 29 | const [component, as] = i.split("as"); 30 | entries[component.trim()] = as.trim(); 31 | } else { 32 | entries[i.trim()] = i.trim(); 33 | } 34 | }); 35 | 36 | s.remove(statementStart, statementEnd); 37 | 38 | const newContent = ` 39 | import { wrap } from 'react-worker-components-plugin/rwc'; 40 | import __RWC_WORKER_${index} from '${n}'; 41 | 42 | ${Object.entries(entries) 43 | .map(([component, as]) => { 44 | return `const ${as} = wrap(() => new __RWC_WORKER_${index}(), '${component}');`; 45 | }) 46 | .join("\n")} 47 | `; 48 | s.prepend(newContent); 49 | 50 | index++; 51 | } 52 | 53 | return { 54 | code: s.toString(), 55 | map: s.generateMap(), 56 | }; 57 | } 58 | }, 59 | }; 60 | } 61 | 62 | function importsWorkerComponent(imports: readonly ImportSpecifier[]) { 63 | return imports.filter(({ n }) => n?.includes(".worker")); 64 | } 65 | -------------------------------------------------------------------------------- /plugin/src/vite/registerComponents.ts: -------------------------------------------------------------------------------- 1 | import { parse } from "es-module-lexer"; 2 | import MagicString from "magic-string"; 3 | import type { Plugin, ResolvedConfig } from "vite"; 4 | import { isWorkerComponent } from "../utils"; 5 | import { isComponentishName } from "../utils/react"; 6 | 7 | export default function registerComponents(): Plugin { 8 | let config: ResolvedConfig; 9 | return { 10 | enforce: "post", 11 | name: "react-worker-components:register_components", 12 | configResolved(_config) { 13 | config = _config; 14 | }, 15 | // register every component in a file that is not a worker 16 | transform(src, id) { 17 | if (isWorkerComponent(id)) { 18 | return; 19 | } 20 | if (!id.includes(config.root)) { 21 | return; 22 | } 23 | 24 | const s = new MagicString(src); 25 | const exports = parse(src)[1]; 26 | const components = exports.filter(isComponentishName); 27 | if (!components.length) { 28 | return; 29 | } 30 | const registeredExports = components 31 | .map((component) => `\nregister(${component},'${component}');`) 32 | .join(""); 33 | 34 | s.prepend( 35 | `import { register } from 'react-worker-components-plugin/rwc';\n` 36 | ); 37 | s.append(registeredExports); 38 | 39 | return { 40 | code: s.toString(), 41 | map: s.generateMap(), 42 | }; 43 | }, 44 | }; 45 | } 46 | -------------------------------------------------------------------------------- /plugin/src/vite/workerComponent.ts: -------------------------------------------------------------------------------- 1 | import MagicString from "magic-string"; 2 | import path from "path"; 3 | import type { Plugin, ResolvedConfig } from "vite"; 4 | import type Rollup from "rollup"; 5 | import { isWorkerComponent } from "../utils"; 6 | import { 7 | cleanUrl, 8 | fileToUrl, 9 | getAssetHash, 10 | injectQuery, 11 | onRollupWarning, 12 | } from "../utils/viteWorker"; 13 | 14 | const WorkerFileId = "react_worker_component"; 15 | export default function workerComponent(): Plugin { 16 | let config: ResolvedConfig; 17 | return { 18 | enforce: "post", 19 | name: "react-worker-components:worker_component", 20 | configResolved: (_config) => { 21 | config = _config; 22 | }, 23 | async transform(code, id) { 24 | if (id.includes(WorkerFileId)) { 25 | return; 26 | } 27 | if (!isWorkerComponent(id)) { 28 | return; 29 | } 30 | 31 | const s = new MagicString(code); 32 | const isBuild = config.command === "build"; 33 | let url: string; 34 | if (isBuild) { 35 | // bundle the file as entry to support imports 36 | const rollup = await import("rollup"); 37 | const bundle = await rollup.rollup({ 38 | input: cleanUrl(id), 39 | plugins: config.plugins 40 | .filter( 41 | (p) => !p.name.includes("react-worker-components:worker_component") 42 | ) as Rollup.Plugin[], 43 | onwarn(warning, warn) { 44 | onRollupWarning(warning, warn, config); 45 | }, 46 | }); 47 | let code: string; 48 | try { 49 | const { output } = await bundle.generate({ 50 | format: "esm", 51 | name: "worker_component", 52 | sourcemap: config.build.sourcemap, 53 | }); 54 | code = output[0].code; 55 | } finally { 56 | await bundle.close(); 57 | } 58 | const content = Buffer.from(code); 59 | 60 | const basename = path.parse(cleanUrl(id)).name; 61 | const contentHash = getAssetHash(content); 62 | const fileName = path.posix.join( 63 | config.build.assetsDir, 64 | `${basename}.${contentHash}.js` 65 | ); 66 | url = `__VITE_ASSET__${this.emitFile({ 67 | fileName, 68 | type: "asset", 69 | source: code, 70 | })}__`; 71 | } else { 72 | url = injectQuery( 73 | await fileToUrl(cleanUrl(id), config, this), 74 | WorkerFileId 75 | ); 76 | } 77 | 78 | const workerConstructor = "Worker"; 79 | const workerOptions = { type: "module" }; 80 | 81 | const result = `export default function WorkerWrapper() { 82 | return new ${workerConstructor}(${JSON.stringify( 83 | url 84 | )}, ${JSON.stringify(workerOptions, null, 2)}) 85 | } 86 | `; 87 | s.remove(0, code.length); 88 | 89 | s.append(result); 90 | 91 | return { code: s.toString(), map: s.generateMap() }; 92 | }, 93 | }; 94 | } 95 | -------------------------------------------------------------------------------- /plugin/src/vite/workerFile.ts: -------------------------------------------------------------------------------- 1 | import { init, parse } from "es-module-lexer"; 2 | import MagicString from "magic-string"; 3 | import type { Plugin, ResolvedConfig } from "vite"; 4 | import { isWorkerComponent } from "../utils"; 5 | import { isComponentishName } from "../utils/react"; 6 | import { ENV_PUBLIC_PATH, parseWorkerRequest } from "../utils/viteWorker"; 7 | 8 | const WorkerFileId = "react_worker_component"; 9 | export default function workerFile(): Plugin { 10 | let config: ResolvedConfig; 11 | return { 12 | enforce: "post", 13 | name: "react-worker-components:worker_file", 14 | configResolved: (_config) => { 15 | config = _config; 16 | }, 17 | async transform(src, id) { 18 | const isBuild = config.command === "build"; 19 | const query = parseWorkerRequest(id); 20 | 21 | if ( 22 | (query && query[WorkerFileId] != null) || 23 | // handle worker components here in build 24 | (isBuild && isWorkerComponent(id)) 25 | ) { 26 | await init; 27 | 28 | const s = new MagicString(src); 29 | const exports = parse(src)[1]; 30 | const exposedExports = exports 31 | .filter(isComponentishName) 32 | .map((component) => `\nexpose(${component}, '${component}');`) 33 | .join(""); 34 | 35 | s.prepend( 36 | `import { expose } from 'react-worker-components-plugin/rwc';\n` 37 | ); 38 | s.append(exposedExports); 39 | 40 | if (!isBuild) { 41 | s.prepend(`import '${ENV_PUBLIC_PATH}'\n`); 42 | } 43 | 44 | return { 45 | code: s.toString(), 46 | map: s.generateMap(), 47 | }; 48 | } 49 | }, 50 | }; 51 | } 52 | -------------------------------------------------------------------------------- /plugin/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "include": ["./src/**/*.ts"], 4 | "exclude": ["./dist"] 5 | } 6 | -------------------------------------------------------------------------------- /pnpm-global/5/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | specifiers: 4 | react-worker-components: ^0.1.0 5 | 6 | devDependencies: 7 | react-worker-components: link:../../../.nvm/versions/node/v16.5.0/pnpm-global/5/node_modules/react-worker-components 8 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: 5.3 2 | 3 | importers: 4 | 5 | .: 6 | specifiers: 7 | '@rollup/plugin-alias': ^3.1.9 8 | '@rollup/plugin-commonjs': ^21.0.1 9 | '@rollup/plugin-json': ^4.1.0 10 | '@rollup/plugin-node-resolve': ^13.1.2 11 | '@testing-library/jest-dom': ^5.16.1 12 | '@testing-library/react': ^12.1.2 13 | '@testing-library/react-hooks': ^7.0.2 14 | '@testing-library/user-event': ^13.5.0 15 | '@types/mime': ^2.0.3 16 | '@types/react': ^17.0.38 17 | '@types/react-dom': ^17.0.11 18 | '@types/shelljs': ^0.8.10 19 | '@vitejs/plugin-react': ^1.1.3 20 | buffer-es6: ^4.9.3 21 | cross-env: ^7.0.3 22 | execa: ^6.0.0 23 | kill-port: ^1.6.1 24 | magic-string: ^0.25.7 25 | process-es6: ^0.11.6 26 | puppeteer: ^13.0.1 27 | react: ^17.0.2 28 | react-dom: ^17.0.2 29 | react-worker-components: ^0.1.0 30 | rimraf: ^3.0.2 31 | rollup: 2.52.2 32 | rollup-plugin-dts: ^4.1.0 33 | rollup-plugin-esbuild: ^4.8.2 34 | shelljs: ^0.8.4 35 | typescript: ^4.5.4 36 | utility-types: ^3.10.0 37 | vite: ^2.7.10 38 | vitest: ^0.0.118 39 | dependencies: 40 | react-worker-components: 0.1.0_react@17.0.2 41 | devDependencies: 42 | '@rollup/plugin-alias': 3.1.9_rollup@2.52.2 43 | '@rollup/plugin-commonjs': 21.0.1_rollup@2.52.2 44 | '@rollup/plugin-json': 4.1.0_rollup@2.52.2 45 | '@rollup/plugin-node-resolve': 13.1.2_rollup@2.52.2 46 | '@testing-library/jest-dom': 5.16.1 47 | '@testing-library/react': 12.1.2_react-dom@17.0.2+react@17.0.2 48 | '@testing-library/react-hooks': 7.0.2_react-dom@17.0.2+react@17.0.2 49 | '@testing-library/user-event': 13.5.0 50 | '@types/mime': 2.0.3 51 | '@types/react': 17.0.38 52 | '@types/react-dom': 17.0.11 53 | '@types/shelljs': 0.8.10 54 | '@vitejs/plugin-react': 1.1.3 55 | buffer-es6: 4.9.3 56 | cross-env: 7.0.3 57 | execa: 6.0.0 58 | kill-port: 1.6.1 59 | magic-string: 0.25.7 60 | process-es6: 0.11.6 61 | puppeteer: 13.0.1 62 | react: 17.0.2 63 | react-dom: 17.0.2_react@17.0.2 64 | rimraf: 3.0.2 65 | rollup: 2.52.2 66 | rollup-plugin-dts: 4.1.0_rollup@2.52.2+typescript@4.5.4 67 | rollup-plugin-esbuild: 4.8.2_rollup@2.52.2 68 | shelljs: 0.8.4 69 | typescript: 4.5.4 70 | utility-types: 3.10.0 71 | vite: 2.7.10 72 | vitest: 0.0.118_vite@2.7.10 73 | 74 | plugin: 75 | specifiers: 76 | aslemammad-react-worker-components: ^0.1.1 77 | chalk: ^5.0.0 78 | es-module-lexer: ^0.9.3 79 | mime: ^3.0.0 80 | react-worker-components: ^0.1.0 81 | typescript: ^4.5.3 82 | vite: 2.7.0 83 | dependencies: 84 | chalk: 5.0.0 85 | es-module-lexer: 0.9.3 86 | mime: 3.0.0 87 | devDependencies: 88 | aslemammad-react-worker-components: 0.1.1_react@17.0.2 89 | react-worker-components: 0.1.0_react@17.0.2 90 | typescript: 4.5.4 91 | vite: 2.7.0 92 | 93 | test/vite: 94 | specifiers: 95 | mime: ^3.0.0 96 | react-worker-components-plugin: workspace:^0.0.0 97 | vite-plugin-inspect: ^0.3.13 98 | dependencies: 99 | mime: 3.0.0 100 | react-worker-components-plugin: link:../../plugin 101 | devDependencies: 102 | vite-plugin-inspect: 0.3.13_vite@2.7.10 103 | 104 | packages: 105 | 106 | /@babel/code-frame/7.16.7: 107 | resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} 108 | engines: {node: '>=6.9.0'} 109 | dependencies: 110 | '@babel/highlight': 7.16.7 111 | dev: true 112 | 113 | /@babel/compat-data/7.16.4: 114 | resolution: {integrity: sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==} 115 | engines: {node: '>=6.9.0'} 116 | dev: true 117 | 118 | /@babel/core/7.16.7: 119 | resolution: {integrity: sha512-aeLaqcqThRNZYmbMqtulsetOQZ/5gbR/dWruUCJcpas4Qoyy+QeagfDsPdMrqwsPRDNxJvBlRiZxxX7THO7qtA==} 120 | engines: {node: '>=6.9.0'} 121 | dependencies: 122 | '@babel/code-frame': 7.16.7 123 | '@babel/generator': 7.16.7 124 | '@babel/helper-compilation-targets': 7.16.7_@babel+core@7.16.7 125 | '@babel/helper-module-transforms': 7.16.7 126 | '@babel/helpers': 7.16.7 127 | '@babel/parser': 7.16.7 128 | '@babel/template': 7.16.7 129 | '@babel/traverse': 7.16.7 130 | '@babel/types': 7.16.7 131 | convert-source-map: 1.8.0 132 | debug: 4.3.3 133 | gensync: 1.0.0-beta.2 134 | json5: 2.2.0 135 | semver: 6.3.0 136 | source-map: 0.5.7 137 | transitivePeerDependencies: 138 | - supports-color 139 | dev: true 140 | 141 | /@babel/generator/7.16.7: 142 | resolution: {integrity: sha512-/ST3Sg8MLGY5HVYmrjOgL60ENux/HfO/CsUh7y4MalThufhE/Ff/6EibFDHi4jiDCaWfJKoqbE6oTh21c5hrRg==} 143 | engines: {node: '>=6.9.0'} 144 | dependencies: 145 | '@babel/types': 7.16.7 146 | jsesc: 2.5.2 147 | source-map: 0.5.7 148 | dev: true 149 | 150 | /@babel/helper-annotate-as-pure/7.16.7: 151 | resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==} 152 | engines: {node: '>=6.9.0'} 153 | dependencies: 154 | '@babel/types': 7.16.7 155 | dev: true 156 | 157 | /@babel/helper-compilation-targets/7.16.7_@babel+core@7.16.7: 158 | resolution: {integrity: sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==} 159 | engines: {node: '>=6.9.0'} 160 | peerDependencies: 161 | '@babel/core': ^7.0.0 162 | dependencies: 163 | '@babel/compat-data': 7.16.4 164 | '@babel/core': 7.16.7 165 | '@babel/helper-validator-option': 7.16.7 166 | browserslist: 4.19.1 167 | semver: 6.3.0 168 | dev: true 169 | 170 | /@babel/helper-environment-visitor/7.16.7: 171 | resolution: {integrity: sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==} 172 | engines: {node: '>=6.9.0'} 173 | dependencies: 174 | '@babel/types': 7.16.7 175 | dev: true 176 | 177 | /@babel/helper-function-name/7.16.7: 178 | resolution: {integrity: sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==} 179 | engines: {node: '>=6.9.0'} 180 | dependencies: 181 | '@babel/helper-get-function-arity': 7.16.7 182 | '@babel/template': 7.16.7 183 | '@babel/types': 7.16.7 184 | dev: true 185 | 186 | /@babel/helper-get-function-arity/7.16.7: 187 | resolution: {integrity: sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==} 188 | engines: {node: '>=6.9.0'} 189 | dependencies: 190 | '@babel/types': 7.16.7 191 | dev: true 192 | 193 | /@babel/helper-hoist-variables/7.16.7: 194 | resolution: {integrity: sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==} 195 | engines: {node: '>=6.9.0'} 196 | dependencies: 197 | '@babel/types': 7.16.7 198 | dev: true 199 | 200 | /@babel/helper-module-imports/7.16.7: 201 | resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} 202 | engines: {node: '>=6.9.0'} 203 | dependencies: 204 | '@babel/types': 7.16.7 205 | dev: true 206 | 207 | /@babel/helper-module-transforms/7.16.7: 208 | resolution: {integrity: sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==} 209 | engines: {node: '>=6.9.0'} 210 | dependencies: 211 | '@babel/helper-environment-visitor': 7.16.7 212 | '@babel/helper-module-imports': 7.16.7 213 | '@babel/helper-simple-access': 7.16.7 214 | '@babel/helper-split-export-declaration': 7.16.7 215 | '@babel/helper-validator-identifier': 7.16.7 216 | '@babel/template': 7.16.7 217 | '@babel/traverse': 7.16.7 218 | '@babel/types': 7.16.7 219 | transitivePeerDependencies: 220 | - supports-color 221 | dev: true 222 | 223 | /@babel/helper-plugin-utils/7.16.7: 224 | resolution: {integrity: sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==} 225 | engines: {node: '>=6.9.0'} 226 | dev: true 227 | 228 | /@babel/helper-simple-access/7.16.7: 229 | resolution: {integrity: sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==} 230 | engines: {node: '>=6.9.0'} 231 | dependencies: 232 | '@babel/types': 7.16.7 233 | dev: true 234 | 235 | /@babel/helper-split-export-declaration/7.16.7: 236 | resolution: {integrity: sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==} 237 | engines: {node: '>=6.9.0'} 238 | dependencies: 239 | '@babel/types': 7.16.7 240 | dev: true 241 | 242 | /@babel/helper-validator-identifier/7.16.7: 243 | resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} 244 | engines: {node: '>=6.9.0'} 245 | dev: true 246 | 247 | /@babel/helper-validator-option/7.16.7: 248 | resolution: {integrity: sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==} 249 | engines: {node: '>=6.9.0'} 250 | dev: true 251 | 252 | /@babel/helpers/7.16.7: 253 | resolution: {integrity: sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==} 254 | engines: {node: '>=6.9.0'} 255 | dependencies: 256 | '@babel/template': 7.16.7 257 | '@babel/traverse': 7.16.7 258 | '@babel/types': 7.16.7 259 | transitivePeerDependencies: 260 | - supports-color 261 | dev: true 262 | 263 | /@babel/highlight/7.16.7: 264 | resolution: {integrity: sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==} 265 | engines: {node: '>=6.9.0'} 266 | dependencies: 267 | '@babel/helper-validator-identifier': 7.16.7 268 | chalk: 2.4.2 269 | js-tokens: 4.0.0 270 | dev: true 271 | 272 | /@babel/parser/7.16.7: 273 | resolution: {integrity: sha512-sR4eaSrnM7BV7QPzGfEX5paG/6wrZM3I0HDzfIAK06ESvo9oy3xBuVBxE3MbQaKNhvg8g/ixjMWo2CGpzpHsDA==} 274 | engines: {node: '>=6.0.0'} 275 | hasBin: true 276 | dev: true 277 | 278 | /@babel/plugin-syntax-jsx/7.16.7_@babel+core@7.16.7: 279 | resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} 280 | engines: {node: '>=6.9.0'} 281 | peerDependencies: 282 | '@babel/core': ^7.0.0-0 283 | dependencies: 284 | '@babel/core': 7.16.7 285 | '@babel/helper-plugin-utils': 7.16.7 286 | dev: true 287 | 288 | /@babel/plugin-transform-react-jsx-development/7.16.7_@babel+core@7.16.7: 289 | resolution: {integrity: sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==} 290 | engines: {node: '>=6.9.0'} 291 | peerDependencies: 292 | '@babel/core': ^7.0.0-0 293 | dependencies: 294 | '@babel/core': 7.16.7 295 | '@babel/plugin-transform-react-jsx': 7.16.7_@babel+core@7.16.7 296 | dev: true 297 | 298 | /@babel/plugin-transform-react-jsx-self/7.16.7_@babel+core@7.16.7: 299 | resolution: {integrity: sha512-oe5VuWs7J9ilH3BCCApGoYjHoSO48vkjX2CbA5bFVhIuO2HKxA3vyF7rleA4o6/4rTDbk6r8hBW7Ul8E+UZrpA==} 300 | engines: {node: '>=6.9.0'} 301 | peerDependencies: 302 | '@babel/core': ^7.0.0-0 303 | dependencies: 304 | '@babel/core': 7.16.7 305 | '@babel/helper-plugin-utils': 7.16.7 306 | dev: true 307 | 308 | /@babel/plugin-transform-react-jsx-source/7.16.7_@babel+core@7.16.7: 309 | resolution: {integrity: sha512-rONFiQz9vgbsnaMtQlZCjIRwhJvlrPET8TabIUK2hzlXw9B9s2Ieaxte1SCOOXMbWRHodbKixNf3BLcWVOQ8Bw==} 310 | engines: {node: '>=6.9.0'} 311 | peerDependencies: 312 | '@babel/core': ^7.0.0-0 313 | dependencies: 314 | '@babel/core': 7.16.7 315 | '@babel/helper-plugin-utils': 7.16.7 316 | dev: true 317 | 318 | /@babel/plugin-transform-react-jsx/7.16.7_@babel+core@7.16.7: 319 | resolution: {integrity: sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==} 320 | engines: {node: '>=6.9.0'} 321 | peerDependencies: 322 | '@babel/core': ^7.0.0-0 323 | dependencies: 324 | '@babel/core': 7.16.7 325 | '@babel/helper-annotate-as-pure': 7.16.7 326 | '@babel/helper-module-imports': 7.16.7 327 | '@babel/helper-plugin-utils': 7.16.7 328 | '@babel/plugin-syntax-jsx': 7.16.7_@babel+core@7.16.7 329 | '@babel/types': 7.16.7 330 | dev: true 331 | 332 | /@babel/runtime/7.16.7: 333 | resolution: {integrity: sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==} 334 | engines: {node: '>=6.9.0'} 335 | dependencies: 336 | regenerator-runtime: 0.13.9 337 | dev: true 338 | 339 | /@babel/template/7.16.7: 340 | resolution: {integrity: sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==} 341 | engines: {node: '>=6.9.0'} 342 | dependencies: 343 | '@babel/code-frame': 7.16.7 344 | '@babel/parser': 7.16.7 345 | '@babel/types': 7.16.7 346 | dev: true 347 | 348 | /@babel/traverse/7.16.7: 349 | resolution: {integrity: sha512-8KWJPIb8c2VvY8AJrydh6+fVRo2ODx1wYBU2398xJVq0JomuLBZmVQzLPBblJgHIGYG4znCpUZUZ0Pt2vdmVYQ==} 350 | engines: {node: '>=6.9.0'} 351 | dependencies: 352 | '@babel/code-frame': 7.16.7 353 | '@babel/generator': 7.16.7 354 | '@babel/helper-environment-visitor': 7.16.7 355 | '@babel/helper-function-name': 7.16.7 356 | '@babel/helper-hoist-variables': 7.16.7 357 | '@babel/helper-split-export-declaration': 7.16.7 358 | '@babel/parser': 7.16.7 359 | '@babel/types': 7.16.7 360 | debug: 4.3.3 361 | globals: 11.12.0 362 | transitivePeerDependencies: 363 | - supports-color 364 | dev: true 365 | 366 | /@babel/types/7.16.7: 367 | resolution: {integrity: sha512-E8HuV7FO9qLpx6OtoGfUQ2cjIYnbFwvZWYBS+87EwtdMvmUPJSwykpovFB+8insbpF0uJcpr8KMUi64XZntZcg==} 368 | engines: {node: '>=6.9.0'} 369 | dependencies: 370 | '@babel/helper-validator-identifier': 7.16.7 371 | to-fast-properties: 2.0.0 372 | dev: true 373 | 374 | /@jest/types/27.4.2: 375 | resolution: {integrity: sha512-j35yw0PMTPpZsUoOBiuHzr1zTYoad1cVIE0ajEjcrJONxxrko/IRGKkXx3os0Nsi4Hu3+5VmDbVfq5WhG/pWAg==} 376 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 377 | dependencies: 378 | '@types/istanbul-lib-coverage': 2.0.4 379 | '@types/istanbul-reports': 3.0.1 380 | '@types/node': 17.0.7 381 | '@types/yargs': 16.0.4 382 | chalk: 4.1.2 383 | dev: true 384 | 385 | /@polka/url/1.0.0-next.21: 386 | resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} 387 | dev: true 388 | 389 | /@rollup/plugin-alias/3.1.9_rollup@2.52.2: 390 | resolution: {integrity: sha512-QI5fsEvm9bDzt32k39wpOwZhVzRcL5ydcffUHMyLVaVaLeC70I8TJZ17F1z1eMoLu4E/UOcH9BWVkKpIKdrfiw==} 391 | engines: {node: '>=8.0.0'} 392 | peerDependencies: 393 | rollup: ^1.20.0||^2.0.0 394 | dependencies: 395 | rollup: 2.52.2 396 | slash: 3.0.0 397 | dev: true 398 | 399 | /@rollup/plugin-commonjs/21.0.1_rollup@2.52.2: 400 | resolution: {integrity: sha512-EA+g22lbNJ8p5kuZJUYyhhDK7WgJckW5g4pNN7n4mAFUM96VuwUnNT3xr2Db2iCZPI1pJPbGyfT5mS9T1dHfMg==} 401 | engines: {node: '>= 8.0.0'} 402 | peerDependencies: 403 | rollup: ^2.38.3 404 | dependencies: 405 | '@rollup/pluginutils': 3.1.0_rollup@2.52.2 406 | commondir: 1.0.1 407 | estree-walker: 2.0.2 408 | glob: 7.2.0 409 | is-reference: 1.2.1 410 | magic-string: 0.25.7 411 | resolve: 1.21.0 412 | rollup: 2.52.2 413 | dev: true 414 | 415 | /@rollup/plugin-json/4.1.0_rollup@2.52.2: 416 | resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} 417 | peerDependencies: 418 | rollup: ^1.20.0 || ^2.0.0 419 | dependencies: 420 | '@rollup/pluginutils': 3.1.0_rollup@2.52.2 421 | rollup: 2.52.2 422 | dev: true 423 | 424 | /@rollup/plugin-node-resolve/13.1.2_rollup@2.52.2: 425 | resolution: {integrity: sha512-xyqbuf1vyOPC60jEKhx3DBHunymnCJswzjNTKfX4Jz7zCPar1UqbRZCNY1u5QaXh97beaFTWdoUUWiV4qX8o/g==} 426 | engines: {node: '>= 10.0.0'} 427 | peerDependencies: 428 | rollup: ^2.42.0 429 | dependencies: 430 | '@rollup/pluginutils': 3.1.0_rollup@2.52.2 431 | '@types/resolve': 1.17.1 432 | builtin-modules: 3.2.0 433 | deepmerge: 4.2.2 434 | is-module: 1.0.0 435 | resolve: 1.21.0 436 | rollup: 2.52.2 437 | dev: true 438 | 439 | /@rollup/pluginutils/3.1.0_rollup@2.52.2: 440 | resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} 441 | engines: {node: '>= 8.0.0'} 442 | peerDependencies: 443 | rollup: ^1.20.0||^2.0.0 444 | dependencies: 445 | '@types/estree': 0.0.39 446 | estree-walker: 1.0.1 447 | picomatch: 2.3.1 448 | rollup: 2.52.2 449 | dev: true 450 | 451 | /@rollup/pluginutils/4.1.2: 452 | resolution: {integrity: sha512-ROn4qvkxP9SyPeHaf7uQC/GPFY6L/OWy9+bd9AwcjOAWQwxRscoEyAUD8qCY5o5iL4jqQwoLk2kaTKJPb/HwzQ==} 453 | engines: {node: '>= 8.0.0'} 454 | dependencies: 455 | estree-walker: 2.0.2 456 | picomatch: 2.3.1 457 | dev: true 458 | 459 | /@testing-library/dom/8.11.1: 460 | resolution: {integrity: sha512-3KQDyx9r0RKYailW2MiYrSSKEfH0GTkI51UGEvJenvcoDoeRYs0PZpi2SXqtnMClQvCqdtTTpOfFETDTVADpAg==} 461 | engines: {node: '>=12'} 462 | dependencies: 463 | '@babel/code-frame': 7.16.7 464 | '@babel/runtime': 7.16.7 465 | '@types/aria-query': 4.2.2 466 | aria-query: 5.0.0 467 | chalk: 4.1.2 468 | dom-accessibility-api: 0.5.10 469 | lz-string: 1.4.4 470 | pretty-format: 27.4.2 471 | dev: true 472 | 473 | /@testing-library/jest-dom/5.16.1: 474 | resolution: {integrity: sha512-ajUJdfDIuTCadB79ukO+0l8O+QwN0LiSxDaYUTI4LndbbUsGi6rWU1SCexXzBA2NSjlVB9/vbkasQIL3tmPBjw==} 475 | engines: {node: '>=8', npm: '>=6', yarn: '>=1'} 476 | dependencies: 477 | '@babel/runtime': 7.16.7 478 | '@types/testing-library__jest-dom': 5.14.2 479 | aria-query: 5.0.0 480 | chalk: 3.0.0 481 | css: 3.0.0 482 | css.escape: 1.5.1 483 | dom-accessibility-api: 0.5.10 484 | lodash: 4.17.21 485 | redent: 3.0.0 486 | dev: true 487 | 488 | /@testing-library/react-hooks/7.0.2_react-dom@17.0.2+react@17.0.2: 489 | resolution: {integrity: sha512-dYxpz8u9m4q1TuzfcUApqi8iFfR6R0FaMbr2hjZJy1uC8z+bO/K4v8Gs9eogGKYQop7QsrBTFkv/BCF7MzD2Cg==} 490 | engines: {node: '>=12'} 491 | peerDependencies: 492 | react: '>=16.9.0' 493 | react-dom: '>=16.9.0' 494 | react-test-renderer: '>=16.9.0' 495 | peerDependenciesMeta: 496 | react-dom: 497 | optional: true 498 | react-test-renderer: 499 | optional: true 500 | dependencies: 501 | '@babel/runtime': 7.16.7 502 | '@types/react': 17.0.38 503 | '@types/react-dom': 17.0.11 504 | '@types/react-test-renderer': 17.0.1 505 | react: 17.0.2 506 | react-dom: 17.0.2_react@17.0.2 507 | react-error-boundary: 3.1.4_react@17.0.2 508 | dev: true 509 | 510 | /@testing-library/react/12.1.2_react-dom@17.0.2+react@17.0.2: 511 | resolution: {integrity: sha512-ihQiEOklNyHIpo2Y8FREkyD1QAea054U0MVbwH1m8N9TxeFz+KoJ9LkqoKqJlzx2JDm56DVwaJ1r36JYxZM05g==} 512 | engines: {node: '>=12'} 513 | peerDependencies: 514 | react: '*' 515 | react-dom: '*' 516 | dependencies: 517 | '@babel/runtime': 7.16.7 518 | '@testing-library/dom': 8.11.1 519 | react: 17.0.2 520 | react-dom: 17.0.2_react@17.0.2 521 | dev: true 522 | 523 | /@testing-library/user-event/13.5.0: 524 | resolution: {integrity: sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==} 525 | engines: {node: '>=10', npm: '>=6'} 526 | peerDependencies: 527 | '@testing-library/dom': '>=7.21.4' 528 | dependencies: 529 | '@babel/runtime': 7.16.7 530 | dev: true 531 | 532 | /@types/aria-query/4.2.2: 533 | resolution: {integrity: sha512-HnYpAE1Y6kRyKM/XkEuiRQhTHvkzMBurTHnpFLYLBGPIylZNPs9jJcuOOYWxPLJCSEtmZT0Y8rHDokKN7rRTig==} 534 | dev: true 535 | 536 | /@types/chai-subset/1.3.3: 537 | resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} 538 | dependencies: 539 | '@types/chai': 4.3.0 540 | dev: true 541 | 542 | /@types/chai/4.3.0: 543 | resolution: {integrity: sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==} 544 | dev: true 545 | 546 | /@types/estree/0.0.39: 547 | resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} 548 | dev: true 549 | 550 | /@types/estree/0.0.50: 551 | resolution: {integrity: sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==} 552 | dev: true 553 | 554 | /@types/glob/7.2.0: 555 | resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} 556 | dependencies: 557 | '@types/minimatch': 3.0.5 558 | '@types/node': 17.0.7 559 | dev: true 560 | 561 | /@types/istanbul-lib-coverage/2.0.4: 562 | resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} 563 | dev: true 564 | 565 | /@types/istanbul-lib-report/3.0.0: 566 | resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} 567 | dependencies: 568 | '@types/istanbul-lib-coverage': 2.0.4 569 | dev: true 570 | 571 | /@types/istanbul-reports/3.0.1: 572 | resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} 573 | dependencies: 574 | '@types/istanbul-lib-report': 3.0.0 575 | dev: true 576 | 577 | /@types/jest/27.4.0: 578 | resolution: {integrity: sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ==} 579 | dependencies: 580 | jest-diff: 27.4.2 581 | pretty-format: 27.4.2 582 | dev: true 583 | 584 | /@types/mime/2.0.3: 585 | resolution: {integrity: sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==} 586 | dev: true 587 | 588 | /@types/minimatch/3.0.5: 589 | resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} 590 | dev: true 591 | 592 | /@types/node/17.0.7: 593 | resolution: {integrity: sha512-1QUk+WAUD4t8iR+Oj+UgI8oJa6yyxaB8a8pHaC8uqM6RrS1qbL7bf3Pwl5rHv0psm2CuDErgho6v5N+G+5fwtQ==} 594 | dev: true 595 | 596 | /@types/prop-types/15.7.4: 597 | resolution: {integrity: sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==} 598 | dev: true 599 | 600 | /@types/react-dom/17.0.11: 601 | resolution: {integrity: sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==} 602 | dependencies: 603 | '@types/react': 17.0.38 604 | dev: true 605 | 606 | /@types/react-test-renderer/17.0.1: 607 | resolution: {integrity: sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw==} 608 | dependencies: 609 | '@types/react': 17.0.38 610 | dev: true 611 | 612 | /@types/react/17.0.38: 613 | resolution: {integrity: sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==} 614 | dependencies: 615 | '@types/prop-types': 15.7.4 616 | '@types/scheduler': 0.16.2 617 | csstype: 3.0.10 618 | dev: true 619 | 620 | /@types/resolve/1.17.1: 621 | resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} 622 | dependencies: 623 | '@types/node': 17.0.7 624 | dev: true 625 | 626 | /@types/scheduler/0.16.2: 627 | resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} 628 | dev: true 629 | 630 | /@types/shelljs/0.8.10: 631 | resolution: {integrity: sha512-nhBdUA/n0nRo1B6E4BuRnUvllYAqal4T9zd91ZDnBh+qQMQTwvxmJHx6xEn/0vdjP2kqEA5eVeLazs4nMxeuFg==} 632 | dependencies: 633 | '@types/glob': 7.2.0 634 | '@types/node': 17.0.7 635 | dev: true 636 | 637 | /@types/testing-library__jest-dom/5.14.2: 638 | resolution: {integrity: sha512-vehbtyHUShPxIa9SioxDwCvgxukDMH//icJG90sXQBUm5lJOHLT5kNeU9tnivhnA/TkOFMzGIXN2cTc4hY8/kg==} 639 | dependencies: 640 | '@types/jest': 27.4.0 641 | dev: true 642 | 643 | /@types/yargs-parser/20.2.1: 644 | resolution: {integrity: sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==} 645 | dev: true 646 | 647 | /@types/yargs/16.0.4: 648 | resolution: {integrity: sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw==} 649 | dependencies: 650 | '@types/yargs-parser': 20.2.1 651 | dev: true 652 | 653 | /@types/yauzl/2.9.2: 654 | resolution: {integrity: sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==} 655 | requiresBuild: true 656 | dependencies: 657 | '@types/node': 17.0.7 658 | dev: true 659 | optional: true 660 | 661 | /@vitejs/plugin-react/1.1.3: 662 | resolution: {integrity: sha512-xv8QujX/uR4ti8qpt0hMriM2bdpxX4jm4iU6GAZfCwHjh/ewkX/8DJgnmQpE0HSJmgz8dixyUnRJKi2Pf1nNoQ==} 663 | engines: {node: '>=12.0.0'} 664 | dependencies: 665 | '@babel/core': 7.16.7 666 | '@babel/plugin-transform-react-jsx': 7.16.7_@babel+core@7.16.7 667 | '@babel/plugin-transform-react-jsx-development': 7.16.7_@babel+core@7.16.7 668 | '@babel/plugin-transform-react-jsx-self': 7.16.7_@babel+core@7.16.7 669 | '@babel/plugin-transform-react-jsx-source': 7.16.7_@babel+core@7.16.7 670 | '@rollup/pluginutils': 4.1.2 671 | react-refresh: 0.11.0 672 | resolve: 1.21.0 673 | transitivePeerDependencies: 674 | - supports-color 675 | dev: true 676 | 677 | /agent-base/6.0.2: 678 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 679 | engines: {node: '>= 6.0.0'} 680 | dependencies: 681 | debug: 4.3.2 682 | transitivePeerDependencies: 683 | - supports-color 684 | dev: true 685 | 686 | /ansi-regex/5.0.1: 687 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 688 | engines: {node: '>=8'} 689 | dev: true 690 | 691 | /ansi-styles/3.2.1: 692 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 693 | engines: {node: '>=4'} 694 | dependencies: 695 | color-convert: 1.9.3 696 | dev: true 697 | 698 | /ansi-styles/4.3.0: 699 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 700 | engines: {node: '>=8'} 701 | dependencies: 702 | color-convert: 2.0.1 703 | dev: true 704 | 705 | /ansi-styles/5.2.0: 706 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 707 | engines: {node: '>=10'} 708 | dev: true 709 | 710 | /aria-query/5.0.0: 711 | resolution: {integrity: sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==} 712 | engines: {node: '>=6.0'} 713 | dev: true 714 | 715 | /aslemammad-react-worker-components/0.1.1_react@17.0.2: 716 | resolution: {integrity: sha512-9Oyzg2myA+AA8eQVCrDhiQeU0dWx2HY+YXtEzFIAf78398al2qoeQQUR0g1hC2DkoYF1YIhyx4AIZu1FGfdYxA==} 717 | peerDependencies: 718 | react: '>=16.8.0' 719 | dependencies: 720 | react: 17.0.2 721 | dev: true 722 | 723 | /assertion-error/1.1.0: 724 | resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} 725 | dev: true 726 | 727 | /atob/2.1.2: 728 | resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} 729 | engines: {node: '>= 4.5.0'} 730 | hasBin: true 731 | dev: true 732 | 733 | /balanced-match/1.0.2: 734 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 735 | dev: true 736 | 737 | /base64-js/1.5.1: 738 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 739 | dev: true 740 | 741 | /bl/4.1.0: 742 | resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} 743 | dependencies: 744 | buffer: 5.7.1 745 | inherits: 2.0.4 746 | readable-stream: 3.6.0 747 | dev: true 748 | 749 | /brace-expansion/1.1.11: 750 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 751 | dependencies: 752 | balanced-match: 1.0.2 753 | concat-map: 0.0.1 754 | dev: true 755 | 756 | /browserslist/4.19.1: 757 | resolution: {integrity: sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==} 758 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 759 | hasBin: true 760 | dependencies: 761 | caniuse-lite: 1.0.30001296 762 | electron-to-chromium: 1.4.33 763 | escalade: 3.1.1 764 | node-releases: 2.0.1 765 | picocolors: 1.0.0 766 | dev: true 767 | 768 | /buffer-crc32/0.2.13: 769 | resolution: {integrity: sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=} 770 | dev: true 771 | 772 | /buffer-es6/4.9.3: 773 | resolution: {integrity: sha1-8mNHuC33b9N+GLy1KIxJcM/VxAQ=} 774 | dev: true 775 | 776 | /buffer/5.7.1: 777 | resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} 778 | dependencies: 779 | base64-js: 1.5.1 780 | ieee754: 1.2.1 781 | dev: true 782 | 783 | /builtin-modules/3.2.0: 784 | resolution: {integrity: sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==} 785 | engines: {node: '>=6'} 786 | dev: true 787 | 788 | /builtins/4.0.0: 789 | resolution: {integrity: sha512-qC0E2Dxgou1IHhvJSLwGDSTvokbRovU5zZFuDY6oY8Y2lF3nGt5Ad8YZK7GMtqzY84Wu7pXTPeHQeHcXSXsRhw==} 790 | dependencies: 791 | semver: 7.3.5 792 | dev: true 793 | 794 | /caniuse-lite/1.0.30001296: 795 | resolution: {integrity: sha512-WfrtPEoNSoeATDlf4y3QvkwiELl9GyPLISV5GejTbbQRtQx4LhsXmc9IQ6XCL2d7UxCyEzToEZNMeqR79OUw8Q==} 796 | dev: true 797 | 798 | /chai/4.3.4: 799 | resolution: {integrity: sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==} 800 | engines: {node: '>=4'} 801 | dependencies: 802 | assertion-error: 1.1.0 803 | check-error: 1.0.2 804 | deep-eql: 3.0.1 805 | get-func-name: 2.0.0 806 | pathval: 1.1.1 807 | type-detect: 4.0.8 808 | dev: true 809 | 810 | /chalk/2.4.2: 811 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 812 | engines: {node: '>=4'} 813 | dependencies: 814 | ansi-styles: 3.2.1 815 | escape-string-regexp: 1.0.5 816 | supports-color: 5.5.0 817 | dev: true 818 | 819 | /chalk/3.0.0: 820 | resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} 821 | engines: {node: '>=8'} 822 | dependencies: 823 | ansi-styles: 4.3.0 824 | supports-color: 7.2.0 825 | dev: true 826 | 827 | /chalk/4.1.2: 828 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 829 | engines: {node: '>=10'} 830 | dependencies: 831 | ansi-styles: 4.3.0 832 | supports-color: 7.2.0 833 | dev: true 834 | 835 | /chalk/5.0.0: 836 | resolution: {integrity: sha512-/duVOqst+luxCQRKEo4bNxinsOQtMP80ZYm7mMqzuh5PociNL0PvmHFvREJ9ueYL2TxlHjBcmLCdmocx9Vg+IQ==} 837 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 838 | dev: false 839 | 840 | /check-error/1.0.2: 841 | resolution: {integrity: sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=} 842 | dev: true 843 | 844 | /chownr/1.1.4: 845 | resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} 846 | dev: true 847 | 848 | /color-convert/1.9.3: 849 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 850 | dependencies: 851 | color-name: 1.1.3 852 | dev: true 853 | 854 | /color-convert/2.0.1: 855 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 856 | engines: {node: '>=7.0.0'} 857 | dependencies: 858 | color-name: 1.1.4 859 | dev: true 860 | 861 | /color-name/1.1.3: 862 | resolution: {integrity: sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=} 863 | dev: true 864 | 865 | /color-name/1.1.4: 866 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 867 | dev: true 868 | 869 | /commondir/1.0.1: 870 | resolution: {integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=} 871 | dev: true 872 | 873 | /concat-map/0.0.1: 874 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} 875 | dev: true 876 | 877 | /convert-source-map/1.8.0: 878 | resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==} 879 | dependencies: 880 | safe-buffer: 5.1.2 881 | dev: true 882 | 883 | /cross-env/7.0.3: 884 | resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} 885 | engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} 886 | hasBin: true 887 | dependencies: 888 | cross-spawn: 7.0.3 889 | dev: true 890 | 891 | /cross-spawn/7.0.3: 892 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 893 | engines: {node: '>= 8'} 894 | dependencies: 895 | path-key: 3.1.1 896 | shebang-command: 2.0.0 897 | which: 2.0.2 898 | dev: true 899 | 900 | /css.escape/1.5.1: 901 | resolution: {integrity: sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=} 902 | dev: true 903 | 904 | /css/3.0.0: 905 | resolution: {integrity: sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==} 906 | dependencies: 907 | inherits: 2.0.4 908 | source-map: 0.6.1 909 | source-map-resolve: 0.6.0 910 | dev: true 911 | 912 | /csstype/3.0.10: 913 | resolution: {integrity: sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==} 914 | dev: true 915 | 916 | /debug/4.3.2: 917 | resolution: {integrity: sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==} 918 | engines: {node: '>=6.0'} 919 | peerDependencies: 920 | supports-color: '*' 921 | peerDependenciesMeta: 922 | supports-color: 923 | optional: true 924 | dependencies: 925 | ms: 2.1.2 926 | dev: true 927 | 928 | /debug/4.3.3: 929 | resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} 930 | engines: {node: '>=6.0'} 931 | peerDependencies: 932 | supports-color: '*' 933 | peerDependenciesMeta: 934 | supports-color: 935 | optional: true 936 | dependencies: 937 | ms: 2.1.2 938 | dev: true 939 | 940 | /decode-uri-component/0.2.0: 941 | resolution: {integrity: sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=} 942 | engines: {node: '>=0.10'} 943 | dev: true 944 | 945 | /deep-eql/3.0.1: 946 | resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==} 947 | engines: {node: '>=0.12'} 948 | dependencies: 949 | type-detect: 4.0.8 950 | dev: true 951 | 952 | /deepmerge/4.2.2: 953 | resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} 954 | engines: {node: '>=0.10.0'} 955 | dev: true 956 | 957 | /devtools-protocol/0.0.937139: 958 | resolution: {integrity: sha512-daj+rzR3QSxsPRy5vjjthn58axO8c11j58uY0lG5vvlJk/EiOdCWOptGdkXDjtuRHr78emKq0udHCXM4trhoDQ==} 959 | dev: true 960 | 961 | /diff-sequences/27.4.0: 962 | resolution: {integrity: sha512-YqiQzkrsmHMH5uuh8OdQFU9/ZpADnwzml8z0O5HvRNda+5UZsaX/xN+AAxfR2hWq1Y7HZnAzO9J5lJXOuDz2Ww==} 963 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 964 | dev: true 965 | 966 | /dom-accessibility-api/0.5.10: 967 | resolution: {integrity: sha512-Xu9mD0UjrJisTmv7lmVSDMagQcU9R5hwAbxsaAE/35XPnPLJobbuREfV/rraiSaEj/UOvgrzQs66zyTWTlyd+g==} 968 | dev: true 969 | 970 | /electron-to-chromium/1.4.33: 971 | resolution: {integrity: sha512-OVK1Ad3pHnmuXPhEfq85X8vUKr1UPNHryBnbKnyLcAfh8dPwoFjoDhDlP5KpPJIiymvSucZs48UBrE1250IxOw==} 972 | dev: true 973 | 974 | /end-of-stream/1.4.4: 975 | resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} 976 | dependencies: 977 | once: 1.4.0 978 | dev: true 979 | 980 | /es-module-lexer/0.9.3: 981 | resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} 982 | 983 | /esbuild-android-arm64/0.13.15: 984 | resolution: {integrity: sha512-m602nft/XXeO8YQPUDVoHfjyRVPdPgjyyXOxZ44MK/agewFFkPa8tUo6lAzSWh5Ui5PB4KR9UIFTSBKh/RrCmg==} 985 | cpu: [arm64] 986 | os: [android] 987 | requiresBuild: true 988 | dev: true 989 | optional: true 990 | 991 | /esbuild-darwin-64/0.13.15: 992 | resolution: {integrity: sha512-ihOQRGs2yyp7t5bArCwnvn2Atr6X4axqPpEdCFPVp7iUj4cVSdisgvEKdNR7yH3JDjW6aQDw40iQFoTqejqxvQ==} 993 | cpu: [x64] 994 | os: [darwin] 995 | requiresBuild: true 996 | dev: true 997 | optional: true 998 | 999 | /esbuild-darwin-arm64/0.13.15: 1000 | resolution: {integrity: sha512-i1FZssTVxUqNlJ6cBTj5YQj4imWy3m49RZRnHhLpefFIh0To05ow9DTrXROTE1urGTQCloFUXTX8QfGJy1P8dQ==} 1001 | cpu: [arm64] 1002 | os: [darwin] 1003 | requiresBuild: true 1004 | dev: true 1005 | optional: true 1006 | 1007 | /esbuild-freebsd-64/0.13.15: 1008 | resolution: {integrity: sha512-G3dLBXUI6lC6Z09/x+WtXBXbOYQZ0E8TDBqvn7aMaOCzryJs8LyVXKY4CPnHFXZAbSwkCbqiPuSQ1+HhrNk7EA==} 1009 | cpu: [x64] 1010 | os: [freebsd] 1011 | requiresBuild: true 1012 | dev: true 1013 | optional: true 1014 | 1015 | /esbuild-freebsd-arm64/0.13.15: 1016 | resolution: {integrity: sha512-KJx0fzEDf1uhNOZQStV4ujg30WlnwqUASaGSFPhznLM/bbheu9HhqZ6mJJZM32lkyfGJikw0jg7v3S0oAvtvQQ==} 1017 | cpu: [arm64] 1018 | os: [freebsd] 1019 | requiresBuild: true 1020 | dev: true 1021 | optional: true 1022 | 1023 | /esbuild-linux-32/0.13.15: 1024 | resolution: {integrity: sha512-ZvTBPk0YWCLMCXiFmD5EUtB30zIPvC5Itxz0mdTu/xZBbbHJftQgLWY49wEPSn2T/TxahYCRDWun5smRa0Tu+g==} 1025 | cpu: [ia32] 1026 | os: [linux] 1027 | requiresBuild: true 1028 | dev: true 1029 | optional: true 1030 | 1031 | /esbuild-linux-64/0.13.15: 1032 | resolution: {integrity: sha512-eCKzkNSLywNeQTRBxJRQ0jxRCl2YWdMB3+PkWFo2BBQYC5mISLIVIjThNtn6HUNqua1pnvgP5xX0nHbZbPj5oA==} 1033 | cpu: [x64] 1034 | os: [linux] 1035 | requiresBuild: true 1036 | dev: true 1037 | optional: true 1038 | 1039 | /esbuild-linux-arm/0.13.15: 1040 | resolution: {integrity: sha512-wUHttDi/ol0tD8ZgUMDH8Ef7IbDX+/UsWJOXaAyTdkT7Yy9ZBqPg8bgB/Dn3CZ9SBpNieozrPRHm0BGww7W/jA==} 1041 | cpu: [arm] 1042 | os: [linux] 1043 | requiresBuild: true 1044 | dev: true 1045 | optional: true 1046 | 1047 | /esbuild-linux-arm64/0.13.15: 1048 | resolution: {integrity: sha512-bYpuUlN6qYU9slzr/ltyLTR9YTBS7qUDymO8SV7kjeNext61OdmqFAzuVZom+OLW1HPHseBfJ/JfdSlx8oTUoA==} 1049 | cpu: [arm64] 1050 | os: [linux] 1051 | requiresBuild: true 1052 | dev: true 1053 | optional: true 1054 | 1055 | /esbuild-linux-mips64le/0.13.15: 1056 | resolution: {integrity: sha512-KlVjIG828uFPyJkO/8gKwy9RbXhCEUeFsCGOJBepUlpa7G8/SeZgncUEz/tOOUJTcWMTmFMtdd3GElGyAtbSWg==} 1057 | cpu: [mips64el] 1058 | os: [linux] 1059 | requiresBuild: true 1060 | dev: true 1061 | optional: true 1062 | 1063 | /esbuild-linux-ppc64le/0.13.15: 1064 | resolution: {integrity: sha512-h6gYF+OsaqEuBjeesTBtUPw0bmiDu7eAeuc2OEH9S6mV9/jPhPdhOWzdeshb0BskRZxPhxPOjqZ+/OqLcxQwEQ==} 1065 | cpu: [ppc64] 1066 | os: [linux] 1067 | requiresBuild: true 1068 | dev: true 1069 | optional: true 1070 | 1071 | /esbuild-netbsd-64/0.13.15: 1072 | resolution: {integrity: sha512-3+yE9emwoevLMyvu+iR3rsa+Xwhie7ZEHMGDQ6dkqP/ndFzRHkobHUKTe+NCApSqG5ce2z4rFu+NX/UHnxlh3w==} 1073 | cpu: [x64] 1074 | os: [netbsd] 1075 | requiresBuild: true 1076 | dev: true 1077 | optional: true 1078 | 1079 | /esbuild-openbsd-64/0.13.15: 1080 | resolution: {integrity: sha512-wTfvtwYJYAFL1fSs8yHIdf5GEE4NkbtbXtjLWjM3Cw8mmQKqsg8kTiqJ9NJQe5NX/5Qlo7Xd9r1yKMMkHllp5g==} 1081 | cpu: [x64] 1082 | os: [openbsd] 1083 | requiresBuild: true 1084 | dev: true 1085 | optional: true 1086 | 1087 | /esbuild-sunos-64/0.13.15: 1088 | resolution: {integrity: sha512-lbivT9Bx3t1iWWrSnGyBP9ODriEvWDRiweAs69vI+miJoeKwHWOComSRukttbuzjZ8r1q0mQJ8Z7yUsDJ3hKdw==} 1089 | cpu: [x64] 1090 | os: [sunos] 1091 | requiresBuild: true 1092 | dev: true 1093 | optional: true 1094 | 1095 | /esbuild-windows-32/0.13.15: 1096 | resolution: {integrity: sha512-fDMEf2g3SsJ599MBr50cY5ve5lP1wyVwTe6aLJsM01KtxyKkB4UT+fc5MXQFn3RLrAIAZOG+tHC+yXObpSn7Nw==} 1097 | cpu: [ia32] 1098 | os: [win32] 1099 | requiresBuild: true 1100 | dev: true 1101 | optional: true 1102 | 1103 | /esbuild-windows-64/0.13.15: 1104 | resolution: {integrity: sha512-9aMsPRGDWCd3bGjUIKG/ZOJPKsiztlxl/Q3C1XDswO6eNX/Jtwu4M+jb6YDH9hRSUflQWX0XKAfWzgy5Wk54JQ==} 1105 | cpu: [x64] 1106 | os: [win32] 1107 | requiresBuild: true 1108 | dev: true 1109 | optional: true 1110 | 1111 | /esbuild-windows-arm64/0.13.15: 1112 | resolution: {integrity: sha512-zzvyCVVpbwQQATaf3IG8mu1IwGEiDxKkYUdA4FpoCHi1KtPa13jeScYDjlW0Qh+ebWzpKfR2ZwvqAQkSWNcKjA==} 1113 | cpu: [arm64] 1114 | os: [win32] 1115 | requiresBuild: true 1116 | dev: true 1117 | optional: true 1118 | 1119 | /esbuild/0.13.15: 1120 | resolution: {integrity: sha512-raCxt02HBKv8RJxE8vkTSCXGIyKHdEdGfUmiYb8wnabnaEmHzyW7DCHb5tEN0xU8ryqg5xw54mcwnYkC4x3AIw==} 1121 | hasBin: true 1122 | requiresBuild: true 1123 | optionalDependencies: 1124 | esbuild-android-arm64: 0.13.15 1125 | esbuild-darwin-64: 0.13.15 1126 | esbuild-darwin-arm64: 0.13.15 1127 | esbuild-freebsd-64: 0.13.15 1128 | esbuild-freebsd-arm64: 0.13.15 1129 | esbuild-linux-32: 0.13.15 1130 | esbuild-linux-64: 0.13.15 1131 | esbuild-linux-arm: 0.13.15 1132 | esbuild-linux-arm64: 0.13.15 1133 | esbuild-linux-mips64le: 0.13.15 1134 | esbuild-linux-ppc64le: 0.13.15 1135 | esbuild-netbsd-64: 0.13.15 1136 | esbuild-openbsd-64: 0.13.15 1137 | esbuild-sunos-64: 0.13.15 1138 | esbuild-windows-32: 0.13.15 1139 | esbuild-windows-64: 0.13.15 1140 | esbuild-windows-arm64: 0.13.15 1141 | dev: true 1142 | 1143 | /escalade/3.1.1: 1144 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 1145 | engines: {node: '>=6'} 1146 | dev: true 1147 | 1148 | /escape-string-regexp/1.0.5: 1149 | resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} 1150 | engines: {node: '>=0.8.0'} 1151 | dev: true 1152 | 1153 | /estree-walker/1.0.1: 1154 | resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} 1155 | dev: true 1156 | 1157 | /estree-walker/2.0.2: 1158 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 1159 | dev: true 1160 | 1161 | /execa/6.0.0: 1162 | resolution: {integrity: sha512-m4wU9j4Z9nXXoqT8RSfl28JSwmMNLFF69OON8H/lL3NeU0tNpGz313bcOfYoBBHokB0dC2tMl3VUcKgHELhL2Q==} 1163 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1164 | dependencies: 1165 | cross-spawn: 7.0.3 1166 | get-stream: 6.0.1 1167 | human-signals: 3.0.1 1168 | is-stream: 3.0.0 1169 | merge-stream: 2.0.0 1170 | npm-run-path: 5.0.1 1171 | onetime: 6.0.0 1172 | signal-exit: 3.0.6 1173 | strip-final-newline: 3.0.0 1174 | dev: true 1175 | 1176 | /extract-zip/2.0.1: 1177 | resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} 1178 | engines: {node: '>= 10.17.0'} 1179 | hasBin: true 1180 | dependencies: 1181 | debug: 4.3.2 1182 | get-stream: 5.2.0 1183 | yauzl: 2.10.0 1184 | optionalDependencies: 1185 | '@types/yauzl': 2.9.2 1186 | transitivePeerDependencies: 1187 | - supports-color 1188 | dev: true 1189 | 1190 | /fd-slicer/1.1.0: 1191 | resolution: {integrity: sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=} 1192 | dependencies: 1193 | pend: 1.2.0 1194 | dev: true 1195 | 1196 | /find-up/4.1.0: 1197 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 1198 | engines: {node: '>=8'} 1199 | dependencies: 1200 | locate-path: 5.0.0 1201 | path-exists: 4.0.0 1202 | dev: true 1203 | 1204 | /fs-constants/1.0.0: 1205 | resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} 1206 | dev: true 1207 | 1208 | /fs.realpath/1.0.0: 1209 | resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} 1210 | dev: true 1211 | 1212 | /fsevents/2.3.2: 1213 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1214 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1215 | os: [darwin] 1216 | requiresBuild: true 1217 | dev: true 1218 | optional: true 1219 | 1220 | /function-bind/1.1.1: 1221 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 1222 | dev: true 1223 | 1224 | /gensync/1.0.0-beta.2: 1225 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1226 | engines: {node: '>=6.9.0'} 1227 | dev: true 1228 | 1229 | /get-func-name/2.0.0: 1230 | resolution: {integrity: sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=} 1231 | dev: true 1232 | 1233 | /get-stream/5.2.0: 1234 | resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} 1235 | engines: {node: '>=8'} 1236 | dependencies: 1237 | pump: 3.0.0 1238 | dev: true 1239 | 1240 | /get-stream/6.0.1: 1241 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1242 | engines: {node: '>=10'} 1243 | dev: true 1244 | 1245 | /get-them-args/1.3.2: 1246 | resolution: {integrity: sha1-dKILqKSr7OWuGZrQPyvMaP38m6U=} 1247 | dev: true 1248 | 1249 | /glob/7.2.0: 1250 | resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} 1251 | dependencies: 1252 | fs.realpath: 1.0.0 1253 | inflight: 1.0.6 1254 | inherits: 2.0.4 1255 | minimatch: 3.0.4 1256 | once: 1.4.0 1257 | path-is-absolute: 1.0.1 1258 | dev: true 1259 | 1260 | /globals/11.12.0: 1261 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1262 | engines: {node: '>=4'} 1263 | dev: true 1264 | 1265 | /has-flag/3.0.0: 1266 | resolution: {integrity: sha1-tdRU3CGZriJWmfNGfloH87lVuv0=} 1267 | engines: {node: '>=4'} 1268 | dev: true 1269 | 1270 | /has-flag/4.0.0: 1271 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1272 | engines: {node: '>=8'} 1273 | dev: true 1274 | 1275 | /has/1.0.3: 1276 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 1277 | engines: {node: '>= 0.4.0'} 1278 | dependencies: 1279 | function-bind: 1.1.1 1280 | dev: true 1281 | 1282 | /https-proxy-agent/5.0.0: 1283 | resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} 1284 | engines: {node: '>= 6'} 1285 | dependencies: 1286 | agent-base: 6.0.2 1287 | debug: 4.3.2 1288 | transitivePeerDependencies: 1289 | - supports-color 1290 | dev: true 1291 | 1292 | /human-signals/3.0.1: 1293 | resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} 1294 | engines: {node: '>=12.20.0'} 1295 | dev: true 1296 | 1297 | /ieee754/1.2.1: 1298 | resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} 1299 | dev: true 1300 | 1301 | /import-meta-resolve/1.1.1: 1302 | resolution: {integrity: sha512-JiTuIvVyPaUg11eTrNDx5bgQ/yMKMZffc7YSjvQeSMXy58DO2SQ8BtAf3xteZvmzvjYh14wnqNjL8XVeDy2o9A==} 1303 | dependencies: 1304 | builtins: 4.0.0 1305 | dev: true 1306 | 1307 | /indent-string/4.0.0: 1308 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 1309 | engines: {node: '>=8'} 1310 | dev: true 1311 | 1312 | /inflight/1.0.6: 1313 | resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} 1314 | dependencies: 1315 | once: 1.4.0 1316 | wrappy: 1.0.2 1317 | dev: true 1318 | 1319 | /inherits/2.0.4: 1320 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1321 | dev: true 1322 | 1323 | /interpret/1.4.0: 1324 | resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} 1325 | engines: {node: '>= 0.10'} 1326 | dev: true 1327 | 1328 | /is-core-module/2.8.0: 1329 | resolution: {integrity: sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==} 1330 | dependencies: 1331 | has: 1.0.3 1332 | dev: true 1333 | 1334 | /is-module/1.0.0: 1335 | resolution: {integrity: sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=} 1336 | dev: true 1337 | 1338 | /is-reference/1.2.1: 1339 | resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} 1340 | dependencies: 1341 | '@types/estree': 0.0.50 1342 | dev: true 1343 | 1344 | /is-stream/3.0.0: 1345 | resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} 1346 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1347 | dev: true 1348 | 1349 | /isexe/2.0.0: 1350 | resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} 1351 | dev: true 1352 | 1353 | /jest-diff/27.4.2: 1354 | resolution: {integrity: sha512-ujc9ToyUZDh9KcqvQDkk/gkbf6zSaeEg9AiBxtttXW59H/AcqEYp1ciXAtJp+jXWva5nAf/ePtSsgWwE5mqp4Q==} 1355 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1356 | dependencies: 1357 | chalk: 4.1.2 1358 | diff-sequences: 27.4.0 1359 | jest-get-type: 27.4.0 1360 | pretty-format: 27.4.2 1361 | dev: true 1362 | 1363 | /jest-get-type/27.4.0: 1364 | resolution: {integrity: sha512-tk9o+ld5TWq41DkK14L4wox4s2D9MtTpKaAVzXfr5CUKm5ZK2ExcaFE0qls2W71zE/6R2TxxrK9w2r6svAFDBQ==} 1365 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1366 | dev: true 1367 | 1368 | /joycon/3.1.1: 1369 | resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} 1370 | engines: {node: '>=10'} 1371 | dev: true 1372 | 1373 | /js-tokens/4.0.0: 1374 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1375 | dev: true 1376 | 1377 | /jsesc/2.5.2: 1378 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 1379 | engines: {node: '>=4'} 1380 | hasBin: true 1381 | dev: true 1382 | 1383 | /json5/2.2.0: 1384 | resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==} 1385 | engines: {node: '>=6'} 1386 | hasBin: true 1387 | dependencies: 1388 | minimist: 1.2.5 1389 | dev: true 1390 | 1391 | /jsonc-parser/3.0.0: 1392 | resolution: {integrity: sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==} 1393 | dev: true 1394 | 1395 | /kill-port/1.6.1: 1396 | resolution: {integrity: sha512-un0Y55cOM7JKGaLnGja28T38tDDop0AQ8N0KlAdyh+B1nmMoX8AnNmqPNZbS3mUMgiST51DCVqmbFT1gNJpVNw==} 1397 | hasBin: true 1398 | dependencies: 1399 | get-them-args: 1.3.2 1400 | shell-exec: 1.0.2 1401 | dev: true 1402 | 1403 | /kolorist/1.5.1: 1404 | resolution: {integrity: sha512-lxpCM3HTvquGxKGzHeknB/sUjuVoUElLlfYnXZT73K8geR9jQbroGlSCFBax9/0mpGoD3kzcMLnOlGQPJJNyqQ==} 1405 | dev: true 1406 | 1407 | /local-pkg/0.4.0: 1408 | resolution: {integrity: sha512-2XBWjO/v63JeR1HPzLJxdTVRQDB84Av2p2KtBA5ahvpyLUPubcAU6iXlAJrONcY7aSqgJhXxElAnKtnYsRolPQ==} 1409 | engines: {node: '>=14'} 1410 | dependencies: 1411 | mlly: 0.2.10 1412 | dev: true 1413 | 1414 | /locate-path/5.0.0: 1415 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1416 | engines: {node: '>=8'} 1417 | dependencies: 1418 | p-locate: 4.1.0 1419 | dev: true 1420 | 1421 | /lodash/4.17.21: 1422 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 1423 | dev: true 1424 | 1425 | /loose-envify/1.4.0: 1426 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1427 | hasBin: true 1428 | dependencies: 1429 | js-tokens: 4.0.0 1430 | dev: true 1431 | 1432 | /lru-cache/6.0.0: 1433 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1434 | engines: {node: '>=10'} 1435 | dependencies: 1436 | yallist: 4.0.0 1437 | dev: true 1438 | 1439 | /lz-string/1.4.4: 1440 | resolution: {integrity: sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=} 1441 | hasBin: true 1442 | dev: true 1443 | 1444 | /magic-string/0.25.7: 1445 | resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} 1446 | dependencies: 1447 | sourcemap-codec: 1.4.8 1448 | dev: true 1449 | 1450 | /merge-stream/2.0.0: 1451 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1452 | dev: true 1453 | 1454 | /mime/3.0.0: 1455 | resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} 1456 | engines: {node: '>=10.0.0'} 1457 | hasBin: true 1458 | dev: false 1459 | 1460 | /mimic-fn/4.0.0: 1461 | resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} 1462 | engines: {node: '>=12'} 1463 | dev: true 1464 | 1465 | /min-indent/1.0.1: 1466 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 1467 | engines: {node: '>=4'} 1468 | dev: true 1469 | 1470 | /minimatch/3.0.4: 1471 | resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} 1472 | dependencies: 1473 | brace-expansion: 1.1.11 1474 | dev: true 1475 | 1476 | /minimist/1.2.5: 1477 | resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} 1478 | dev: true 1479 | 1480 | /mkdirp-classic/0.5.3: 1481 | resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} 1482 | dev: true 1483 | 1484 | /mlly/0.2.10: 1485 | resolution: {integrity: sha512-xfyW6c2QBGArtctzNnTV5leOKX8nOMz2simeubtXofdsdSJFSNw+Ncvrs8kxcN3pBrQLXuYBHNFV6NgZ5Ryf4A==} 1486 | dependencies: 1487 | import-meta-resolve: 1.1.1 1488 | dev: true 1489 | 1490 | /mrmime/1.0.0: 1491 | resolution: {integrity: sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==} 1492 | engines: {node: '>=10'} 1493 | dev: true 1494 | 1495 | /ms/2.1.2: 1496 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1497 | dev: true 1498 | 1499 | /nanoid/3.1.30: 1500 | resolution: {integrity: sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==} 1501 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1502 | hasBin: true 1503 | dev: true 1504 | 1505 | /node-fetch/2.6.5: 1506 | resolution: {integrity: sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==} 1507 | engines: {node: 4.x || >=6.0.0} 1508 | dependencies: 1509 | whatwg-url: 5.0.0 1510 | dev: true 1511 | 1512 | /node-releases/2.0.1: 1513 | resolution: {integrity: sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==} 1514 | dev: true 1515 | 1516 | /npm-run-path/5.0.1: 1517 | resolution: {integrity: sha512-ybBJQUSyFwEEhqO2lXmyKOl9ucHtyZBWVM0h0FiMfT/+WKxCUZFa95qAR2X3w/w6oigN3B0b2UNHZbD+kdfD5w==} 1518 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 1519 | dependencies: 1520 | path-key: 4.0.0 1521 | dev: true 1522 | 1523 | /object-assign/4.1.1: 1524 | resolution: {integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=} 1525 | engines: {node: '>=0.10.0'} 1526 | dev: true 1527 | 1528 | /once/1.4.0: 1529 | resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} 1530 | dependencies: 1531 | wrappy: 1.0.2 1532 | dev: true 1533 | 1534 | /onetime/6.0.0: 1535 | resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} 1536 | engines: {node: '>=12'} 1537 | dependencies: 1538 | mimic-fn: 4.0.0 1539 | dev: true 1540 | 1541 | /p-limit/2.3.0: 1542 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1543 | engines: {node: '>=6'} 1544 | dependencies: 1545 | p-try: 2.2.0 1546 | dev: true 1547 | 1548 | /p-locate/4.1.0: 1549 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1550 | engines: {node: '>=8'} 1551 | dependencies: 1552 | p-limit: 2.3.0 1553 | dev: true 1554 | 1555 | /p-try/2.2.0: 1556 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1557 | engines: {node: '>=6'} 1558 | dev: true 1559 | 1560 | /path-exists/4.0.0: 1561 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1562 | engines: {node: '>=8'} 1563 | dev: true 1564 | 1565 | /path-is-absolute/1.0.1: 1566 | resolution: {integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18=} 1567 | engines: {node: '>=0.10.0'} 1568 | dev: true 1569 | 1570 | /path-key/3.1.1: 1571 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1572 | engines: {node: '>=8'} 1573 | dev: true 1574 | 1575 | /path-key/4.0.0: 1576 | resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} 1577 | engines: {node: '>=12'} 1578 | dev: true 1579 | 1580 | /path-parse/1.0.7: 1581 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1582 | dev: true 1583 | 1584 | /pathval/1.1.1: 1585 | resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} 1586 | dev: true 1587 | 1588 | /pend/1.2.0: 1589 | resolution: {integrity: sha1-elfrVQpng/kRUzH89GY9XI4AelA=} 1590 | dev: true 1591 | 1592 | /picocolors/1.0.0: 1593 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1594 | dev: true 1595 | 1596 | /picomatch/2.3.1: 1597 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1598 | engines: {node: '>=8.6'} 1599 | dev: true 1600 | 1601 | /pkg-dir/4.2.0: 1602 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 1603 | engines: {node: '>=8'} 1604 | dependencies: 1605 | find-up: 4.1.0 1606 | dev: true 1607 | 1608 | /postcss/8.4.5: 1609 | resolution: {integrity: sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==} 1610 | engines: {node: ^10 || ^12 || >=14} 1611 | dependencies: 1612 | nanoid: 3.1.30 1613 | picocolors: 1.0.0 1614 | source-map-js: 1.0.1 1615 | dev: true 1616 | 1617 | /pretty-format/27.4.2: 1618 | resolution: {integrity: sha512-p0wNtJ9oLuvgOQDEIZ9zQjZffK7KtyR6Si0jnXULIDwrlNF8Cuir3AZP0hHv0jmKuNN/edOnbMjnzd4uTcmWiw==} 1619 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 1620 | dependencies: 1621 | '@jest/types': 27.4.2 1622 | ansi-regex: 5.0.1 1623 | ansi-styles: 5.2.0 1624 | react-is: 17.0.2 1625 | dev: true 1626 | 1627 | /process-es6/0.11.6: 1628 | resolution: {integrity: sha1-xrs4n5qVH4K9TrFpYAEFvS/5x3g=} 1629 | dev: true 1630 | 1631 | /progress/2.0.3: 1632 | resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} 1633 | engines: {node: '>=0.4.0'} 1634 | dev: true 1635 | 1636 | /proxy-from-env/1.1.0: 1637 | resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} 1638 | dev: true 1639 | 1640 | /pump/3.0.0: 1641 | resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} 1642 | dependencies: 1643 | end-of-stream: 1.4.4 1644 | once: 1.4.0 1645 | dev: true 1646 | 1647 | /puppeteer/13.0.1: 1648 | resolution: {integrity: sha512-wqGIx59LzYqWhYcJQphMT+ux0sgatEUbjKG0lbjJxNVqVIT3ZC5m4Bvmq2gHE3qhb63EwS+rNkql08bm4BvO0A==} 1649 | engines: {node: '>=10.18.1'} 1650 | requiresBuild: true 1651 | dependencies: 1652 | debug: 4.3.2 1653 | devtools-protocol: 0.0.937139 1654 | extract-zip: 2.0.1 1655 | https-proxy-agent: 5.0.0 1656 | node-fetch: 2.6.5 1657 | pkg-dir: 4.2.0 1658 | progress: 2.0.3 1659 | proxy-from-env: 1.1.0 1660 | rimraf: 3.0.2 1661 | tar-fs: 2.1.1 1662 | unbzip2-stream: 1.4.3 1663 | ws: 8.2.3 1664 | transitivePeerDependencies: 1665 | - bufferutil 1666 | - supports-color 1667 | - utf-8-validate 1668 | dev: true 1669 | 1670 | /react-dom/17.0.2_react@17.0.2: 1671 | resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} 1672 | peerDependencies: 1673 | react: 17.0.2 1674 | dependencies: 1675 | loose-envify: 1.4.0 1676 | object-assign: 4.1.1 1677 | react: 17.0.2 1678 | scheduler: 0.20.2 1679 | dev: true 1680 | 1681 | /react-error-boundary/3.1.4_react@17.0.2: 1682 | resolution: {integrity: sha512-uM9uPzZJTF6wRQORmSrvOIgt4lJ9MC1sNgEOj2XGsDTRE4kmpWxg7ENK9EWNKJRMAOY9z0MuF4yIfl6gp4sotA==} 1683 | engines: {node: '>=10', npm: '>=6'} 1684 | peerDependencies: 1685 | react: '>=16.13.1' 1686 | dependencies: 1687 | '@babel/runtime': 7.16.7 1688 | react: 17.0.2 1689 | dev: true 1690 | 1691 | /react-is/17.0.2: 1692 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} 1693 | dev: true 1694 | 1695 | /react-refresh/0.11.0: 1696 | resolution: {integrity: sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==} 1697 | engines: {node: '>=0.10.0'} 1698 | dev: true 1699 | 1700 | /react-worker-components/0.1.0_react@17.0.2: 1701 | resolution: {integrity: sha512-jq4E/pX/YyQ3WW2DTxSVmV53pAC2MtO38U2idzZ9N0tp2f6ZMJmzpUdZo0ku1nAFVSBnaycSsX1Vh5KEV9ecvA==} 1702 | peerDependencies: 1703 | react: '>=16.8.0' 1704 | dependencies: 1705 | react: 17.0.2 1706 | 1707 | /react/17.0.2: 1708 | resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} 1709 | engines: {node: '>=0.10.0'} 1710 | dependencies: 1711 | loose-envify: 1.4.0 1712 | object-assign: 4.1.1 1713 | dev: true 1714 | 1715 | /readable-stream/3.6.0: 1716 | resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} 1717 | engines: {node: '>= 6'} 1718 | dependencies: 1719 | inherits: 2.0.4 1720 | string_decoder: 1.3.0 1721 | util-deprecate: 1.0.2 1722 | dev: true 1723 | 1724 | /rechoir/0.6.2: 1725 | resolution: {integrity: sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=} 1726 | engines: {node: '>= 0.10'} 1727 | dependencies: 1728 | resolve: 1.21.0 1729 | dev: true 1730 | 1731 | /redent/3.0.0: 1732 | resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} 1733 | engines: {node: '>=8'} 1734 | dependencies: 1735 | indent-string: 4.0.0 1736 | strip-indent: 3.0.0 1737 | dev: true 1738 | 1739 | /regenerator-runtime/0.13.9: 1740 | resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} 1741 | dev: true 1742 | 1743 | /resolve/1.20.0: 1744 | resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} 1745 | dependencies: 1746 | is-core-module: 2.8.0 1747 | path-parse: 1.0.7 1748 | dev: true 1749 | 1750 | /resolve/1.21.0: 1751 | resolution: {integrity: sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==} 1752 | hasBin: true 1753 | dependencies: 1754 | is-core-module: 2.8.0 1755 | path-parse: 1.0.7 1756 | supports-preserve-symlinks-flag: 1.0.0 1757 | dev: true 1758 | 1759 | /rimraf/3.0.2: 1760 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 1761 | hasBin: true 1762 | dependencies: 1763 | glob: 7.2.0 1764 | dev: true 1765 | 1766 | /rollup-plugin-dts/4.1.0_rollup@2.52.2+typescript@4.5.4: 1767 | resolution: {integrity: sha512-rriXIm3jdUiYeiAAd1Fv+x2AxK6Kq6IybB2Z/IdoAW95fb4uRUurYsEYKa8L1seedezDeJhy8cfo8FEL9aZzqg==} 1768 | engines: {node: '>=v12.22.7'} 1769 | peerDependencies: 1770 | rollup: ^2.55 1771 | typescript: ~4.1 || ~4.2 || ~4.3 || ~4.4 || ~4.5 1772 | dependencies: 1773 | magic-string: 0.25.7 1774 | rollup: 2.52.2 1775 | typescript: 4.5.4 1776 | optionalDependencies: 1777 | '@babel/code-frame': 7.16.7 1778 | dev: true 1779 | 1780 | /rollup-plugin-esbuild/4.8.2_rollup@2.52.2: 1781 | resolution: {integrity: sha512-wsaYNOjzTb6dN1qCIZsMZ7Q0LWiPJklYs2TDI8vJA2LUbvtPUY+17TC8C0vSat3jPMInfR9XWKdA7ttuwkjsGQ==} 1782 | engines: {node: '>=12'} 1783 | peerDependencies: 1784 | esbuild: '>=0.10.1' 1785 | rollup: ^1.20.0 || ^2.0.0 1786 | dependencies: 1787 | '@rollup/pluginutils': 4.1.2 1788 | debug: 4.3.3 1789 | es-module-lexer: 0.9.3 1790 | joycon: 3.1.1 1791 | jsonc-parser: 3.0.0 1792 | rollup: 2.52.2 1793 | transitivePeerDependencies: 1794 | - supports-color 1795 | dev: true 1796 | 1797 | /rollup/2.52.2: 1798 | resolution: {integrity: sha512-4RlFC3k2BIHlUsJ9mGd8OO+9Lm2eDF5P7+6DNQOp5sx+7N/1tFM01kELfbxlMX3MxT6owvLB1ln4S3QvvQlbUA==} 1799 | engines: {node: '>=10.0.0'} 1800 | hasBin: true 1801 | optionalDependencies: 1802 | fsevents: 2.3.2 1803 | dev: true 1804 | 1805 | /rollup/2.61.1: 1806 | resolution: {integrity: sha512-BbTXlEvB8d+XFbK/7E5doIcRtxWPRiqr0eb5vQ0+2paMM04Ye4PZY5nHOQef2ix24l/L0SpLd5hwcH15QHPdvA==} 1807 | engines: {node: '>=10.0.0'} 1808 | hasBin: true 1809 | optionalDependencies: 1810 | fsevents: 2.3.2 1811 | dev: true 1812 | 1813 | /rollup/2.63.0: 1814 | resolution: {integrity: sha512-nps0idjmD+NXl6OREfyYXMn/dar3WGcyKn+KBzPdaLecub3x/LrId0wUcthcr8oZUAcZAR8NKcfGGFlNgGL1kQ==} 1815 | engines: {node: '>=10.0.0'} 1816 | hasBin: true 1817 | optionalDependencies: 1818 | fsevents: 2.3.2 1819 | dev: true 1820 | 1821 | /safe-buffer/5.1.2: 1822 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1823 | dev: true 1824 | 1825 | /safe-buffer/5.2.1: 1826 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1827 | dev: true 1828 | 1829 | /scheduler/0.20.2: 1830 | resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} 1831 | dependencies: 1832 | loose-envify: 1.4.0 1833 | object-assign: 4.1.1 1834 | dev: true 1835 | 1836 | /semver/6.3.0: 1837 | resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} 1838 | hasBin: true 1839 | dev: true 1840 | 1841 | /semver/7.3.5: 1842 | resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} 1843 | engines: {node: '>=10'} 1844 | hasBin: true 1845 | dependencies: 1846 | lru-cache: 6.0.0 1847 | dev: true 1848 | 1849 | /shebang-command/2.0.0: 1850 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1851 | engines: {node: '>=8'} 1852 | dependencies: 1853 | shebang-regex: 3.0.0 1854 | dev: true 1855 | 1856 | /shebang-regex/3.0.0: 1857 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1858 | engines: {node: '>=8'} 1859 | dev: true 1860 | 1861 | /shell-exec/1.0.2: 1862 | resolution: {integrity: sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg==} 1863 | dev: true 1864 | 1865 | /shelljs/0.8.4: 1866 | resolution: {integrity: sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==} 1867 | engines: {node: '>=4'} 1868 | hasBin: true 1869 | dependencies: 1870 | glob: 7.2.0 1871 | interpret: 1.4.0 1872 | rechoir: 0.6.2 1873 | dev: true 1874 | 1875 | /signal-exit/3.0.6: 1876 | resolution: {integrity: sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==} 1877 | dev: true 1878 | 1879 | /sirv/2.0.2: 1880 | resolution: {integrity: sha512-4Qog6aE29nIjAOKe/wowFTxOdmbEZKb+3tsLljaBRzJwtqto0BChD2zzH0LhgCSXiI+V7X+Y45v14wBZQ1TK3w==} 1881 | engines: {node: '>= 10'} 1882 | dependencies: 1883 | '@polka/url': 1.0.0-next.21 1884 | mrmime: 1.0.0 1885 | totalist: 3.0.0 1886 | dev: true 1887 | 1888 | /slash/3.0.0: 1889 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1890 | engines: {node: '>=8'} 1891 | dev: true 1892 | 1893 | /source-map-js/1.0.1: 1894 | resolution: {integrity: sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==} 1895 | engines: {node: '>=0.10.0'} 1896 | dev: true 1897 | 1898 | /source-map-resolve/0.6.0: 1899 | resolution: {integrity: sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==} 1900 | dependencies: 1901 | atob: 2.1.2 1902 | decode-uri-component: 0.2.0 1903 | dev: true 1904 | 1905 | /source-map/0.5.7: 1906 | resolution: {integrity: sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=} 1907 | engines: {node: '>=0.10.0'} 1908 | dev: true 1909 | 1910 | /source-map/0.6.1: 1911 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1912 | engines: {node: '>=0.10.0'} 1913 | requiresBuild: true 1914 | dev: true 1915 | 1916 | /sourcemap-codec/1.4.8: 1917 | resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} 1918 | dev: true 1919 | 1920 | /string_decoder/1.3.0: 1921 | resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} 1922 | dependencies: 1923 | safe-buffer: 5.2.1 1924 | dev: true 1925 | 1926 | /strip-final-newline/3.0.0: 1927 | resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} 1928 | engines: {node: '>=12'} 1929 | dev: true 1930 | 1931 | /strip-indent/3.0.0: 1932 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 1933 | engines: {node: '>=8'} 1934 | dependencies: 1935 | min-indent: 1.0.1 1936 | dev: true 1937 | 1938 | /supports-color/5.5.0: 1939 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1940 | engines: {node: '>=4'} 1941 | dependencies: 1942 | has-flag: 3.0.0 1943 | dev: true 1944 | 1945 | /supports-color/7.2.0: 1946 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1947 | engines: {node: '>=8'} 1948 | dependencies: 1949 | has-flag: 4.0.0 1950 | dev: true 1951 | 1952 | /supports-preserve-symlinks-flag/1.0.0: 1953 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1954 | engines: {node: '>= 0.4'} 1955 | dev: true 1956 | 1957 | /tar-fs/2.1.1: 1958 | resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} 1959 | dependencies: 1960 | chownr: 1.1.4 1961 | mkdirp-classic: 0.5.3 1962 | pump: 3.0.0 1963 | tar-stream: 2.2.0 1964 | dev: true 1965 | 1966 | /tar-stream/2.2.0: 1967 | resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} 1968 | engines: {node: '>=6'} 1969 | dependencies: 1970 | bl: 4.1.0 1971 | end-of-stream: 1.4.4 1972 | fs-constants: 1.0.0 1973 | inherits: 2.0.4 1974 | readable-stream: 3.6.0 1975 | dev: true 1976 | 1977 | /through/2.3.8: 1978 | resolution: {integrity: sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=} 1979 | dev: true 1980 | 1981 | /tinypool/0.0.6: 1982 | resolution: {integrity: sha512-E9vY6eq/Q7fUlSt69cY3y7qXNbVOFaxP+lAEDMKMObLrmO0MmEdUPyjOMgepoMDw/ps/sazl7WIQglnUrunnLg==} 1983 | engines: {node: '>=14.0.0'} 1984 | dev: true 1985 | 1986 | /tinyspy/0.2.7: 1987 | resolution: {integrity: sha512-AaNITSED8/2j2/nSgPeQZW2nNhdTxNJ7XwcdBezI7MtPS2C+pJ1HjcHc/qfDhohUhQvODITdxzWH9u+Qs+7yFQ==} 1988 | engines: {node: '>=14.0.0'} 1989 | dev: true 1990 | 1991 | /to-fast-properties/2.0.0: 1992 | resolution: {integrity: sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=} 1993 | engines: {node: '>=4'} 1994 | dev: true 1995 | 1996 | /totalist/3.0.0: 1997 | resolution: {integrity: sha512-eM+pCBxXO/njtF7vdFsHuqb+ElbxqtI4r5EAvk6grfAFyJ6IvWlSkfZ5T9ozC6xWw3Fj1fGoSmrl0gUs46JVIw==} 1998 | engines: {node: '>=6'} 1999 | dev: true 2000 | 2001 | /tr46/0.0.3: 2002 | resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} 2003 | dev: true 2004 | 2005 | /type-detect/4.0.8: 2006 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 2007 | engines: {node: '>=4'} 2008 | dev: true 2009 | 2010 | /typescript/4.5.4: 2011 | resolution: {integrity: sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==} 2012 | engines: {node: '>=4.2.0'} 2013 | hasBin: true 2014 | dev: true 2015 | 2016 | /ufo/0.7.9: 2017 | resolution: {integrity: sha512-6t9LrLk3FhqTS+GW3IqlITtfRB5JAVr5MMNjpBECfK827W+Vh5Ilw/LhTcHWrt6b3hkeBvcbjx4Ti7QVFzmcww==} 2018 | dev: true 2019 | 2020 | /unbzip2-stream/1.4.3: 2021 | resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} 2022 | dependencies: 2023 | buffer: 5.7.1 2024 | through: 2.3.8 2025 | dev: true 2026 | 2027 | /util-deprecate/1.0.2: 2028 | resolution: {integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=} 2029 | dev: true 2030 | 2031 | /utility-types/3.10.0: 2032 | resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} 2033 | engines: {node: '>= 4'} 2034 | dev: true 2035 | 2036 | /vite-plugin-inspect/0.3.13_vite@2.7.10: 2037 | resolution: {integrity: sha512-Naie3Rx/0IbmQSknfQPVrvWKiar7fCu50u+uLcUgt54yX0espduLDnI8IEtOYlsCA4gHs93IYKtxFDTxAThmYw==} 2038 | engines: {node: '>=14'} 2039 | peerDependencies: 2040 | vite: ^2.0.0 2041 | dependencies: 2042 | '@rollup/pluginutils': 4.1.2 2043 | debug: 4.3.3 2044 | kolorist: 1.5.1 2045 | sirv: 2.0.2 2046 | ufo: 0.7.9 2047 | vite: 2.7.10 2048 | transitivePeerDependencies: 2049 | - supports-color 2050 | dev: true 2051 | 2052 | /vite/2.7.0: 2053 | resolution: {integrity: sha512-ZM629j9n6f1Gcr2KsfpLhJ0FRkift4SsTLSvExmNpGJYzyi1JyLOFybz85ShqFP5f4oCfJSblWAma9X8lZg/vA==} 2054 | engines: {node: '>=12.2.0'} 2055 | hasBin: true 2056 | peerDependencies: 2057 | less: '*' 2058 | sass: '*' 2059 | stylus: '*' 2060 | peerDependenciesMeta: 2061 | less: 2062 | optional: true 2063 | sass: 2064 | optional: true 2065 | stylus: 2066 | optional: true 2067 | dependencies: 2068 | esbuild: 0.13.15 2069 | postcss: 8.4.5 2070 | resolve: 1.20.0 2071 | rollup: 2.61.1 2072 | optionalDependencies: 2073 | fsevents: 2.3.2 2074 | dev: true 2075 | 2076 | /vite/2.7.10: 2077 | resolution: {integrity: sha512-KEY96ntXUid1/xJihJbgmLZx7QSC2D4Tui0FdS0Old5OokYzFclcofhtxtjDdGOk/fFpPbHv9yw88+rB93Tb8w==} 2078 | engines: {node: '>=12.2.0'} 2079 | hasBin: true 2080 | peerDependencies: 2081 | less: '*' 2082 | sass: '*' 2083 | stylus: '*' 2084 | peerDependenciesMeta: 2085 | less: 2086 | optional: true 2087 | sass: 2088 | optional: true 2089 | stylus: 2090 | optional: true 2091 | dependencies: 2092 | esbuild: 0.13.15 2093 | postcss: 8.4.5 2094 | resolve: 1.21.0 2095 | rollup: 2.63.0 2096 | optionalDependencies: 2097 | fsevents: 2.3.2 2098 | dev: true 2099 | 2100 | /vitest/0.0.118_vite@2.7.10: 2101 | resolution: {integrity: sha512-2zBpowIaVAMPFB+/DkHFpt63QNXMz737dKTpLtC2t4RNUfLS4n+KKg14nFexj5VlhMf4ntSkrvDHnrE+6gFTmg==} 2102 | engines: {node: '>=14.14.0'} 2103 | hasBin: true 2104 | peerDependencies: 2105 | c8: '*' 2106 | happy-dom: '*' 2107 | jsdom: '*' 2108 | vite: ^2.7.1 2109 | peerDependenciesMeta: 2110 | c8: 2111 | optional: true 2112 | happy-dom: 2113 | optional: true 2114 | jsdom: 2115 | optional: true 2116 | dependencies: 2117 | '@types/chai': 4.3.0 2118 | '@types/chai-subset': 1.3.3 2119 | chai: 4.3.4 2120 | local-pkg: 0.4.0 2121 | tinypool: 0.0.6 2122 | tinyspy: 0.2.7 2123 | vite: 2.7.10 2124 | dev: true 2125 | 2126 | /webidl-conversions/3.0.1: 2127 | resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} 2128 | dev: true 2129 | 2130 | /whatwg-url/5.0.0: 2131 | resolution: {integrity: sha1-lmRU6HZUYuN2RNNib2dCzotwll0=} 2132 | dependencies: 2133 | tr46: 0.0.3 2134 | webidl-conversions: 3.0.1 2135 | dev: true 2136 | 2137 | /which/2.0.2: 2138 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2139 | engines: {node: '>= 8'} 2140 | hasBin: true 2141 | dependencies: 2142 | isexe: 2.0.0 2143 | dev: true 2144 | 2145 | /wrappy/1.0.2: 2146 | resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} 2147 | dev: true 2148 | 2149 | /ws/8.2.3: 2150 | resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==} 2151 | engines: {node: '>=10.0.0'} 2152 | peerDependencies: 2153 | bufferutil: ^4.0.1 2154 | utf-8-validate: ^5.0.2 2155 | peerDependenciesMeta: 2156 | bufferutil: 2157 | optional: true 2158 | utf-8-validate: 2159 | optional: true 2160 | dev: true 2161 | 2162 | /yallist/4.0.0: 2163 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2164 | dev: true 2165 | 2166 | /yauzl/2.10.0: 2167 | resolution: {integrity: sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=} 2168 | dependencies: 2169 | buffer-crc32: 0.2.13 2170 | fd-slicer: 1.1.0 2171 | dev: true 2172 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - plugin/ 3 | - test/* 4 | -------------------------------------------------------------------------------- /test/utils.ts: -------------------------------------------------------------------------------- 1 | export const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); 2 | 3 | export async function autoRetry( 4 | test: () => void | Promise 5 | ): Promise { 6 | const period = 100; 7 | const numberOfTries = 30_000 / period; 8 | let i = 0; 9 | while (true) { 10 | try { 11 | await test(); 12 | return; 13 | } catch (err) { 14 | i = i + 1; 15 | if (i > numberOfTries) { 16 | throw err; 17 | } 18 | } 19 | await sleep(period); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /test/vite/App.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | import { Hello, Hey as Hey1 } from "./Hello.worker"; 4 | import { Suspense, useState } from "react"; 5 | import { TextBox } from "./TextBox"; 6 | 7 | function App() { 8 | const [count, setCount] = useState(40); 9 | return ( 10 |
11 |

Workers

12 | Count: {count} 13 | 16 | 23 | 24 | Loading...
}> 25 | 26 | 27 | Loading...}> 28 | 29 | 30 | 31 | 32 | 33 | ); 34 | } 35 | 36 | export default App; 37 | -------------------------------------------------------------------------------- /test/vite/Hello.worker.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | // import { expose } from "react-worker-components"; 4 | 5 | import { TextBox } from "./TextBox"; 6 | 7 | const fib = (i: number): number => { 8 | const result = i <= 1 ? i : fib(i - 1) + fib(i - 2); 9 | return result; 10 | }; 11 | 12 | export const Hello: React.FC<{ count: number }> = ({ count, children }) => { 13 | const fibNum = fib(count); 14 | 15 | return ( 16 |
17 |
Hello from worker: {fibNum}
18 |

Main TextBox

19 | {children} 20 |

Worker TextBox

21 | 22 |
23 | ); 24 | }; 25 | 26 | export const Hey: React.FC = () => { 27 | return ( 28 |
29 |

Hey from worker

30 |
31 | ); 32 | }; 33 | 34 | // expose(Hello); 35 | -------------------------------------------------------------------------------- /test/vite/TextBox.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | 3 | export const TextBox = () => { 4 | const [text, setText] = useState(''); 5 | return ( 6 |
7 | Text: {text} 8 | setText(event.target.value)} /> 9 |
10 | ); 11 | }; 12 | 13 | -------------------------------------------------------------------------------- /test/vite/basic.test.tsx: -------------------------------------------------------------------------------- 1 | import { afterAll, beforeAll, describe, expect, test } from "vitest"; 2 | import { createServer, build, preview } from "vite"; 3 | import type { PreviewServer } from "vite"; 4 | import puppeteer from "puppeteer"; 5 | import type { Browser, Page } from "puppeteer"; 6 | import { autoRetry } from "../utils"; 7 | 8 | const url = "http://localhost:3000"; 9 | 10 | describe("basic", async () => { 11 | let server: PreviewServer; 12 | let browser: Browser; 13 | let page: Page; 14 | 15 | beforeAll(async () => { 16 | if (process.env.PREVIEW) { 17 | await build({ 18 | root: process.cwd(), 19 | }); 20 | 21 | server = await preview({ 22 | preview: { port: 3000 }, 23 | root: process.cwd(), 24 | }); 25 | } else if (process.env.DEV) { 26 | server = await createServer({ 27 | preview: { port: 3000 }, 28 | root: process.cwd(), 29 | mode: "dev", 30 | }); 31 | server.httpServer.listen(3000); 32 | } 33 | 34 | browser = await puppeteer.launch(); 35 | page = await browser.newPage(); 36 | }); 37 | 38 | afterAll(async () => { 39 | await browser.close(); 40 | server.httpServer.close(); 41 | }); 42 | 43 | it("basic render", async () => { 44 | await page.goto(url); 45 | expect(await page.content()).toContain("Workers"); 46 | expect(await page.content()).toContain("Loading"); 47 | await autoRetry(async () => { 48 | expect(await page.content()).toContain("102334155"); 49 | }); 50 | 51 | await page.click("#increment"); 52 | expect(await page.content()).toContain("Loading"); 53 | await autoRetry(async () => { 54 | expect(await page.content()).toContain("165580141"); 55 | }); 56 | }); 57 | }); 58 | -------------------------------------------------------------------------------- /test/vite/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Vite App 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /test/vite/main.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | import ReactDOM from 'react-dom' 3 | import App from './App' 4 | 5 | ReactDOM.render( 6 | 7 | 8 | , 9 | document.getElementById('root') 10 | ) 11 | -------------------------------------------------------------------------------- /test/vite/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "module", 3 | "scripts": { 4 | "start": "vite", 5 | "test:dev": "cross-env DEV=true vitest", 6 | "test:preview": "cross-env PREVIEW=true vitest", 7 | "test": "pnpm test:dev && pnpm test:dev" 8 | }, 9 | "dependencies": { 10 | "mime": "^3.0.0", 11 | "react-worker-components-plugin": "workspace:^0.0.0" 12 | }, 13 | "devDependencies": { 14 | "vite-plugin-inspect": "^0.3.13" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /test/vite/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.json", 3 | "include": ["./**/*.ts"], 4 | "exclude": ["./dist"] 5 | } 6 | -------------------------------------------------------------------------------- /test/vite/vite.config.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | import { defineConfig } from "vite"; 4 | import Inspect from "vite-plugin-inspect"; 5 | import rwc from "react-worker-components-plugin/vite"; 6 | 7 | // https://vitejs.dev/config/ 8 | export default defineConfig({ 9 | plugins: [rwc(), Inspect()], 10 | build: { sourcemap: true }, 11 | test: { 12 | testTimeout: 30_000, 13 | hookTimeout: 30_000, 14 | global: true, 15 | }, 16 | }); 17 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "module": "esnext", 5 | "lib": ["esnext", "dom"], 6 | "moduleResolution": "node", 7 | "esModuleInterop": true, 8 | "strict": true, 9 | "strictNullChecks": true, 10 | "resolveJsonModule": true, 11 | "skipDefaultLibCheck": true, 12 | "skipLibCheck": true, 13 | "outDir": "./dist", 14 | "declaration": true, 15 | "inlineSourceMap": true, 16 | "jsx": "react-jsx" 17 | }, 18 | "exclude": [ 19 | "**/dist/**" 20 | ] 21 | } 22 | --------------------------------------------------------------------------------