├── .editorconfig ├── .github └── workflows │ └── main.yml ├── .gitignore ├── .husky └── pre-commit ├── .prettierrc.js ├── LICENSE ├── README.md ├── declarations.d.ts ├── e2e └── menubar.test.ts ├── jest.config.js ├── package.json ├── playwright.config.ts ├── pnpm-lock.yaml ├── scripts ├── .DS_Store ├── css-mock.js ├── css-transform.js ├── esbuild.js ├── icon │ ├── android-icon-144x144.png │ ├── android-icon-192x192.png │ ├── android-icon-36x36.png │ ├── android-icon-48x48.png │ ├── android-icon-72x72.png │ ├── android-icon-96x96.png │ ├── apple-icon-114x114.png │ ├── apple-icon-120x120.png │ ├── apple-icon-144x144.png │ ├── apple-icon-152x152.png │ ├── apple-icon-180x180.png │ ├── apple-icon-57x57.png │ ├── apple-icon-60x60.png │ ├── apple-icon-72x72.png │ ├── apple-icon-76x76.png │ ├── apple-icon-precomposed.png │ ├── apple-icon.png │ ├── browserconfig.xml │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon-96x96.png │ ├── favicon.ico │ ├── manifest.json │ ├── ms-icon-144x144.png │ ├── ms-icon-150x150.png │ ├── ms-icon-310x310.png │ ├── ms-icon-70x70.png │ └── rotate.png ├── index.html └── jest.setup.js ├── src ├── __tests__ │ └── App.test.tsx ├── components │ ├── BaseIcon │ │ ├── BaseIcon.module.css │ │ ├── BaseIcon.tsx │ │ ├── icon.ts │ │ └── index.tsx │ ├── Button │ │ ├── index.module.css │ │ └── index.tsx │ ├── Github │ │ ├── index.module.css │ │ └── index.tsx │ ├── Select │ │ ├── index.module.css │ │ └── index.tsx │ ├── Toast │ │ ├── index.module.css │ │ └── index.tsx │ ├── __tests__ │ │ ├── BaseIcon.test.tsx │ │ ├── Button.test.tsx │ │ └── Toast.test.tsx │ └── index.ts ├── entry │ ├── FPS.tsx │ ├── I18N.tsx │ ├── Store.tsx │ ├── Theme.tsx │ ├── index.module.css │ ├── index.tsx │ └── useFps.ts ├── global.css ├── global.d.ts ├── i18n │ ├── __tests__ │ │ └── i18n.test.ts │ ├── index.ts │ └── lang │ │ ├── en.json │ │ └── zh.json ├── index.tsx ├── store │ ├── arrayStore.ts │ ├── base.ts │ ├── index.ts │ └── objectStore.ts ├── theme │ ├── __tests__ │ │ └── theme.test.ts │ ├── color.ts │ ├── convert.ts │ ├── index.ts │ ├── size.ts │ └── zIndex.ts ├── types │ └── index.ts └── util │ ├── __tests__ │ ├── classnames.test.ts │ └── deepEqual.test.ts │ ├── classnames.ts │ ├── deepEqual.ts │ └── index.ts ├── tsconfig.json └── typedoc.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | end_of_line = lf 7 | indent_size = 2 8 | indent_style = space 9 | insert_final_newline = true 10 | max_line_length = 80 11 | trim_trailing_whitespace = true 12 | 13 | [*.md] 14 | max_line_length = 0 -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: CI 5 | on: 6 | - push 7 | - pull_request 8 | jobs: 9 | build: 10 | timeout-minutes: 60 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v4 14 | - uses: actions/setup-node@v4 15 | with: 16 | node-version: 20 17 | - name: Test 18 | run: | 19 | npm i -g pnpm 20 | pnpm i 21 | npm run lint 22 | npx tsc 23 | npm run coverage 24 | - name: Upload coverage 25 | uses: codecov/codecov-action@v4 26 | with: 27 | token: ${{ secrets.CODECOV_TOKEN }} 28 | - name: Install Playwright Browsers 29 | run: npx playwright install --with-deps 30 | - name: E2E 31 | run: npm run e2e 32 | - name: Build 33 | run: npm run build 34 | - name: Deploy 35 | uses: peaceiris/actions-gh-pages@v3 36 | if: ${{ github.ref == 'refs/heads/main' }} 37 | with: 38 | github_token: ${{ secrets.GITHUB_TOKEN }} 39 | publish_dir: ./dist 40 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | dist 3 | .vscode 4 | .idea 5 | yarn.lock 6 | package-lock.json 7 | coverage 8 | dist 9 | .DS_Store 10 | lib 11 | output 12 | port.txt 13 | *.html 14 | /test-results/ 15 | /playwright-report/ 16 | /blob-report/ 17 | /playwright/.cache/ 18 | report 19 | docs -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | npm run ci 2 | 3 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | /** @type {import("prettier").Config} */ 3 | const config = { 4 | bracketSpacing: true, 5 | singleQuote: true, 6 | bracketSameLine: false, 7 | trailingComma: 'all', 8 | printWidth: 80, 9 | arrowParens: 'always', 10 | semi: true, 11 | }; 12 | module.exports = config; 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Steve Xu 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-esbuild-boilerplate 2 | 3 | [![CI](https://github.com/nusr/react-esbuild-boilerplate/actions/workflows/main.yml/badge.svg)](https://github.com/nusr/react-esbuild-boilerplate/actions/workflows/main.yml) 4 | [![codecov](https://codecov.io/gh/nusr/react-esbuild-boilerplate/graph/badge.svg?token=FW67QU1LC5)](https://codecov.io/gh/nusr/react-esbuild-boilerplate) 5 | ![GitHub](https://img.shields.io/github/license/nusr/react-esbuild-boilerplate.svg) 6 | ![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/nusr/react-esbuild-boilerplate.svg) 7 | 8 | An extremely fast react boilerplate. 9 | 10 | support by [esbuild](https://github.com/evanw/esbuild). 11 | 12 | [online demo](https://nusr.github.io/react-esbuild-boilerplate/) 13 | 14 | ## Start 15 | 16 | ```bash 17 | git clone https://github.com/nusr/react-esbuild-boilerplate.git 18 | cd react-esbuild-boilerplate 19 | npm i -g pnpm 20 | pnpm i 21 | npm run start 22 | ``` 23 | 24 | ## Features 25 | 26 | 1. Type Check: Typescript 27 | 1. Css Module: esbuild 28 | 1. Unit Test: Jest 29 | 1. E2E Test: playwright 30 | 1. Lint: oxlint 31 | 1. Hot Reload: Esbuild 32 | 1. Bundler: Esbuild 33 | 1. Dark Mode 34 | 1. I18N 35 | 36 | ## Test 37 | 38 | ```bash 39 | npm run test 40 | ``` 41 | 42 | ## lint 43 | 44 | ```bash 45 | npm run lint 46 | ``` 47 | 48 | ## typecheck 49 | 50 | ```bash 51 | npx tsc 52 | ``` 53 | 54 | ## build 55 | 56 | ```bash 57 | npm run build 58 | ``` -------------------------------------------------------------------------------- /declarations.d.ts: -------------------------------------------------------------------------------- 1 | declare module '*.css'; 2 | -------------------------------------------------------------------------------- /e2e/menubar.test.ts: -------------------------------------------------------------------------------- 1 | import { test, expect } from '@playwright/test'; 2 | 3 | test.describe('menubar.test', () => { 4 | test.beforeEach(async ({ page }) => { 5 | await page.goto('/'); 6 | }); 7 | 8 | test('test menubar exist', async ({ page }) => { 9 | await expect(page.getByTestId('menubar')).toBeVisible(); 10 | }); 11 | }); 12 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('ts-jest').JestConfigWithTsJest} */ 2 | module.exports = { 3 | rootDir: process.cwd(), 4 | preset: 'ts-jest', 5 | testEnvironment: 'jsdom', 6 | testMatch: ['/src/**/*.test.[jt]s?(x)'], 7 | transform: { 8 | '^.+\\.css$': '/scripts/css-transform.js', 9 | }, 10 | collectCoverageFrom: ['src/**/*.{ts,tsx,js,jsx}'], 11 | coverageReporters: ['clover', 'json', 'lcov', 'text', 'html'], 12 | moduleNameMapper: { 13 | '@/(.*)': '/src/$1', 14 | '\\.css$': '/scripts/css-mock.js', 15 | }, 16 | setupFiles: ['/scripts/jest.setup.js'], 17 | }; 18 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-esbuild-boilerplate", 3 | "version": "2.0.0", 4 | "description": "An extremely fast react boilerplate", 5 | "main": "lib/index.umd.js", 6 | "module": "lib/index.esm.js", 7 | "scripts": { 8 | "start": "node ./scripts/esbuild.js", 9 | "build": "npm run start -- --nodeEnv production", 10 | "test": "jest --config ./jest.config.js --forceExit --detectOpenHandles", 11 | "coverage": "npm run test -- --coverage", 12 | "ci": "npm run e2e && npm run test && npm run build && npm run lint && npx tsc", 13 | "e2e": "npx playwright test", 14 | "lint": "npx oxlint@latest --fix", 15 | "prepare": "husky && npx playwright install --with-deps", 16 | "typedoc": "npx typedoc" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "git://github.com/nusr/react-esbuild-boilerplate.git" 21 | }, 22 | "keywords": [], 23 | "author": "Steve Xu ", 24 | "license": "MIT", 25 | "homepage": "https://nusr.github.io/react-esbuild-boilerplate", 26 | "dependencies": { 27 | "react": "^18.3.1", 28 | "react-dom": "^18.3.1" 29 | }, 30 | "devDependencies": { 31 | "@playwright/test": "^1.44.0", 32 | "@testing-library/jest-dom": "^6.4.5", 33 | "@testing-library/react": "^15.0.7", 34 | "@types/jest": "^29.5.12", 35 | "@types/node": "^20.12.12", 36 | "@types/react": "^18.3.2", 37 | "@types/react-dom": "^18.3.0", 38 | "esbuild": "^0.21.3", 39 | "husky": "^9.0.11", 40 | "jest": "^29.7.0", 41 | "jest-environment-jsdom": "^29.7.0", 42 | "ts-jest": "^29.1.2", 43 | "typedoc": "^0.25.13", 44 | "typescript": "^5.4.5" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /playwright.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig, devices } from '@playwright/test'; 2 | import fs from 'fs'; 3 | import path from 'path'; 4 | 5 | function getPort(): number { 6 | const filePath = path.join(process.cwd(), 'port.txt'); 7 | const check = fs.existsSync(filePath); 8 | if (check) { 9 | const portData = fs.readFileSync(filePath, 'utf-8'); 10 | fs.unlinkSync(filePath); 11 | const t = parseInt(portData, 10); 12 | if (!isNaN(t)) { 13 | return t; 14 | } 15 | } 16 | return 8000; 17 | } 18 | 19 | const baseURL = `http://127.0.0.1:${getPort()}`; 20 | 21 | /** 22 | * See https://playwright.dev/docs/test-configuration. 23 | */ 24 | export default defineConfig({ 25 | testDir: './e2e', 26 | /* Run tests in files in parallel */ 27 | fullyParallel: true, 28 | /* Fail the build on CI if you accidentally left test.only in the source code. */ 29 | forbidOnly: !!process.env.CI, 30 | /* Retry on CI only */ 31 | retries: process.env.CI ? 2 : 0, 32 | /* Opt out of parallel tests on CI. */ 33 | workers: process.env.CI ? 1 : undefined, 34 | /* Reporter to use. See https://playwright.dev/docs/test-reporters */ 35 | reporter: 'html', 36 | /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ 37 | use: { 38 | /* Base URL to use in actions like `await page.goto('/')`. */ 39 | baseURL, 40 | 41 | /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ 42 | trace: 'on-first-retry', 43 | }, 44 | 45 | /* Configure projects for major browsers */ 46 | projects: [ 47 | { 48 | name: 'chromium', 49 | use: { ...devices['Desktop Chrome'] }, 50 | }, 51 | 52 | // { 53 | // name: 'firefox', 54 | // use: { ...devices['Desktop Firefox'] }, 55 | // }, 56 | 57 | // { 58 | // name: 'webkit', 59 | // use: { ...devices['Desktop Safari'] }, 60 | // }, 61 | 62 | /* Test against mobile viewports. */ 63 | // { 64 | // name: 'Mobile Chrome', 65 | // use: { ...devices['Pixel 5'] }, 66 | // }, 67 | // { 68 | // name: 'Mobile Safari', 69 | // use: { ...devices['iPhone 12'] }, 70 | // }, 71 | 72 | /* Test against branded browsers. */ 73 | // { 74 | // name: 'Microsoft Edge', 75 | // use: { ...devices['Desktop Edge'], channel: 'msedge' }, 76 | // }, 77 | // { 78 | // name: 'Google Chrome', 79 | // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, 80 | // }, 81 | ], 82 | 83 | /* Run your local dev server before starting the tests */ 84 | webServer: { 85 | command: 'npm run start', 86 | url: baseURL, 87 | reuseExistingServer: !process.env.CI, 88 | }, 89 | expect: { 90 | // Maximum time expect() should wait for the condition to be met. 91 | timeout: 10000, 92 | 93 | toHaveScreenshot: { 94 | // An acceptable amount of pixels that could be different, unset by default. 95 | maxDiffPixels: 10, 96 | }, 97 | 98 | toMatchSnapshot: { 99 | // An acceptable ratio of pixels that are different to the 100 | // total amount of pixels, between 0 and 1. 101 | maxDiffPixelRatio: 0.1, 102 | }, 103 | }, 104 | }); 105 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | react: 9 | specifier: ^18.3.1 10 | version: 18.3.1 11 | react-dom: 12 | specifier: ^18.3.1 13 | version: 18.3.1(react@18.3.1) 14 | 15 | devDependencies: 16 | '@playwright/test': 17 | specifier: ^1.44.0 18 | version: 1.44.0 19 | '@testing-library/jest-dom': 20 | specifier: ^6.4.5 21 | version: 6.4.5(@types/jest@29.5.12)(jest@29.7.0) 22 | '@testing-library/react': 23 | specifier: ^15.0.7 24 | version: 15.0.7(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1) 25 | '@types/jest': 26 | specifier: ^29.5.12 27 | version: 29.5.12 28 | '@types/node': 29 | specifier: ^20.12.12 30 | version: 20.12.12 31 | '@types/react': 32 | specifier: ^18.3.2 33 | version: 18.3.2 34 | '@types/react-dom': 35 | specifier: ^18.3.0 36 | version: 18.3.0 37 | esbuild: 38 | specifier: ^0.21.3 39 | version: 0.21.3 40 | husky: 41 | specifier: ^9.0.11 42 | version: 9.0.11 43 | jest: 44 | specifier: ^29.7.0 45 | version: 29.7.0(@types/node@20.12.12) 46 | jest-environment-jsdom: 47 | specifier: ^29.7.0 48 | version: 29.7.0 49 | ts-jest: 50 | specifier: ^29.1.2 51 | version: 29.1.2(@babel/core@7.24.5)(esbuild@0.21.3)(jest@29.7.0)(typescript@5.4.5) 52 | typedoc: 53 | specifier: ^0.25.13 54 | version: 0.25.13(typescript@5.4.5) 55 | typescript: 56 | specifier: ^5.4.5 57 | version: 5.4.5 58 | 59 | packages: 60 | 61 | /@adobe/css-tools@4.3.3: 62 | resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} 63 | dev: true 64 | 65 | /@ampproject/remapping@2.3.0: 66 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} 67 | engines: {node: '>=6.0.0'} 68 | dependencies: 69 | '@jridgewell/gen-mapping': 0.3.5 70 | '@jridgewell/trace-mapping': 0.3.25 71 | dev: true 72 | 73 | /@babel/code-frame@7.24.2: 74 | resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} 75 | engines: {node: '>=6.9.0'} 76 | dependencies: 77 | '@babel/highlight': 7.24.5 78 | picocolors: 1.0.1 79 | dev: true 80 | 81 | /@babel/compat-data@7.24.4: 82 | resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} 83 | engines: {node: '>=6.9.0'} 84 | dev: true 85 | 86 | /@babel/core@7.24.5: 87 | resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} 88 | engines: {node: '>=6.9.0'} 89 | dependencies: 90 | '@ampproject/remapping': 2.3.0 91 | '@babel/code-frame': 7.24.2 92 | '@babel/generator': 7.24.5 93 | '@babel/helper-compilation-targets': 7.23.6 94 | '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) 95 | '@babel/helpers': 7.24.5 96 | '@babel/parser': 7.24.5 97 | '@babel/template': 7.24.0 98 | '@babel/traverse': 7.24.5 99 | '@babel/types': 7.24.5 100 | convert-source-map: 2.0.0 101 | debug: 4.3.4 102 | gensync: 1.0.0-beta.2 103 | json5: 2.2.3 104 | semver: 6.3.1 105 | transitivePeerDependencies: 106 | - supports-color 107 | dev: true 108 | 109 | /@babel/generator@7.24.5: 110 | resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} 111 | engines: {node: '>=6.9.0'} 112 | dependencies: 113 | '@babel/types': 7.24.5 114 | '@jridgewell/gen-mapping': 0.3.5 115 | '@jridgewell/trace-mapping': 0.3.25 116 | jsesc: 2.5.2 117 | dev: true 118 | 119 | /@babel/helper-compilation-targets@7.23.6: 120 | resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} 121 | engines: {node: '>=6.9.0'} 122 | dependencies: 123 | '@babel/compat-data': 7.24.4 124 | '@babel/helper-validator-option': 7.23.5 125 | browserslist: 4.23.0 126 | lru-cache: 5.1.1 127 | semver: 6.3.1 128 | dev: true 129 | 130 | /@babel/helper-environment-visitor@7.22.20: 131 | resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} 132 | engines: {node: '>=6.9.0'} 133 | dev: true 134 | 135 | /@babel/helper-function-name@7.23.0: 136 | resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} 137 | engines: {node: '>=6.9.0'} 138 | dependencies: 139 | '@babel/template': 7.24.0 140 | '@babel/types': 7.24.5 141 | dev: true 142 | 143 | /@babel/helper-hoist-variables@7.22.5: 144 | resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} 145 | engines: {node: '>=6.9.0'} 146 | dependencies: 147 | '@babel/types': 7.24.5 148 | dev: true 149 | 150 | /@babel/helper-module-imports@7.24.3: 151 | resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} 152 | engines: {node: '>=6.9.0'} 153 | dependencies: 154 | '@babel/types': 7.24.5 155 | dev: true 156 | 157 | /@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5): 158 | resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} 159 | engines: {node: '>=6.9.0'} 160 | peerDependencies: 161 | '@babel/core': ^7.0.0 162 | dependencies: 163 | '@babel/core': 7.24.5 164 | '@babel/helper-environment-visitor': 7.22.20 165 | '@babel/helper-module-imports': 7.24.3 166 | '@babel/helper-simple-access': 7.24.5 167 | '@babel/helper-split-export-declaration': 7.24.5 168 | '@babel/helper-validator-identifier': 7.24.5 169 | dev: true 170 | 171 | /@babel/helper-plugin-utils@7.24.5: 172 | resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} 173 | engines: {node: '>=6.9.0'} 174 | dev: true 175 | 176 | /@babel/helper-simple-access@7.24.5: 177 | resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} 178 | engines: {node: '>=6.9.0'} 179 | dependencies: 180 | '@babel/types': 7.24.5 181 | dev: true 182 | 183 | /@babel/helper-split-export-declaration@7.24.5: 184 | resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} 185 | engines: {node: '>=6.9.0'} 186 | dependencies: 187 | '@babel/types': 7.24.5 188 | dev: true 189 | 190 | /@babel/helper-string-parser@7.24.1: 191 | resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} 192 | engines: {node: '>=6.9.0'} 193 | dev: true 194 | 195 | /@babel/helper-validator-identifier@7.24.5: 196 | resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} 197 | engines: {node: '>=6.9.0'} 198 | dev: true 199 | 200 | /@babel/helper-validator-option@7.23.5: 201 | resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} 202 | engines: {node: '>=6.9.0'} 203 | dev: true 204 | 205 | /@babel/helpers@7.24.5: 206 | resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} 207 | engines: {node: '>=6.9.0'} 208 | dependencies: 209 | '@babel/template': 7.24.0 210 | '@babel/traverse': 7.24.5 211 | '@babel/types': 7.24.5 212 | transitivePeerDependencies: 213 | - supports-color 214 | dev: true 215 | 216 | /@babel/highlight@7.24.5: 217 | resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} 218 | engines: {node: '>=6.9.0'} 219 | dependencies: 220 | '@babel/helper-validator-identifier': 7.24.5 221 | chalk: 2.4.2 222 | js-tokens: 4.0.0 223 | picocolors: 1.0.1 224 | dev: true 225 | 226 | /@babel/parser@7.24.5: 227 | resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} 228 | engines: {node: '>=6.0.0'} 229 | hasBin: true 230 | dependencies: 231 | '@babel/types': 7.24.5 232 | dev: true 233 | 234 | /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5): 235 | resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} 236 | peerDependencies: 237 | '@babel/core': ^7.0.0-0 238 | dependencies: 239 | '@babel/core': 7.24.5 240 | '@babel/helper-plugin-utils': 7.24.5 241 | dev: true 242 | 243 | /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.5): 244 | resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} 245 | peerDependencies: 246 | '@babel/core': ^7.0.0-0 247 | dependencies: 248 | '@babel/core': 7.24.5 249 | '@babel/helper-plugin-utils': 7.24.5 250 | dev: true 251 | 252 | /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5): 253 | resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} 254 | peerDependencies: 255 | '@babel/core': ^7.0.0-0 256 | dependencies: 257 | '@babel/core': 7.24.5 258 | '@babel/helper-plugin-utils': 7.24.5 259 | dev: true 260 | 261 | /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5): 262 | resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} 263 | peerDependencies: 264 | '@babel/core': ^7.0.0-0 265 | dependencies: 266 | '@babel/core': 7.24.5 267 | '@babel/helper-plugin-utils': 7.24.5 268 | dev: true 269 | 270 | /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5): 271 | resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} 272 | peerDependencies: 273 | '@babel/core': ^7.0.0-0 274 | dependencies: 275 | '@babel/core': 7.24.5 276 | '@babel/helper-plugin-utils': 7.24.5 277 | dev: true 278 | 279 | /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5): 280 | resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} 281 | engines: {node: '>=6.9.0'} 282 | peerDependencies: 283 | '@babel/core': ^7.0.0-0 284 | dependencies: 285 | '@babel/core': 7.24.5 286 | '@babel/helper-plugin-utils': 7.24.5 287 | dev: true 288 | 289 | /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5): 290 | resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} 291 | peerDependencies: 292 | '@babel/core': ^7.0.0-0 293 | dependencies: 294 | '@babel/core': 7.24.5 295 | '@babel/helper-plugin-utils': 7.24.5 296 | dev: true 297 | 298 | /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5): 299 | resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} 300 | peerDependencies: 301 | '@babel/core': ^7.0.0-0 302 | dependencies: 303 | '@babel/core': 7.24.5 304 | '@babel/helper-plugin-utils': 7.24.5 305 | dev: true 306 | 307 | /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5): 308 | resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} 309 | peerDependencies: 310 | '@babel/core': ^7.0.0-0 311 | dependencies: 312 | '@babel/core': 7.24.5 313 | '@babel/helper-plugin-utils': 7.24.5 314 | dev: true 315 | 316 | /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5): 317 | resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} 318 | peerDependencies: 319 | '@babel/core': ^7.0.0-0 320 | dependencies: 321 | '@babel/core': 7.24.5 322 | '@babel/helper-plugin-utils': 7.24.5 323 | dev: true 324 | 325 | /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5): 326 | resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} 327 | peerDependencies: 328 | '@babel/core': ^7.0.0-0 329 | dependencies: 330 | '@babel/core': 7.24.5 331 | '@babel/helper-plugin-utils': 7.24.5 332 | dev: true 333 | 334 | /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5): 335 | resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} 336 | peerDependencies: 337 | '@babel/core': ^7.0.0-0 338 | dependencies: 339 | '@babel/core': 7.24.5 340 | '@babel/helper-plugin-utils': 7.24.5 341 | dev: true 342 | 343 | /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5): 344 | resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} 345 | engines: {node: '>=6.9.0'} 346 | peerDependencies: 347 | '@babel/core': ^7.0.0-0 348 | dependencies: 349 | '@babel/core': 7.24.5 350 | '@babel/helper-plugin-utils': 7.24.5 351 | dev: true 352 | 353 | /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.5): 354 | resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} 355 | engines: {node: '>=6.9.0'} 356 | peerDependencies: 357 | '@babel/core': ^7.0.0-0 358 | dependencies: 359 | '@babel/core': 7.24.5 360 | '@babel/helper-plugin-utils': 7.24.5 361 | dev: true 362 | 363 | /@babel/runtime@7.24.5: 364 | resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} 365 | engines: {node: '>=6.9.0'} 366 | dependencies: 367 | regenerator-runtime: 0.14.1 368 | dev: true 369 | 370 | /@babel/template@7.24.0: 371 | resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} 372 | engines: {node: '>=6.9.0'} 373 | dependencies: 374 | '@babel/code-frame': 7.24.2 375 | '@babel/parser': 7.24.5 376 | '@babel/types': 7.24.5 377 | dev: true 378 | 379 | /@babel/traverse@7.24.5: 380 | resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} 381 | engines: {node: '>=6.9.0'} 382 | dependencies: 383 | '@babel/code-frame': 7.24.2 384 | '@babel/generator': 7.24.5 385 | '@babel/helper-environment-visitor': 7.22.20 386 | '@babel/helper-function-name': 7.23.0 387 | '@babel/helper-hoist-variables': 7.22.5 388 | '@babel/helper-split-export-declaration': 7.24.5 389 | '@babel/parser': 7.24.5 390 | '@babel/types': 7.24.5 391 | debug: 4.3.4 392 | globals: 11.12.0 393 | transitivePeerDependencies: 394 | - supports-color 395 | dev: true 396 | 397 | /@babel/types@7.24.5: 398 | resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} 399 | engines: {node: '>=6.9.0'} 400 | dependencies: 401 | '@babel/helper-string-parser': 7.24.1 402 | '@babel/helper-validator-identifier': 7.24.5 403 | to-fast-properties: 2.0.0 404 | dev: true 405 | 406 | /@bcoe/v8-coverage@0.2.3: 407 | resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} 408 | dev: true 409 | 410 | /@esbuild/aix-ppc64@0.21.3: 411 | resolution: {integrity: sha512-yTgnwQpFVYfvvo4SvRFB0SwrW8YjOxEoT7wfMT7Ol5v7v5LDNvSGo67aExmxOb87nQNeWPVvaGBNfQ7BXcrZ9w==} 412 | engines: {node: '>=12'} 413 | cpu: [ppc64] 414 | os: [aix] 415 | requiresBuild: true 416 | dev: true 417 | optional: true 418 | 419 | /@esbuild/android-arm64@0.21.3: 420 | resolution: {integrity: sha512-c+ty9necz3zB1Y+d/N+mC6KVVkGUUOcm4ZmT5i/Fk5arOaY3i6CA3P5wo/7+XzV8cb4GrI/Zjp8NuOQ9Lfsosw==} 421 | engines: {node: '>=12'} 422 | cpu: [arm64] 423 | os: [android] 424 | requiresBuild: true 425 | dev: true 426 | optional: true 427 | 428 | /@esbuild/android-arm@0.21.3: 429 | resolution: {integrity: sha512-bviJOLMgurLJtF1/mAoJLxDZDL6oU5/ztMHnJQRejbJrSc9FFu0QoUoFhvi6qSKJEw9y5oGyvr9fuDtzJ30rNQ==} 430 | engines: {node: '>=12'} 431 | cpu: [arm] 432 | os: [android] 433 | requiresBuild: true 434 | dev: true 435 | optional: true 436 | 437 | /@esbuild/android-x64@0.21.3: 438 | resolution: {integrity: sha512-JReHfYCRK3FVX4Ra+y5EBH1b9e16TV2OxrPAvzMsGeES0X2Ndm9ImQRI4Ket757vhc5XBOuGperw63upesclRw==} 439 | engines: {node: '>=12'} 440 | cpu: [x64] 441 | os: [android] 442 | requiresBuild: true 443 | dev: true 444 | optional: true 445 | 446 | /@esbuild/darwin-arm64@0.21.3: 447 | resolution: {integrity: sha512-U3fuQ0xNiAkXOmQ6w5dKpEvXQRSpHOnbw7gEfHCRXPeTKW9sBzVck6C5Yneb8LfJm0l6le4NQfkNPnWMSlTFUQ==} 448 | engines: {node: '>=12'} 449 | cpu: [arm64] 450 | os: [darwin] 451 | requiresBuild: true 452 | dev: true 453 | optional: true 454 | 455 | /@esbuild/darwin-x64@0.21.3: 456 | resolution: {integrity: sha512-3m1CEB7F07s19wmaMNI2KANLcnaqryJxO1fXHUV5j1rWn+wMxdUYoPyO2TnAbfRZdi7ADRwJClmOwgT13qlP3Q==} 457 | engines: {node: '>=12'} 458 | cpu: [x64] 459 | os: [darwin] 460 | requiresBuild: true 461 | dev: true 462 | optional: true 463 | 464 | /@esbuild/freebsd-arm64@0.21.3: 465 | resolution: {integrity: sha512-fsNAAl5pU6wmKHq91cHWQT0Fz0vtyE1JauMzKotrwqIKAswwP5cpHUCxZNSTuA/JlqtScq20/5KZ+TxQdovU/g==} 466 | engines: {node: '>=12'} 467 | cpu: [arm64] 468 | os: [freebsd] 469 | requiresBuild: true 470 | dev: true 471 | optional: true 472 | 473 | /@esbuild/freebsd-x64@0.21.3: 474 | resolution: {integrity: sha512-tci+UJ4zP5EGF4rp8XlZIdq1q1a/1h9XuronfxTMCNBslpCtmk97Q/5qqy1Mu4zIc0yswN/yP/BLX+NTUC1bXA==} 475 | engines: {node: '>=12'} 476 | cpu: [x64] 477 | os: [freebsd] 478 | requiresBuild: true 479 | dev: true 480 | optional: true 481 | 482 | /@esbuild/linux-arm64@0.21.3: 483 | resolution: {integrity: sha512-vvG6R5g5ieB4eCJBQevyDMb31LMHthLpXTc2IGkFnPWS/GzIFDnaYFp558O+XybTmYrVjxnryru7QRleJvmZ6Q==} 484 | engines: {node: '>=12'} 485 | cpu: [arm64] 486 | os: [linux] 487 | requiresBuild: true 488 | dev: true 489 | optional: true 490 | 491 | /@esbuild/linux-arm@0.21.3: 492 | resolution: {integrity: sha512-f6kz2QpSuyHHg01cDawj0vkyMwuIvN62UAguQfnNVzbge2uWLhA7TCXOn83DT0ZvyJmBI943MItgTovUob36SQ==} 493 | engines: {node: '>=12'} 494 | cpu: [arm] 495 | os: [linux] 496 | requiresBuild: true 497 | dev: true 498 | optional: true 499 | 500 | /@esbuild/linux-ia32@0.21.3: 501 | resolution: {integrity: sha512-HjCWhH7K96Na+66TacDLJmOI9R8iDWDDiqe17C7znGvvE4sW1ECt9ly0AJ3dJH62jHyVqW9xpxZEU1jKdt+29A==} 502 | engines: {node: '>=12'} 503 | cpu: [ia32] 504 | os: [linux] 505 | requiresBuild: true 506 | dev: true 507 | optional: true 508 | 509 | /@esbuild/linux-loong64@0.21.3: 510 | resolution: {integrity: sha512-BGpimEccmHBZRcAhdlRIxMp7x9PyJxUtj7apL2IuoG9VxvU/l/v1z015nFs7Si7tXUwEsvjc1rOJdZCn4QTU+Q==} 511 | engines: {node: '>=12'} 512 | cpu: [loong64] 513 | os: [linux] 514 | requiresBuild: true 515 | dev: true 516 | optional: true 517 | 518 | /@esbuild/linux-mips64el@0.21.3: 519 | resolution: {integrity: sha512-5rMOWkp7FQGtAH3QJddP4w3s47iT20hwftqdm7b+loe95o8JU8ro3qZbhgMRy0VuFU0DizymF1pBKkn3YHWtsw==} 520 | engines: {node: '>=12'} 521 | cpu: [mips64el] 522 | os: [linux] 523 | requiresBuild: true 524 | dev: true 525 | optional: true 526 | 527 | /@esbuild/linux-ppc64@0.21.3: 528 | resolution: {integrity: sha512-h0zj1ldel89V5sjPLo5H1SyMzp4VrgN1tPkN29TmjvO1/r0MuMRwJxL8QY05SmfsZRs6TF0c/IDH3u7XYYmbAg==} 529 | engines: {node: '>=12'} 530 | cpu: [ppc64] 531 | os: [linux] 532 | requiresBuild: true 533 | dev: true 534 | optional: true 535 | 536 | /@esbuild/linux-riscv64@0.21.3: 537 | resolution: {integrity: sha512-dkAKcTsTJ+CRX6bnO17qDJbLoW37npd5gSNtSzjYQr0svghLJYGYB0NF1SNcU1vDcjXLYS5pO4qOW4YbFama4A==} 538 | engines: {node: '>=12'} 539 | cpu: [riscv64] 540 | os: [linux] 541 | requiresBuild: true 542 | dev: true 543 | optional: true 544 | 545 | /@esbuild/linux-s390x@0.21.3: 546 | resolution: {integrity: sha512-vnD1YUkovEdnZWEuMmy2X2JmzsHQqPpZElXx6dxENcIwTu+Cu5ERax6+Ke1QsE814Zf3c6rxCfwQdCTQ7tPuXA==} 547 | engines: {node: '>=12'} 548 | cpu: [s390x] 549 | os: [linux] 550 | requiresBuild: true 551 | dev: true 552 | optional: true 553 | 554 | /@esbuild/linux-x64@0.21.3: 555 | resolution: {integrity: sha512-IOXOIm9WaK7plL2gMhsWJd+l2bfrhfilv0uPTptoRoSb2p09RghhQQp9YY6ZJhk/kqmeRt6siRdMSLLwzuT0KQ==} 556 | engines: {node: '>=12'} 557 | cpu: [x64] 558 | os: [linux] 559 | requiresBuild: true 560 | dev: true 561 | optional: true 562 | 563 | /@esbuild/netbsd-x64@0.21.3: 564 | resolution: {integrity: sha512-uTgCwsvQ5+vCQnqM//EfDSuomo2LhdWhFPS8VL8xKf+PKTCrcT/2kPPoWMTs22aB63MLdGMJiE3f1PHvCDmUOw==} 565 | engines: {node: '>=12'} 566 | cpu: [x64] 567 | os: [netbsd] 568 | requiresBuild: true 569 | dev: true 570 | optional: true 571 | 572 | /@esbuild/openbsd-x64@0.21.3: 573 | resolution: {integrity: sha512-vNAkR17Ub2MgEud2Wag/OE4HTSI6zlb291UYzHez/psiKarp0J8PKGDnAhMBcHFoOHMXHfExzmjMojJNbAStrQ==} 574 | engines: {node: '>=12'} 575 | cpu: [x64] 576 | os: [openbsd] 577 | requiresBuild: true 578 | dev: true 579 | optional: true 580 | 581 | /@esbuild/sunos-x64@0.21.3: 582 | resolution: {integrity: sha512-W8H9jlGiSBomkgmouaRoTXo49j4w4Kfbl6I1bIdO/vT0+0u4f20ko3ELzV3hPI6XV6JNBVX+8BC+ajHkvffIJA==} 583 | engines: {node: '>=12'} 584 | cpu: [x64] 585 | os: [sunos] 586 | requiresBuild: true 587 | dev: true 588 | optional: true 589 | 590 | /@esbuild/win32-arm64@0.21.3: 591 | resolution: {integrity: sha512-EjEomwyLSCg8Ag3LDILIqYCZAq/y3diJ04PnqGRgq8/4O3VNlXyMd54j/saShaN4h5o5mivOjAzmU6C3X4v0xw==} 592 | engines: {node: '>=12'} 593 | cpu: [arm64] 594 | os: [win32] 595 | requiresBuild: true 596 | dev: true 597 | optional: true 598 | 599 | /@esbuild/win32-ia32@0.21.3: 600 | resolution: {integrity: sha512-WGiE/GgbsEwR33++5rzjiYsKyHywE8QSZPF7Rfx9EBfK3Qn3xyR6IjyCr5Uk38Kg8fG4/2phN7sXp4NPWd3fcw==} 601 | engines: {node: '>=12'} 602 | cpu: [ia32] 603 | os: [win32] 604 | requiresBuild: true 605 | dev: true 606 | optional: true 607 | 608 | /@esbuild/win32-x64@0.21.3: 609 | resolution: {integrity: sha512-xRxC0jaJWDLYvcUvjQmHCJSfMrgmUuvsoXgDeU/wTorQ1ngDdUBuFtgY3W1Pc5sprGAvZBtWdJX7RPg/iZZUqA==} 610 | engines: {node: '>=12'} 611 | cpu: [x64] 612 | os: [win32] 613 | requiresBuild: true 614 | dev: true 615 | optional: true 616 | 617 | /@istanbuljs/load-nyc-config@1.1.0: 618 | resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} 619 | engines: {node: '>=8'} 620 | dependencies: 621 | camelcase: 5.3.1 622 | find-up: 4.1.0 623 | get-package-type: 0.1.0 624 | js-yaml: 3.14.1 625 | resolve-from: 5.0.0 626 | dev: true 627 | 628 | /@istanbuljs/schema@0.1.3: 629 | resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} 630 | engines: {node: '>=8'} 631 | dev: true 632 | 633 | /@jest/console@29.7.0: 634 | resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} 635 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 636 | dependencies: 637 | '@jest/types': 29.6.3 638 | '@types/node': 20.12.12 639 | chalk: 4.1.2 640 | jest-message-util: 29.7.0 641 | jest-util: 29.7.0 642 | slash: 3.0.0 643 | dev: true 644 | 645 | /@jest/core@29.7.0: 646 | resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} 647 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 648 | peerDependencies: 649 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 650 | peerDependenciesMeta: 651 | node-notifier: 652 | optional: true 653 | dependencies: 654 | '@jest/console': 29.7.0 655 | '@jest/reporters': 29.7.0 656 | '@jest/test-result': 29.7.0 657 | '@jest/transform': 29.7.0 658 | '@jest/types': 29.6.3 659 | '@types/node': 20.12.12 660 | ansi-escapes: 4.3.2 661 | chalk: 4.1.2 662 | ci-info: 3.9.0 663 | exit: 0.1.2 664 | graceful-fs: 4.2.11 665 | jest-changed-files: 29.7.0 666 | jest-config: 29.7.0(@types/node@20.12.12) 667 | jest-haste-map: 29.7.0 668 | jest-message-util: 29.7.0 669 | jest-regex-util: 29.6.3 670 | jest-resolve: 29.7.0 671 | jest-resolve-dependencies: 29.7.0 672 | jest-runner: 29.7.0 673 | jest-runtime: 29.7.0 674 | jest-snapshot: 29.7.0 675 | jest-util: 29.7.0 676 | jest-validate: 29.7.0 677 | jest-watcher: 29.7.0 678 | micromatch: 4.0.5 679 | pretty-format: 29.7.0 680 | slash: 3.0.0 681 | strip-ansi: 6.0.1 682 | transitivePeerDependencies: 683 | - babel-plugin-macros 684 | - supports-color 685 | - ts-node 686 | dev: true 687 | 688 | /@jest/environment@29.7.0: 689 | resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} 690 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 691 | dependencies: 692 | '@jest/fake-timers': 29.7.0 693 | '@jest/types': 29.6.3 694 | '@types/node': 20.12.12 695 | jest-mock: 29.7.0 696 | dev: true 697 | 698 | /@jest/expect-utils@29.7.0: 699 | resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} 700 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 701 | dependencies: 702 | jest-get-type: 29.6.3 703 | dev: true 704 | 705 | /@jest/expect@29.7.0: 706 | resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} 707 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 708 | dependencies: 709 | expect: 29.7.0 710 | jest-snapshot: 29.7.0 711 | transitivePeerDependencies: 712 | - supports-color 713 | dev: true 714 | 715 | /@jest/fake-timers@29.7.0: 716 | resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} 717 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 718 | dependencies: 719 | '@jest/types': 29.6.3 720 | '@sinonjs/fake-timers': 10.3.0 721 | '@types/node': 20.12.12 722 | jest-message-util: 29.7.0 723 | jest-mock: 29.7.0 724 | jest-util: 29.7.0 725 | dev: true 726 | 727 | /@jest/globals@29.7.0: 728 | resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} 729 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 730 | dependencies: 731 | '@jest/environment': 29.7.0 732 | '@jest/expect': 29.7.0 733 | '@jest/types': 29.6.3 734 | jest-mock: 29.7.0 735 | transitivePeerDependencies: 736 | - supports-color 737 | dev: true 738 | 739 | /@jest/reporters@29.7.0: 740 | resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} 741 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 742 | peerDependencies: 743 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 744 | peerDependenciesMeta: 745 | node-notifier: 746 | optional: true 747 | dependencies: 748 | '@bcoe/v8-coverage': 0.2.3 749 | '@jest/console': 29.7.0 750 | '@jest/test-result': 29.7.0 751 | '@jest/transform': 29.7.0 752 | '@jest/types': 29.6.3 753 | '@jridgewell/trace-mapping': 0.3.25 754 | '@types/node': 20.12.12 755 | chalk: 4.1.2 756 | collect-v8-coverage: 1.0.2 757 | exit: 0.1.2 758 | glob: 7.2.3 759 | graceful-fs: 4.2.11 760 | istanbul-lib-coverage: 3.2.2 761 | istanbul-lib-instrument: 6.0.2 762 | istanbul-lib-report: 3.0.1 763 | istanbul-lib-source-maps: 4.0.1 764 | istanbul-reports: 3.1.7 765 | jest-message-util: 29.7.0 766 | jest-util: 29.7.0 767 | jest-worker: 29.7.0 768 | slash: 3.0.0 769 | string-length: 4.0.2 770 | strip-ansi: 6.0.1 771 | v8-to-istanbul: 9.2.0 772 | transitivePeerDependencies: 773 | - supports-color 774 | dev: true 775 | 776 | /@jest/schemas@29.6.3: 777 | resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} 778 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 779 | dependencies: 780 | '@sinclair/typebox': 0.27.8 781 | dev: true 782 | 783 | /@jest/source-map@29.6.3: 784 | resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} 785 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 786 | dependencies: 787 | '@jridgewell/trace-mapping': 0.3.25 788 | callsites: 3.1.0 789 | graceful-fs: 4.2.11 790 | dev: true 791 | 792 | /@jest/test-result@29.7.0: 793 | resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} 794 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 795 | dependencies: 796 | '@jest/console': 29.7.0 797 | '@jest/types': 29.6.3 798 | '@types/istanbul-lib-coverage': 2.0.6 799 | collect-v8-coverage: 1.0.2 800 | dev: true 801 | 802 | /@jest/test-sequencer@29.7.0: 803 | resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} 804 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 805 | dependencies: 806 | '@jest/test-result': 29.7.0 807 | graceful-fs: 4.2.11 808 | jest-haste-map: 29.7.0 809 | slash: 3.0.0 810 | dev: true 811 | 812 | /@jest/transform@29.7.0: 813 | resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} 814 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 815 | dependencies: 816 | '@babel/core': 7.24.5 817 | '@jest/types': 29.6.3 818 | '@jridgewell/trace-mapping': 0.3.25 819 | babel-plugin-istanbul: 6.1.1 820 | chalk: 4.1.2 821 | convert-source-map: 2.0.0 822 | fast-json-stable-stringify: 2.1.0 823 | graceful-fs: 4.2.11 824 | jest-haste-map: 29.7.0 825 | jest-regex-util: 29.6.3 826 | jest-util: 29.7.0 827 | micromatch: 4.0.5 828 | pirates: 4.0.6 829 | slash: 3.0.0 830 | write-file-atomic: 4.0.2 831 | transitivePeerDependencies: 832 | - supports-color 833 | dev: true 834 | 835 | /@jest/types@29.6.3: 836 | resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} 837 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 838 | dependencies: 839 | '@jest/schemas': 29.6.3 840 | '@types/istanbul-lib-coverage': 2.0.6 841 | '@types/istanbul-reports': 3.0.4 842 | '@types/node': 20.12.12 843 | '@types/yargs': 17.0.32 844 | chalk: 4.1.2 845 | dev: true 846 | 847 | /@jridgewell/gen-mapping@0.3.5: 848 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 849 | engines: {node: '>=6.0.0'} 850 | dependencies: 851 | '@jridgewell/set-array': 1.2.1 852 | '@jridgewell/sourcemap-codec': 1.4.15 853 | '@jridgewell/trace-mapping': 0.3.25 854 | dev: true 855 | 856 | /@jridgewell/resolve-uri@3.1.2: 857 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 858 | engines: {node: '>=6.0.0'} 859 | dev: true 860 | 861 | /@jridgewell/set-array@1.2.1: 862 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 863 | engines: {node: '>=6.0.0'} 864 | dev: true 865 | 866 | /@jridgewell/sourcemap-codec@1.4.15: 867 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 868 | dev: true 869 | 870 | /@jridgewell/trace-mapping@0.3.25: 871 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 872 | dependencies: 873 | '@jridgewell/resolve-uri': 3.1.2 874 | '@jridgewell/sourcemap-codec': 1.4.15 875 | dev: true 876 | 877 | /@playwright/test@1.44.0: 878 | resolution: {integrity: sha512-rNX5lbNidamSUorBhB4XZ9SQTjAqfe5M+p37Z8ic0jPFBMo5iCtQz1kRWkEMg+rYOKSlVycpQmpqjSFq7LXOfg==} 879 | engines: {node: '>=16'} 880 | hasBin: true 881 | dependencies: 882 | playwright: 1.44.0 883 | dev: true 884 | 885 | /@sinclair/typebox@0.27.8: 886 | resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} 887 | dev: true 888 | 889 | /@sinonjs/commons@3.0.1: 890 | resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} 891 | dependencies: 892 | type-detect: 4.0.8 893 | dev: true 894 | 895 | /@sinonjs/fake-timers@10.3.0: 896 | resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} 897 | dependencies: 898 | '@sinonjs/commons': 3.0.1 899 | dev: true 900 | 901 | /@testing-library/dom@10.1.0: 902 | resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} 903 | engines: {node: '>=18'} 904 | dependencies: 905 | '@babel/code-frame': 7.24.2 906 | '@babel/runtime': 7.24.5 907 | '@types/aria-query': 5.0.4 908 | aria-query: 5.3.0 909 | chalk: 4.1.2 910 | dom-accessibility-api: 0.5.16 911 | lz-string: 1.5.0 912 | pretty-format: 27.5.1 913 | dev: true 914 | 915 | /@testing-library/jest-dom@6.4.5(@types/jest@29.5.12)(jest@29.7.0): 916 | resolution: {integrity: sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A==} 917 | engines: {node: '>=14', npm: '>=6', yarn: '>=1'} 918 | peerDependencies: 919 | '@jest/globals': '>= 28' 920 | '@types/bun': latest 921 | '@types/jest': '>= 28' 922 | jest: '>= 28' 923 | vitest: '>= 0.32' 924 | peerDependenciesMeta: 925 | '@jest/globals': 926 | optional: true 927 | '@types/bun': 928 | optional: true 929 | '@types/jest': 930 | optional: true 931 | jest: 932 | optional: true 933 | vitest: 934 | optional: true 935 | dependencies: 936 | '@adobe/css-tools': 4.3.3 937 | '@babel/runtime': 7.24.5 938 | '@types/jest': 29.5.12 939 | aria-query: 5.3.0 940 | chalk: 3.0.0 941 | css.escape: 1.5.1 942 | dom-accessibility-api: 0.6.3 943 | jest: 29.7.0(@types/node@20.12.12) 944 | lodash: 4.17.21 945 | redent: 3.0.0 946 | dev: true 947 | 948 | /@testing-library/react@15.0.7(@types/react@18.3.2)(react-dom@18.3.1)(react@18.3.1): 949 | resolution: {integrity: sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==} 950 | engines: {node: '>=18'} 951 | peerDependencies: 952 | '@types/react': ^18.0.0 953 | react: ^18.0.0 954 | react-dom: ^18.0.0 955 | peerDependenciesMeta: 956 | '@types/react': 957 | optional: true 958 | dependencies: 959 | '@babel/runtime': 7.24.5 960 | '@testing-library/dom': 10.1.0 961 | '@types/react': 18.3.2 962 | '@types/react-dom': 18.3.0 963 | react: 18.3.1 964 | react-dom: 18.3.1(react@18.3.1) 965 | dev: true 966 | 967 | /@tootallnate/once@2.0.0: 968 | resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} 969 | engines: {node: '>= 10'} 970 | dev: true 971 | 972 | /@types/aria-query@5.0.4: 973 | resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} 974 | dev: true 975 | 976 | /@types/babel__core@7.20.5: 977 | resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} 978 | dependencies: 979 | '@babel/parser': 7.24.5 980 | '@babel/types': 7.24.5 981 | '@types/babel__generator': 7.6.8 982 | '@types/babel__template': 7.4.4 983 | '@types/babel__traverse': 7.20.5 984 | dev: true 985 | 986 | /@types/babel__generator@7.6.8: 987 | resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} 988 | dependencies: 989 | '@babel/types': 7.24.5 990 | dev: true 991 | 992 | /@types/babel__template@7.4.4: 993 | resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} 994 | dependencies: 995 | '@babel/parser': 7.24.5 996 | '@babel/types': 7.24.5 997 | dev: true 998 | 999 | /@types/babel__traverse@7.20.5: 1000 | resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} 1001 | dependencies: 1002 | '@babel/types': 7.24.5 1003 | dev: true 1004 | 1005 | /@types/graceful-fs@4.1.9: 1006 | resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} 1007 | dependencies: 1008 | '@types/node': 20.12.12 1009 | dev: true 1010 | 1011 | /@types/istanbul-lib-coverage@2.0.6: 1012 | resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} 1013 | dev: true 1014 | 1015 | /@types/istanbul-lib-report@3.0.3: 1016 | resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} 1017 | dependencies: 1018 | '@types/istanbul-lib-coverage': 2.0.6 1019 | dev: true 1020 | 1021 | /@types/istanbul-reports@3.0.4: 1022 | resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} 1023 | dependencies: 1024 | '@types/istanbul-lib-report': 3.0.3 1025 | dev: true 1026 | 1027 | /@types/jest@29.5.12: 1028 | resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} 1029 | dependencies: 1030 | expect: 29.7.0 1031 | pretty-format: 29.7.0 1032 | dev: true 1033 | 1034 | /@types/jsdom@20.0.1: 1035 | resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} 1036 | dependencies: 1037 | '@types/node': 20.12.12 1038 | '@types/tough-cookie': 4.0.5 1039 | parse5: 7.1.2 1040 | dev: true 1041 | 1042 | /@types/node@20.12.12: 1043 | resolution: {integrity: sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==} 1044 | dependencies: 1045 | undici-types: 5.26.5 1046 | dev: true 1047 | 1048 | /@types/prop-types@15.7.12: 1049 | resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} 1050 | dev: true 1051 | 1052 | /@types/react-dom@18.3.0: 1053 | resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} 1054 | dependencies: 1055 | '@types/react': 18.3.2 1056 | dev: true 1057 | 1058 | /@types/react@18.3.2: 1059 | resolution: {integrity: sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==} 1060 | dependencies: 1061 | '@types/prop-types': 15.7.12 1062 | csstype: 3.1.3 1063 | dev: true 1064 | 1065 | /@types/stack-utils@2.0.3: 1066 | resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} 1067 | dev: true 1068 | 1069 | /@types/tough-cookie@4.0.5: 1070 | resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} 1071 | dev: true 1072 | 1073 | /@types/yargs-parser@21.0.3: 1074 | resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} 1075 | dev: true 1076 | 1077 | /@types/yargs@17.0.32: 1078 | resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} 1079 | dependencies: 1080 | '@types/yargs-parser': 21.0.3 1081 | dev: true 1082 | 1083 | /abab@2.0.6: 1084 | resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} 1085 | deprecated: Use your platform's native atob() and btoa() methods instead 1086 | dev: true 1087 | 1088 | /acorn-globals@7.0.1: 1089 | resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} 1090 | dependencies: 1091 | acorn: 8.11.3 1092 | acorn-walk: 8.3.2 1093 | dev: true 1094 | 1095 | /acorn-walk@8.3.2: 1096 | resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} 1097 | engines: {node: '>=0.4.0'} 1098 | dev: true 1099 | 1100 | /acorn@8.11.3: 1101 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 1102 | engines: {node: '>=0.4.0'} 1103 | hasBin: true 1104 | dev: true 1105 | 1106 | /agent-base@6.0.2: 1107 | resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} 1108 | engines: {node: '>= 6.0.0'} 1109 | dependencies: 1110 | debug: 4.3.4 1111 | transitivePeerDependencies: 1112 | - supports-color 1113 | dev: true 1114 | 1115 | /ansi-escapes@4.3.2: 1116 | resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} 1117 | engines: {node: '>=8'} 1118 | dependencies: 1119 | type-fest: 0.21.3 1120 | dev: true 1121 | 1122 | /ansi-regex@5.0.1: 1123 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 1124 | engines: {node: '>=8'} 1125 | dev: true 1126 | 1127 | /ansi-sequence-parser@1.1.1: 1128 | resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} 1129 | dev: true 1130 | 1131 | /ansi-styles@3.2.1: 1132 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 1133 | engines: {node: '>=4'} 1134 | dependencies: 1135 | color-convert: 1.9.3 1136 | dev: true 1137 | 1138 | /ansi-styles@4.3.0: 1139 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 1140 | engines: {node: '>=8'} 1141 | dependencies: 1142 | color-convert: 2.0.1 1143 | dev: true 1144 | 1145 | /ansi-styles@5.2.0: 1146 | resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} 1147 | engines: {node: '>=10'} 1148 | dev: true 1149 | 1150 | /anymatch@3.1.3: 1151 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 1152 | engines: {node: '>= 8'} 1153 | dependencies: 1154 | normalize-path: 3.0.0 1155 | picomatch: 2.3.1 1156 | dev: true 1157 | 1158 | /argparse@1.0.10: 1159 | resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} 1160 | dependencies: 1161 | sprintf-js: 1.0.3 1162 | dev: true 1163 | 1164 | /aria-query@5.3.0: 1165 | resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} 1166 | dependencies: 1167 | dequal: 2.0.3 1168 | dev: true 1169 | 1170 | /asynckit@0.4.0: 1171 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 1172 | dev: true 1173 | 1174 | /babel-jest@29.7.0(@babel/core@7.24.5): 1175 | resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} 1176 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1177 | peerDependencies: 1178 | '@babel/core': ^7.8.0 1179 | dependencies: 1180 | '@babel/core': 7.24.5 1181 | '@jest/transform': 29.7.0 1182 | '@types/babel__core': 7.20.5 1183 | babel-plugin-istanbul: 6.1.1 1184 | babel-preset-jest: 29.6.3(@babel/core@7.24.5) 1185 | chalk: 4.1.2 1186 | graceful-fs: 4.2.11 1187 | slash: 3.0.0 1188 | transitivePeerDependencies: 1189 | - supports-color 1190 | dev: true 1191 | 1192 | /babel-plugin-istanbul@6.1.1: 1193 | resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} 1194 | engines: {node: '>=8'} 1195 | dependencies: 1196 | '@babel/helper-plugin-utils': 7.24.5 1197 | '@istanbuljs/load-nyc-config': 1.1.0 1198 | '@istanbuljs/schema': 0.1.3 1199 | istanbul-lib-instrument: 5.2.1 1200 | test-exclude: 6.0.0 1201 | transitivePeerDependencies: 1202 | - supports-color 1203 | dev: true 1204 | 1205 | /babel-plugin-jest-hoist@29.6.3: 1206 | resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} 1207 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1208 | dependencies: 1209 | '@babel/template': 7.24.0 1210 | '@babel/types': 7.24.5 1211 | '@types/babel__core': 7.20.5 1212 | '@types/babel__traverse': 7.20.5 1213 | dev: true 1214 | 1215 | /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.5): 1216 | resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} 1217 | peerDependencies: 1218 | '@babel/core': ^7.0.0 1219 | dependencies: 1220 | '@babel/core': 7.24.5 1221 | '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) 1222 | '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.5) 1223 | '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) 1224 | '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) 1225 | '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) 1226 | '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) 1227 | '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) 1228 | '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) 1229 | '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) 1230 | '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) 1231 | '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) 1232 | '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) 1233 | dev: true 1234 | 1235 | /babel-preset-jest@29.6.3(@babel/core@7.24.5): 1236 | resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} 1237 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1238 | peerDependencies: 1239 | '@babel/core': ^7.0.0 1240 | dependencies: 1241 | '@babel/core': 7.24.5 1242 | babel-plugin-jest-hoist: 29.6.3 1243 | babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.5) 1244 | dev: true 1245 | 1246 | /balanced-match@1.0.2: 1247 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 1248 | dev: true 1249 | 1250 | /brace-expansion@1.1.11: 1251 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 1252 | dependencies: 1253 | balanced-match: 1.0.2 1254 | concat-map: 0.0.1 1255 | dev: true 1256 | 1257 | /brace-expansion@2.0.1: 1258 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 1259 | dependencies: 1260 | balanced-match: 1.0.2 1261 | dev: true 1262 | 1263 | /braces@3.0.2: 1264 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 1265 | engines: {node: '>=8'} 1266 | dependencies: 1267 | fill-range: 7.0.1 1268 | dev: true 1269 | 1270 | /browserslist@4.23.0: 1271 | resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} 1272 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 1273 | hasBin: true 1274 | dependencies: 1275 | caniuse-lite: 1.0.30001620 1276 | electron-to-chromium: 1.4.774 1277 | node-releases: 2.0.14 1278 | update-browserslist-db: 1.0.16(browserslist@4.23.0) 1279 | dev: true 1280 | 1281 | /bs-logger@0.2.6: 1282 | resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} 1283 | engines: {node: '>= 6'} 1284 | dependencies: 1285 | fast-json-stable-stringify: 2.1.0 1286 | dev: true 1287 | 1288 | /bser@2.1.1: 1289 | resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} 1290 | dependencies: 1291 | node-int64: 0.4.0 1292 | dev: true 1293 | 1294 | /buffer-from@1.1.2: 1295 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 1296 | dev: true 1297 | 1298 | /callsites@3.1.0: 1299 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 1300 | engines: {node: '>=6'} 1301 | dev: true 1302 | 1303 | /camelcase@5.3.1: 1304 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 1305 | engines: {node: '>=6'} 1306 | dev: true 1307 | 1308 | /camelcase@6.3.0: 1309 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 1310 | engines: {node: '>=10'} 1311 | dev: true 1312 | 1313 | /caniuse-lite@1.0.30001620: 1314 | resolution: {integrity: sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==} 1315 | dev: true 1316 | 1317 | /chalk@2.4.2: 1318 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 1319 | engines: {node: '>=4'} 1320 | dependencies: 1321 | ansi-styles: 3.2.1 1322 | escape-string-regexp: 1.0.5 1323 | supports-color: 5.5.0 1324 | dev: true 1325 | 1326 | /chalk@3.0.0: 1327 | resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} 1328 | engines: {node: '>=8'} 1329 | dependencies: 1330 | ansi-styles: 4.3.0 1331 | supports-color: 7.2.0 1332 | dev: true 1333 | 1334 | /chalk@4.1.2: 1335 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 1336 | engines: {node: '>=10'} 1337 | dependencies: 1338 | ansi-styles: 4.3.0 1339 | supports-color: 7.2.0 1340 | dev: true 1341 | 1342 | /char-regex@1.0.2: 1343 | resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} 1344 | engines: {node: '>=10'} 1345 | dev: true 1346 | 1347 | /ci-info@3.9.0: 1348 | resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} 1349 | engines: {node: '>=8'} 1350 | dev: true 1351 | 1352 | /cjs-module-lexer@1.3.1: 1353 | resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} 1354 | dev: true 1355 | 1356 | /cliui@8.0.1: 1357 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 1358 | engines: {node: '>=12'} 1359 | dependencies: 1360 | string-width: 4.2.3 1361 | strip-ansi: 6.0.1 1362 | wrap-ansi: 7.0.0 1363 | dev: true 1364 | 1365 | /co@4.6.0: 1366 | resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} 1367 | engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} 1368 | dev: true 1369 | 1370 | /collect-v8-coverage@1.0.2: 1371 | resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} 1372 | dev: true 1373 | 1374 | /color-convert@1.9.3: 1375 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 1376 | dependencies: 1377 | color-name: 1.1.3 1378 | dev: true 1379 | 1380 | /color-convert@2.0.1: 1381 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 1382 | engines: {node: '>=7.0.0'} 1383 | dependencies: 1384 | color-name: 1.1.4 1385 | dev: true 1386 | 1387 | /color-name@1.1.3: 1388 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 1389 | dev: true 1390 | 1391 | /color-name@1.1.4: 1392 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 1393 | dev: true 1394 | 1395 | /combined-stream@1.0.8: 1396 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 1397 | engines: {node: '>= 0.8'} 1398 | dependencies: 1399 | delayed-stream: 1.0.0 1400 | dev: true 1401 | 1402 | /concat-map@0.0.1: 1403 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 1404 | dev: true 1405 | 1406 | /convert-source-map@2.0.0: 1407 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} 1408 | dev: true 1409 | 1410 | /create-jest@29.7.0(@types/node@20.12.12): 1411 | resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} 1412 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1413 | hasBin: true 1414 | dependencies: 1415 | '@jest/types': 29.6.3 1416 | chalk: 4.1.2 1417 | exit: 0.1.2 1418 | graceful-fs: 4.2.11 1419 | jest-config: 29.7.0(@types/node@20.12.12) 1420 | jest-util: 29.7.0 1421 | prompts: 2.4.2 1422 | transitivePeerDependencies: 1423 | - '@types/node' 1424 | - babel-plugin-macros 1425 | - supports-color 1426 | - ts-node 1427 | dev: true 1428 | 1429 | /cross-spawn@7.0.3: 1430 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 1431 | engines: {node: '>= 8'} 1432 | dependencies: 1433 | path-key: 3.1.1 1434 | shebang-command: 2.0.0 1435 | which: 2.0.2 1436 | dev: true 1437 | 1438 | /css.escape@1.5.1: 1439 | resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} 1440 | dev: true 1441 | 1442 | /cssom@0.3.8: 1443 | resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} 1444 | dev: true 1445 | 1446 | /cssom@0.5.0: 1447 | resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} 1448 | dev: true 1449 | 1450 | /cssstyle@2.3.0: 1451 | resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} 1452 | engines: {node: '>=8'} 1453 | dependencies: 1454 | cssom: 0.3.8 1455 | dev: true 1456 | 1457 | /csstype@3.1.3: 1458 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 1459 | dev: true 1460 | 1461 | /data-urls@3.0.2: 1462 | resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} 1463 | engines: {node: '>=12'} 1464 | dependencies: 1465 | abab: 2.0.6 1466 | whatwg-mimetype: 3.0.0 1467 | whatwg-url: 11.0.0 1468 | dev: true 1469 | 1470 | /debug@4.3.4: 1471 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 1472 | engines: {node: '>=6.0'} 1473 | peerDependencies: 1474 | supports-color: '*' 1475 | peerDependenciesMeta: 1476 | supports-color: 1477 | optional: true 1478 | dependencies: 1479 | ms: 2.1.2 1480 | dev: true 1481 | 1482 | /decimal.js@10.4.3: 1483 | resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} 1484 | dev: true 1485 | 1486 | /dedent@1.5.3: 1487 | resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} 1488 | peerDependencies: 1489 | babel-plugin-macros: ^3.1.0 1490 | peerDependenciesMeta: 1491 | babel-plugin-macros: 1492 | optional: true 1493 | dev: true 1494 | 1495 | /deepmerge@4.3.1: 1496 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 1497 | engines: {node: '>=0.10.0'} 1498 | dev: true 1499 | 1500 | /delayed-stream@1.0.0: 1501 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 1502 | engines: {node: '>=0.4.0'} 1503 | dev: true 1504 | 1505 | /dequal@2.0.3: 1506 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 1507 | engines: {node: '>=6'} 1508 | dev: true 1509 | 1510 | /detect-newline@3.1.0: 1511 | resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} 1512 | engines: {node: '>=8'} 1513 | dev: true 1514 | 1515 | /diff-sequences@29.6.3: 1516 | resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} 1517 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1518 | dev: true 1519 | 1520 | /dom-accessibility-api@0.5.16: 1521 | resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} 1522 | dev: true 1523 | 1524 | /dom-accessibility-api@0.6.3: 1525 | resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==} 1526 | dev: true 1527 | 1528 | /domexception@4.0.0: 1529 | resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} 1530 | engines: {node: '>=12'} 1531 | deprecated: Use your platform's native DOMException instead 1532 | dependencies: 1533 | webidl-conversions: 7.0.0 1534 | dev: true 1535 | 1536 | /electron-to-chromium@1.4.774: 1537 | resolution: {integrity: sha512-132O1XCd7zcTkzS3FgkAzKmnBuNJjK8WjcTtNuoylj7MYbqw5eXehjQ5OK91g0zm7OTKIPeaAG4CPoRfD9M1Mg==} 1538 | dev: true 1539 | 1540 | /emittery@0.13.1: 1541 | resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} 1542 | engines: {node: '>=12'} 1543 | dev: true 1544 | 1545 | /emoji-regex@8.0.0: 1546 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 1547 | dev: true 1548 | 1549 | /entities@4.5.0: 1550 | resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 1551 | engines: {node: '>=0.12'} 1552 | dev: true 1553 | 1554 | /error-ex@1.3.2: 1555 | resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} 1556 | dependencies: 1557 | is-arrayish: 0.2.1 1558 | dev: true 1559 | 1560 | /esbuild@0.21.3: 1561 | resolution: {integrity: sha512-Kgq0/ZsAPzKrbOjCQcjoSmPoWhlcVnGAUo7jvaLHoxW1Drto0KGkR1xBNg2Cp43b9ImvxmPEJZ9xkfcnqPsfBw==} 1562 | engines: {node: '>=12'} 1563 | hasBin: true 1564 | requiresBuild: true 1565 | optionalDependencies: 1566 | '@esbuild/aix-ppc64': 0.21.3 1567 | '@esbuild/android-arm': 0.21.3 1568 | '@esbuild/android-arm64': 0.21.3 1569 | '@esbuild/android-x64': 0.21.3 1570 | '@esbuild/darwin-arm64': 0.21.3 1571 | '@esbuild/darwin-x64': 0.21.3 1572 | '@esbuild/freebsd-arm64': 0.21.3 1573 | '@esbuild/freebsd-x64': 0.21.3 1574 | '@esbuild/linux-arm': 0.21.3 1575 | '@esbuild/linux-arm64': 0.21.3 1576 | '@esbuild/linux-ia32': 0.21.3 1577 | '@esbuild/linux-loong64': 0.21.3 1578 | '@esbuild/linux-mips64el': 0.21.3 1579 | '@esbuild/linux-ppc64': 0.21.3 1580 | '@esbuild/linux-riscv64': 0.21.3 1581 | '@esbuild/linux-s390x': 0.21.3 1582 | '@esbuild/linux-x64': 0.21.3 1583 | '@esbuild/netbsd-x64': 0.21.3 1584 | '@esbuild/openbsd-x64': 0.21.3 1585 | '@esbuild/sunos-x64': 0.21.3 1586 | '@esbuild/win32-arm64': 0.21.3 1587 | '@esbuild/win32-ia32': 0.21.3 1588 | '@esbuild/win32-x64': 0.21.3 1589 | dev: true 1590 | 1591 | /escalade@3.1.2: 1592 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 1593 | engines: {node: '>=6'} 1594 | dev: true 1595 | 1596 | /escape-string-regexp@1.0.5: 1597 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 1598 | engines: {node: '>=0.8.0'} 1599 | dev: true 1600 | 1601 | /escape-string-regexp@2.0.0: 1602 | resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} 1603 | engines: {node: '>=8'} 1604 | dev: true 1605 | 1606 | /escodegen@2.1.0: 1607 | resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} 1608 | engines: {node: '>=6.0'} 1609 | hasBin: true 1610 | dependencies: 1611 | esprima: 4.0.1 1612 | estraverse: 5.3.0 1613 | esutils: 2.0.3 1614 | optionalDependencies: 1615 | source-map: 0.6.1 1616 | dev: true 1617 | 1618 | /esprima@4.0.1: 1619 | resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} 1620 | engines: {node: '>=4'} 1621 | hasBin: true 1622 | dev: true 1623 | 1624 | /estraverse@5.3.0: 1625 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1626 | engines: {node: '>=4.0'} 1627 | dev: true 1628 | 1629 | /esutils@2.0.3: 1630 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1631 | engines: {node: '>=0.10.0'} 1632 | dev: true 1633 | 1634 | /execa@5.1.1: 1635 | resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} 1636 | engines: {node: '>=10'} 1637 | dependencies: 1638 | cross-spawn: 7.0.3 1639 | get-stream: 6.0.1 1640 | human-signals: 2.1.0 1641 | is-stream: 2.0.1 1642 | merge-stream: 2.0.0 1643 | npm-run-path: 4.0.1 1644 | onetime: 5.1.2 1645 | signal-exit: 3.0.7 1646 | strip-final-newline: 2.0.0 1647 | dev: true 1648 | 1649 | /exit@0.1.2: 1650 | resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} 1651 | engines: {node: '>= 0.8.0'} 1652 | dev: true 1653 | 1654 | /expect@29.7.0: 1655 | resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} 1656 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1657 | dependencies: 1658 | '@jest/expect-utils': 29.7.0 1659 | jest-get-type: 29.6.3 1660 | jest-matcher-utils: 29.7.0 1661 | jest-message-util: 29.7.0 1662 | jest-util: 29.7.0 1663 | dev: true 1664 | 1665 | /fast-json-stable-stringify@2.1.0: 1666 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1667 | dev: true 1668 | 1669 | /fb-watchman@2.0.2: 1670 | resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} 1671 | dependencies: 1672 | bser: 2.1.1 1673 | dev: true 1674 | 1675 | /fill-range@7.0.1: 1676 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1677 | engines: {node: '>=8'} 1678 | dependencies: 1679 | to-regex-range: 5.0.1 1680 | dev: true 1681 | 1682 | /find-up@4.1.0: 1683 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 1684 | engines: {node: '>=8'} 1685 | dependencies: 1686 | locate-path: 5.0.0 1687 | path-exists: 4.0.0 1688 | dev: true 1689 | 1690 | /form-data@4.0.0: 1691 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 1692 | engines: {node: '>= 6'} 1693 | dependencies: 1694 | asynckit: 0.4.0 1695 | combined-stream: 1.0.8 1696 | mime-types: 2.1.35 1697 | dev: true 1698 | 1699 | /fs.realpath@1.0.0: 1700 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1701 | dev: true 1702 | 1703 | /fsevents@2.3.2: 1704 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 1705 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1706 | os: [darwin] 1707 | requiresBuild: true 1708 | dev: true 1709 | optional: true 1710 | 1711 | /fsevents@2.3.3: 1712 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1713 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1714 | os: [darwin] 1715 | requiresBuild: true 1716 | dev: true 1717 | optional: true 1718 | 1719 | /function-bind@1.1.2: 1720 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1721 | dev: true 1722 | 1723 | /gensync@1.0.0-beta.2: 1724 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} 1725 | engines: {node: '>=6.9.0'} 1726 | dev: true 1727 | 1728 | /get-caller-file@2.0.5: 1729 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 1730 | engines: {node: 6.* || 8.* || >= 10.*} 1731 | dev: true 1732 | 1733 | /get-package-type@0.1.0: 1734 | resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} 1735 | engines: {node: '>=8.0.0'} 1736 | dev: true 1737 | 1738 | /get-stream@6.0.1: 1739 | resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} 1740 | engines: {node: '>=10'} 1741 | dev: true 1742 | 1743 | /glob@7.2.3: 1744 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1745 | dependencies: 1746 | fs.realpath: 1.0.0 1747 | inflight: 1.0.6 1748 | inherits: 2.0.4 1749 | minimatch: 3.1.2 1750 | once: 1.4.0 1751 | path-is-absolute: 1.0.1 1752 | dev: true 1753 | 1754 | /globals@11.12.0: 1755 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} 1756 | engines: {node: '>=4'} 1757 | dev: true 1758 | 1759 | /graceful-fs@4.2.11: 1760 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1761 | dev: true 1762 | 1763 | /has-flag@3.0.0: 1764 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 1765 | engines: {node: '>=4'} 1766 | dev: true 1767 | 1768 | /has-flag@4.0.0: 1769 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1770 | engines: {node: '>=8'} 1771 | dev: true 1772 | 1773 | /hasown@2.0.2: 1774 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 1775 | engines: {node: '>= 0.4'} 1776 | dependencies: 1777 | function-bind: 1.1.2 1778 | dev: true 1779 | 1780 | /html-encoding-sniffer@3.0.0: 1781 | resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} 1782 | engines: {node: '>=12'} 1783 | dependencies: 1784 | whatwg-encoding: 2.0.0 1785 | dev: true 1786 | 1787 | /html-escaper@2.0.2: 1788 | resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} 1789 | dev: true 1790 | 1791 | /http-proxy-agent@5.0.0: 1792 | resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} 1793 | engines: {node: '>= 6'} 1794 | dependencies: 1795 | '@tootallnate/once': 2.0.0 1796 | agent-base: 6.0.2 1797 | debug: 4.3.4 1798 | transitivePeerDependencies: 1799 | - supports-color 1800 | dev: true 1801 | 1802 | /https-proxy-agent@5.0.1: 1803 | resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} 1804 | engines: {node: '>= 6'} 1805 | dependencies: 1806 | agent-base: 6.0.2 1807 | debug: 4.3.4 1808 | transitivePeerDependencies: 1809 | - supports-color 1810 | dev: true 1811 | 1812 | /human-signals@2.1.0: 1813 | resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} 1814 | engines: {node: '>=10.17.0'} 1815 | dev: true 1816 | 1817 | /husky@9.0.11: 1818 | resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} 1819 | engines: {node: '>=18'} 1820 | hasBin: true 1821 | dev: true 1822 | 1823 | /iconv-lite@0.6.3: 1824 | resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} 1825 | engines: {node: '>=0.10.0'} 1826 | dependencies: 1827 | safer-buffer: 2.1.2 1828 | dev: true 1829 | 1830 | /import-local@3.1.0: 1831 | resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} 1832 | engines: {node: '>=8'} 1833 | hasBin: true 1834 | dependencies: 1835 | pkg-dir: 4.2.0 1836 | resolve-cwd: 3.0.0 1837 | dev: true 1838 | 1839 | /imurmurhash@0.1.4: 1840 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1841 | engines: {node: '>=0.8.19'} 1842 | dev: true 1843 | 1844 | /indent-string@4.0.0: 1845 | resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} 1846 | engines: {node: '>=8'} 1847 | dev: true 1848 | 1849 | /inflight@1.0.6: 1850 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1851 | dependencies: 1852 | once: 1.4.0 1853 | wrappy: 1.0.2 1854 | dev: true 1855 | 1856 | /inherits@2.0.4: 1857 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1858 | dev: true 1859 | 1860 | /is-arrayish@0.2.1: 1861 | resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} 1862 | dev: true 1863 | 1864 | /is-core-module@2.13.1: 1865 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1866 | dependencies: 1867 | hasown: 2.0.2 1868 | dev: true 1869 | 1870 | /is-fullwidth-code-point@3.0.0: 1871 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1872 | engines: {node: '>=8'} 1873 | dev: true 1874 | 1875 | /is-generator-fn@2.1.0: 1876 | resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} 1877 | engines: {node: '>=6'} 1878 | dev: true 1879 | 1880 | /is-number@7.0.0: 1881 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1882 | engines: {node: '>=0.12.0'} 1883 | dev: true 1884 | 1885 | /is-potential-custom-element-name@1.0.1: 1886 | resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} 1887 | dev: true 1888 | 1889 | /is-stream@2.0.1: 1890 | resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} 1891 | engines: {node: '>=8'} 1892 | dev: true 1893 | 1894 | /isexe@2.0.0: 1895 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1896 | dev: true 1897 | 1898 | /istanbul-lib-coverage@3.2.2: 1899 | resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} 1900 | engines: {node: '>=8'} 1901 | dev: true 1902 | 1903 | /istanbul-lib-instrument@5.2.1: 1904 | resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} 1905 | engines: {node: '>=8'} 1906 | dependencies: 1907 | '@babel/core': 7.24.5 1908 | '@babel/parser': 7.24.5 1909 | '@istanbuljs/schema': 0.1.3 1910 | istanbul-lib-coverage: 3.2.2 1911 | semver: 6.3.1 1912 | transitivePeerDependencies: 1913 | - supports-color 1914 | dev: true 1915 | 1916 | /istanbul-lib-instrument@6.0.2: 1917 | resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} 1918 | engines: {node: '>=10'} 1919 | dependencies: 1920 | '@babel/core': 7.24.5 1921 | '@babel/parser': 7.24.5 1922 | '@istanbuljs/schema': 0.1.3 1923 | istanbul-lib-coverage: 3.2.2 1924 | semver: 7.6.2 1925 | transitivePeerDependencies: 1926 | - supports-color 1927 | dev: true 1928 | 1929 | /istanbul-lib-report@3.0.1: 1930 | resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} 1931 | engines: {node: '>=10'} 1932 | dependencies: 1933 | istanbul-lib-coverage: 3.2.2 1934 | make-dir: 4.0.0 1935 | supports-color: 7.2.0 1936 | dev: true 1937 | 1938 | /istanbul-lib-source-maps@4.0.1: 1939 | resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} 1940 | engines: {node: '>=10'} 1941 | dependencies: 1942 | debug: 4.3.4 1943 | istanbul-lib-coverage: 3.2.2 1944 | source-map: 0.6.1 1945 | transitivePeerDependencies: 1946 | - supports-color 1947 | dev: true 1948 | 1949 | /istanbul-reports@3.1.7: 1950 | resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} 1951 | engines: {node: '>=8'} 1952 | dependencies: 1953 | html-escaper: 2.0.2 1954 | istanbul-lib-report: 3.0.1 1955 | dev: true 1956 | 1957 | /jest-changed-files@29.7.0: 1958 | resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} 1959 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1960 | dependencies: 1961 | execa: 5.1.1 1962 | jest-util: 29.7.0 1963 | p-limit: 3.1.0 1964 | dev: true 1965 | 1966 | /jest-circus@29.7.0: 1967 | resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} 1968 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1969 | dependencies: 1970 | '@jest/environment': 29.7.0 1971 | '@jest/expect': 29.7.0 1972 | '@jest/test-result': 29.7.0 1973 | '@jest/types': 29.6.3 1974 | '@types/node': 20.12.12 1975 | chalk: 4.1.2 1976 | co: 4.6.0 1977 | dedent: 1.5.3 1978 | is-generator-fn: 2.1.0 1979 | jest-each: 29.7.0 1980 | jest-matcher-utils: 29.7.0 1981 | jest-message-util: 29.7.0 1982 | jest-runtime: 29.7.0 1983 | jest-snapshot: 29.7.0 1984 | jest-util: 29.7.0 1985 | p-limit: 3.1.0 1986 | pretty-format: 29.7.0 1987 | pure-rand: 6.1.0 1988 | slash: 3.0.0 1989 | stack-utils: 2.0.6 1990 | transitivePeerDependencies: 1991 | - babel-plugin-macros 1992 | - supports-color 1993 | dev: true 1994 | 1995 | /jest-cli@29.7.0(@types/node@20.12.12): 1996 | resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} 1997 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 1998 | hasBin: true 1999 | peerDependencies: 2000 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 2001 | peerDependenciesMeta: 2002 | node-notifier: 2003 | optional: true 2004 | dependencies: 2005 | '@jest/core': 29.7.0 2006 | '@jest/test-result': 29.7.0 2007 | '@jest/types': 29.6.3 2008 | chalk: 4.1.2 2009 | create-jest: 29.7.0(@types/node@20.12.12) 2010 | exit: 0.1.2 2011 | import-local: 3.1.0 2012 | jest-config: 29.7.0(@types/node@20.12.12) 2013 | jest-util: 29.7.0 2014 | jest-validate: 29.7.0 2015 | yargs: 17.7.2 2016 | transitivePeerDependencies: 2017 | - '@types/node' 2018 | - babel-plugin-macros 2019 | - supports-color 2020 | - ts-node 2021 | dev: true 2022 | 2023 | /jest-config@29.7.0(@types/node@20.12.12): 2024 | resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} 2025 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2026 | peerDependencies: 2027 | '@types/node': '*' 2028 | ts-node: '>=9.0.0' 2029 | peerDependenciesMeta: 2030 | '@types/node': 2031 | optional: true 2032 | ts-node: 2033 | optional: true 2034 | dependencies: 2035 | '@babel/core': 7.24.5 2036 | '@jest/test-sequencer': 29.7.0 2037 | '@jest/types': 29.6.3 2038 | '@types/node': 20.12.12 2039 | babel-jest: 29.7.0(@babel/core@7.24.5) 2040 | chalk: 4.1.2 2041 | ci-info: 3.9.0 2042 | deepmerge: 4.3.1 2043 | glob: 7.2.3 2044 | graceful-fs: 4.2.11 2045 | jest-circus: 29.7.0 2046 | jest-environment-node: 29.7.0 2047 | jest-get-type: 29.6.3 2048 | jest-regex-util: 29.6.3 2049 | jest-resolve: 29.7.0 2050 | jest-runner: 29.7.0 2051 | jest-util: 29.7.0 2052 | jest-validate: 29.7.0 2053 | micromatch: 4.0.5 2054 | parse-json: 5.2.0 2055 | pretty-format: 29.7.0 2056 | slash: 3.0.0 2057 | strip-json-comments: 3.1.1 2058 | transitivePeerDependencies: 2059 | - babel-plugin-macros 2060 | - supports-color 2061 | dev: true 2062 | 2063 | /jest-diff@29.7.0: 2064 | resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} 2065 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2066 | dependencies: 2067 | chalk: 4.1.2 2068 | diff-sequences: 29.6.3 2069 | jest-get-type: 29.6.3 2070 | pretty-format: 29.7.0 2071 | dev: true 2072 | 2073 | /jest-docblock@29.7.0: 2074 | resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} 2075 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2076 | dependencies: 2077 | detect-newline: 3.1.0 2078 | dev: true 2079 | 2080 | /jest-each@29.7.0: 2081 | resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} 2082 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2083 | dependencies: 2084 | '@jest/types': 29.6.3 2085 | chalk: 4.1.2 2086 | jest-get-type: 29.6.3 2087 | jest-util: 29.7.0 2088 | pretty-format: 29.7.0 2089 | dev: true 2090 | 2091 | /jest-environment-jsdom@29.7.0: 2092 | resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} 2093 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2094 | peerDependencies: 2095 | canvas: ^2.5.0 2096 | peerDependenciesMeta: 2097 | canvas: 2098 | optional: true 2099 | dependencies: 2100 | '@jest/environment': 29.7.0 2101 | '@jest/fake-timers': 29.7.0 2102 | '@jest/types': 29.6.3 2103 | '@types/jsdom': 20.0.1 2104 | '@types/node': 20.12.12 2105 | jest-mock: 29.7.0 2106 | jest-util: 29.7.0 2107 | jsdom: 20.0.3 2108 | transitivePeerDependencies: 2109 | - bufferutil 2110 | - supports-color 2111 | - utf-8-validate 2112 | dev: true 2113 | 2114 | /jest-environment-node@29.7.0: 2115 | resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} 2116 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2117 | dependencies: 2118 | '@jest/environment': 29.7.0 2119 | '@jest/fake-timers': 29.7.0 2120 | '@jest/types': 29.6.3 2121 | '@types/node': 20.12.12 2122 | jest-mock: 29.7.0 2123 | jest-util: 29.7.0 2124 | dev: true 2125 | 2126 | /jest-get-type@29.6.3: 2127 | resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} 2128 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2129 | dev: true 2130 | 2131 | /jest-haste-map@29.7.0: 2132 | resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} 2133 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2134 | dependencies: 2135 | '@jest/types': 29.6.3 2136 | '@types/graceful-fs': 4.1.9 2137 | '@types/node': 20.12.12 2138 | anymatch: 3.1.3 2139 | fb-watchman: 2.0.2 2140 | graceful-fs: 4.2.11 2141 | jest-regex-util: 29.6.3 2142 | jest-util: 29.7.0 2143 | jest-worker: 29.7.0 2144 | micromatch: 4.0.5 2145 | walker: 1.0.8 2146 | optionalDependencies: 2147 | fsevents: 2.3.3 2148 | dev: true 2149 | 2150 | /jest-leak-detector@29.7.0: 2151 | resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} 2152 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2153 | dependencies: 2154 | jest-get-type: 29.6.3 2155 | pretty-format: 29.7.0 2156 | dev: true 2157 | 2158 | /jest-matcher-utils@29.7.0: 2159 | resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} 2160 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2161 | dependencies: 2162 | chalk: 4.1.2 2163 | jest-diff: 29.7.0 2164 | jest-get-type: 29.6.3 2165 | pretty-format: 29.7.0 2166 | dev: true 2167 | 2168 | /jest-message-util@29.7.0: 2169 | resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} 2170 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2171 | dependencies: 2172 | '@babel/code-frame': 7.24.2 2173 | '@jest/types': 29.6.3 2174 | '@types/stack-utils': 2.0.3 2175 | chalk: 4.1.2 2176 | graceful-fs: 4.2.11 2177 | micromatch: 4.0.5 2178 | pretty-format: 29.7.0 2179 | slash: 3.0.0 2180 | stack-utils: 2.0.6 2181 | dev: true 2182 | 2183 | /jest-mock@29.7.0: 2184 | resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} 2185 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2186 | dependencies: 2187 | '@jest/types': 29.6.3 2188 | '@types/node': 20.12.12 2189 | jest-util: 29.7.0 2190 | dev: true 2191 | 2192 | /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): 2193 | resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} 2194 | engines: {node: '>=6'} 2195 | peerDependencies: 2196 | jest-resolve: '*' 2197 | peerDependenciesMeta: 2198 | jest-resolve: 2199 | optional: true 2200 | dependencies: 2201 | jest-resolve: 29.7.0 2202 | dev: true 2203 | 2204 | /jest-regex-util@29.6.3: 2205 | resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} 2206 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2207 | dev: true 2208 | 2209 | /jest-resolve-dependencies@29.7.0: 2210 | resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} 2211 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2212 | dependencies: 2213 | jest-regex-util: 29.6.3 2214 | jest-snapshot: 29.7.0 2215 | transitivePeerDependencies: 2216 | - supports-color 2217 | dev: true 2218 | 2219 | /jest-resolve@29.7.0: 2220 | resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} 2221 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2222 | dependencies: 2223 | chalk: 4.1.2 2224 | graceful-fs: 4.2.11 2225 | jest-haste-map: 29.7.0 2226 | jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) 2227 | jest-util: 29.7.0 2228 | jest-validate: 29.7.0 2229 | resolve: 1.22.8 2230 | resolve.exports: 2.0.2 2231 | slash: 3.0.0 2232 | dev: true 2233 | 2234 | /jest-runner@29.7.0: 2235 | resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} 2236 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2237 | dependencies: 2238 | '@jest/console': 29.7.0 2239 | '@jest/environment': 29.7.0 2240 | '@jest/test-result': 29.7.0 2241 | '@jest/transform': 29.7.0 2242 | '@jest/types': 29.6.3 2243 | '@types/node': 20.12.12 2244 | chalk: 4.1.2 2245 | emittery: 0.13.1 2246 | graceful-fs: 4.2.11 2247 | jest-docblock: 29.7.0 2248 | jest-environment-node: 29.7.0 2249 | jest-haste-map: 29.7.0 2250 | jest-leak-detector: 29.7.0 2251 | jest-message-util: 29.7.0 2252 | jest-resolve: 29.7.0 2253 | jest-runtime: 29.7.0 2254 | jest-util: 29.7.0 2255 | jest-watcher: 29.7.0 2256 | jest-worker: 29.7.0 2257 | p-limit: 3.1.0 2258 | source-map-support: 0.5.13 2259 | transitivePeerDependencies: 2260 | - supports-color 2261 | dev: true 2262 | 2263 | /jest-runtime@29.7.0: 2264 | resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} 2265 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2266 | dependencies: 2267 | '@jest/environment': 29.7.0 2268 | '@jest/fake-timers': 29.7.0 2269 | '@jest/globals': 29.7.0 2270 | '@jest/source-map': 29.6.3 2271 | '@jest/test-result': 29.7.0 2272 | '@jest/transform': 29.7.0 2273 | '@jest/types': 29.6.3 2274 | '@types/node': 20.12.12 2275 | chalk: 4.1.2 2276 | cjs-module-lexer: 1.3.1 2277 | collect-v8-coverage: 1.0.2 2278 | glob: 7.2.3 2279 | graceful-fs: 4.2.11 2280 | jest-haste-map: 29.7.0 2281 | jest-message-util: 29.7.0 2282 | jest-mock: 29.7.0 2283 | jest-regex-util: 29.6.3 2284 | jest-resolve: 29.7.0 2285 | jest-snapshot: 29.7.0 2286 | jest-util: 29.7.0 2287 | slash: 3.0.0 2288 | strip-bom: 4.0.0 2289 | transitivePeerDependencies: 2290 | - supports-color 2291 | dev: true 2292 | 2293 | /jest-snapshot@29.7.0: 2294 | resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} 2295 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2296 | dependencies: 2297 | '@babel/core': 7.24.5 2298 | '@babel/generator': 7.24.5 2299 | '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) 2300 | '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) 2301 | '@babel/types': 7.24.5 2302 | '@jest/expect-utils': 29.7.0 2303 | '@jest/transform': 29.7.0 2304 | '@jest/types': 29.6.3 2305 | babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.5) 2306 | chalk: 4.1.2 2307 | expect: 29.7.0 2308 | graceful-fs: 4.2.11 2309 | jest-diff: 29.7.0 2310 | jest-get-type: 29.6.3 2311 | jest-matcher-utils: 29.7.0 2312 | jest-message-util: 29.7.0 2313 | jest-util: 29.7.0 2314 | natural-compare: 1.4.0 2315 | pretty-format: 29.7.0 2316 | semver: 7.6.2 2317 | transitivePeerDependencies: 2318 | - supports-color 2319 | dev: true 2320 | 2321 | /jest-util@29.7.0: 2322 | resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} 2323 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2324 | dependencies: 2325 | '@jest/types': 29.6.3 2326 | '@types/node': 20.12.12 2327 | chalk: 4.1.2 2328 | ci-info: 3.9.0 2329 | graceful-fs: 4.2.11 2330 | picomatch: 2.3.1 2331 | dev: true 2332 | 2333 | /jest-validate@29.7.0: 2334 | resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} 2335 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2336 | dependencies: 2337 | '@jest/types': 29.6.3 2338 | camelcase: 6.3.0 2339 | chalk: 4.1.2 2340 | jest-get-type: 29.6.3 2341 | leven: 3.1.0 2342 | pretty-format: 29.7.0 2343 | dev: true 2344 | 2345 | /jest-watcher@29.7.0: 2346 | resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} 2347 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2348 | dependencies: 2349 | '@jest/test-result': 29.7.0 2350 | '@jest/types': 29.6.3 2351 | '@types/node': 20.12.12 2352 | ansi-escapes: 4.3.2 2353 | chalk: 4.1.2 2354 | emittery: 0.13.1 2355 | jest-util: 29.7.0 2356 | string-length: 4.0.2 2357 | dev: true 2358 | 2359 | /jest-worker@29.7.0: 2360 | resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} 2361 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2362 | dependencies: 2363 | '@types/node': 20.12.12 2364 | jest-util: 29.7.0 2365 | merge-stream: 2.0.0 2366 | supports-color: 8.1.1 2367 | dev: true 2368 | 2369 | /jest@29.7.0(@types/node@20.12.12): 2370 | resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} 2371 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2372 | hasBin: true 2373 | peerDependencies: 2374 | node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 2375 | peerDependenciesMeta: 2376 | node-notifier: 2377 | optional: true 2378 | dependencies: 2379 | '@jest/core': 29.7.0 2380 | '@jest/types': 29.6.3 2381 | import-local: 3.1.0 2382 | jest-cli: 29.7.0(@types/node@20.12.12) 2383 | transitivePeerDependencies: 2384 | - '@types/node' 2385 | - babel-plugin-macros 2386 | - supports-color 2387 | - ts-node 2388 | dev: true 2389 | 2390 | /js-tokens@4.0.0: 2391 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 2392 | 2393 | /js-yaml@3.14.1: 2394 | resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} 2395 | hasBin: true 2396 | dependencies: 2397 | argparse: 1.0.10 2398 | esprima: 4.0.1 2399 | dev: true 2400 | 2401 | /jsdom@20.0.3: 2402 | resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} 2403 | engines: {node: '>=14'} 2404 | peerDependencies: 2405 | canvas: ^2.5.0 2406 | peerDependenciesMeta: 2407 | canvas: 2408 | optional: true 2409 | dependencies: 2410 | abab: 2.0.6 2411 | acorn: 8.11.3 2412 | acorn-globals: 7.0.1 2413 | cssom: 0.5.0 2414 | cssstyle: 2.3.0 2415 | data-urls: 3.0.2 2416 | decimal.js: 10.4.3 2417 | domexception: 4.0.0 2418 | escodegen: 2.1.0 2419 | form-data: 4.0.0 2420 | html-encoding-sniffer: 3.0.0 2421 | http-proxy-agent: 5.0.0 2422 | https-proxy-agent: 5.0.1 2423 | is-potential-custom-element-name: 1.0.1 2424 | nwsapi: 2.2.10 2425 | parse5: 7.1.2 2426 | saxes: 6.0.0 2427 | symbol-tree: 3.2.4 2428 | tough-cookie: 4.1.4 2429 | w3c-xmlserializer: 4.0.0 2430 | webidl-conversions: 7.0.0 2431 | whatwg-encoding: 2.0.0 2432 | whatwg-mimetype: 3.0.0 2433 | whatwg-url: 11.0.0 2434 | ws: 8.17.0 2435 | xml-name-validator: 4.0.0 2436 | transitivePeerDependencies: 2437 | - bufferutil 2438 | - supports-color 2439 | - utf-8-validate 2440 | dev: true 2441 | 2442 | /jsesc@2.5.2: 2443 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} 2444 | engines: {node: '>=4'} 2445 | hasBin: true 2446 | dev: true 2447 | 2448 | /json-parse-even-better-errors@2.3.1: 2449 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 2450 | dev: true 2451 | 2452 | /json5@2.2.3: 2453 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} 2454 | engines: {node: '>=6'} 2455 | hasBin: true 2456 | dev: true 2457 | 2458 | /jsonc-parser@3.2.1: 2459 | resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} 2460 | dev: true 2461 | 2462 | /kleur@3.0.3: 2463 | resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} 2464 | engines: {node: '>=6'} 2465 | dev: true 2466 | 2467 | /leven@3.1.0: 2468 | resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} 2469 | engines: {node: '>=6'} 2470 | dev: true 2471 | 2472 | /lines-and-columns@1.2.4: 2473 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 2474 | dev: true 2475 | 2476 | /locate-path@5.0.0: 2477 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 2478 | engines: {node: '>=8'} 2479 | dependencies: 2480 | p-locate: 4.1.0 2481 | dev: true 2482 | 2483 | /lodash.memoize@4.1.2: 2484 | resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} 2485 | dev: true 2486 | 2487 | /lodash@4.17.21: 2488 | resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} 2489 | dev: true 2490 | 2491 | /loose-envify@1.4.0: 2492 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 2493 | hasBin: true 2494 | dependencies: 2495 | js-tokens: 4.0.0 2496 | 2497 | /lru-cache@5.1.1: 2498 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} 2499 | dependencies: 2500 | yallist: 3.1.1 2501 | dev: true 2502 | 2503 | /lunr@2.3.9: 2504 | resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} 2505 | dev: true 2506 | 2507 | /lz-string@1.5.0: 2508 | resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} 2509 | hasBin: true 2510 | dev: true 2511 | 2512 | /make-dir@4.0.0: 2513 | resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} 2514 | engines: {node: '>=10'} 2515 | dependencies: 2516 | semver: 7.6.2 2517 | dev: true 2518 | 2519 | /make-error@1.3.6: 2520 | resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} 2521 | dev: true 2522 | 2523 | /makeerror@1.0.12: 2524 | resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} 2525 | dependencies: 2526 | tmpl: 1.0.5 2527 | dev: true 2528 | 2529 | /marked@4.3.0: 2530 | resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} 2531 | engines: {node: '>= 12'} 2532 | hasBin: true 2533 | dev: true 2534 | 2535 | /merge-stream@2.0.0: 2536 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 2537 | dev: true 2538 | 2539 | /micromatch@4.0.5: 2540 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 2541 | engines: {node: '>=8.6'} 2542 | dependencies: 2543 | braces: 3.0.2 2544 | picomatch: 2.3.1 2545 | dev: true 2546 | 2547 | /mime-db@1.52.0: 2548 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 2549 | engines: {node: '>= 0.6'} 2550 | dev: true 2551 | 2552 | /mime-types@2.1.35: 2553 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 2554 | engines: {node: '>= 0.6'} 2555 | dependencies: 2556 | mime-db: 1.52.0 2557 | dev: true 2558 | 2559 | /mimic-fn@2.1.0: 2560 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 2561 | engines: {node: '>=6'} 2562 | dev: true 2563 | 2564 | /min-indent@1.0.1: 2565 | resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 2566 | engines: {node: '>=4'} 2567 | dev: true 2568 | 2569 | /minimatch@3.1.2: 2570 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 2571 | dependencies: 2572 | brace-expansion: 1.1.11 2573 | dev: true 2574 | 2575 | /minimatch@9.0.4: 2576 | resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} 2577 | engines: {node: '>=16 || 14 >=14.17'} 2578 | dependencies: 2579 | brace-expansion: 2.0.1 2580 | dev: true 2581 | 2582 | /ms@2.1.2: 2583 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 2584 | dev: true 2585 | 2586 | /natural-compare@1.4.0: 2587 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 2588 | dev: true 2589 | 2590 | /node-int64@0.4.0: 2591 | resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} 2592 | dev: true 2593 | 2594 | /node-releases@2.0.14: 2595 | resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} 2596 | dev: true 2597 | 2598 | /normalize-path@3.0.0: 2599 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 2600 | engines: {node: '>=0.10.0'} 2601 | dev: true 2602 | 2603 | /npm-run-path@4.0.1: 2604 | resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} 2605 | engines: {node: '>=8'} 2606 | dependencies: 2607 | path-key: 3.1.1 2608 | dev: true 2609 | 2610 | /nwsapi@2.2.10: 2611 | resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} 2612 | dev: true 2613 | 2614 | /once@1.4.0: 2615 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2616 | dependencies: 2617 | wrappy: 1.0.2 2618 | dev: true 2619 | 2620 | /onetime@5.1.2: 2621 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 2622 | engines: {node: '>=6'} 2623 | dependencies: 2624 | mimic-fn: 2.1.0 2625 | dev: true 2626 | 2627 | /p-limit@2.3.0: 2628 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 2629 | engines: {node: '>=6'} 2630 | dependencies: 2631 | p-try: 2.2.0 2632 | dev: true 2633 | 2634 | /p-limit@3.1.0: 2635 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 2636 | engines: {node: '>=10'} 2637 | dependencies: 2638 | yocto-queue: 0.1.0 2639 | dev: true 2640 | 2641 | /p-locate@4.1.0: 2642 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 2643 | engines: {node: '>=8'} 2644 | dependencies: 2645 | p-limit: 2.3.0 2646 | dev: true 2647 | 2648 | /p-try@2.2.0: 2649 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 2650 | engines: {node: '>=6'} 2651 | dev: true 2652 | 2653 | /parse-json@5.2.0: 2654 | resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} 2655 | engines: {node: '>=8'} 2656 | dependencies: 2657 | '@babel/code-frame': 7.24.2 2658 | error-ex: 1.3.2 2659 | json-parse-even-better-errors: 2.3.1 2660 | lines-and-columns: 1.2.4 2661 | dev: true 2662 | 2663 | /parse5@7.1.2: 2664 | resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} 2665 | dependencies: 2666 | entities: 4.5.0 2667 | dev: true 2668 | 2669 | /path-exists@4.0.0: 2670 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2671 | engines: {node: '>=8'} 2672 | dev: true 2673 | 2674 | /path-is-absolute@1.0.1: 2675 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2676 | engines: {node: '>=0.10.0'} 2677 | dev: true 2678 | 2679 | /path-key@3.1.1: 2680 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2681 | engines: {node: '>=8'} 2682 | dev: true 2683 | 2684 | /path-parse@1.0.7: 2685 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2686 | dev: true 2687 | 2688 | /picocolors@1.0.1: 2689 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 2690 | dev: true 2691 | 2692 | /picomatch@2.3.1: 2693 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2694 | engines: {node: '>=8.6'} 2695 | dev: true 2696 | 2697 | /pirates@4.0.6: 2698 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 2699 | engines: {node: '>= 6'} 2700 | dev: true 2701 | 2702 | /pkg-dir@4.2.0: 2703 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 2704 | engines: {node: '>=8'} 2705 | dependencies: 2706 | find-up: 4.1.0 2707 | dev: true 2708 | 2709 | /playwright-core@1.44.0: 2710 | resolution: {integrity: sha512-ZTbkNpFfYcGWohvTTl+xewITm7EOuqIqex0c7dNZ+aXsbrLj0qI8XlGKfPpipjm0Wny/4Lt4CJsWJk1stVS5qQ==} 2711 | engines: {node: '>=16'} 2712 | hasBin: true 2713 | dev: true 2714 | 2715 | /playwright@1.44.0: 2716 | resolution: {integrity: sha512-F9b3GUCLQ3Nffrfb6dunPOkE5Mh68tR7zN32L4jCk4FjQamgesGay7/dAAe1WaMEGV04DkdJfcJzjoCKygUaRQ==} 2717 | engines: {node: '>=16'} 2718 | hasBin: true 2719 | dependencies: 2720 | playwright-core: 1.44.0 2721 | optionalDependencies: 2722 | fsevents: 2.3.2 2723 | dev: true 2724 | 2725 | /pretty-format@27.5.1: 2726 | resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} 2727 | engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} 2728 | dependencies: 2729 | ansi-regex: 5.0.1 2730 | ansi-styles: 5.2.0 2731 | react-is: 17.0.2 2732 | dev: true 2733 | 2734 | /pretty-format@29.7.0: 2735 | resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} 2736 | engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} 2737 | dependencies: 2738 | '@jest/schemas': 29.6.3 2739 | ansi-styles: 5.2.0 2740 | react-is: 18.3.1 2741 | dev: true 2742 | 2743 | /prompts@2.4.2: 2744 | resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} 2745 | engines: {node: '>= 6'} 2746 | dependencies: 2747 | kleur: 3.0.3 2748 | sisteransi: 1.0.5 2749 | dev: true 2750 | 2751 | /psl@1.9.0: 2752 | resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} 2753 | dev: true 2754 | 2755 | /punycode@2.3.1: 2756 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 2757 | engines: {node: '>=6'} 2758 | dev: true 2759 | 2760 | /pure-rand@6.1.0: 2761 | resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} 2762 | dev: true 2763 | 2764 | /querystringify@2.2.0: 2765 | resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} 2766 | dev: true 2767 | 2768 | /react-dom@18.3.1(react@18.3.1): 2769 | resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} 2770 | peerDependencies: 2771 | react: ^18.3.1 2772 | dependencies: 2773 | loose-envify: 1.4.0 2774 | react: 18.3.1 2775 | scheduler: 0.23.2 2776 | 2777 | /react-is@17.0.2: 2778 | resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} 2779 | dev: true 2780 | 2781 | /react-is@18.3.1: 2782 | resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} 2783 | dev: true 2784 | 2785 | /react@18.3.1: 2786 | resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} 2787 | engines: {node: '>=0.10.0'} 2788 | dependencies: 2789 | loose-envify: 1.4.0 2790 | 2791 | /redent@3.0.0: 2792 | resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} 2793 | engines: {node: '>=8'} 2794 | dependencies: 2795 | indent-string: 4.0.0 2796 | strip-indent: 3.0.0 2797 | dev: true 2798 | 2799 | /regenerator-runtime@0.14.1: 2800 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 2801 | dev: true 2802 | 2803 | /require-directory@2.1.1: 2804 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 2805 | engines: {node: '>=0.10.0'} 2806 | dev: true 2807 | 2808 | /requires-port@1.0.0: 2809 | resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} 2810 | dev: true 2811 | 2812 | /resolve-cwd@3.0.0: 2813 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 2814 | engines: {node: '>=8'} 2815 | dependencies: 2816 | resolve-from: 5.0.0 2817 | dev: true 2818 | 2819 | /resolve-from@5.0.0: 2820 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 2821 | engines: {node: '>=8'} 2822 | dev: true 2823 | 2824 | /resolve.exports@2.0.2: 2825 | resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} 2826 | engines: {node: '>=10'} 2827 | dev: true 2828 | 2829 | /resolve@1.22.8: 2830 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 2831 | hasBin: true 2832 | dependencies: 2833 | is-core-module: 2.13.1 2834 | path-parse: 1.0.7 2835 | supports-preserve-symlinks-flag: 1.0.0 2836 | dev: true 2837 | 2838 | /safer-buffer@2.1.2: 2839 | resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} 2840 | dev: true 2841 | 2842 | /saxes@6.0.0: 2843 | resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} 2844 | engines: {node: '>=v12.22.7'} 2845 | dependencies: 2846 | xmlchars: 2.2.0 2847 | dev: true 2848 | 2849 | /scheduler@0.23.2: 2850 | resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} 2851 | dependencies: 2852 | loose-envify: 1.4.0 2853 | 2854 | /semver@6.3.1: 2855 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 2856 | hasBin: true 2857 | dev: true 2858 | 2859 | /semver@7.6.2: 2860 | resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} 2861 | engines: {node: '>=10'} 2862 | hasBin: true 2863 | dev: true 2864 | 2865 | /shebang-command@2.0.0: 2866 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2867 | engines: {node: '>=8'} 2868 | dependencies: 2869 | shebang-regex: 3.0.0 2870 | dev: true 2871 | 2872 | /shebang-regex@3.0.0: 2873 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2874 | engines: {node: '>=8'} 2875 | dev: true 2876 | 2877 | /shiki@0.14.7: 2878 | resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} 2879 | dependencies: 2880 | ansi-sequence-parser: 1.1.1 2881 | jsonc-parser: 3.2.1 2882 | vscode-oniguruma: 1.7.0 2883 | vscode-textmate: 8.0.0 2884 | dev: true 2885 | 2886 | /signal-exit@3.0.7: 2887 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 2888 | dev: true 2889 | 2890 | /sisteransi@1.0.5: 2891 | resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} 2892 | dev: true 2893 | 2894 | /slash@3.0.0: 2895 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2896 | engines: {node: '>=8'} 2897 | dev: true 2898 | 2899 | /source-map-support@0.5.13: 2900 | resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} 2901 | dependencies: 2902 | buffer-from: 1.1.2 2903 | source-map: 0.6.1 2904 | dev: true 2905 | 2906 | /source-map@0.6.1: 2907 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 2908 | engines: {node: '>=0.10.0'} 2909 | dev: true 2910 | 2911 | /sprintf-js@1.0.3: 2912 | resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} 2913 | dev: true 2914 | 2915 | /stack-utils@2.0.6: 2916 | resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} 2917 | engines: {node: '>=10'} 2918 | dependencies: 2919 | escape-string-regexp: 2.0.0 2920 | dev: true 2921 | 2922 | /string-length@4.0.2: 2923 | resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} 2924 | engines: {node: '>=10'} 2925 | dependencies: 2926 | char-regex: 1.0.2 2927 | strip-ansi: 6.0.1 2928 | dev: true 2929 | 2930 | /string-width@4.2.3: 2931 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2932 | engines: {node: '>=8'} 2933 | dependencies: 2934 | emoji-regex: 8.0.0 2935 | is-fullwidth-code-point: 3.0.0 2936 | strip-ansi: 6.0.1 2937 | dev: true 2938 | 2939 | /strip-ansi@6.0.1: 2940 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2941 | engines: {node: '>=8'} 2942 | dependencies: 2943 | ansi-regex: 5.0.1 2944 | dev: true 2945 | 2946 | /strip-bom@4.0.0: 2947 | resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} 2948 | engines: {node: '>=8'} 2949 | dev: true 2950 | 2951 | /strip-final-newline@2.0.0: 2952 | resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} 2953 | engines: {node: '>=6'} 2954 | dev: true 2955 | 2956 | /strip-indent@3.0.0: 2957 | resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} 2958 | engines: {node: '>=8'} 2959 | dependencies: 2960 | min-indent: 1.0.1 2961 | dev: true 2962 | 2963 | /strip-json-comments@3.1.1: 2964 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2965 | engines: {node: '>=8'} 2966 | dev: true 2967 | 2968 | /supports-color@5.5.0: 2969 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 2970 | engines: {node: '>=4'} 2971 | dependencies: 2972 | has-flag: 3.0.0 2973 | dev: true 2974 | 2975 | /supports-color@7.2.0: 2976 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2977 | engines: {node: '>=8'} 2978 | dependencies: 2979 | has-flag: 4.0.0 2980 | dev: true 2981 | 2982 | /supports-color@8.1.1: 2983 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 2984 | engines: {node: '>=10'} 2985 | dependencies: 2986 | has-flag: 4.0.0 2987 | dev: true 2988 | 2989 | /supports-preserve-symlinks-flag@1.0.0: 2990 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2991 | engines: {node: '>= 0.4'} 2992 | dev: true 2993 | 2994 | /symbol-tree@3.2.4: 2995 | resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} 2996 | dev: true 2997 | 2998 | /test-exclude@6.0.0: 2999 | resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} 3000 | engines: {node: '>=8'} 3001 | dependencies: 3002 | '@istanbuljs/schema': 0.1.3 3003 | glob: 7.2.3 3004 | minimatch: 3.1.2 3005 | dev: true 3006 | 3007 | /tmpl@1.0.5: 3008 | resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} 3009 | dev: true 3010 | 3011 | /to-fast-properties@2.0.0: 3012 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} 3013 | engines: {node: '>=4'} 3014 | dev: true 3015 | 3016 | /to-regex-range@5.0.1: 3017 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 3018 | engines: {node: '>=8.0'} 3019 | dependencies: 3020 | is-number: 7.0.0 3021 | dev: true 3022 | 3023 | /tough-cookie@4.1.4: 3024 | resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} 3025 | engines: {node: '>=6'} 3026 | dependencies: 3027 | psl: 1.9.0 3028 | punycode: 2.3.1 3029 | universalify: 0.2.0 3030 | url-parse: 1.5.10 3031 | dev: true 3032 | 3033 | /tr46@3.0.0: 3034 | resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} 3035 | engines: {node: '>=12'} 3036 | dependencies: 3037 | punycode: 2.3.1 3038 | dev: true 3039 | 3040 | /ts-jest@29.1.2(@babel/core@7.24.5)(esbuild@0.21.3)(jest@29.7.0)(typescript@5.4.5): 3041 | resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} 3042 | engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} 3043 | hasBin: true 3044 | peerDependencies: 3045 | '@babel/core': '>=7.0.0-beta.0 <8' 3046 | '@jest/types': ^29.0.0 3047 | babel-jest: ^29.0.0 3048 | esbuild: '*' 3049 | jest: ^29.0.0 3050 | typescript: '>=4.3 <6' 3051 | peerDependenciesMeta: 3052 | '@babel/core': 3053 | optional: true 3054 | '@jest/types': 3055 | optional: true 3056 | babel-jest: 3057 | optional: true 3058 | esbuild: 3059 | optional: true 3060 | dependencies: 3061 | '@babel/core': 7.24.5 3062 | bs-logger: 0.2.6 3063 | esbuild: 0.21.3 3064 | fast-json-stable-stringify: 2.1.0 3065 | jest: 29.7.0(@types/node@20.12.12) 3066 | jest-util: 29.7.0 3067 | json5: 2.2.3 3068 | lodash.memoize: 4.1.2 3069 | make-error: 1.3.6 3070 | semver: 7.6.2 3071 | typescript: 5.4.5 3072 | yargs-parser: 21.1.1 3073 | dev: true 3074 | 3075 | /type-detect@4.0.8: 3076 | resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} 3077 | engines: {node: '>=4'} 3078 | dev: true 3079 | 3080 | /type-fest@0.21.3: 3081 | resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} 3082 | engines: {node: '>=10'} 3083 | dev: true 3084 | 3085 | /typedoc@0.25.13(typescript@5.4.5): 3086 | resolution: {integrity: sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==} 3087 | engines: {node: '>= 16'} 3088 | hasBin: true 3089 | peerDependencies: 3090 | typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x 3091 | dependencies: 3092 | lunr: 2.3.9 3093 | marked: 4.3.0 3094 | minimatch: 9.0.4 3095 | shiki: 0.14.7 3096 | typescript: 5.4.5 3097 | dev: true 3098 | 3099 | /typescript@5.4.5: 3100 | resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} 3101 | engines: {node: '>=14.17'} 3102 | hasBin: true 3103 | dev: true 3104 | 3105 | /undici-types@5.26.5: 3106 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 3107 | dev: true 3108 | 3109 | /universalify@0.2.0: 3110 | resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} 3111 | engines: {node: '>= 4.0.0'} 3112 | dev: true 3113 | 3114 | /update-browserslist-db@1.0.16(browserslist@4.23.0): 3115 | resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} 3116 | hasBin: true 3117 | peerDependencies: 3118 | browserslist: '>= 4.21.0' 3119 | dependencies: 3120 | browserslist: 4.23.0 3121 | escalade: 3.1.2 3122 | picocolors: 1.0.1 3123 | dev: true 3124 | 3125 | /url-parse@1.5.10: 3126 | resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} 3127 | dependencies: 3128 | querystringify: 2.2.0 3129 | requires-port: 1.0.0 3130 | dev: true 3131 | 3132 | /v8-to-istanbul@9.2.0: 3133 | resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} 3134 | engines: {node: '>=10.12.0'} 3135 | dependencies: 3136 | '@jridgewell/trace-mapping': 0.3.25 3137 | '@types/istanbul-lib-coverage': 2.0.6 3138 | convert-source-map: 2.0.0 3139 | dev: true 3140 | 3141 | /vscode-oniguruma@1.7.0: 3142 | resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} 3143 | dev: true 3144 | 3145 | /vscode-textmate@8.0.0: 3146 | resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} 3147 | dev: true 3148 | 3149 | /w3c-xmlserializer@4.0.0: 3150 | resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} 3151 | engines: {node: '>=14'} 3152 | dependencies: 3153 | xml-name-validator: 4.0.0 3154 | dev: true 3155 | 3156 | /walker@1.0.8: 3157 | resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} 3158 | dependencies: 3159 | makeerror: 1.0.12 3160 | dev: true 3161 | 3162 | /webidl-conversions@7.0.0: 3163 | resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} 3164 | engines: {node: '>=12'} 3165 | dev: true 3166 | 3167 | /whatwg-encoding@2.0.0: 3168 | resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} 3169 | engines: {node: '>=12'} 3170 | dependencies: 3171 | iconv-lite: 0.6.3 3172 | dev: true 3173 | 3174 | /whatwg-mimetype@3.0.0: 3175 | resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} 3176 | engines: {node: '>=12'} 3177 | dev: true 3178 | 3179 | /whatwg-url@11.0.0: 3180 | resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} 3181 | engines: {node: '>=12'} 3182 | dependencies: 3183 | tr46: 3.0.0 3184 | webidl-conversions: 7.0.0 3185 | dev: true 3186 | 3187 | /which@2.0.2: 3188 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 3189 | engines: {node: '>= 8'} 3190 | hasBin: true 3191 | dependencies: 3192 | isexe: 2.0.0 3193 | dev: true 3194 | 3195 | /wrap-ansi@7.0.0: 3196 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 3197 | engines: {node: '>=10'} 3198 | dependencies: 3199 | ansi-styles: 4.3.0 3200 | string-width: 4.2.3 3201 | strip-ansi: 6.0.1 3202 | dev: true 3203 | 3204 | /wrappy@1.0.2: 3205 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 3206 | dev: true 3207 | 3208 | /write-file-atomic@4.0.2: 3209 | resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} 3210 | engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} 3211 | dependencies: 3212 | imurmurhash: 0.1.4 3213 | signal-exit: 3.0.7 3214 | dev: true 3215 | 3216 | /ws@8.17.0: 3217 | resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} 3218 | engines: {node: '>=10.0.0'} 3219 | peerDependencies: 3220 | bufferutil: ^4.0.1 3221 | utf-8-validate: '>=5.0.2' 3222 | peerDependenciesMeta: 3223 | bufferutil: 3224 | optional: true 3225 | utf-8-validate: 3226 | optional: true 3227 | dev: true 3228 | 3229 | /xml-name-validator@4.0.0: 3230 | resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} 3231 | engines: {node: '>=12'} 3232 | dev: true 3233 | 3234 | /xmlchars@2.2.0: 3235 | resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} 3236 | dev: true 3237 | 3238 | /y18n@5.0.8: 3239 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 3240 | engines: {node: '>=10'} 3241 | dev: true 3242 | 3243 | /yallist@3.1.1: 3244 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} 3245 | dev: true 3246 | 3247 | /yargs-parser@21.1.1: 3248 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 3249 | engines: {node: '>=12'} 3250 | dev: true 3251 | 3252 | /yargs@17.7.2: 3253 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 3254 | engines: {node: '>=12'} 3255 | dependencies: 3256 | cliui: 8.0.1 3257 | escalade: 3.1.2 3258 | get-caller-file: 2.0.5 3259 | require-directory: 2.1.1 3260 | string-width: 4.2.3 3261 | y18n: 5.0.8 3262 | yargs-parser: 21.1.1 3263 | dev: true 3264 | 3265 | /yocto-queue@0.1.0: 3266 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 3267 | engines: {node: '>=10'} 3268 | dev: true 3269 | -------------------------------------------------------------------------------- /scripts/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/.DS_Store -------------------------------------------------------------------------------- /scripts/css-mock.js: -------------------------------------------------------------------------------- 1 | const proxyObj = new Proxy( 2 | {}, 3 | { 4 | get: (_target, key) => { 5 | if (key === '__esModule') { 6 | return false; 7 | } 8 | return key; 9 | }, 10 | }, 11 | ); 12 | 13 | module.exports = proxyObj; 14 | -------------------------------------------------------------------------------- /scripts/css-transform.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | /** 4 | * 5 | * @param {string} _ 6 | * @param {string} sourcePath 7 | * @returns 8 | */ 9 | function process(_, sourcePath) { 10 | return { 11 | code: `module.exports = ${JSON.stringify(path.basename(sourcePath))};`, 12 | }; 13 | } 14 | 15 | module.exports = { process }; 16 | -------------------------------------------------------------------------------- /scripts/esbuild.js: -------------------------------------------------------------------------------- 1 | const { build, context } = require('esbuild'); 2 | const packageJson = require('../package.json'); 3 | const path = require('path'); 4 | const fs = require('fs'); 5 | const { parseArgs } = require('util'); 6 | const { networkInterfaces } = require('os'); 7 | 8 | const { values: envConfig } = parseArgs({ 9 | options: { 10 | help: { 11 | type: 'boolean', 12 | short: 'h', 13 | default: false, 14 | }, 15 | // production development test 16 | nodeEnv: { 17 | type: 'string', 18 | short: 'e', 19 | }, 20 | }, 21 | allowPositionals: true, 22 | }); 23 | 24 | const nodeEnv = envConfig.nodeEnv || 'development'; 25 | const isDev = nodeEnv === 'development'; 26 | 27 | const licenseText = fs.readFileSync( 28 | path.join(process.cwd(), 'LICENSE'), 29 | 'utf-8', 30 | ); 31 | const globalName = '__export__'; 32 | const distDir = path.join(process.cwd(), 'dist'); 33 | 34 | function umdWrapper() { 35 | const header = `(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = global || self, factory(global.${packageJson.name} = {}));})(this, (function (exports) { 'use strict';`; 36 | const footer = `for(var key in ${globalName}) { exports[key] = ${globalName}[key] } }));`; 37 | return { header, footer }; 38 | } 39 | 40 | /** 41 | * build ESM 42 | * @param {string} filePath 43 | * @returns {import('esbuild').BuildOptions} 44 | */ 45 | function buildESM(filePath) { 46 | return buildBrowserConfig({ 47 | outfile: filePath, 48 | format: 'esm', 49 | }); 50 | } 51 | 52 | /** 53 | * build UMD 54 | * @param {string} filePath 55 | * @returns {import('esbuild').BuildOptions} 56 | */ 57 | function buildUMD(filePath) { 58 | const umd = umdWrapper(); 59 | return buildBrowserConfig({ 60 | outfile: filePath, 61 | format: 'iife', 62 | globalName, 63 | banner: { 64 | js: `/* \n${licenseText} \n*/${umd.header}`, 65 | }, 66 | footer: { 67 | js: umd.footer, 68 | }, 69 | }); 70 | } 71 | 72 | /** 73 | * 74 | * @param { import('esbuild').BuildOptions } options 75 | * @returns {import('esbuild').BuildOptions} 76 | */ 77 | function buildBrowserConfig(options) { 78 | const minify = !!options.outfile?.includes('.min.'); 79 | /** @type {import('esbuild').BuildOptions} */ 80 | const realOptions = { 81 | bundle: true, 82 | entryPoints: ['src/index.tsx'], 83 | tsconfig: 'tsconfig.json', 84 | define: { 85 | 'process.env.NODE_ENV': JSON.stringify(nodeEnv), 86 | 'process.env.VERSION': JSON.stringify(packageJson.version), 87 | }, 88 | banner: { 89 | js: `/* \n${licenseText}\n*/`, 90 | }, 91 | platform: 'browser', 92 | sourcemap: true, 93 | minify, 94 | metafile: minify, 95 | logLevel: 'error', 96 | }; 97 | Object.assign(realOptions, options); 98 | return realOptions; 99 | } 100 | 101 | function buildHtml() { 102 | if (!fs.existsSync(distDir)) { 103 | fs.mkdirSync(distDir); 104 | } 105 | const data = fs.readFileSync(path.join(__dirname, 'index.html'), 'utf-8'); 106 | fs.writeFileSync( 107 | path.join(distDir, 'index.html'), 108 | data.replace('process.env.NODE_ENV', JSON.stringify(nodeEnv)), 109 | ); 110 | 111 | const iconDir = path.join(__dirname, './icon'); 112 | const resultDir = path.join(distDir, 'icon'); 113 | const files = fs.readdirSync(iconDir); 114 | if (!fs.existsSync(resultDir)) { 115 | fs.mkdirSync(resultDir); 116 | } 117 | for (const item of files) { 118 | const source = path.join(iconDir, item); 119 | const dest = path.join(resultDir, item); 120 | fs.copyFileSync(source, dest); 121 | } 122 | } 123 | 124 | /** 125 | * delete directory 126 | * @param {string} dir 127 | */ 128 | function deleteDir(dir) { 129 | const t = path.join(process.cwd(), dir); 130 | if (fs.existsSync(t)) { 131 | fs.rmSync(t, { recursive: true, force: true }); 132 | } 133 | } 134 | 135 | /** 136 | * 137 | * @param { import('esbuild').BuildOptions } options 138 | */ 139 | async function buildProd(options) { 140 | const list = await Promise.all( 141 | [ 142 | options, 143 | buildESM(packageJson.module), 144 | buildUMD(packageJson.main), 145 | buildESM(packageJson.module.replace('.js', '.min.js')), 146 | buildUMD(packageJson.main.replace('.js', '.min.js')), 147 | ].map(async (item) => { 148 | const result = await build(item); 149 | return result; 150 | }), 151 | ); 152 | return list; 153 | } 154 | 155 | function getIp() { 156 | const localIPs = networkInterfaces(); 157 | for (const key of Object.keys(localIPs)) { 158 | if (!localIPs || !localIPs[key]) { 159 | continue; 160 | } 161 | const list = localIPs[key] || []; 162 | for (const iface of list) { 163 | if (iface.family === 'IPv4' && !iface.internal) { 164 | return iface.address; 165 | } 166 | } 167 | } 168 | return ''; 169 | } 170 | 171 | 172 | /** 173 | * 174 | * @param { import('esbuild').BuildOptions } options 175 | */ 176 | async function buildDev(options) { 177 | const ctx = await context(options); 178 | 179 | await ctx.watch(); 180 | const { port } = await ctx.serve({ 181 | servedir: distDir, 182 | }); 183 | fs.writeFileSync(path.join(process.cwd(), 'port.txt'), String(port), 'utf-8'); 184 | 185 | console.log(`http://localhost:${port}`); 186 | console.log(`http://${getIp()}:${port}`); 187 | } 188 | 189 | async function init() { 190 | deleteDir('lib'); 191 | deleteDir('dist'); 192 | const options = buildESM(''); 193 | /** @type {import('esbuild').BuildOptions} */ 194 | const distOptions = { 195 | ...options, 196 | outdir: distDir, 197 | outfile: undefined, 198 | splitting: true, 199 | }; 200 | if (isDev) { 201 | await buildDev(distOptions); 202 | } else { 203 | distOptions.minify = true; 204 | await buildProd(distOptions); 205 | } 206 | buildHtml(); 207 | } 208 | init(); 209 | -------------------------------------------------------------------------------- /scripts/icon/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/android-icon-144x144.png -------------------------------------------------------------------------------- /scripts/icon/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/android-icon-192x192.png -------------------------------------------------------------------------------- /scripts/icon/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/android-icon-36x36.png -------------------------------------------------------------------------------- /scripts/icon/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/android-icon-48x48.png -------------------------------------------------------------------------------- /scripts/icon/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/android-icon-72x72.png -------------------------------------------------------------------------------- /scripts/icon/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/android-icon-96x96.png -------------------------------------------------------------------------------- /scripts/icon/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/apple-icon-114x114.png -------------------------------------------------------------------------------- /scripts/icon/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/apple-icon-120x120.png -------------------------------------------------------------------------------- /scripts/icon/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/apple-icon-144x144.png -------------------------------------------------------------------------------- /scripts/icon/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/apple-icon-152x152.png -------------------------------------------------------------------------------- /scripts/icon/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/apple-icon-180x180.png -------------------------------------------------------------------------------- /scripts/icon/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/apple-icon-57x57.png -------------------------------------------------------------------------------- /scripts/icon/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/apple-icon-60x60.png -------------------------------------------------------------------------------- /scripts/icon/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/apple-icon-72x72.png -------------------------------------------------------------------------------- /scripts/icon/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/apple-icon-76x76.png -------------------------------------------------------------------------------- /scripts/icon/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/apple-icon-precomposed.png -------------------------------------------------------------------------------- /scripts/icon/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/apple-icon.png -------------------------------------------------------------------------------- /scripts/icon/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | #ffffff 9 | 10 | 11 | -------------------------------------------------------------------------------- /scripts/icon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/favicon-16x16.png -------------------------------------------------------------------------------- /scripts/icon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/favicon-32x32.png -------------------------------------------------------------------------------- /scripts/icon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/favicon-96x96.png -------------------------------------------------------------------------------- /scripts/icon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/favicon.ico -------------------------------------------------------------------------------- /scripts/icon/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "App", 3 | "icons": [ 4 | { 5 | "src": "./android-icon-36x36.png", 6 | "sizes": "36x36", 7 | "type": "image/png", 8 | "density": "0.75" 9 | }, 10 | { 11 | "src": "./android-icon-48x48.png", 12 | "sizes": "48x48", 13 | "type": "image/png", 14 | "density": "1.0" 15 | }, 16 | { 17 | "src": "./android-icon-72x72.png", 18 | "sizes": "72x72", 19 | "type": "image/png", 20 | "density": "1.5" 21 | }, 22 | { 23 | "src": "./android-icon-96x96.png", 24 | "sizes": "96x96", 25 | "type": "image/png", 26 | "density": "2.0" 27 | }, 28 | { 29 | "src": "./android-icon-144x144.png", 30 | "sizes": "144x144", 31 | "type": "image/png", 32 | "density": "3.0" 33 | }, 34 | { 35 | "src": "./android-icon-192x192.png", 36 | "sizes": "192x192", 37 | "type": "image/png", 38 | "density": "4.0" 39 | } 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /scripts/icon/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/ms-icon-144x144.png -------------------------------------------------------------------------------- /scripts/icon/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/ms-icon-150x150.png -------------------------------------------------------------------------------- /scripts/icon/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/ms-icon-310x310.png -------------------------------------------------------------------------------- /scripts/icon/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/ms-icon-70x70.png -------------------------------------------------------------------------------- /scripts/icon/rotate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nusr/react-esbuild-boilerplate/7be060ace3a4838d6ee58c18e570b50960d78179/scripts/icon/rotate.png -------------------------------------------------------------------------------- /scripts/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | React Esbuild Boilerplate 39 | 40 | 41 | 42 | 43 |
44 | 45 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /scripts/jest.setup.js: -------------------------------------------------------------------------------- 1 | class PointerEventMock extends Event { 2 | /** 3 | * 4 | * @param { string } type 5 | * @param { Record } props 6 | */ 7 | constructor(type, props) { 8 | super(type, props); 9 | for (const [key, value] of Object.entries(props)) { 10 | // @ts-ignore 11 | if (value !== undefined && this[key] === undefined) { 12 | // @ts-ignore 13 | this[key] = value; 14 | } 15 | } 16 | } 17 | } 18 | 19 | class LocalStorageMock { 20 | constructor() { 21 | /** @type Record */ 22 | this.store = {}; 23 | } 24 | get length() { 25 | return Object.keys(this.store).length; 26 | } 27 | 28 | clear() { 29 | this.store = {}; 30 | } 31 | /** 32 | * 33 | * @param { string } key 34 | * @returns 35 | */ 36 | getItem(key) { 37 | return this.store[key]; 38 | } 39 | /** 40 | * 41 | * @param {string} key 42 | * @param {string} value 43 | */ 44 | setItem(key, value) { 45 | this.store[key] = value; 46 | } 47 | /** 48 | * 49 | * @param {string} key 50 | */ 51 | removeItem(key) { 52 | delete this.store[key]; 53 | } 54 | /** 55 | * 56 | * @param {number} index 57 | * @returns {string} 58 | */ 59 | key(index) { 60 | const list = Object.keys(this.store); 61 | return list[index]; 62 | } 63 | } 64 | class ImageMock { 65 | src = ''; 66 | width = 300; 67 | height = 300; 68 | /** 69 | * 70 | * @param {number | undefined} width 71 | * @param {number | undefined} height 72 | */ 73 | constructor(width, height) { 74 | if (width !== undefined) { 75 | this.width = width; 76 | } 77 | if (height !== undefined) { 78 | this.height = height; 79 | } 80 | setTimeout(() => this.onload(), 0); 81 | } 82 | onload() {} 83 | onerror() {} 84 | } 85 | 86 | // @ts-ignore 87 | global.PointerEvent = PointerEventMock; 88 | global.ResizeObserver = class ResizeObserver { 89 | observe() {} 90 | unobserve() {} 91 | disconnect() {} 92 | }; 93 | // @ts-ignore 94 | delete global.location; 95 | // @ts-ignore 96 | global.location = { 97 | reload: () => {}, 98 | }; 99 | 100 | global.localStorage = new LocalStorageMock(); 101 | // @ts-ignore 102 | global.Image = ImageMock; 103 | -------------------------------------------------------------------------------- /src/__tests__/App.test.tsx: -------------------------------------------------------------------------------- 1 | import { App } from '@/entry'; 2 | import * as React from 'react'; 3 | import { 4 | render, 5 | screen, 6 | fireEvent, 7 | act, 8 | RenderResult, 9 | cleanup, 10 | } from '@testing-library/react'; 11 | import '@testing-library/jest-dom'; 12 | 13 | type MatchMediaFun = (data: { matches: boolean }) => void; 14 | 15 | describe('App.test.ts', () => { 16 | afterEach(cleanup); 17 | describe('menubar', () => { 18 | test('normal', () => { 19 | act(() => { 20 | render(); 21 | }); 22 | expect(screen.getByTestId('menubar')!.childNodes.length).toEqual(2); 23 | }); 24 | }); 25 | describe('dark mode', () => { 26 | afterEach(() => { 27 | sessionStorage.clear(); 28 | }); 29 | test('toggle', () => { 30 | act(() => { 31 | render(); 32 | }); 33 | const before = document.documentElement.getAttribute('data-theme'); 34 | fireEvent.click(screen.getByTestId('menubar-theme-toggle')); 35 | const after = document.documentElement.getAttribute('data-theme'); 36 | expect(before).not.toEqual(after); 37 | expect(new Set([after, before])).toEqual(new Set(['light', 'dark'])); 38 | }); 39 | 40 | test('toggle twice', () => { 41 | act(() => { 42 | render(); 43 | }); 44 | const before = document.documentElement.getAttribute('data-theme'); 45 | fireEvent.click(screen.getByTestId('menubar-theme-toggle')); 46 | const after = document.documentElement.getAttribute('data-theme'); 47 | expect(before).not.toEqual(after); 48 | expect(new Set([after, before])).toEqual(new Set(['light', 'dark'])); 49 | 50 | fireEvent.click(screen.getByTestId('menubar-theme-toggle')); 51 | const after2 = document.documentElement.getAttribute('data-theme'); 52 | expect(after2).toEqual(before); 53 | }); 54 | 55 | test('mock matchMedia light to dark', () => { 56 | let func: MatchMediaFun; 57 | function addEventListener( 58 | _type: string, 59 | fn: (data: { matches: boolean }) => void, 60 | ) { 61 | func = fn; 62 | } 63 | Object.defineProperty(global, 'matchMedia', { 64 | writable: true, 65 | value: () => { 66 | return { 67 | matches: false, 68 | addEventListener, 69 | }; 70 | }, 71 | }); 72 | act(() => { 73 | render(); 74 | }); 75 | const before = document.documentElement.getAttribute('data-theme'); 76 | expect(before).toEqual('light'); 77 | act(() => { 78 | func({ matches: true }); 79 | }); 80 | const after = document.documentElement.getAttribute('data-theme'); 81 | expect(after).toEqual('dark'); 82 | }); 83 | test('mock matchMedia dark to light', () => { 84 | let func: MatchMediaFun; 85 | function addEventListener( 86 | _type: string, 87 | fn: (data: { matches: boolean }) => void, 88 | ) { 89 | func = fn; 90 | } 91 | Object.defineProperty(global, 'matchMedia', { 92 | writable: true, 93 | value: () => { 94 | return { 95 | matches: true, 96 | addEventListener, 97 | }; 98 | }, 99 | }); 100 | act(() => { 101 | render(); 102 | }); 103 | const before = document.documentElement.getAttribute('data-theme'); 104 | expect(before).toEqual('dark'); 105 | act(() => { 106 | func({ matches: false }); 107 | }); 108 | const after = document.documentElement.getAttribute('data-theme'); 109 | expect(after).toEqual('light'); 110 | }); 111 | }); 112 | describe('i18n', () => { 113 | test('default', () => { 114 | act(() => { 115 | render(); 116 | }); 117 | expect(screen.getByTestId('menubar-i18n-select')).toHaveValue('en'); 118 | }); 119 | test('change', () => { 120 | let result: RenderResult; 121 | act(() => { 122 | result = render(); 123 | }); 124 | fireEvent.change(screen.getByTestId('menubar-i18n-select'), { 125 | target: { value: 'zh' }, 126 | }); 127 | act(() => { 128 | result.rerender(); 129 | }); 130 | expect(screen.getByTestId('menubar-i18n-select')).toHaveValue('zh'); 131 | }); 132 | }); 133 | }); 134 | -------------------------------------------------------------------------------- /src/components/BaseIcon/BaseIcon.module.css: -------------------------------------------------------------------------------- 1 | .baseIcon { 2 | width: 1em; 3 | height: 1em; 4 | fill: currentcolor; 5 | overflow: hidden; 6 | } 7 | -------------------------------------------------------------------------------- /src/components/BaseIcon/BaseIcon.tsx: -------------------------------------------------------------------------------- 1 | import { classnames } from '@/util'; 2 | import styles from './BaseIcon.module.css'; 3 | import React, { FunctionComponent } from 'react'; 4 | 5 | interface PathItem { 6 | d: string; 7 | 'fill-opacity'?: string; 8 | } 9 | 10 | export interface BaseIconProps { 11 | className?: string; 12 | paths: PathItem[]; 13 | testId?: string; 14 | } 15 | 16 | export const BaseIcon: FunctionComponent = ({ 17 | className = '', 18 | paths, 19 | testId, 20 | }) => { 21 | return ( 22 | 28 | {paths.map((item, i) => ( 29 | 30 | ))} 31 | 32 | ); 33 | }; 34 | BaseIcon.displayName = 'BaseIcon'; 35 | -------------------------------------------------------------------------------- /src/components/BaseIcon/icon.ts: -------------------------------------------------------------------------------- 1 | export type BaseIconName = 2 | | 'alignCenter' 3 | | 'alignLeft' 4 | | 'alignRight' 5 | | 'bold' 6 | | 'fontColor' 7 | | 'italic' 8 | | 'middleAlign' 9 | | 'plus' 10 | | 'redo' 11 | | 'underline' 12 | | 'undo' 13 | | 'success' 14 | | 'info' 15 | | 'warning' 16 | | 'error' 17 | | 'rotate' 18 | | 'moon' 19 | | 'sun' 20 | | 'down' 21 | | 'menu' 22 | | 'confirm' 23 | | 'horizontalLeft' 24 | | 'horizontalRight' 25 | | 'horizontalCenter' 26 | | 'verticalTop' 27 | | 'verticalMiddle' 28 | | 'verticalBottom'; 29 | 30 | const icon: Record = { 31 | alignCenter: [ 32 | 'M142.2 227.6h739.6v56.9H142.2zM142.2 568.9h739.6v56.9H142.2zM256 398.2h512v56.9H256zM256 739.6h512v56.9H256z', 33 | ], 34 | alignLeft: [ 35 | 'M627.712 788.48c11.305 0 20.48-9.155 20.48-20.48s-9.175-20.48-20.48-20.48H218.46c-11.305 0-20.48 9.155-20.48 20.48s9.175 20.48 20.48 20.48h409.252zM832.86 583.68h-614.4c-11.305 0-20.48 9.155-20.48 20.48s9.175 20.48 20.48 20.48h614.4c11.305 0 20.48-9.155 20.48-20.48s-9.175-20.48-20.48-20.48zM832.86 256h-614.4c-11.305 0-20.48 9.155-20.48 20.48s9.175 20.48 20.48 20.48h614.4c11.305 0 20.48-9.155 20.48-20.48S844.165 256 832.86 256zM218.46 460.8h409.252c11.305 0 20.48-9.155 20.48-20.48s-9.175-20.48-20.48-20.48H218.46c-11.305 0-20.48 9.155-20.48 20.48s9.155 20.48 20.48 20.48z', 36 | ], 37 | alignRight: [ 38 | 'M832.86 747.52H423.588a20.48 20.48 0 1 0 0 40.96H832.84a20.48 20.48 0 0 0 0.02-40.96z m20.48-143.36a20.48 20.48 0 0 0-20.48-20.48h-614.4a20.48 20.48 0 1 0 0 40.96h614.4a20.48 20.48 0 0 0 20.48-20.48zM832.86 256h-614.4a20.48 20.48 0 1 0 0 40.96h614.4a20.48 20.48 0 1 0 0-40.96z m0 163.84H423.588a20.48 20.48 0 1 0 0 40.96H832.84a20.48 20.48 0 0 0 0.02-40.96z', 39 | ], 40 | bold: [ 41 | 'M724.342857 477.028571c38.4-40 61.942857-94.057143 61.942857-153.485714v-11.657143C786.285714 188.914286 685.6 89.142857 561.485714 89.142857H223.314286c-17.257143 0-31.314286 14.057143-31.314286 31.314286v776.114286c0 18.628571 15.085714 33.714286 33.714286 33.714285h364.228571c133.714286 0 242.057143-107.657143 242.057143-240.571428v-12.571429c0-83.428571-42.742857-156.914286-107.657143-200.114286zM301.714286 198.857143h256.8c65.257143 0 118.057143 50.742857 118.057143 113.485714v10.857143c0 62.628571-52.914286 113.485714-118.057143 113.485714H301.714286V198.857143z m418.971428 490.742857c0 71.885714-59.085714 130.171429-132 130.171429H301.714286V547.085714h286.971428c72.914286 0 132 58.285714 132 130.171429v12.342857z', 42 | ], 43 | fontColor: [ 44 | 'M650.496 597.333333H373.504l-68.266667 170.666667H213.333333l256-640h85.333334l256 640h-91.904l-68.266667-170.666667z m-34.133333-85.333333L512 251.093333 407.637333 512h208.725334zM128 853.333333h768v85.333334H128v-85.333334z', 45 | ], 46 | italic: [ 47 | 'M219.428571 949.714286l9.714286-48.571429q3.428571-1.142857 46.571429-12.285714t63.714286-21.428571q16-20 23.428571-57.714286 0.571429-4 35.428571-165.142857t65.142857-310.571429 29.714286-169.428571l0-14.285714q-13.714286-7.428571-31.142857-10.571429t-39.714286-4.571429-33.142857-3.142857l10.857143-58.857143q18.857143 1.142857 68.571429 3.714286t85.428571 4 68.857143 1.428571q27.428571 0 56.285714-1.428571t69.142857-4 56.285714-3.714286q-2.857143 22.285714-10.857143 50.857143-17.142857 5.714286-58 16.285714t-62 19.142857q-4.571429 10.857143-8 24.285714t-5.142857 22.857143-4.285714 26-3.714286 24q-15.428571 84.571429-50 239.714286t-44.285714 203.142857q-1.142857 5.142857-7.428571 33.142857t-11.428571 51.428571-9.142857 47.714286-3.428571 32.857143l0.571429 10.285714q9.714286 2.285714 105.714286 17.714286-1.714286 25.142857-9.142857 56.571429-6.285714 0-18.571429 0.857143t-18.571429 0.857143q-16.571429 0-49.714286-5.714286t-49.142857-5.714286q-78.857143-1.142857-117.714286-1.142857-29.142857 0-81.714286 5.142857t-69.142857 6.285714z', 48 | ], 49 | middleAlign: [ 50 | 'M740.43392 788.48c11.30496 0 20.48-9.15456 20.48-20.48s-9.17504-20.48-20.48-20.48L331.18208 747.52c-11.30496 0-20.48 9.15456-20.48 20.48s9.17504 20.48 20.48 20.48L740.43392 788.48zM863.49824 604.16c0-11.32544-9.17504-20.48-20.48-20.48l-614.4 0c-11.30496 0-20.48 9.15456-20.48 20.48s9.17504 20.48 20.48 20.48l614.4 0C854.3232 624.64 863.49824 615.48544 863.49824 604.16zM208.13824 276.48c0 11.32544 9.17504 20.48 20.48 20.48l614.4 0c11.30496 0 20.48-9.15456 20.48-20.48s-9.17504-20.48-20.48-20.48l-614.4 0C217.2928 256 208.13824 265.15456 208.13824 276.48zM740.43392 460.8c11.30496 0 20.48-9.15456 20.48-20.48s-9.17504-20.48-20.48-20.48L331.18208 419.84c-11.30496 0-20.48 9.15456-20.48 20.48s9.17504 20.48 20.48 20.48L740.43392 460.8z', 51 | ], 52 | plus: [ 53 | 'M896 468.571429H555.428571V100.571429h-86.857142v368H128c-5.028571 0-9.142857 4.114286-9.142857 9.142857v68.571428c0 5.028571 4.114286 9.142857 9.142857 9.142857h340.571429v368h86.857142V555.428571h340.571429c5.028571 0 9.142857-4.114286 9.142857-9.142857v-68.571428c0-5.028571-4.114286-9.142857-9.142857-9.142857z', 54 | ], 55 | redo: [ 56 | 'M611.783111 569.344L549.622519 644.740741h284.444444l-65.498074-265.481482-59.922963 72.666074c-35.422815-28.48237-108.278519-68.342519-238.667852-68.342518-202.827852 0-280.651852 206.01363-280.651852 206.013629s116.318815-132.778667 246.215111-132.778666c97.204148-0.037926 153.865481 74.827852 176.241778 112.526222z', 57 | ], 58 | underline: [ 59 | 'M512 725.333333c166.4 0 298.666667-132.266667 298.666667-298.666666V128c0-25.6-17.066667-42.666667-42.666667-42.666667s-42.666667 17.066667-42.666667 42.666667v298.666667c0 119.466667-93.866667 213.333333-213.333333 213.333333s-213.333333-93.866667-213.333333-213.333333V128c0-25.6-17.066667-42.666667-42.666667-42.666667s-42.666667 17.066667-42.666667 42.666667v298.666667c0 166.4 132.266667 298.666667 298.666667 298.666666zM853.333333 853.333333H170.666667c-25.6 0-42.666667 17.066667-42.666667 42.666667s17.066667 42.666667 42.666667 42.666667h682.666666c25.6 0 42.666667-17.066667 42.666667-42.666667s-17.066667-42.666667-42.666667-42.666667z', 60 | ], 61 | undo: [ 62 | 'M489.244444 568.888889l60.681482 75.851852H265.481481l64.474075-265.481482 60.681481 72.05926c34.133333-30.340741 109.985185-68.266667 238.933333-68.266667 201.007407 0 280.651852 204.8 280.651852 204.8S792.651852 455.111111 663.703704 455.111111c-98.607407 0-155.496296 75.851852-174.45926 113.777778z', 63 | ], 64 | success: [ 65 | 'M666.272 472.288l-175.616 192a31.904 31.904 0 0 1-23.616 10.4h-0.192a32 32 0 0 1-23.68-10.688l-85.728-96a32 32 0 1 1 47.744-42.624l62.144 69.6 151.712-165.888a32 32 0 1 1 47.232 43.2m-154.24-344.32C300.224 128 128 300.32 128 512c0 211.776 172.224 384 384 384 211.68 0 384-172.224 384-384 0-211.68-172.32-384-384-384', 66 | ], 67 | info: [ 68 | 'M512 97.52381c228.912762 0 414.47619 185.563429 414.47619 414.47619s-185.563429 414.47619-414.47619 414.47619S97.52381 740.912762 97.52381 512 283.087238 97.52381 512 97.52381z m36.571429 341.333333h-73.142858v292.571428h73.142858V438.857143z m0-121.904762h-73.142858v73.142857h73.142858v-73.142857z', 69 | ], 70 | warning: [ 71 | 'M512 64q190.016 4.992 316.512 131.488T960 512q-4.992 190.016-131.488 316.512T512 960q-190.016-4.992-316.512-131.488T64 512q4.992-190.016 131.488-316.512T512 64z m0 192q-26.016 0-43.008 19.008T453.984 320l23.008 256q2.016 14.016 11.488 22.496t23.488 8.512 23.488-8.512 11.488-22.496l23.008-256q2.016-26.016-15.008-44.992T511.936 256z m0 512q22.016-0.992 36.512-15.008t14.496-36-14.496-36.512T512 665.984t-36.512 14.496-14.496 36.512 14.496 36T512 768z', 72 | ], 73 | error: [ 74 | 'M512 97.52381c228.912762 0 414.47619 185.563429 414.47619 414.47619s-185.563429 414.47619-414.47619 414.47619S97.52381 740.912762 97.52381 512 283.087238 97.52381 512 97.52381z m129.29219 233.447619l-129.267809 129.29219-129.316571-129.29219-51.736381 51.736381 129.316571 129.267809-129.316571 129.316571 51.736381 51.736381L512 563.687619l129.29219 129.316571 51.736381-51.73638L563.687619 512l129.316571-129.29219-51.73638-51.736381z', 75 | ], 76 | rotate: [ 77 | 'M934.08 416.448h-220.352a46.4 46.4 0 0 1-47.232-47.232c0-26.752 20.48-47.232 47.232-47.232h173.184V148.8c0-26.752 20.48-47.168 47.168-47.168 26.816 0 47.232 20.48 47.232 47.168V369.28a47.36 47.36 0 0 1-47.232 47.232z', 78 | 'M509.056 978.432A470.976 470.976 0 0 1 38.4 507.712 470.976 470.976 0 0 1 509.056 37.12a472.32 472.32 0 0 1 434.56 288.064c9.408 23.68-1.6 51.968-25.216 61.44-23.68 9.408-51.968-1.6-61.44-25.216a377.92 377.92 0 0 0-347.904-229.824 376.192 376.192 0 1 0 0 752.448c190.528 0 351.104-141.696 373.12-328.96a47.36 47.36 0 0 1 51.904-40.96 47.36 47.36 0 0 1 40.96 51.904 469.504 469.504 0 0 1-465.92 412.48z', 79 | ], 80 | moon: [ 81 | 'M735.996 244.2C693.136 221.106 644.1 208 592 208c-167.894 0-304 136.106-304 304s136.106 304 304 304c52.1 0 101.136-13.106 143.996-36.2C621.368 744.742 538 638.108 538 512s83.368-232.742 197.996-267.8z m26.32 86.064C683.17 354.472 628 427.888 628 512s55.168 157.528 134.318 181.736c76.442 23.378 86.74 127.376 16.37 165.294C721.764 889.702 657.958 906 592 906c-217.6 0-394-176.4-394-394S374.4 118 592 118c65.96 0 129.764 16.298 186.688 46.97 70.372 37.918 60.072 141.916-16.37 165.294z', 82 | ], 83 | sun: [ 84 | 'M512 768c-140.8 0-256-115.2-256-256s115.2-256 256-256 256 115.2 256 256-115.2 256-256 256z m0-426.666667c-93.866667 0-170.666667 76.8-170.666667 170.666667s76.8 170.666667 170.666667 170.666667 170.666667-76.8 170.666667-170.666667-76.8-170.666667-170.666667-170.666667zM512 170.666667c-25.6 0-42.666667-17.066667-42.666667-42.666667V42.666667c0-25.6 17.066667-42.666667 42.666667-42.666667s42.666667 17.066667 42.666667 42.666667v85.333333c0 25.6-17.066667 42.666667-42.666667 42.666667zM512 1024c-25.6 0-42.666667-17.066667-42.666667-42.666667v-85.333333c0-25.6 17.066667-42.666667 42.666667-42.666667s42.666667 17.066667 42.666667 42.666667v85.333333c0 25.6-17.066667 42.666667-42.666667 42.666667zM238.933333 281.6c-12.8 0-21.333333-4.266667-29.866666-12.8L149.333333 209.066667c-17.066667-17.066667-17.066667-42.666667 0-59.733334s42.666667-17.066667 59.733334 0l59.733333 59.733334c17.066667 17.066667 17.066667 42.666667 0 59.733333-4.266667 8.533333-17.066667 12.8-29.866667 12.8zM844.8 887.466667c-12.8 0-21.333333-4.266667-29.866667-12.8l-59.733333-59.733334c-17.066667-17.066667-17.066667-42.666667 0-59.733333s42.666667-17.066667 59.733333 0l59.733334 59.733333c17.066667 17.066667 17.066667 42.666667 0 59.733334-8.533333 8.533333-21.333333 12.8-29.866667 12.8zM128 554.666667H42.666667c-25.6 0-42.666667-17.066667-42.666667-42.666667s17.066667-42.666667 42.666667-42.666667h85.333333c25.6 0 42.666667 17.066667 42.666667 42.666667s-17.066667 42.666667-42.666667 42.666667zM981.333333 554.666667h-85.333333c-25.6 0-42.666667-17.066667-42.666667-42.666667s17.066667-42.666667 42.666667-42.666667h85.333333c25.6 0 42.666667 17.066667 42.666667 42.666667s-17.066667 42.666667-42.666667 42.666667zM179.2 887.466667c-12.8 0-21.333333-4.266667-29.866667-12.8-17.066667-17.066667-17.066667-42.666667 0-59.733334l59.733334-59.733333c17.066667-17.066667 42.666667-17.066667 59.733333 0s17.066667 42.666667 0 59.733333l-59.733333 59.733334c-8.533333 8.533333-17.066667 12.8-29.866667 12.8zM785.066667 281.6c-12.8 0-21.333333-4.266667-29.866667-12.8-17.066667-17.066667-17.066667-42.666667 0-59.733333l59.733333-59.733334c17.066667-17.066667 42.666667-17.066667 59.733334 0s17.066667 42.666667 0 59.733334l-59.733334 59.733333c-8.533333 8.533333-21.333333 12.8-29.866666 12.8z', 85 | ], 86 | down: [ 87 | 'M512.146286 619.52L245.296762 352.792381 193.584762 404.48l318.585905 318.415238 318.268952-318.415238-51.736381-51.687619z', 88 | ], 89 | menu: [ 90 | 'M904 160H120c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8zM904 784H120c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8zM904 472H120c-4.4 0-8 3.6-8 8v64c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-64c0-4.4-3.6-8-8-8z', 91 | ], 92 | confirm: [ 93 | 'M394.792 797.429c-9.71 0-19.443-3.513-27.137-10.622L87.488 527.917c-16.225-14.993-17.224-40.3-2.231-56.525 14.993-16.226 40.3-17.225 56.524-2.231l280.167 258.89c16.225 14.993 17.224 40.3 2.231 56.524-7.883 8.532-18.62 12.854-29.387 12.854z', 94 | 'M394.808 797.429c-10.555 0-21.088-4.15-28.949-12.391-15.249-15.984-14.652-41.304 1.333-56.553l514.564-490.858c15.983-15.249 41.303-14.652 56.553 1.333 15.248 15.985 14.651 41.305-1.334 56.553l-514.563 490.86c-7.745 7.387-17.684 11.056-27.604 11.056z', 95 | ], 96 | horizontalLeft: [ 97 | 'M484.693 477.013h-371.2a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32h371.2a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32z m435.2-338.133h-806.4a32 32 0 0 0-32 31.787v32a32 32 0 0 0 32 32h806.4a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32z m0 674.133h-806.4a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32h806.4a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32z', 98 | ], 99 | horizontalRight: [ 100 | 'M922.453 472.107H551.04a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32h371.413a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32z m0 337.066H115.84a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32h806.613a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32z m0-674.133H115.84a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32h806.613a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32z', 101 | ], 102 | horizontalCenter: [ 103 | 'M697.6 472.107H326.4a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32h371.2a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32zM915.2 135.04H108.8a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32h806.4a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32z m0 674.133H108.8a32 32 0 0 0-32 32v32a32 32 0 0 0 32 32h806.4a32 32 0 0 0 32-32v-32a32 32 0 0 0-32-32z', 104 | ], 105 | verticalTop: [ 106 | 'M902.890667 125.482667H121.109333a9.045333 9.045333 0 0 0-9.109333 8.981333v67.413333c0 4.949333 4.053333 9.002667 9.109333 9.002667h781.781334c5.056 0 9.109333-4.053333 9.109333-9.002667v-67.413333a9.045333 9.045333 0 0 0-9.109333-8.981333z m-383.808 210.112a8.96 8.96 0 0 0-14.165334 0l-125.845333 159.210666a8.96 8.96 0 0 0 7.082667 14.506667h83.029333v380.224c0 4.928 4.053333 8.981333 9.002667 8.981333h67.413333c4.949333 0 8.981333-4.053333 8.981333-8.981333V509.418667H637.866667a8.96 8.96 0 0 0 7.082666-14.506667l-125.866666-159.317333z', 107 | ], 108 | verticalMiddle: [ 109 | 'M512 614.4l117.028571 153.6h-73.142857V950.857143H468.114286v-182.857143h-73.142857L512 614.4z m438.857143-153.6v102.4H73.142857V460.8h877.714286zM555.885714 73.142857v182.857143h73.142857L512 409.6 394.971429 256h73.142857V73.142857h87.771428z', 110 | ], 111 | verticalBottom: [ 112 | 'M902.890667 813.12H121.109333a9.045333 9.045333 0 0 0-9.109333 9.002667v67.413333c0 4.928 4.053333 8.981333 9.109333 8.981333h781.781334c5.056 0 9.109333-4.053333 9.109333-8.981333v-67.413333a9.045333 9.045333 0 0 0-9.109333-9.002667zM504.917333 688.426667a8.96 8.96 0 0 0 14.165334 0l125.845333-159.210667a8.96 8.96 0 0 0-7.082667-14.506667h-83.264V134.464a9.024 9.024 0 0 0-8.981333-8.981333h-67.413333a9.024 9.024 0 0 0-9.002667 8.981333v380.117333h-83.029333a8.96 8.96 0 0 0-7.082667 14.506667l125.866667 159.317333z', 113 | ], 114 | }; 115 | 116 | export default icon; 117 | -------------------------------------------------------------------------------- /src/components/BaseIcon/index.tsx: -------------------------------------------------------------------------------- 1 | import { FunctionComponent, memo } from 'react'; 2 | import iconConfig from './icon'; 3 | import type { BaseIconName } from './icon'; 4 | import { BaseIcon } from './BaseIcon'; 5 | 6 | interface IconProps { 7 | name: BaseIconName; 8 | className?: string; 9 | testId?: string; 10 | } 11 | 12 | export const Icon: FunctionComponent = memo( 13 | ({ name, className = '', testId }) => { 14 | const paths = iconConfig[name].map((item) => ({ d: item })); 15 | return BaseIcon({ className, paths, testId }); 16 | }, 17 | ); 18 | Icon.displayName = 'Icon'; 19 | 20 | -------------------------------------------------------------------------------- /src/components/Button/index.module.css: -------------------------------------------------------------------------------- 1 | .buttonWrapper { 2 | padding: 0 var(--tinyPadding); 3 | min-width: 20px; 4 | text-align: center; 5 | box-sizing: border-box; 6 | cursor: pointer; 7 | border-radius: var(--borderRadius); 8 | border: 1px solid var(--activeBorderColor); 9 | display: block; 10 | background-color: var(--white); 11 | color: var(--black); 12 | height: 20px; 13 | } 14 | 15 | .buttonWrapper.circle { 16 | border-radius: 50%; 17 | } 18 | .buttonWrapper.disabled { 19 | cursor: not-allowed; 20 | opacity: 0.35; 21 | } 22 | .buttonWrapper:hover, 23 | .buttonWrapper.active { 24 | background-color: var(--buttonActiveColor); 25 | } 26 | .buttonWrapper.plain { 27 | border: none; 28 | border-radius: unset; 29 | } 30 | .buttonWrapper.primary { 31 | background-color: var(--primaryColor); 32 | color: var(--white); 33 | } 34 | -------------------------------------------------------------------------------- /src/components/Button/index.tsx: -------------------------------------------------------------------------------- 1 | import React, { FunctionComponent, CSSProperties, memo } from 'react'; 2 | import { classnames } from '@/util'; 3 | import styles from './index.module.css'; 4 | 5 | export interface ButtonProps { 6 | type?: 'normal' | 'circle' | 'plain' | 'primary'; 7 | style?: CSSProperties; 8 | active?: boolean; 9 | disabled?: boolean; 10 | onClick?: React.MouseEventHandler; 11 | className?: string; 12 | title?: string; 13 | testId?: string; 14 | dataType?: string; 15 | buttonType?: React.ButtonHTMLAttributes['type']; 16 | } 17 | 18 | export const Button: FunctionComponent> = 19 | memo((props) => { 20 | const { 21 | className = '', 22 | onClick = () => {}, 23 | disabled = false, 24 | active = false, 25 | type = 'normal', 26 | style, 27 | testId, 28 | title, 29 | dataType, 30 | buttonType, 31 | children, 32 | } = props; 33 | const cls = classnames(styles.buttonWrapper, className, { 34 | [styles['disabled']]: disabled, 35 | [styles['active']]: active, 36 | [styles['circle']]: type === 'circle', 37 | [styles['plain']]: type === 'plain', 38 | [styles['primary']]: type === 'primary', 39 | }); 40 | return ( 41 | 53 | ); 54 | }); 55 | Button.displayName = 'Button'; 56 | -------------------------------------------------------------------------------- /src/components/Github/index.module.css: -------------------------------------------------------------------------------- 1 | .githubWrapper { 2 | color: var(--white); 3 | position: absolute; 4 | top: 0; 5 | border: 0; 6 | right: 0; 7 | fill: var(--primaryColor); 8 | height: 40px; 9 | width: 40px; 10 | } 11 | -------------------------------------------------------------------------------- /src/components/Github/index.tsx: -------------------------------------------------------------------------------- 1 | import React, { FunctionComponent, memo } from 'react'; 2 | 3 | import styles from './index.module.css'; 4 | 5 | const pathStyle = { 6 | transformOrigin: '130px 106px', 7 | }; 8 | 9 | export const Github: FunctionComponent = memo(() => { 10 | return ( 11 | 18 | 19 | 20 | 25 | 30 | 31 | 32 | ); 33 | }); 34 | Github.displayName = 'Github'; 35 | -------------------------------------------------------------------------------- /src/components/Select/index.module.css: -------------------------------------------------------------------------------- 1 | .selectList { 2 | background-color: var(--white); 3 | color: var(--black); 4 | } 5 | .selectItem { 6 | text-wrap: nowrap; 7 | } 8 | .selectItem.disabled { 9 | background-color: var(--white); 10 | cursor: not-allowed; 11 | color: var(--borderColor); 12 | } 13 | .selectItem.disabled:hover { 14 | background-color: var(--white); 15 | } 16 | 17 | .popup-container { 18 | position: absolute; 19 | background-color: var(--white); 20 | border-radius: var(--borderRadius); 21 | border: 1px solid var(--borderColor); 22 | display: none; 23 | top: 100%; 24 | left: 0; 25 | right: 0; 26 | z-index: var(--highestZIndex); 27 | max-height: 200px; 28 | overflow: auto; 29 | white-space: nowrap; 30 | } 31 | .popup-container.top { 32 | transform: translate(0, -100%); 33 | top: 0; 34 | } 35 | .popup-container.active { 36 | display: block; 37 | } 38 | 39 | .popup-item { 40 | padding: var(--tinyPadding); 41 | border-bottom: 1px solid var(--borderColor); 42 | display: flex; 43 | justify-content: space-between; 44 | align-items: center; 45 | } 46 | .popup-item:hover { 47 | background-color: var(--buttonActiveColor); 48 | } 49 | .popup-item-icon { 50 | color: var(--primaryColor); 51 | } 52 | 53 | .popup-item-content { 54 | flex: 1; 55 | text-align: left; 56 | } 57 | 58 | .select-list-container { 59 | height: 100%; 60 | text-align: center; 61 | background-color: var(--white); 62 | user-select: none; 63 | display: flex; 64 | align-items: center; 65 | position: relative; 66 | border: 1px solid var(--borderColor); 67 | box-sizing: border-box; 68 | } 69 | 70 | .select-list-container .select-list-trigger { 71 | position: absolute; 72 | right: 0; 73 | border-radius: unset; 74 | border-left: 1px solid var(--borderColor); 75 | display: flex; 76 | align-items: center; 77 | justify-content: center; 78 | height: 100%; 79 | } 80 | 81 | .select-list-container.active .select-list-trigger { 82 | transform: rotate(180deg); 83 | border-right: 1px solid var(--borderColor); 84 | border-left: none; 85 | } 86 | -------------------------------------------------------------------------------- /src/components/Select/index.tsx: -------------------------------------------------------------------------------- 1 | import React, { 2 | CSSProperties, 3 | FunctionComponent, 4 | memo, 5 | useCallback, 6 | } from 'react'; 7 | import { classnames } from '@/util'; 8 | import { OptionItem } from '@/types'; 9 | import styles from './index.module.css'; 10 | 11 | export interface SelectProps { 12 | value?: string | number; 13 | defaultValue?: string | number; 14 | data: Array; 15 | getItemStyle?: (value: string | number) => CSSProperties; 16 | onChange: (value: string | number) => void; 17 | title?: string; 18 | className?: string; 19 | testId?: string; 20 | } 21 | 22 | export const Select: FunctionComponent = memo((props) => { 23 | const { 24 | data, 25 | value: activeValue, 26 | className, 27 | onChange, 28 | getItemStyle, 29 | title, 30 | defaultValue, 31 | testId, 32 | } = props; 33 | const handleChange = useCallback( 34 | (event: React.ChangeEvent) => { 35 | onChange(event.target.value); 36 | }, 37 | [], 38 | ); 39 | 40 | return ( 41 | 73 | ); 74 | }); 75 | Select.displayName = 'Select'; 76 | -------------------------------------------------------------------------------- /src/components/Toast/index.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | position: fixed; 3 | top: 50px; 4 | left: 50%; 5 | z-index: var(--highestZIndex); 6 | } 7 | .content { 8 | padding-left: var(--mediumPadding); 9 | } 10 | .toast { 11 | padding: var(--mediumPadding) var(--padding); 12 | border-radius: var(--borderLargeRadius); 13 | display: flex; 14 | align-items: center; 15 | word-wrap: break-word; 16 | min-width: 200px; 17 | font-size: var(--largeFont); 18 | } 19 | .icon { 20 | font-size: 20px; 21 | } 22 | .success { 23 | border: 1px solid rgb(183, 235, 143); 24 | background-color: rgb(183, 235, 143); 25 | } 26 | .success_icon { 27 | color: #52c41a; 28 | } 29 | .error { 30 | border: 1px solid rgb(255, 204, 199); 31 | background-color: rgb(255, 204, 199); 32 | } 33 | .error_icon { 34 | color: #ff4d4f; 35 | } 36 | .info { 37 | border: 1px solid rgb(145, 202, 255); 38 | background-color: rgb(145, 202, 255); 39 | } 40 | .info_icon { 41 | color: #1677ff; 42 | } 43 | .warning { 44 | border: 1px solid rgb(255, 229, 143); 45 | background-color: rgb(255, 229, 143); 46 | } 47 | .warning_icon { 48 | color: #faad14; 49 | } 50 | -------------------------------------------------------------------------------- /src/components/Toast/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { createRoot } from 'react-dom/client'; 3 | import styles from './index.module.css'; 4 | import { classnames } from '@/util'; 5 | import { Icon } from '../BaseIcon'; 6 | 7 | type MessageType = 'success' | 'error' | 'info' | 'warning'; 8 | type Props = { 9 | message: string; 10 | type: MessageType; 11 | duration?: number; // second 12 | testId: string; 13 | }; 14 | 15 | export const Toast: React.FunctionComponent> = ({ 16 | message, 17 | type, 18 | testId, 19 | }) => { 20 | return ( 21 |
25 | 29 |
{message}
30 |
31 | ); 32 | }; 33 | 34 | export function toast(props: Props) { 35 | const { duration = 3, ...rest } = props; 36 | let container: HTMLDivElement | undefined = document.createElement('div'); 37 | container.className = styles['container']; 38 | document.body.appendChild(container); 39 | const root = createRoot(container); 40 | root.render(); 41 | 42 | function close() { 43 | if (!container) { 44 | return; 45 | } 46 | root.unmount(); 47 | document.body.removeChild(container!); 48 | container = undefined; 49 | } 50 | 51 | setTimeout(close, duration * 1000); 52 | return close; 53 | } 54 | 55 | toast.error = function (message: string, testId = 'error-toast') { 56 | return toast({ message, type: 'error', testId }); 57 | }; 58 | 59 | toast.info = function (message: string, testId = 'info-toast') { 60 | return toast({ message, type: 'info', testId }); 61 | }; 62 | 63 | toast.warning = function (message: string, testId = 'warning-toast') { 64 | return toast({ message, type: 'warning', testId }); 65 | }; 66 | toast.success = function (message: string, testId = 'success-toast') { 67 | return toast({ message, type: 'success', testId }); 68 | }; 69 | -------------------------------------------------------------------------------- /src/components/__tests__/BaseIcon.test.tsx: -------------------------------------------------------------------------------- 1 | import { Icon } from '../BaseIcon'; 2 | import React from 'react'; 3 | import { cleanup, render, screen } from '@testing-library/react'; 4 | import '@testing-library/jest-dom'; 5 | 6 | describe('BaseIcon.test.ts', () => { 7 | afterEach(cleanup); 8 | test('normal', () => { 9 | render(); 10 | expect(screen.getByTestId('icon_data')).toBeInTheDocument(); 11 | }); 12 | }); 13 | -------------------------------------------------------------------------------- /src/components/__tests__/Button.test.tsx: -------------------------------------------------------------------------------- 1 | import { Button } from '../Button'; 2 | import { cleanup, render } from '@testing-library/react'; 3 | import React from 'react'; 4 | 5 | describe('Button.test.ts', () => { 6 | afterEach(cleanup); 7 | test('normal', () => { 8 | const dom = render( 9 | , 12 | ); 13 | expect(dom.container.textContent).toEqual('button'); 14 | }); 15 | test('icon button', () => { 16 | const dom = render( 17 | , 20 | ); 21 | expect(dom.container.textContent).toEqual('add'); 22 | expect(dom.container.childNodes).toHaveLength(1); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /src/components/__tests__/Toast.test.tsx: -------------------------------------------------------------------------------- 1 | import { Toast, toast } from '../Toast'; 2 | import React from 'react'; 3 | import { cleanup, render, act, screen } from '@testing-library/react'; 4 | import '@testing-library/jest-dom'; 5 | 6 | describe('BaseIcon.test.ts', () => { 7 | afterEach(cleanup); 8 | test('normal', () => { 9 | const dom = render(); 10 | expect(dom.container.childNodes.length).toEqual(1); 11 | }); 12 | test('close', () => { 13 | let close: any; 14 | act(() => { 15 | close = toast({ 16 | type: 'success', 17 | message: 'test', 18 | testId: 'toast-close', 19 | duration: 1, 20 | }); 21 | }); 22 | expect(screen.getByTestId('toast-close').textContent).toEqual('test'); 23 | act(() => { 24 | close(); 25 | }); 26 | expect(() => screen.getByTestId('toast-close')).toThrow(); 27 | }); 28 | test('close twice', () => { 29 | let close: any; 30 | act(() => { 31 | close = toast({ 32 | type: 'success', 33 | message: 'test', 34 | testId: 'toast-twice', 35 | duration: 1, 36 | }); 37 | }); 38 | expect(screen.getByTestId('toast-twice').textContent).toEqual('test'); 39 | act(() => { 40 | close(); 41 | }); 42 | expect(() => screen.getByTestId('toast-twice')).toThrow(); 43 | act(() => { 44 | close(); 45 | }); 46 | expect(() => screen.getByTestId('toast-twice')).toThrow(); 47 | }); 48 | }); 49 | -------------------------------------------------------------------------------- /src/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Github'; 2 | export * from './BaseIcon'; 3 | export * from './Button'; 4 | export * from './Select'; 5 | export * from './Toast'; 6 | -------------------------------------------------------------------------------- /src/entry/FPS.tsx: -------------------------------------------------------------------------------- 1 | import React, { memo } from 'react'; 2 | import styles from './index.module.css'; 3 | import { useFPS } from './useFps'; 4 | 5 | export const FPS: React.FunctionComponent = memo(() => { 6 | const [fps] = useFPS(); 7 | return ( 8 |
9 | FPS: {fps} 10 |
11 | ); 12 | }); 13 | 14 | FPS.displayName = 'FPS'; 15 | -------------------------------------------------------------------------------- /src/entry/I18N.tsx: -------------------------------------------------------------------------------- 1 | import React, { memo, useCallback } from 'react'; 2 | import { Select } from '@/components'; 3 | import { OptionItem, LanguageType } from '@/types'; 4 | import styles from './index.module.css'; 5 | import { getLanguage, setLanguage, LANGUAGE_LIST } from '@/i18n'; 6 | 7 | const dataList: OptionItem[] = LANGUAGE_LIST.map((v) => ({ 8 | value: v, 9 | label: v, 10 | disabled: false, 11 | })); 12 | const defaultValue = getLanguage(); 13 | 14 | export const I18N: React.FunctionComponent = memo(() => { 15 | const handleChange = useCallback((c: string | number) => { 16 | setLanguage(String(c) as LanguageType); 17 | window.location.reload(); 18 | }, []); 19 | return ( 20 |
21 |