├── .eslintrc.json
├── .github
├── actions
│ ├── deploy-s3-javascript
│ │ ├── action.yml
│ │ ├── dist
│ │ │ └── index.js
│ │ ├── package-lock.json
│ │ ├── package.json
│ │ └── src
│ │ │ └── main.js
│ └── install_dependencies
│ │ └── action.yml
└── workflows
│ ├── deploy_demo.yml
│ └── pull_request_guard.yml
├── .gitignore
├── .npmrc
├── LICENSE
├── README.md
├── demo
├── .eslintrc.json
├── .gitignore
├── README.md
├── package.json
├── pnpm-lock.yaml
├── public
│ ├── bensound-ukulele.mp3
│ ├── favicon.ico
│ ├── index.html
│ ├── logo192.png
│ ├── logo512.png
│ ├── manifest.json
│ └── robots.txt
└── src
│ ├── App.css
│ ├── App.js
│ ├── App.test.js
│ ├── index.css
│ ├── index.js
│ ├── logo.svg
│ ├── reportWebVitals.js
│ └── setupTests.js
├── package.json
├── pnpm-lock.yaml
├── src
├── components
│ ├── Marker.tsx
│ ├── Region.tsx
│ └── WaveForm.tsx
├── constants
│ └── updatableRegionProps.ts
├── containers
│ └── WaveSurfer.tsx
├── contexts
│ └── WaveSurferContext.ts
├── hooks
│ ├── useRegionEvent.ts
│ ├── useRegionPluginEvent.ts
│ ├── useWavesurfer.ts
│ └── useWavesurferContext.ts
├── index.ts
├── types.ts
└── utils
│ ├── createPlugin.ts
│ ├── createWavesurfer.ts
│ ├── getDifference.ts
│ ├── getWaveFormOptionsFromProps.ts
│ └── isReactElement.ts
└── tsconfig.json
/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "browser": true,
4 | "es2021": true
5 | },
6 | "extends": [
7 | "eslint:recommended",
8 | "plugin:@typescript-eslint/recommended",
9 | "plugin:react/recommended"
10 | ],
11 | "parser": "@typescript-eslint/parser",
12 | "parserOptions": {
13 | "ecmaFeatures": {
14 | "jsx": true
15 | },
16 | "ecmaVersion": 13,
17 | "sourceType": "module"
18 | },
19 | "plugins": [
20 | "react",
21 | "@typescript-eslint"
22 | ],
23 | "rules": {
24 | "@typescript-eslint/no-explicit-any": "off"
25 | },
26 | "ignorePatterns": ["demo"],
27 | "settings": {
28 | "react": {
29 | "version": "detect"
30 | }
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/.github/actions/deploy-s3-javascript/action.yml:
--------------------------------------------------------------------------------
1 | name: "Deploy to S3"
2 | description: "Deploy a static website to S3"
3 | inputs:
4 | bucket:
5 | description: "The S3 bucket name"
6 | required: true
7 | bucket-region:
8 | description: "The S3 bucket region"
9 | required: false
10 | default: "ru-central1"
11 | dist-folder:
12 | description: "The folder containing the deployable files"
13 | required: true
14 | outputs:
15 | website-url:
16 | description: "The URL of deployed website"
17 | runs:
18 | using: 'node20'
19 | # All paths below are relative
20 | # to reusable action file location
21 | #
22 | # pre: <-- script executed before
23 | main: 'dist/index.js'
24 | # post: <-- script executed after
25 |
26 |
--------------------------------------------------------------------------------
/.github/actions/deploy-s3-javascript/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "deploy-s3-javascript",
3 | "version": "1.0.0",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "deploy-s3-javascript",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "@actions/core": "^1.10.1",
13 | "@actions/exec": "^1.1.1",
14 | "@actions/github": "^6.0.0",
15 | "@vercel/ncc": "^0.38.1"
16 | }
17 | },
18 | "node_modules/@actions/core": {
19 | "version": "1.10.1",
20 | "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.1.tgz",
21 | "integrity": "sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==",
22 | "dependencies": {
23 | "@actions/http-client": "^2.0.1",
24 | "uuid": "^8.3.2"
25 | }
26 | },
27 | "node_modules/@actions/exec": {
28 | "version": "1.1.1",
29 | "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz",
30 | "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==",
31 | "dependencies": {
32 | "@actions/io": "^1.0.1"
33 | }
34 | },
35 | "node_modules/@actions/github": {
36 | "version": "6.0.0",
37 | "resolved": "https://registry.npmjs.org/@actions/github/-/github-6.0.0.tgz",
38 | "integrity": "sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==",
39 | "dependencies": {
40 | "@actions/http-client": "^2.2.0",
41 | "@octokit/core": "^5.0.1",
42 | "@octokit/plugin-paginate-rest": "^9.0.0",
43 | "@octokit/plugin-rest-endpoint-methods": "^10.0.0"
44 | }
45 | },
46 | "node_modules/@actions/http-client": {
47 | "version": "2.2.0",
48 | "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.0.tgz",
49 | "integrity": "sha512-q+epW0trjVUUHboliPb4UF9g2msf+w61b32tAkFEwL/IwP0DQWgbCMM0Hbe3e3WXSKz5VcUXbzJQgy8Hkra/Lg==",
50 | "dependencies": {
51 | "tunnel": "^0.0.6",
52 | "undici": "^5.25.4"
53 | }
54 | },
55 | "node_modules/@actions/io": {
56 | "version": "1.1.3",
57 | "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.3.tgz",
58 | "integrity": "sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q=="
59 | },
60 | "node_modules/@fastify/busboy": {
61 | "version": "2.1.0",
62 | "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz",
63 | "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==",
64 | "engines": {
65 | "node": ">=14"
66 | }
67 | },
68 | "node_modules/@octokit/auth-token": {
69 | "version": "4.0.0",
70 | "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz",
71 | "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==",
72 | "engines": {
73 | "node": ">= 18"
74 | }
75 | },
76 | "node_modules/@octokit/core": {
77 | "version": "5.1.0",
78 | "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.1.0.tgz",
79 | "integrity": "sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==",
80 | "dependencies": {
81 | "@octokit/auth-token": "^4.0.0",
82 | "@octokit/graphql": "^7.0.0",
83 | "@octokit/request": "^8.0.2",
84 | "@octokit/request-error": "^5.0.0",
85 | "@octokit/types": "^12.0.0",
86 | "before-after-hook": "^2.2.0",
87 | "universal-user-agent": "^6.0.0"
88 | },
89 | "engines": {
90 | "node": ">= 18"
91 | }
92 | },
93 | "node_modules/@octokit/endpoint": {
94 | "version": "9.0.4",
95 | "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.4.tgz",
96 | "integrity": "sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==",
97 | "dependencies": {
98 | "@octokit/types": "^12.0.0",
99 | "universal-user-agent": "^6.0.0"
100 | },
101 | "engines": {
102 | "node": ">= 18"
103 | }
104 | },
105 | "node_modules/@octokit/graphql": {
106 | "version": "7.0.2",
107 | "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.0.2.tgz",
108 | "integrity": "sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==",
109 | "dependencies": {
110 | "@octokit/request": "^8.0.1",
111 | "@octokit/types": "^12.0.0",
112 | "universal-user-agent": "^6.0.0"
113 | },
114 | "engines": {
115 | "node": ">= 18"
116 | }
117 | },
118 | "node_modules/@octokit/openapi-types": {
119 | "version": "19.1.0",
120 | "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-19.1.0.tgz",
121 | "integrity": "sha512-6G+ywGClliGQwRsjvqVYpklIfa7oRPA0vyhPQG/1Feh+B+wU0vGH1JiJ5T25d3g1JZYBHzR2qefLi9x8Gt+cpw=="
122 | },
123 | "node_modules/@octokit/plugin-paginate-rest": {
124 | "version": "9.1.5",
125 | "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.1.5.tgz",
126 | "integrity": "sha512-WKTQXxK+bu49qzwv4qKbMMRXej1DU2gq017euWyKVudA6MldaSSQuxtz+vGbhxV4CjxpUxjZu6rM2wfc1FiWVg==",
127 | "dependencies": {
128 | "@octokit/types": "^12.4.0"
129 | },
130 | "engines": {
131 | "node": ">= 18"
132 | },
133 | "peerDependencies": {
134 | "@octokit/core": ">=5"
135 | }
136 | },
137 | "node_modules/@octokit/plugin-rest-endpoint-methods": {
138 | "version": "10.2.0",
139 | "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.2.0.tgz",
140 | "integrity": "sha512-ePbgBMYtGoRNXDyKGvr9cyHjQ163PbwD0y1MkDJCpkO2YH4OeXX40c4wYHKikHGZcpGPbcRLuy0unPUuafco8Q==",
141 | "dependencies": {
142 | "@octokit/types": "^12.3.0"
143 | },
144 | "engines": {
145 | "node": ">= 18"
146 | },
147 | "peerDependencies": {
148 | "@octokit/core": ">=5"
149 | }
150 | },
151 | "node_modules/@octokit/request": {
152 | "version": "8.1.6",
153 | "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.1.6.tgz",
154 | "integrity": "sha512-YhPaGml3ncZC1NfXpP3WZ7iliL1ap6tLkAp6MvbK2fTTPytzVUyUesBBogcdMm86uRYO5rHaM1xIWxigWZ17MQ==",
155 | "dependencies": {
156 | "@octokit/endpoint": "^9.0.0",
157 | "@octokit/request-error": "^5.0.0",
158 | "@octokit/types": "^12.0.0",
159 | "universal-user-agent": "^6.0.0"
160 | },
161 | "engines": {
162 | "node": ">= 18"
163 | }
164 | },
165 | "node_modules/@octokit/request-error": {
166 | "version": "5.0.1",
167 | "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.0.1.tgz",
168 | "integrity": "sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==",
169 | "dependencies": {
170 | "@octokit/types": "^12.0.0",
171 | "deprecation": "^2.0.0",
172 | "once": "^1.4.0"
173 | },
174 | "engines": {
175 | "node": ">= 18"
176 | }
177 | },
178 | "node_modules/@octokit/types": {
179 | "version": "12.4.0",
180 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-12.4.0.tgz",
181 | "integrity": "sha512-FLWs/AvZllw/AGVs+nJ+ELCDZZJk+kY0zMen118xhL2zD0s1etIUHm1odgjP7epxYU1ln7SZxEUWYop5bhsdgQ==",
182 | "dependencies": {
183 | "@octokit/openapi-types": "^19.1.0"
184 | }
185 | },
186 | "node_modules/@vercel/ncc": {
187 | "version": "0.38.1",
188 | "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.1.tgz",
189 | "integrity": "sha512-IBBb+iI2NLu4VQn3Vwldyi2QwaXt5+hTyh58ggAMoCGE6DJmPvwL3KPBWcJl1m9LYPChBLE980Jw+CS4Wokqxw==",
190 | "bin": {
191 | "ncc": "dist/ncc/cli.js"
192 | }
193 | },
194 | "node_modules/before-after-hook": {
195 | "version": "2.2.3",
196 | "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz",
197 | "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ=="
198 | },
199 | "node_modules/deprecation": {
200 | "version": "2.3.1",
201 | "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
202 | "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
203 | },
204 | "node_modules/once": {
205 | "version": "1.4.0",
206 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
207 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
208 | "dependencies": {
209 | "wrappy": "1"
210 | }
211 | },
212 | "node_modules/tunnel": {
213 | "version": "0.0.6",
214 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
215 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
216 | "engines": {
217 | "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
218 | }
219 | },
220 | "node_modules/undici": {
221 | "version": "5.28.2",
222 | "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.2.tgz",
223 | "integrity": "sha512-wh1pHJHnUeQV5Xa8/kyQhO7WFa8M34l026L5P/+2TYiakvGy5Rdc8jWZVyG7ieht/0WgJLEd3kcU5gKx+6GC8w==",
224 | "dependencies": {
225 | "@fastify/busboy": "^2.0.0"
226 | },
227 | "engines": {
228 | "node": ">=14.0"
229 | }
230 | },
231 | "node_modules/universal-user-agent": {
232 | "version": "6.0.1",
233 | "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz",
234 | "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ=="
235 | },
236 | "node_modules/uuid": {
237 | "version": "8.3.2",
238 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
239 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
240 | "bin": {
241 | "uuid": "dist/bin/uuid"
242 | }
243 | },
244 | "node_modules/wrappy": {
245 | "version": "1.0.2",
246 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
247 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
248 | }
249 | }
250 | }
251 |
--------------------------------------------------------------------------------
/.github/actions/deploy-s3-javascript/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "deploy-s3-javascript",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "dist/index.js",
6 | "scripts": {
7 | "build": "node_modules/.bin/ncc build src/main.js",
8 | "test": "echo \"Error: no test specified\" && exit 1"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "@actions/core": "^1.10.1",
14 | "@actions/exec": "^1.1.1",
15 | "@actions/github": "^6.0.0",
16 | "@vercel/ncc": "^0.38.1"
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/.github/actions/deploy-s3-javascript/src/main.js:
--------------------------------------------------------------------------------
1 | const core = require('@actions/core');
2 | const exec = require('@actions/exec');
3 |
4 | function run() {
5 | // get some inputs
6 | const bucket$ = core.getInput('bucket', { required: true });
7 | const bucketRegion$ = core.getInput('bucket-region', { required: true });
8 | const dist$ = core.getInput('dist-folder', { required: true });
9 |
10 |
11 |
12 | // upload to S3
13 | const s3URI = `s3://${bucket$}`;
14 |
15 | exec.exec(`aws s3 sync ${dist$} ${s3URI} --region ${bucketRegion$} --endpoint-url=https://storage.yandexcloud.net`)
16 |
17 | const website$ = `https://${bucket$}.website.yandexcloud.net`;
18 | core.setOutput('website-url', website$);
19 | }
20 |
21 | run();
22 |
--------------------------------------------------------------------------------
/.github/actions/install_dependencies/action.yml:
--------------------------------------------------------------------------------
1 | name: 'Yarn'
2 |
3 | description: 'Install node modules'
4 |
5 | runs:
6 | using: 'composite'
7 | steps:
8 | - name: Install pnpm
9 | uses: pnpm/action-setup@v4
10 | with:
11 | version: 9
12 |
13 | - name: Use Node.js 20
14 | uses: actions/setup-node@v4
15 | with:
16 | node-version: 20
17 | cache: 'pnpm'
18 |
19 | - name: Install dependencies
20 | shell: bash
21 | run: pnpm install
--------------------------------------------------------------------------------
/.github/workflows/deploy_demo.yml:
--------------------------------------------------------------------------------
1 | name: Deploy Demo
2 | on:
3 | push:
4 | branches:
5 | - master
6 | paths-ignore:
7 | - '*.md' # all MD files
8 | - '.eslintrc.json'
9 | - 'LICENSE'
10 | - '.gitignore'
11 | workflow_dispatch:
12 | jobs:
13 | lint:
14 | runs-on: ubuntu-latest
15 | steps:
16 | - name: Checkout
17 | uses: actions/checkout@v4
18 |
19 | - name: Install dependencies
20 | uses: ./.github/actions/install_dependencies
21 |
22 | - name: Lint
23 | run: |
24 | pnpm run lint
25 | deploy:
26 | needs: [ lint ]
27 | runs-on: ubuntu-latest
28 | steps:
29 | - name: Checkout
30 | uses: actions/checkout@v4
31 |
32 | - name: Install dependencies
33 | uses: ./.github/actions/install_dependencies
34 |
35 | - name: Build
36 | run: |
37 | pnpm run build
38 |
39 | # вложить дистрибутив в папку с демо по правильному пути
40 | - name: Move dist
41 | run: |
42 | pnpm run demo:sync
43 |
44 | - name: Install demo dependencies
45 | run: |
46 | cd ./demo && pnpm install --frozen-lockfile
47 |
48 | - name: Build demo
49 | run: |
50 | pnpm run build:demo
51 |
52 | - name: Upload artifacts
53 | uses: actions/upload-artifact@v4
54 | with:
55 | name: demo-dist
56 | path: demo/build
57 |
58 | # папку с демо отправить в бакет
59 | - name: Deploy
60 | uses: ./.github/actions/deploy-s3-javascript
61 | id: deploy
62 | env:
63 | AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
64 | AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
65 | with:
66 | bucket: wavesurfer-react
67 | dist-folder: ./demo/build
68 | - name: Output information
69 | run: |
70 | echo "Live URL: ${{ steps.deploy.outputs.website-url }}"
71 |
--------------------------------------------------------------------------------
/.github/workflows/pull_request_guard.yml:
--------------------------------------------------------------------------------
1 | name: Pull Request Guard
2 | on: [pull_request]
3 |
4 | jobs:
5 | eslint:
6 | runs-on: ubuntu-latest
7 | steps:
8 | - uses: actions/checkout@v4
9 |
10 | - uses: ./.github/actions/install_dependencies
11 |
12 | - name: Lint
13 | run: pnpm run lint
14 |
15 | build:
16 | needs: eslint
17 | runs-on: ubuntu-latest
18 | steps:
19 | - uses: actions/checkout@v4
20 |
21 | - uses: ./.github/actions/install_dependencies
22 |
23 | - name: Build
24 | run: pnpm run build
25 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 | **/node_modules/
3 | dist
4 | demo_dist
5 | !/.github/actions/**/dist
6 | npm-debug.log
7 | debug.log
8 |
9 | /demo/src/wavesurfer-react
10 |
11 | __dev__
12 |
--------------------------------------------------------------------------------
/.npmrc:
--------------------------------------------------------------------------------
1 | auto-install-peers=true
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Denis Bogdanenko
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 |
2 |
3 |
Wavesurfer React
4 |
5 | [](https://bundlephobia.com/package/wavesurfer-react)
6 | [](https://bundlephobia.com/package/wavesurfer-react)
7 | [](https://npmjs.com/package/wavesurfer-react)
8 |
9 | A simple wrapper around an awesome library called [wavesurfer.js](https://wavesurfer-js.org).
10 |
11 | The purpose of the package is to provide an abstraction over wavesurfer.js API
12 | and to do it as close to react style of doing things as its maintainer(-s) can provide.
13 |
14 | **LiveDemo:**
15 |
16 | [
](https://codesandbox.io/p/sandbox/wavesurfer-react-3-0-w8vr3m)
17 |
18 | [
19 | ](https://wavesurfer-react.website.yandexcloud.net)
20 |
21 | > [!IMPORTANT]
22 | > Since October 2023 I am occupied on a full-time job where it's not currently required to use any audio related modules.
23 | > I'll try to pay as much attention as possible for this repo, but not as much as previously because I need to prioritize things.
24 | > I'll keep this module to be as simple as possible and open to contributions.
25 |
26 | # Table of Contents
27 |
28 | - [Wavesurfer React](#wavesurfer-react)
29 | * [User Guide](#user-guide)
30 | + [Components](#components)
31 | - [WaveSurfer](#wavesurfer)
32 | - [WaveForm](#waveform)
33 | - [Region](#region)
34 | - [Marker](#region)
35 | + [Hooks](#hooks)
36 | - [useWavesurfer](#usewavesurfer)
37 | - [useRegionEvent](#useregionevent)
38 | - [useRegionsPluginEvent](#useregionpluginevent)
39 | - [useWaveSurferContext](#usewavesurfercontext)
40 | * [Known Issues and Workarounds](#known-issues-and-workarounds)
41 |
42 |
43 |
44 | ## User Guide
45 |
46 | ### Components
47 | Package provides the following set of components:
48 | 1. WaveSurfer
49 | 2. WaveForm
50 | 3. Region
51 |
52 | #### WaveSurfer
53 | Core component of the package.
54 | It creates wavesurfer instance and watches for changes in plugins list.
55 | It accepts the following props set:
56 | 1. plugins
57 | 2. onMount
58 |
59 | ##### Plugins Prop
60 |
61 | It is a list of plugins to use by WaveSurfer and has the following format:
62 | ```jsx
63 | import { WaveSurfer } from 'wavesurfer-react';
64 | import RegionsPlugin from "wavesurfer.js/dist/plugins/regions";
65 | import TimelinePlugin from "wavesurfer.js/dist/plugins/timeline";
66 | import MyCustomPlugin from 'my-custom-plugin-path';
67 |
68 | const plugins = [
69 | {
70 | plugin: RegionsPlugin,
71 | key: "regions",
72 | options: { dragSelection: true }
73 | },
74 | {
75 | plugin: TimelinePlugin,
76 | key: "timeline",
77 | options: {
78 | container: "#timeline"
79 | }
80 | },
81 | {
82 | plugin: MyCustomPlugin,
83 | key: "my-custom-plugin",
84 | options: {
85 | someGreatOption: 'someGreatValue'
86 | },
87 | creator: 'myCustomCreate'
88 | }
89 | ];
90 |
91 |
92 | ```
93 |
94 | The `plugins` prop is watched inside WaveSurfer.
95 | If plugin was disabled (it's not enlisted in `plugins` prop) it will be destroyed,
96 | otherwise added to wavesurfer plugins list and immediately initialized.
97 |
98 | To correctly track initialized plugins, `key` property is used in item of `plugins` array.
99 |
100 | ##### onMount prop
101 | It is a function, that is called after WaveSurfer instance has been mounted.
102 | It has only one argument - WaveSurfer instance.
103 |
104 | ##### WaveSurfer Options
105 | You can pass here all options that is used to configure wavesurfer, i.e. [full list of available options](https://wavesurfer-js.org/docs/options.html).
106 |
107 | #### WaveForm
108 | It is used as an alias for:
109 | ```html
110 |
111 | ```
112 |
113 |
114 |
115 | #### Region
116 | Think of it as a some kind of helper component.
117 | It can be used to imperatively control regions, appearing on WaveForm if you're using RegionsPlugin.
118 | If region is already present of WaveForm it creation will be avoided and existing instance is used.
119 | On mount, it will try to find region with the same region identifier and then attaches itself to it.
120 | If the Region component did not find an appropriate region, then it creates a region itself.
121 |
122 | It accepts the following props:
123 | 1. onOver - is called when mouse enters a region
124 | 2. onLeave - is called when moused leaves a region
125 | 3. onClick - is called on a mouse click on a region
126 | 4. onDoubleClick - is called on double click
127 | 5. onIn - is called when playback enters a region
128 | 6. onOut - is called when playback leaves a region
129 | 7. onRemove - is called just before region remove
130 | 8. onUpdate - is called on each region's options update
131 | 9. onUpdateEnd - is called when dragging or resizing are finished
132 |
133 | Rest given props are passed as region's data into wavesurfer.
134 |
135 | #### Marker
136 | Special component using Region under the hood to display only markers.
137 | Marker await all props of Region except `end` prop.
138 |
139 | ### Hooks
140 |
141 | Package provides the following set of hooks:
142 | 1. useWavesurfer
143 | 2. useRegionEvent
144 | 3. useRegionPluginEvent
145 | 4. useWaveSurferContext
146 |
147 | #### useWavesurfer
148 | This hook is used inside WaveSurfer and its purpose is to create wavesurfer instance and return it.
149 | It also handles a task of creating and destroying wavesurfer plugins, after `plugins` prop update detection.
150 |
151 | You can use it standalone to create you own (more specific) wavesurfer component that will handle more than a component that is provided out-of-the-box.
152 |
153 | #### useRegionEvent
154 | Is used inside the `Region` component to subscribe to region-related events.
155 | Can be used by developers, if they wanna to, inside a HOC-like component over `Region` component
156 | that is provided by the package or any other component, that is rendered inside `WaveSurfer` component,
157 | but for the latter task you will have to get region instance first.
158 |
159 | #### useRegionPluginEvent
160 | Is used inside the `Region` component to subscribe to region plugin related events.
161 | Can be used by developers, if they wanna to, inside a HOC-like component over `Region` component
162 | that is provided by the package or any other component, that is rendered inside `WaveSurfer` component,
163 | but for the latter task you will have to get regions plugin instance first.
164 |
165 | #### useWaveSurferContext
166 | Returns a tuple of:
167 | 1. wavesurfer instance,
168 | 2. mapped object of enabled plugins keyed by the `key` property passed alongside a plugin,
169 | 3. an array containing these plugins.
170 |
171 | ## Known Issues and Workarounds
172 | ### Regions desynchronization
173 | Issues with regions synchronization when using redux and `Region` component.
174 | Try to not hard-bind redux-state with wavesurfer-react too tight or use an instance of wavesurfer to operate regions.
175 |
176 | ### Timeline issues
177 | [**FIXED**](https://github.com/katspaugh/wavesurfer.js/pull/3327/files): Timeline is not visible after removing it from plugins array and adding again. I hope it is a temporal issue with the original package.
178 | Comments related to this issue are:
179 | [Comment #1](https://github.com/ShiiRochi/wavesurfer-react/issues/72#issuecomment-1793807986)
180 | [Comment #2](https://github.com/ShiiRochi/wavesurfer-react/issues/72#issuecomment-1793968082)
181 | [Comment #3](https://github.com/ShiiRochi/wavesurfer-react/issues/72#issuecomment-1794293542)
182 |
183 | **INFO**: use `wavesurfer.js@^7.4.5` to have this issue fixed
184 |
185 | **Solution** to this problem is **to execute** `wavesurfer.setOptions({})`, right after Timeline plugin is added again via `plugins` prop second time and further.
186 |
187 | ## Infographics
188 |
189 | ### Stars History
190 |
191 | Thanks for your support and contributions!
192 |
193 | [](https://star-history.com/#ShiiRochi/wavesurfer-react&Date)
194 |
195 |
196 | ## Credits
197 |
198 | Logo: Facebook, React-icon, place another image at the center of this image by shiirochi@yandex.ru, CC BY-SA 1.0
199 |
--------------------------------------------------------------------------------
/demo/.eslintrc.json:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "browser": true,
4 | "es2021": true
5 | },
6 | "root": true,
7 | "extends": [
8 | "eslint:recommended",
9 | "plugin:react/recommended"
10 | ],
11 | "rules": {
12 | "react/prop-types": "off",
13 | "@typescript-eslint/no-explicit-any": "off"
14 | },
15 | "ignorePatterns": ["demo"],
16 | "settings": {
17 | "react": {
18 | "version": "detect"
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/demo/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # production
12 | /build
13 |
14 | # misc
15 | .DS_Store
16 | .env.local
17 | .env.development.local
18 | .env.test.local
19 | .env.production.local
20 |
21 | npm-debug.log*
22 | yarn-debug.log*
23 | yarn-error.log*
24 |
--------------------------------------------------------------------------------
/demo/README.md:
--------------------------------------------------------------------------------
1 | # Getting Started with Create React App
2 |
3 | This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
4 |
5 | ## Available Scripts
6 |
7 | In the project directory, you can run:
8 |
9 | ### `npm start`
10 |
11 | Runs the app in the development mode.\
12 | Open [http://localhost:3000](http://localhost:3000) to view it in your browser.
13 |
14 | The page will reload when you make changes.\
15 | You may also see any lint errors in the console.
16 |
17 | ### `npm test`
18 |
19 | Launches the test runner in the interactive watch mode.\
20 | See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
21 |
22 | ### `npm run build`
23 |
24 | Builds the app for production to the `build` folder.\
25 | It correctly bundles React in production mode and optimizes the build for the best performance.
26 |
27 | The build is minified and the filenames include the hashes.\
28 | Your app is ready to be deployed!
29 |
30 | See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
31 |
32 | ### `npm run eject`
33 |
34 | **Note: this is a one-way operation. Once you `eject`, you can't go back!**
35 |
36 | If you aren't satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
37 |
38 | Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you're on your own.
39 |
40 | You don't have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn't feel obligated to use this feature. However we understand that this tool wouldn't be useful if you couldn't customize it when you are ready for it.
41 |
42 | ## Learn More
43 |
44 | You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
45 |
46 | To learn React, check out the [React documentation](https://reactjs.org/).
47 |
48 | ### Code Splitting
49 |
50 | This section has moved here: [https://facebook.github.io/create-react-app/docs/code-splitting](https://facebook.github.io/create-react-app/docs/code-splitting)
51 |
52 | ### Analyzing the Bundle Size
53 |
54 | This section has moved here: [https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size](https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size)
55 |
56 | ### Making a Progressive Web App
57 |
58 | This section has moved here: [https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app](https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app)
59 |
60 | ### Advanced Configuration
61 |
62 | This section has moved here: [https://facebook.github.io/create-react-app/docs/advanced-configuration](https://facebook.github.io/create-react-app/docs/advanced-configuration)
63 |
64 | ### Deployment
65 |
66 | This section has moved here: [https://facebook.github.io/create-react-app/docs/deployment](https://facebook.github.io/create-react-app/docs/deployment)
67 |
68 | ### `npm run build` fails to minify
69 |
70 | This section has moved here: [https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify](https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify)
71 |
--------------------------------------------------------------------------------
/demo/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "demo",
3 | "version": "0.1.1",
4 | "private": true,
5 | "dependencies": {
6 | "@testing-library/jest-dom": "^5.16.5",
7 | "@testing-library/react": "^13.4.0",
8 | "@testing-library/user-event": "^13.5.0",
9 | "react": "^18.2.0",
10 | "react-dom": "^18.2.0",
11 | "react-scripts": "5.0.1",
12 | "styled-components": "^6.1.0",
13 | "wavesurfer.js": "^7.4.12",
14 | "web-vitals": "^2.1.4",
15 | "wavesurfer-react": "../../wavesurfer-react-artifacts/demo_dist"
16 | },
17 | "scripts": {
18 | "start": "react-scripts start",
19 | "build": "react-scripts build",
20 | "test": "react-scripts test",
21 | "eject": "react-scripts eject"
22 | },
23 | "browserslist": {
24 | "production": [
25 | ">0.2%",
26 | "not dead",
27 | "not op_mini all"
28 | ],
29 | "development": [
30 | "last 1 chrome version",
31 | "last 1 firefox version",
32 | "last 1 safari version"
33 | ]
34 | }
35 | }
36 |
--------------------------------------------------------------------------------
/demo/public/bensound-ukulele.mp3:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiiRochi/wavesurfer-react/a4282efaef8cf57549fc3febd6a6ba2d9fb6aa26/demo/public/bensound-ukulele.mp3
--------------------------------------------------------------------------------
/demo/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiiRochi/wavesurfer-react/a4282efaef8cf57549fc3febd6a6ba2d9fb6aa26/demo/public/favicon.ico
--------------------------------------------------------------------------------
/demo/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
12 |
13 |
17 |
18 |
27 | React App
28 |
29 |
30 |
31 |
32 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/demo/public/logo192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiiRochi/wavesurfer-react/a4282efaef8cf57549fc3febd6a6ba2d9fb6aa26/demo/public/logo192.png
--------------------------------------------------------------------------------
/demo/public/logo512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiiRochi/wavesurfer-react/a4282efaef8cf57549fc3febd6a6ba2d9fb6aa26/demo/public/logo512.png
--------------------------------------------------------------------------------
/demo/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "React App",
3 | "name": "Create React App Sample",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "64x64 32x32 24x24 16x16",
8 | "type": "image/x-icon"
9 | },
10 | {
11 | "src": "logo192.png",
12 | "type": "image/png",
13 | "sizes": "192x192"
14 | },
15 | {
16 | "src": "logo512.png",
17 | "type": "image/png",
18 | "sizes": "512x512"
19 | }
20 | ],
21 | "start_url": ".",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/demo/public/robots.txt:
--------------------------------------------------------------------------------
1 | # https://www.robotstxt.org/robotstxt.html
2 | User-agent: *
3 | Disallow:
4 |
--------------------------------------------------------------------------------
/demo/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | font-family: sans-serif;
3 | text-align: center;
4 | }
5 |
--------------------------------------------------------------------------------
/demo/src/App.js:
--------------------------------------------------------------------------------
1 | import React, {
2 | useCallback,
3 | useEffect,
4 | useRef,
5 | useState,
6 | useMemo
7 | } from "react";
8 | import styled from "styled-components";
9 | import { WaveSurfer, WaveForm, Region, Marker } from "wavesurfer-react";
10 | import "./App.css";
11 | import RegionsPlugin from "wavesurfer.js/dist/plugins/regions";
12 | import TimelinePlugin from "wavesurfer.js/dist/plugins/timeline";
13 |
14 | const Buttons = styled.div`
15 | display: inline-block;
16 | `;
17 |
18 | const Button = styled.button``;
19 |
20 | /**
21 | * @param min
22 | * @param max
23 | * @returns {*}
24 | */
25 | function generateNum(min, max) {
26 | return Math.random() * (max - min + 1) + min;
27 | }
28 |
29 | /**
30 | * @param distance
31 | * @param min
32 | * @param max
33 | * @returns {([*, *]|[*, *])|*[]}
34 | */
35 | function generateTwoNumsWithDistance(distance, min, max) {
36 | const num1 = generateNum(min, max);
37 | const num2 = generateNum(min, max);
38 | // if num2 - num1 < 10
39 | if (num2 - num1 >= 10) {
40 | return [num1, num2];
41 | }
42 | return generateTwoNumsWithDistance(distance, min, max);
43 | }
44 |
45 | function App() {
46 | const [timelineVis, setTimelineVis] = useState(false);
47 | const [isLoaded, setIsLoaded] = useState(false);
48 |
49 | const [markers, setMarkers] = useState([
50 | {
51 | time: 5.5,
52 | label: "V1",
53 | color: "#ff990a",
54 | draggable: true
55 | },
56 | {
57 | time: 10,
58 | label: "V2",
59 | color: "#00ffcc",
60 | position: "top"
61 | }
62 | ]);
63 |
64 | const plugins = useMemo(() => {
65 | return [
66 | {
67 | key: "regions",
68 | plugin: RegionsPlugin,
69 | options: { dragSelection: true }
70 | },
71 | timelineVis && {
72 | key: "top-timeline",
73 | plugin: TimelinePlugin,
74 | options: {
75 | height: 20,
76 | insertPosition: 'beforebegin',
77 | style: {
78 | color: '#2D5B88',
79 | }
80 | }
81 | },
82 | timelineVis && {
83 | key: "bottom-timeline",
84 | plugin: TimelinePlugin,
85 | options: {
86 | height: 10,
87 | style: {
88 | color: '#6A3274',
89 | }
90 | }
91 | }
92 | ].filter(Boolean);
93 | }, [timelineVis]);
94 |
95 | const toggleTimeline = useCallback(() => {
96 | setTimelineVis(!timelineVis);
97 | }, [timelineVis]);
98 |
99 | const [regions, setRegions] = useState([
100 | {
101 | id: "region-1",
102 | start: 0.5,
103 | end: 10,
104 | color: "rgba(0, 0, 0, .5)",
105 | data: {
106 | systemRegionId: 31
107 | }
108 | },
109 | {
110 | id: "region-2",
111 | start: 5,
112 | end: 25,
113 | color: "rgba(225, 195, 100, .5)",
114 | data: {
115 | systemRegionId: 32
116 | }
117 | },
118 | {
119 | id: "region-3",
120 | start: 15,
121 | end: 35,
122 | color: "rgba(25, 95, 195, .5)",
123 | data: {
124 | systemRegionId: 33
125 | }
126 | }
127 | ]);
128 |
129 | // use regions ref to pass it inside useCallback
130 | // so it will use always the most fresh version of regions list
131 | const regionsRef = useRef(regions);
132 |
133 | useEffect(() => {
134 | regionsRef.current = regions;
135 | }, [regions]);
136 |
137 | const regionCreatedHandler = useCallback(
138 | (region) => {
139 | console.log("region-created --> region:", region);
140 |
141 | if (region.data.systemRegionId) return;
142 |
143 | setRegions([
144 | ...regionsRef.current,
145 | { ...region, data: { ...region.data, systemRegionId: -1 } }
146 | ]);
147 | },
148 | [regionsRef]
149 | );
150 |
151 | const wavesurferRef = useRef();
152 |
153 | const handleWSMount = useCallback(
154 | (waveSurfer) => {
155 | wavesurferRef.current = waveSurfer;
156 |
157 | if (wavesurferRef.current) {
158 | wavesurferRef.current.load("/bensound-ukulele.mp3");
159 |
160 | wavesurferRef.current.on("region-created", regionCreatedHandler);
161 |
162 | wavesurferRef.current.on("ready", () => {
163 | console.log("WaveSurfer is ready");
164 | setIsLoaded(true);
165 | });
166 |
167 | wavesurferRef.current.on("region-removed", (region) => {
168 | console.log("region-removed --> ", region);
169 | });
170 |
171 | wavesurferRef.current.on("loading", (data) => {
172 | console.log("loading --> ", data);
173 | });
174 |
175 | if (window) {
176 | window.surferidze = wavesurferRef.current;
177 | }
178 | }
179 | },
180 | [regionCreatedHandler]
181 | );
182 |
183 | const generateRegion = useCallback(() => {
184 | if (!wavesurferRef.current) return;
185 | const minTimestampInSeconds = 0;
186 | const maxTimestampInSeconds = wavesurferRef.current.getDuration();
187 | const distance = generateNum(0, 10);
188 | const [min, max] = generateTwoNumsWithDistance(
189 | distance,
190 | minTimestampInSeconds,
191 | maxTimestampInSeconds
192 | );
193 |
194 | const r = generateNum(0, 255);
195 | const g = generateNum(0, 255);
196 | const b = generateNum(0, 255);
197 |
198 | setRegions([
199 | ...regions,
200 | {
201 | id: `custom-${generateNum(0, 9999)}`,
202 | start: min,
203 | end: max,
204 | color: `rgba(${r}, ${g}, ${b}, 0.5)`
205 | }
206 | ]);
207 | }, [regions, wavesurferRef]);
208 | const generateMarker = useCallback(() => {
209 | if (!wavesurferRef.current) return;
210 | const minTimestampInSeconds = 0;
211 | const maxTimestampInSeconds = wavesurferRef.current.getDuration();
212 | const distance = generateNum(0, 10);
213 | const [min] = generateTwoNumsWithDistance(
214 | distance,
215 | minTimestampInSeconds,
216 | maxTimestampInSeconds
217 | );
218 |
219 | const r = generateNum(0, 255);
220 | const g = generateNum(0, 255);
221 | const b = generateNum(0, 255);
222 |
223 | setMarkers([
224 | ...markers,
225 | {
226 | label: `custom-${generateNum(0, 9999)}`,
227 | time: min,
228 | color: `rgba(${r}, ${g}, ${b}, 0.5)`
229 | }
230 | ]);
231 | }, [markers, wavesurferRef]);
232 |
233 | const removeLastRegion = useCallback(() => {
234 | let nextRegions = [...regions];
235 |
236 | nextRegions.pop();
237 |
238 | setRegions(nextRegions);
239 | }, [regions]);
240 | const removeLastMarker = useCallback(() => {
241 | let nextMarkers = [...markers];
242 |
243 | nextMarkers.pop();
244 |
245 | setMarkers(nextMarkers);
246 | }, [markers]);
247 |
248 | const shuffleLastMarker = useCallback(() => {
249 | setMarkers((prev) => {
250 | const next = [...prev];
251 | let lastIndex = next.length - 1;
252 |
253 | const minTimestampInSeconds = 0;
254 | const maxTimestampInSeconds = wavesurferRef.current.getDuration();
255 | const distance = generateNum(0, 10);
256 | const [min] = generateTwoNumsWithDistance(
257 | distance,
258 | minTimestampInSeconds,
259 | maxTimestampInSeconds
260 | );
261 |
262 | next[lastIndex] = {
263 | ...next[lastIndex],
264 | time: min
265 | };
266 |
267 | return next;
268 | });
269 | }, []);
270 |
271 | const play = useCallback(() => {
272 | wavesurferRef.current.playPause();
273 | }, []);
274 |
275 | const handleRegionUpdate = useCallback((region, smth) => {
276 | console.log("region-update-end --> region:", region);
277 | console.log(smth);
278 | }, []);
279 |
280 | const handleMarkerUpdate = useCallback((marker, smth) => {
281 | console.log("region-update-end --> marker:", marker);
282 | console.log(smth);
283 | }, []);
284 |
285 | const setZoom50 = () => {
286 | wavesurferRef.current.zoom(50);
287 | };
288 |
289 | return (
290 |
291 |
292 |
293 | {isLoaded && regions.map((regionProps) => (
294 |
299 | ))}
300 | {isLoaded && markers.map(markerProps => (
301 |
309 | ))}
310 |
311 |
312 |
313 |
314 |
315 |
316 |
317 |
318 |
319 |
320 |
321 |
322 |
323 |
324 | );
325 | }
326 |
327 | export default App;
328 |
--------------------------------------------------------------------------------
/demo/src/App.test.js:
--------------------------------------------------------------------------------
1 | import { render, screen } from '@testing-library/react';
2 | import App from './App';
3 |
4 | test('renders learn react link', () => {
5 | render();
6 | const linkElement = screen.getByText(/learn react/i);
7 | expect(linkElement).toBeInTheDocument();
8 | });
9 |
--------------------------------------------------------------------------------
/demo/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
4 | 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
12 | monospace;
13 | }
14 |
--------------------------------------------------------------------------------
/demo/src/index.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom/client';
3 | import './index.css';
4 | import App from './App';
5 | import reportWebVitals from './reportWebVitals';
6 |
7 | const root = ReactDOM.createRoot(document.getElementById('root'));
8 | root.render(
9 |
10 |
11 |
12 | );
13 |
14 | // If you want to start measuring performance in your app, pass a function
15 | // to log results (for example: reportWebVitals(console.log))
16 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
17 | reportWebVitals();
18 |
--------------------------------------------------------------------------------
/demo/src/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/demo/src/reportWebVitals.js:
--------------------------------------------------------------------------------
1 | const reportWebVitals = onPerfEntry => {
2 | if (onPerfEntry && onPerfEntry instanceof Function) {
3 | import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
4 | getCLS(onPerfEntry);
5 | getFID(onPerfEntry);
6 | getFCP(onPerfEntry);
7 | getLCP(onPerfEntry);
8 | getTTFB(onPerfEntry);
9 | });
10 | }
11 | };
12 |
13 | export default reportWebVitals;
14 |
--------------------------------------------------------------------------------
/demo/src/setupTests.js:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import '@testing-library/jest-dom';
6 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "wavesurfer-react",
3 | "version": "3.0.4",
4 | "description": "react wrapper for wavesurfer.js",
5 | "keywords": [
6 | "react",
7 | "wavesurfer.js"
8 | ],
9 | "license": "MIT",
10 | "main": "dist/index.js",
11 | "types": "dist/index.d.ts",
12 | "author": "Denis Bogdanenko ",
13 | "scripts": {
14 | "test": "echo \"Error: no test specified\" && exit 1",
15 | "prebuild": "rimraf dist/*",
16 | "build": "tsc",
17 | "prepublishOnly": "pnpm run build",
18 | "build:dev": "pnpm run build && pnpm run demo:sync && cd ./demo && pnpm install",
19 | "build:demo": "cd ./demo && pnpm run build",
20 | "start:demo": "cd ./demo && pnpm run start",
21 | "demo:sync": "rm -rf ../wavesurfer-react-artifacts/demo_dist && mkdir -p ../wavesurfer-react-artifacts && rsync -aRv ./dist ../wavesurfer-react-artifacts/demo_dist && cp package.json pnpm-lock.yaml README.md ../wavesurfer-react-artifacts/demo_dist",
22 | "lint": "eslint --ext .ts src --fix"
23 | },
24 | "peerDependencies": {
25 | "react": "^16 || ^17 || ^18 || ^19",
26 | "wavesurfer.js": "^7"
27 | },
28 | "devDependencies": {
29 | "@babel/preset-typescript": "^7.16.7",
30 | "@types/react": "^17.0.38",
31 | "@typescript-eslint/eslint-plugin": "^6.11.0",
32 | "@typescript-eslint/parser": "^6.11.0",
33 | "eslint": "^8.7.0",
34 | "eslint-config-prettier": "^8.3.0",
35 | "eslint-plugin-prettier": "^4.0.0",
36 | "eslint-plugin-react": "^7.28.0",
37 | "prettier": "^2.5.1",
38 | "rimraf": "^3.0.2",
39 | "typescript": "^5.2.2"
40 | },
41 | "browserslist": [
42 | ">0.2%",
43 | "not dead",
44 | "not ie <= 11",
45 | "not op_mini all"
46 | ],
47 | "repository": {
48 | "type": "git",
49 | "url": "git+https://github.com/ShiiRochi/wavesurfer-react.git"
50 | },
51 | "bugs": {
52 | "url": "https://github.com/ShiiRochi/wavesurfer-react/issues"
53 | },
54 | "homepage": "https://github.com/ShiiRochi/wavesurfer-react#readme"
55 | }
56 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: '9.0'
2 |
3 | settings:
4 | autoInstallPeers: true
5 | excludeLinksFromLockfile: false
6 |
7 | importers:
8 |
9 | .:
10 | dependencies:
11 | react:
12 | specifier: ^16 || ^17 || ^18 || ^19
13 | version: 18.3.1
14 | wavesurfer.js:
15 | specifier: ^7
16 | version: 7.8.2
17 | devDependencies:
18 | '@babel/preset-typescript':
19 | specifier: ^7.16.7
20 | version: 7.24.7(@babel/core@7.24.9)
21 | '@types/react':
22 | specifier: ^17.0.38
23 | version: 17.0.80
24 | '@typescript-eslint/eslint-plugin':
25 | specifier: ^6.11.0
26 | version: 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)
27 | '@typescript-eslint/parser':
28 | specifier: ^6.11.0
29 | version: 6.21.0(eslint@8.57.0)(typescript@5.5.3)
30 | eslint:
31 | specifier: ^8.7.0
32 | version: 8.57.0
33 | eslint-config-prettier:
34 | specifier: ^8.3.0
35 | version: 8.10.0(eslint@8.57.0)
36 | eslint-plugin-prettier:
37 | specifier: ^4.0.0
38 | version: 4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8)
39 | eslint-plugin-react:
40 | specifier: ^7.28.0
41 | version: 7.34.4(eslint@8.57.0)
42 | prettier:
43 | specifier: ^2.5.1
44 | version: 2.8.8
45 | rimraf:
46 | specifier: ^3.0.2
47 | version: 3.0.2
48 | typescript:
49 | specifier: ^5.2.2
50 | version: 5.5.3
51 |
52 | packages:
53 |
54 | '@ampproject/remapping@2.3.0':
55 | resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
56 | engines: {node: '>=6.0.0'}
57 |
58 | '@babel/code-frame@7.24.7':
59 | resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==}
60 | engines: {node: '>=6.9.0'}
61 |
62 | '@babel/compat-data@7.24.9':
63 | resolution: {integrity: sha512-e701mcfApCJqMMueQI0Fb68Amflj83+dvAvHawoBpAz+GDjCIyGHzNwnefjsWJ3xiYAqqiQFoWbspGYBdb2/ng==}
64 | engines: {node: '>=6.9.0'}
65 |
66 | '@babel/core@7.24.9':
67 | resolution: {integrity: sha512-5e3FI4Q3M3Pbr21+5xJwCv6ZT6KmGkI0vw3Tozy5ODAQFTIWe37iT8Cr7Ice2Ntb+M3iSKCEWMB1MBgKrW3whg==}
68 | engines: {node: '>=6.9.0'}
69 |
70 | '@babel/generator@7.24.10':
71 | resolution: {integrity: sha512-o9HBZL1G2129luEUlG1hB4N/nlYNWHnpwlND9eOMclRqqu1YDy2sSYVCFUZwl8I1Gxh+QSRrP2vD7EpUmFVXxg==}
72 | engines: {node: '>=6.9.0'}
73 |
74 | '@babel/helper-annotate-as-pure@7.24.7':
75 | resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==}
76 | engines: {node: '>=6.9.0'}
77 |
78 | '@babel/helper-compilation-targets@7.24.8':
79 | resolution: {integrity: sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==}
80 | engines: {node: '>=6.9.0'}
81 |
82 | '@babel/helper-create-class-features-plugin@7.24.8':
83 | resolution: {integrity: sha512-4f6Oqnmyp2PP3olgUMmOwC3akxSm5aBYraQ6YDdKy7NcAMkDECHWG0DEnV6M2UAkERgIBhYt8S27rURPg7SxWA==}
84 | engines: {node: '>=6.9.0'}
85 | peerDependencies:
86 | '@babel/core': ^7.0.0
87 |
88 | '@babel/helper-environment-visitor@7.24.7':
89 | resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==}
90 | engines: {node: '>=6.9.0'}
91 |
92 | '@babel/helper-function-name@7.24.7':
93 | resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==}
94 | engines: {node: '>=6.9.0'}
95 |
96 | '@babel/helper-hoist-variables@7.24.7':
97 | resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==}
98 | engines: {node: '>=6.9.0'}
99 |
100 | '@babel/helper-member-expression-to-functions@7.24.8':
101 | resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==}
102 | engines: {node: '>=6.9.0'}
103 |
104 | '@babel/helper-module-imports@7.24.7':
105 | resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==}
106 | engines: {node: '>=6.9.0'}
107 |
108 | '@babel/helper-module-transforms@7.24.9':
109 | resolution: {integrity: sha512-oYbh+rtFKj/HwBQkFlUzvcybzklmVdVV3UU+mN7n2t/q3yGHbuVdNxyFvSBO1tfvjyArpHNcWMAzsSPdyI46hw==}
110 | engines: {node: '>=6.9.0'}
111 | peerDependencies:
112 | '@babel/core': ^7.0.0
113 |
114 | '@babel/helper-optimise-call-expression@7.24.7':
115 | resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==}
116 | engines: {node: '>=6.9.0'}
117 |
118 | '@babel/helper-plugin-utils@7.24.8':
119 | resolution: {integrity: sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==}
120 | engines: {node: '>=6.9.0'}
121 |
122 | '@babel/helper-replace-supers@7.24.7':
123 | resolution: {integrity: sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==}
124 | engines: {node: '>=6.9.0'}
125 | peerDependencies:
126 | '@babel/core': ^7.0.0
127 |
128 | '@babel/helper-simple-access@7.24.7':
129 | resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==}
130 | engines: {node: '>=6.9.0'}
131 |
132 | '@babel/helper-skip-transparent-expression-wrappers@7.24.7':
133 | resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==}
134 | engines: {node: '>=6.9.0'}
135 |
136 | '@babel/helper-split-export-declaration@7.24.7':
137 | resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==}
138 | engines: {node: '>=6.9.0'}
139 |
140 | '@babel/helper-string-parser@7.24.8':
141 | resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==}
142 | engines: {node: '>=6.9.0'}
143 |
144 | '@babel/helper-validator-identifier@7.24.7':
145 | resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
146 | engines: {node: '>=6.9.0'}
147 |
148 | '@babel/helper-validator-option@7.24.8':
149 | resolution: {integrity: sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==}
150 | engines: {node: '>=6.9.0'}
151 |
152 | '@babel/helpers@7.24.8':
153 | resolution: {integrity: sha512-gV2265Nkcz7weJJfvDoAEVzC1e2OTDpkGbEsebse8koXUJUXPsCMi7sRo/+SPMuMZ9MtUPnGwITTnQnU5YjyaQ==}
154 | engines: {node: '>=6.9.0'}
155 |
156 | '@babel/highlight@7.24.7':
157 | resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==}
158 | engines: {node: '>=6.9.0'}
159 |
160 | '@babel/parser@7.24.8':
161 | resolution: {integrity: sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==}
162 | engines: {node: '>=6.0.0'}
163 | hasBin: true
164 |
165 | '@babel/plugin-syntax-jsx@7.24.7':
166 | resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==}
167 | engines: {node: '>=6.9.0'}
168 | peerDependencies:
169 | '@babel/core': ^7.0.0-0
170 |
171 | '@babel/plugin-syntax-typescript@7.24.7':
172 | resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==}
173 | engines: {node: '>=6.9.0'}
174 | peerDependencies:
175 | '@babel/core': ^7.0.0-0
176 |
177 | '@babel/plugin-transform-modules-commonjs@7.24.8':
178 | resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==}
179 | engines: {node: '>=6.9.0'}
180 | peerDependencies:
181 | '@babel/core': ^7.0.0-0
182 |
183 | '@babel/plugin-transform-typescript@7.24.8':
184 | resolution: {integrity: sha512-CgFgtN61BbdOGCP4fLaAMOPkzWUh6yQZNMr5YSt8uz2cZSSiQONCQFWqsE4NeVfOIhqDOlS9CR3WD91FzMeB2Q==}
185 | engines: {node: '>=6.9.0'}
186 | peerDependencies:
187 | '@babel/core': ^7.0.0-0
188 |
189 | '@babel/preset-typescript@7.24.7':
190 | resolution: {integrity: sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==}
191 | engines: {node: '>=6.9.0'}
192 | peerDependencies:
193 | '@babel/core': ^7.0.0-0
194 |
195 | '@babel/template@7.24.7':
196 | resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==}
197 | engines: {node: '>=6.9.0'}
198 |
199 | '@babel/traverse@7.24.8':
200 | resolution: {integrity: sha512-t0P1xxAPzEDcEPmjprAQq19NWum4K0EQPjMwZQZbHt+GiZqvjCHjj755Weq1YRPVzBI+3zSfvScfpnuIecVFJQ==}
201 | engines: {node: '>=6.9.0'}
202 |
203 | '@babel/types@7.24.9':
204 | resolution: {integrity: sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==}
205 | engines: {node: '>=6.9.0'}
206 |
207 | '@eslint-community/eslint-utils@4.4.0':
208 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
209 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
210 | peerDependencies:
211 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
212 |
213 | '@eslint-community/regexpp@4.11.0':
214 | resolution: {integrity: sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==}
215 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
216 |
217 | '@eslint/eslintrc@2.1.4':
218 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
219 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
220 |
221 | '@eslint/js@8.57.0':
222 | resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==}
223 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
224 |
225 | '@humanwhocodes/config-array@0.11.14':
226 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
227 | engines: {node: '>=10.10.0'}
228 | deprecated: Use @eslint/config-array instead
229 |
230 | '@humanwhocodes/module-importer@1.0.1':
231 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
232 | engines: {node: '>=12.22'}
233 |
234 | '@humanwhocodes/object-schema@2.0.3':
235 | resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
236 | deprecated: Use @eslint/object-schema instead
237 |
238 | '@jridgewell/gen-mapping@0.3.5':
239 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
240 | engines: {node: '>=6.0.0'}
241 |
242 | '@jridgewell/resolve-uri@3.1.2':
243 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
244 | engines: {node: '>=6.0.0'}
245 |
246 | '@jridgewell/set-array@1.2.1':
247 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
248 | engines: {node: '>=6.0.0'}
249 |
250 | '@jridgewell/sourcemap-codec@1.5.0':
251 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
252 |
253 | '@jridgewell/trace-mapping@0.3.25':
254 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
255 |
256 | '@nodelib/fs.scandir@2.1.5':
257 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
258 | engines: {node: '>= 8'}
259 |
260 | '@nodelib/fs.stat@2.0.5':
261 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
262 | engines: {node: '>= 8'}
263 |
264 | '@nodelib/fs.walk@1.2.8':
265 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
266 | engines: {node: '>= 8'}
267 |
268 | '@types/json-schema@7.0.15':
269 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
270 |
271 | '@types/prop-types@15.7.12':
272 | resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==}
273 |
274 | '@types/react@17.0.80':
275 | resolution: {integrity: sha512-LrgHIu2lEtIo8M7d1FcI3BdwXWoRQwMoXOZ7+dPTW0lYREjmlHl3P0U1VD0i/9tppOuv8/sam7sOjx34TxSFbA==}
276 |
277 | '@types/scheduler@0.16.8':
278 | resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==}
279 |
280 | '@types/semver@7.5.8':
281 | resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
282 |
283 | '@typescript-eslint/eslint-plugin@6.21.0':
284 | resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==}
285 | engines: {node: ^16.0.0 || >=18.0.0}
286 | peerDependencies:
287 | '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
288 | eslint: ^7.0.0 || ^8.0.0
289 | typescript: '*'
290 | peerDependenciesMeta:
291 | typescript:
292 | optional: true
293 |
294 | '@typescript-eslint/parser@6.21.0':
295 | resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==}
296 | engines: {node: ^16.0.0 || >=18.0.0}
297 | peerDependencies:
298 | eslint: ^7.0.0 || ^8.0.0
299 | typescript: '*'
300 | peerDependenciesMeta:
301 | typescript:
302 | optional: true
303 |
304 | '@typescript-eslint/scope-manager@6.21.0':
305 | resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==}
306 | engines: {node: ^16.0.0 || >=18.0.0}
307 |
308 | '@typescript-eslint/type-utils@6.21.0':
309 | resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==}
310 | engines: {node: ^16.0.0 || >=18.0.0}
311 | peerDependencies:
312 | eslint: ^7.0.0 || ^8.0.0
313 | typescript: '*'
314 | peerDependenciesMeta:
315 | typescript:
316 | optional: true
317 |
318 | '@typescript-eslint/types@6.21.0':
319 | resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==}
320 | engines: {node: ^16.0.0 || >=18.0.0}
321 |
322 | '@typescript-eslint/typescript-estree@6.21.0':
323 | resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==}
324 | engines: {node: ^16.0.0 || >=18.0.0}
325 | peerDependencies:
326 | typescript: '*'
327 | peerDependenciesMeta:
328 | typescript:
329 | optional: true
330 |
331 | '@typescript-eslint/utils@6.21.0':
332 | resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==}
333 | engines: {node: ^16.0.0 || >=18.0.0}
334 | peerDependencies:
335 | eslint: ^7.0.0 || ^8.0.0
336 |
337 | '@typescript-eslint/visitor-keys@6.21.0':
338 | resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
339 | engines: {node: ^16.0.0 || >=18.0.0}
340 |
341 | '@ungap/structured-clone@1.2.0':
342 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
343 |
344 | acorn-jsx@5.3.2:
345 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
346 | peerDependencies:
347 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
348 |
349 | acorn@8.12.1:
350 | resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==}
351 | engines: {node: '>=0.4.0'}
352 | hasBin: true
353 |
354 | ajv@6.12.6:
355 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
356 |
357 | ansi-regex@5.0.1:
358 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
359 | engines: {node: '>=8'}
360 |
361 | ansi-styles@3.2.1:
362 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
363 | engines: {node: '>=4'}
364 |
365 | ansi-styles@4.3.0:
366 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
367 | engines: {node: '>=8'}
368 |
369 | argparse@2.0.1:
370 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
371 |
372 | array-buffer-byte-length@1.0.1:
373 | resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
374 | engines: {node: '>= 0.4'}
375 |
376 | array-includes@3.1.8:
377 | resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
378 | engines: {node: '>= 0.4'}
379 |
380 | array-union@2.1.0:
381 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
382 | engines: {node: '>=8'}
383 |
384 | array.prototype.findlast@1.2.5:
385 | resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
386 | engines: {node: '>= 0.4'}
387 |
388 | array.prototype.flat@1.3.2:
389 | resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
390 | engines: {node: '>= 0.4'}
391 |
392 | array.prototype.flatmap@1.3.2:
393 | resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
394 | engines: {node: '>= 0.4'}
395 |
396 | array.prototype.toreversed@1.1.2:
397 | resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==}
398 |
399 | array.prototype.tosorted@1.1.4:
400 | resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
401 | engines: {node: '>= 0.4'}
402 |
403 | arraybuffer.prototype.slice@1.0.3:
404 | resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
405 | engines: {node: '>= 0.4'}
406 |
407 | available-typed-arrays@1.0.7:
408 | resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
409 | engines: {node: '>= 0.4'}
410 |
411 | balanced-match@1.0.2:
412 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
413 |
414 | brace-expansion@1.1.11:
415 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
416 |
417 | brace-expansion@2.0.1:
418 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
419 |
420 | braces@3.0.3:
421 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
422 | engines: {node: '>=8'}
423 |
424 | browserslist@4.23.2:
425 | resolution: {integrity: sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==}
426 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
427 | hasBin: true
428 |
429 | call-bind@1.0.7:
430 | resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
431 | engines: {node: '>= 0.4'}
432 |
433 | callsites@3.1.0:
434 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
435 | engines: {node: '>=6'}
436 |
437 | caniuse-lite@1.0.30001642:
438 | resolution: {integrity: sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==}
439 |
440 | chalk@2.4.2:
441 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
442 | engines: {node: '>=4'}
443 |
444 | chalk@4.1.2:
445 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
446 | engines: {node: '>=10'}
447 |
448 | color-convert@1.9.3:
449 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
450 |
451 | color-convert@2.0.1:
452 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
453 | engines: {node: '>=7.0.0'}
454 |
455 | color-name@1.1.3:
456 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
457 |
458 | color-name@1.1.4:
459 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
460 |
461 | concat-map@0.0.1:
462 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
463 |
464 | convert-source-map@2.0.0:
465 | resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
466 |
467 | cross-spawn@7.0.3:
468 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
469 | engines: {node: '>= 8'}
470 |
471 | csstype@3.1.3:
472 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
473 |
474 | data-view-buffer@1.0.1:
475 | resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
476 | engines: {node: '>= 0.4'}
477 |
478 | data-view-byte-length@1.0.1:
479 | resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==}
480 | engines: {node: '>= 0.4'}
481 |
482 | data-view-byte-offset@1.0.0:
483 | resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
484 | engines: {node: '>= 0.4'}
485 |
486 | debug@4.3.5:
487 | resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==}
488 | engines: {node: '>=6.0'}
489 | peerDependencies:
490 | supports-color: '*'
491 | peerDependenciesMeta:
492 | supports-color:
493 | optional: true
494 |
495 | deep-is@0.1.4:
496 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
497 |
498 | define-data-property@1.1.4:
499 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
500 | engines: {node: '>= 0.4'}
501 |
502 | define-properties@1.2.1:
503 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
504 | engines: {node: '>= 0.4'}
505 |
506 | dir-glob@3.0.1:
507 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
508 | engines: {node: '>=8'}
509 |
510 | doctrine@2.1.0:
511 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
512 | engines: {node: '>=0.10.0'}
513 |
514 | doctrine@3.0.0:
515 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
516 | engines: {node: '>=6.0.0'}
517 |
518 | electron-to-chromium@1.4.829:
519 | resolution: {integrity: sha512-5qp1N2POAfW0u1qGAxXEtz6P7bO1m6gpZr5hdf5ve6lxpLM7MpiM4jIPz7xcrNlClQMafbyUDDWjlIQZ1Mw0Rw==}
520 |
521 | es-abstract@1.23.3:
522 | resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==}
523 | engines: {node: '>= 0.4'}
524 |
525 | es-define-property@1.0.0:
526 | resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
527 | engines: {node: '>= 0.4'}
528 |
529 | es-errors@1.3.0:
530 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
531 | engines: {node: '>= 0.4'}
532 |
533 | es-iterator-helpers@1.0.19:
534 | resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==}
535 | engines: {node: '>= 0.4'}
536 |
537 | es-object-atoms@1.0.0:
538 | resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
539 | engines: {node: '>= 0.4'}
540 |
541 | es-set-tostringtag@2.0.3:
542 | resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
543 | engines: {node: '>= 0.4'}
544 |
545 | es-shim-unscopables@1.0.2:
546 | resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
547 |
548 | es-to-primitive@1.2.1:
549 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
550 | engines: {node: '>= 0.4'}
551 |
552 | escalade@3.1.2:
553 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
554 | engines: {node: '>=6'}
555 |
556 | escape-string-regexp@1.0.5:
557 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
558 | engines: {node: '>=0.8.0'}
559 |
560 | escape-string-regexp@4.0.0:
561 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
562 | engines: {node: '>=10'}
563 |
564 | eslint-config-prettier@8.10.0:
565 | resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==}
566 | hasBin: true
567 | peerDependencies:
568 | eslint: '>=7.0.0'
569 |
570 | eslint-plugin-prettier@4.2.1:
571 | resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
572 | engines: {node: '>=12.0.0'}
573 | peerDependencies:
574 | eslint: '>=7.28.0'
575 | eslint-config-prettier: '*'
576 | prettier: '>=2.0.0'
577 | peerDependenciesMeta:
578 | eslint-config-prettier:
579 | optional: true
580 |
581 | eslint-plugin-react@7.34.4:
582 | resolution: {integrity: sha512-Np+jo9bUwJNxCsT12pXtrGhJgT3T44T1sHhn1Ssr42XFn8TES0267wPGo5nNrMHi8qkyimDAX2BUmkf9pSaVzA==}
583 | engines: {node: '>=4'}
584 | peerDependencies:
585 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
586 |
587 | eslint-scope@7.2.2:
588 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
589 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
590 |
591 | eslint-visitor-keys@3.4.3:
592 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
593 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
594 |
595 | eslint@8.57.0:
596 | resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==}
597 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
598 | hasBin: true
599 |
600 | espree@9.6.1:
601 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
602 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
603 |
604 | esquery@1.6.0:
605 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
606 | engines: {node: '>=0.10'}
607 |
608 | esrecurse@4.3.0:
609 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
610 | engines: {node: '>=4.0'}
611 |
612 | estraverse@5.3.0:
613 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
614 | engines: {node: '>=4.0'}
615 |
616 | esutils@2.0.3:
617 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
618 | engines: {node: '>=0.10.0'}
619 |
620 | fast-deep-equal@3.1.3:
621 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
622 |
623 | fast-diff@1.3.0:
624 | resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
625 |
626 | fast-glob@3.3.2:
627 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
628 | engines: {node: '>=8.6.0'}
629 |
630 | fast-json-stable-stringify@2.1.0:
631 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
632 |
633 | fast-levenshtein@2.0.6:
634 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
635 |
636 | fastq@1.17.1:
637 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
638 |
639 | file-entry-cache@6.0.1:
640 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
641 | engines: {node: ^10.12.0 || >=12.0.0}
642 |
643 | fill-range@7.1.1:
644 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
645 | engines: {node: '>=8'}
646 |
647 | find-up@5.0.0:
648 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
649 | engines: {node: '>=10'}
650 |
651 | flat-cache@3.2.0:
652 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
653 | engines: {node: ^10.12.0 || >=12.0.0}
654 |
655 | flatted@3.3.1:
656 | resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
657 |
658 | for-each@0.3.3:
659 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
660 |
661 | fs.realpath@1.0.0:
662 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
663 |
664 | function-bind@1.1.2:
665 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
666 |
667 | function.prototype.name@1.1.6:
668 | resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
669 | engines: {node: '>= 0.4'}
670 |
671 | functions-have-names@1.2.3:
672 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
673 |
674 | gensync@1.0.0-beta.2:
675 | resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
676 | engines: {node: '>=6.9.0'}
677 |
678 | get-intrinsic@1.2.4:
679 | resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
680 | engines: {node: '>= 0.4'}
681 |
682 | get-symbol-description@1.0.2:
683 | resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
684 | engines: {node: '>= 0.4'}
685 |
686 | glob-parent@5.1.2:
687 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
688 | engines: {node: '>= 6'}
689 |
690 | glob-parent@6.0.2:
691 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
692 | engines: {node: '>=10.13.0'}
693 |
694 | glob@7.2.3:
695 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
696 | deprecated: Glob versions prior to v9 are no longer supported
697 |
698 | globals@11.12.0:
699 | resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
700 | engines: {node: '>=4'}
701 |
702 | globals@13.24.0:
703 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
704 | engines: {node: '>=8'}
705 |
706 | globalthis@1.0.4:
707 | resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
708 | engines: {node: '>= 0.4'}
709 |
710 | globby@11.1.0:
711 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
712 | engines: {node: '>=10'}
713 |
714 | gopd@1.0.1:
715 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
716 |
717 | graphemer@1.4.0:
718 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
719 |
720 | has-bigints@1.0.2:
721 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
722 |
723 | has-flag@3.0.0:
724 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
725 | engines: {node: '>=4'}
726 |
727 | has-flag@4.0.0:
728 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
729 | engines: {node: '>=8'}
730 |
731 | has-property-descriptors@1.0.2:
732 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
733 |
734 | has-proto@1.0.3:
735 | resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
736 | engines: {node: '>= 0.4'}
737 |
738 | has-symbols@1.0.3:
739 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
740 | engines: {node: '>= 0.4'}
741 |
742 | has-tostringtag@1.0.2:
743 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
744 | engines: {node: '>= 0.4'}
745 |
746 | hasown@2.0.2:
747 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
748 | engines: {node: '>= 0.4'}
749 |
750 | ignore@5.3.1:
751 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==}
752 | engines: {node: '>= 4'}
753 |
754 | import-fresh@3.3.0:
755 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
756 | engines: {node: '>=6'}
757 |
758 | imurmurhash@0.1.4:
759 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
760 | engines: {node: '>=0.8.19'}
761 |
762 | inflight@1.0.6:
763 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
764 | deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
765 |
766 | inherits@2.0.4:
767 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
768 |
769 | internal-slot@1.0.7:
770 | resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
771 | engines: {node: '>= 0.4'}
772 |
773 | is-array-buffer@3.0.4:
774 | resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
775 | engines: {node: '>= 0.4'}
776 |
777 | is-async-function@2.0.0:
778 | resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==}
779 | engines: {node: '>= 0.4'}
780 |
781 | is-bigint@1.0.4:
782 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
783 |
784 | is-boolean-object@1.1.2:
785 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
786 | engines: {node: '>= 0.4'}
787 |
788 | is-callable@1.2.7:
789 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
790 | engines: {node: '>= 0.4'}
791 |
792 | is-core-module@2.14.0:
793 | resolution: {integrity: sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==}
794 | engines: {node: '>= 0.4'}
795 |
796 | is-data-view@1.0.1:
797 | resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
798 | engines: {node: '>= 0.4'}
799 |
800 | is-date-object@1.0.5:
801 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
802 | engines: {node: '>= 0.4'}
803 |
804 | is-extglob@2.1.1:
805 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
806 | engines: {node: '>=0.10.0'}
807 |
808 | is-finalizationregistry@1.0.2:
809 | resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==}
810 |
811 | is-generator-function@1.0.10:
812 | resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
813 | engines: {node: '>= 0.4'}
814 |
815 | is-glob@4.0.3:
816 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
817 | engines: {node: '>=0.10.0'}
818 |
819 | is-map@2.0.3:
820 | resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
821 | engines: {node: '>= 0.4'}
822 |
823 | is-negative-zero@2.0.3:
824 | resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
825 | engines: {node: '>= 0.4'}
826 |
827 | is-number-object@1.0.7:
828 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
829 | engines: {node: '>= 0.4'}
830 |
831 | is-number@7.0.0:
832 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
833 | engines: {node: '>=0.12.0'}
834 |
835 | is-path-inside@3.0.3:
836 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
837 | engines: {node: '>=8'}
838 |
839 | is-regex@1.1.4:
840 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
841 | engines: {node: '>= 0.4'}
842 |
843 | is-set@2.0.3:
844 | resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
845 | engines: {node: '>= 0.4'}
846 |
847 | is-shared-array-buffer@1.0.3:
848 | resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
849 | engines: {node: '>= 0.4'}
850 |
851 | is-string@1.0.7:
852 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
853 | engines: {node: '>= 0.4'}
854 |
855 | is-symbol@1.0.4:
856 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
857 | engines: {node: '>= 0.4'}
858 |
859 | is-typed-array@1.1.13:
860 | resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
861 | engines: {node: '>= 0.4'}
862 |
863 | is-weakmap@2.0.2:
864 | resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
865 | engines: {node: '>= 0.4'}
866 |
867 | is-weakref@1.0.2:
868 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
869 |
870 | is-weakset@2.0.3:
871 | resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
872 | engines: {node: '>= 0.4'}
873 |
874 | isarray@2.0.5:
875 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
876 |
877 | isexe@2.0.0:
878 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
879 |
880 | iterator.prototype@1.1.2:
881 | resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==}
882 |
883 | js-tokens@4.0.0:
884 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
885 |
886 | js-yaml@4.1.0:
887 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
888 | hasBin: true
889 |
890 | jsesc@2.5.2:
891 | resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
892 | engines: {node: '>=4'}
893 | hasBin: true
894 |
895 | json-buffer@3.0.1:
896 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
897 |
898 | json-schema-traverse@0.4.1:
899 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
900 |
901 | json-stable-stringify-without-jsonify@1.0.1:
902 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
903 |
904 | json5@2.2.3:
905 | resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
906 | engines: {node: '>=6'}
907 | hasBin: true
908 |
909 | jsx-ast-utils@3.3.5:
910 | resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
911 | engines: {node: '>=4.0'}
912 |
913 | keyv@4.5.4:
914 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
915 |
916 | levn@0.4.1:
917 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
918 | engines: {node: '>= 0.8.0'}
919 |
920 | locate-path@6.0.0:
921 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
922 | engines: {node: '>=10'}
923 |
924 | lodash.merge@4.6.2:
925 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
926 |
927 | loose-envify@1.4.0:
928 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
929 | hasBin: true
930 |
931 | lru-cache@5.1.1:
932 | resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
933 |
934 | merge2@1.4.1:
935 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
936 | engines: {node: '>= 8'}
937 |
938 | micromatch@4.0.7:
939 | resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==}
940 | engines: {node: '>=8.6'}
941 |
942 | minimatch@3.1.2:
943 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
944 |
945 | minimatch@9.0.3:
946 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
947 | engines: {node: '>=16 || 14 >=14.17'}
948 |
949 | ms@2.1.2:
950 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
951 |
952 | natural-compare@1.4.0:
953 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
954 |
955 | node-releases@2.0.17:
956 | resolution: {integrity: sha512-Ww6ZlOiEQfPfXM45v17oabk77Z7mg5bOt7AjDyzy7RjK9OrLrLC8dyZQoAPEOtFX9SaNf1Tdvr5gRJWdTJj7GA==}
957 |
958 | object-assign@4.1.1:
959 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
960 | engines: {node: '>=0.10.0'}
961 |
962 | object-inspect@1.13.2:
963 | resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==}
964 | engines: {node: '>= 0.4'}
965 |
966 | object-keys@1.1.1:
967 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
968 | engines: {node: '>= 0.4'}
969 |
970 | object.assign@4.1.5:
971 | resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
972 | engines: {node: '>= 0.4'}
973 |
974 | object.entries@1.1.8:
975 | resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==}
976 | engines: {node: '>= 0.4'}
977 |
978 | object.fromentries@2.0.8:
979 | resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
980 | engines: {node: '>= 0.4'}
981 |
982 | object.values@1.2.0:
983 | resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
984 | engines: {node: '>= 0.4'}
985 |
986 | once@1.4.0:
987 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
988 |
989 | optionator@0.9.4:
990 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
991 | engines: {node: '>= 0.8.0'}
992 |
993 | p-limit@3.1.0:
994 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
995 | engines: {node: '>=10'}
996 |
997 | p-locate@5.0.0:
998 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
999 | engines: {node: '>=10'}
1000 |
1001 | parent-module@1.0.1:
1002 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
1003 | engines: {node: '>=6'}
1004 |
1005 | path-exists@4.0.0:
1006 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
1007 | engines: {node: '>=8'}
1008 |
1009 | path-is-absolute@1.0.1:
1010 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
1011 | engines: {node: '>=0.10.0'}
1012 |
1013 | path-key@3.1.1:
1014 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
1015 | engines: {node: '>=8'}
1016 |
1017 | path-parse@1.0.7:
1018 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
1019 |
1020 | path-type@4.0.0:
1021 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
1022 | engines: {node: '>=8'}
1023 |
1024 | picocolors@1.0.1:
1025 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
1026 |
1027 | picomatch@2.3.1:
1028 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
1029 | engines: {node: '>=8.6'}
1030 |
1031 | possible-typed-array-names@1.0.0:
1032 | resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
1033 | engines: {node: '>= 0.4'}
1034 |
1035 | prelude-ls@1.2.1:
1036 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
1037 | engines: {node: '>= 0.8.0'}
1038 |
1039 | prettier-linter-helpers@1.0.0:
1040 | resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
1041 | engines: {node: '>=6.0.0'}
1042 |
1043 | prettier@2.8.8:
1044 | resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
1045 | engines: {node: '>=10.13.0'}
1046 | hasBin: true
1047 |
1048 | prop-types@15.8.1:
1049 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
1050 |
1051 | punycode@2.3.1:
1052 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
1053 | engines: {node: '>=6'}
1054 |
1055 | queue-microtask@1.2.3:
1056 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
1057 |
1058 | react-is@16.13.1:
1059 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
1060 |
1061 | react@18.3.1:
1062 | resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
1063 | engines: {node: '>=0.10.0'}
1064 |
1065 | reflect.getprototypeof@1.0.6:
1066 | resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==}
1067 | engines: {node: '>= 0.4'}
1068 |
1069 | regexp.prototype.flags@1.5.2:
1070 | resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
1071 | engines: {node: '>= 0.4'}
1072 |
1073 | resolve-from@4.0.0:
1074 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
1075 | engines: {node: '>=4'}
1076 |
1077 | resolve@2.0.0-next.5:
1078 | resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
1079 | hasBin: true
1080 |
1081 | reusify@1.0.4:
1082 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
1083 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1084 |
1085 | rimraf@3.0.2:
1086 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
1087 | deprecated: Rimraf versions prior to v4 are no longer supported
1088 | hasBin: true
1089 |
1090 | run-parallel@1.2.0:
1091 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
1092 |
1093 | safe-array-concat@1.1.2:
1094 | resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
1095 | engines: {node: '>=0.4'}
1096 |
1097 | safe-regex-test@1.0.3:
1098 | resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
1099 | engines: {node: '>= 0.4'}
1100 |
1101 | semver@6.3.1:
1102 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
1103 | hasBin: true
1104 |
1105 | semver@7.6.3:
1106 | resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
1107 | engines: {node: '>=10'}
1108 | hasBin: true
1109 |
1110 | set-function-length@1.2.2:
1111 | resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
1112 | engines: {node: '>= 0.4'}
1113 |
1114 | set-function-name@2.0.2:
1115 | resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
1116 | engines: {node: '>= 0.4'}
1117 |
1118 | shebang-command@2.0.0:
1119 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
1120 | engines: {node: '>=8'}
1121 |
1122 | shebang-regex@3.0.0:
1123 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
1124 | engines: {node: '>=8'}
1125 |
1126 | side-channel@1.0.6:
1127 | resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
1128 | engines: {node: '>= 0.4'}
1129 |
1130 | slash@3.0.0:
1131 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
1132 | engines: {node: '>=8'}
1133 |
1134 | string.prototype.matchall@4.0.11:
1135 | resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==}
1136 | engines: {node: '>= 0.4'}
1137 |
1138 | string.prototype.repeat@1.0.0:
1139 | resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
1140 |
1141 | string.prototype.trim@1.2.9:
1142 | resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
1143 | engines: {node: '>= 0.4'}
1144 |
1145 | string.prototype.trimend@1.0.8:
1146 | resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==}
1147 |
1148 | string.prototype.trimstart@1.0.8:
1149 | resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
1150 | engines: {node: '>= 0.4'}
1151 |
1152 | strip-ansi@6.0.1:
1153 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
1154 | engines: {node: '>=8'}
1155 |
1156 | strip-json-comments@3.1.1:
1157 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
1158 | engines: {node: '>=8'}
1159 |
1160 | supports-color@5.5.0:
1161 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
1162 | engines: {node: '>=4'}
1163 |
1164 | supports-color@7.2.0:
1165 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
1166 | engines: {node: '>=8'}
1167 |
1168 | supports-preserve-symlinks-flag@1.0.0:
1169 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
1170 | engines: {node: '>= 0.4'}
1171 |
1172 | text-table@0.2.0:
1173 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
1174 |
1175 | to-fast-properties@2.0.0:
1176 | resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
1177 | engines: {node: '>=4'}
1178 |
1179 | to-regex-range@5.0.1:
1180 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
1181 | engines: {node: '>=8.0'}
1182 |
1183 | ts-api-utils@1.3.0:
1184 | resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
1185 | engines: {node: '>=16'}
1186 | peerDependencies:
1187 | typescript: '>=4.2.0'
1188 |
1189 | type-check@0.4.0:
1190 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
1191 | engines: {node: '>= 0.8.0'}
1192 |
1193 | type-fest@0.20.2:
1194 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
1195 | engines: {node: '>=10'}
1196 |
1197 | typed-array-buffer@1.0.2:
1198 | resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
1199 | engines: {node: '>= 0.4'}
1200 |
1201 | typed-array-byte-length@1.0.1:
1202 | resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==}
1203 | engines: {node: '>= 0.4'}
1204 |
1205 | typed-array-byte-offset@1.0.2:
1206 | resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==}
1207 | engines: {node: '>= 0.4'}
1208 |
1209 | typed-array-length@1.0.6:
1210 | resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
1211 | engines: {node: '>= 0.4'}
1212 |
1213 | typescript@5.5.3:
1214 | resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==}
1215 | engines: {node: '>=14.17'}
1216 | hasBin: true
1217 |
1218 | unbox-primitive@1.0.2:
1219 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
1220 |
1221 | update-browserslist-db@1.1.0:
1222 | resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
1223 | hasBin: true
1224 | peerDependencies:
1225 | browserslist: '>= 4.21.0'
1226 |
1227 | uri-js@4.4.1:
1228 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
1229 |
1230 | wavesurfer.js@7.8.2:
1231 | resolution: {integrity: sha512-tcQrhtILu7lOy4ZkfkqFjjv+fK4dDVNoEF4vh79W5RtkLjByCt7jqcneEG1lf+6XMBXyWE5AHQ8bAE/Ch4HdtQ==}
1232 |
1233 | which-boxed-primitive@1.0.2:
1234 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
1235 |
1236 | which-builtin-type@1.1.3:
1237 | resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==}
1238 | engines: {node: '>= 0.4'}
1239 |
1240 | which-collection@1.0.2:
1241 | resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
1242 | engines: {node: '>= 0.4'}
1243 |
1244 | which-typed-array@1.1.15:
1245 | resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
1246 | engines: {node: '>= 0.4'}
1247 |
1248 | which@2.0.2:
1249 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
1250 | engines: {node: '>= 8'}
1251 | hasBin: true
1252 |
1253 | word-wrap@1.2.5:
1254 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
1255 | engines: {node: '>=0.10.0'}
1256 |
1257 | wrappy@1.0.2:
1258 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
1259 |
1260 | yallist@3.1.1:
1261 | resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
1262 |
1263 | yocto-queue@0.1.0:
1264 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
1265 | engines: {node: '>=10'}
1266 |
1267 | snapshots:
1268 |
1269 | '@ampproject/remapping@2.3.0':
1270 | dependencies:
1271 | '@jridgewell/gen-mapping': 0.3.5
1272 | '@jridgewell/trace-mapping': 0.3.25
1273 |
1274 | '@babel/code-frame@7.24.7':
1275 | dependencies:
1276 | '@babel/highlight': 7.24.7
1277 | picocolors: 1.0.1
1278 |
1279 | '@babel/compat-data@7.24.9': {}
1280 |
1281 | '@babel/core@7.24.9':
1282 | dependencies:
1283 | '@ampproject/remapping': 2.3.0
1284 | '@babel/code-frame': 7.24.7
1285 | '@babel/generator': 7.24.10
1286 | '@babel/helper-compilation-targets': 7.24.8
1287 | '@babel/helper-module-transforms': 7.24.9(@babel/core@7.24.9)
1288 | '@babel/helpers': 7.24.8
1289 | '@babel/parser': 7.24.8
1290 | '@babel/template': 7.24.7
1291 | '@babel/traverse': 7.24.8
1292 | '@babel/types': 7.24.9
1293 | convert-source-map: 2.0.0
1294 | debug: 4.3.5
1295 | gensync: 1.0.0-beta.2
1296 | json5: 2.2.3
1297 | semver: 6.3.1
1298 | transitivePeerDependencies:
1299 | - supports-color
1300 |
1301 | '@babel/generator@7.24.10':
1302 | dependencies:
1303 | '@babel/types': 7.24.9
1304 | '@jridgewell/gen-mapping': 0.3.5
1305 | '@jridgewell/trace-mapping': 0.3.25
1306 | jsesc: 2.5.2
1307 |
1308 | '@babel/helper-annotate-as-pure@7.24.7':
1309 | dependencies:
1310 | '@babel/types': 7.24.9
1311 |
1312 | '@babel/helper-compilation-targets@7.24.8':
1313 | dependencies:
1314 | '@babel/compat-data': 7.24.9
1315 | '@babel/helper-validator-option': 7.24.8
1316 | browserslist: 4.23.2
1317 | lru-cache: 5.1.1
1318 | semver: 6.3.1
1319 |
1320 | '@babel/helper-create-class-features-plugin@7.24.8(@babel/core@7.24.9)':
1321 | dependencies:
1322 | '@babel/core': 7.24.9
1323 | '@babel/helper-annotate-as-pure': 7.24.7
1324 | '@babel/helper-environment-visitor': 7.24.7
1325 | '@babel/helper-function-name': 7.24.7
1326 | '@babel/helper-member-expression-to-functions': 7.24.8
1327 | '@babel/helper-optimise-call-expression': 7.24.7
1328 | '@babel/helper-replace-supers': 7.24.7(@babel/core@7.24.9)
1329 | '@babel/helper-skip-transparent-expression-wrappers': 7.24.7
1330 | '@babel/helper-split-export-declaration': 7.24.7
1331 | semver: 6.3.1
1332 | transitivePeerDependencies:
1333 | - supports-color
1334 |
1335 | '@babel/helper-environment-visitor@7.24.7':
1336 | dependencies:
1337 | '@babel/types': 7.24.9
1338 |
1339 | '@babel/helper-function-name@7.24.7':
1340 | dependencies:
1341 | '@babel/template': 7.24.7
1342 | '@babel/types': 7.24.9
1343 |
1344 | '@babel/helper-hoist-variables@7.24.7':
1345 | dependencies:
1346 | '@babel/types': 7.24.9
1347 |
1348 | '@babel/helper-member-expression-to-functions@7.24.8':
1349 | dependencies:
1350 | '@babel/traverse': 7.24.8
1351 | '@babel/types': 7.24.9
1352 | transitivePeerDependencies:
1353 | - supports-color
1354 |
1355 | '@babel/helper-module-imports@7.24.7':
1356 | dependencies:
1357 | '@babel/traverse': 7.24.8
1358 | '@babel/types': 7.24.9
1359 | transitivePeerDependencies:
1360 | - supports-color
1361 |
1362 | '@babel/helper-module-transforms@7.24.9(@babel/core@7.24.9)':
1363 | dependencies:
1364 | '@babel/core': 7.24.9
1365 | '@babel/helper-environment-visitor': 7.24.7
1366 | '@babel/helper-module-imports': 7.24.7
1367 | '@babel/helper-simple-access': 7.24.7
1368 | '@babel/helper-split-export-declaration': 7.24.7
1369 | '@babel/helper-validator-identifier': 7.24.7
1370 | transitivePeerDependencies:
1371 | - supports-color
1372 |
1373 | '@babel/helper-optimise-call-expression@7.24.7':
1374 | dependencies:
1375 | '@babel/types': 7.24.9
1376 |
1377 | '@babel/helper-plugin-utils@7.24.8': {}
1378 |
1379 | '@babel/helper-replace-supers@7.24.7(@babel/core@7.24.9)':
1380 | dependencies:
1381 | '@babel/core': 7.24.9
1382 | '@babel/helper-environment-visitor': 7.24.7
1383 | '@babel/helper-member-expression-to-functions': 7.24.8
1384 | '@babel/helper-optimise-call-expression': 7.24.7
1385 | transitivePeerDependencies:
1386 | - supports-color
1387 |
1388 | '@babel/helper-simple-access@7.24.7':
1389 | dependencies:
1390 | '@babel/traverse': 7.24.8
1391 | '@babel/types': 7.24.9
1392 | transitivePeerDependencies:
1393 | - supports-color
1394 |
1395 | '@babel/helper-skip-transparent-expression-wrappers@7.24.7':
1396 | dependencies:
1397 | '@babel/traverse': 7.24.8
1398 | '@babel/types': 7.24.9
1399 | transitivePeerDependencies:
1400 | - supports-color
1401 |
1402 | '@babel/helper-split-export-declaration@7.24.7':
1403 | dependencies:
1404 | '@babel/types': 7.24.9
1405 |
1406 | '@babel/helper-string-parser@7.24.8': {}
1407 |
1408 | '@babel/helper-validator-identifier@7.24.7': {}
1409 |
1410 | '@babel/helper-validator-option@7.24.8': {}
1411 |
1412 | '@babel/helpers@7.24.8':
1413 | dependencies:
1414 | '@babel/template': 7.24.7
1415 | '@babel/types': 7.24.9
1416 |
1417 | '@babel/highlight@7.24.7':
1418 | dependencies:
1419 | '@babel/helper-validator-identifier': 7.24.7
1420 | chalk: 2.4.2
1421 | js-tokens: 4.0.0
1422 | picocolors: 1.0.1
1423 |
1424 | '@babel/parser@7.24.8':
1425 | dependencies:
1426 | '@babel/types': 7.24.9
1427 |
1428 | '@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.9)':
1429 | dependencies:
1430 | '@babel/core': 7.24.9
1431 | '@babel/helper-plugin-utils': 7.24.8
1432 |
1433 | '@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.9)':
1434 | dependencies:
1435 | '@babel/core': 7.24.9
1436 | '@babel/helper-plugin-utils': 7.24.8
1437 |
1438 | '@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.24.9)':
1439 | dependencies:
1440 | '@babel/core': 7.24.9
1441 | '@babel/helper-module-transforms': 7.24.9(@babel/core@7.24.9)
1442 | '@babel/helper-plugin-utils': 7.24.8
1443 | '@babel/helper-simple-access': 7.24.7
1444 | transitivePeerDependencies:
1445 | - supports-color
1446 |
1447 | '@babel/plugin-transform-typescript@7.24.8(@babel/core@7.24.9)':
1448 | dependencies:
1449 | '@babel/core': 7.24.9
1450 | '@babel/helper-annotate-as-pure': 7.24.7
1451 | '@babel/helper-create-class-features-plugin': 7.24.8(@babel/core@7.24.9)
1452 | '@babel/helper-plugin-utils': 7.24.8
1453 | '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.9)
1454 | transitivePeerDependencies:
1455 | - supports-color
1456 |
1457 | '@babel/preset-typescript@7.24.7(@babel/core@7.24.9)':
1458 | dependencies:
1459 | '@babel/core': 7.24.9
1460 | '@babel/helper-plugin-utils': 7.24.8
1461 | '@babel/helper-validator-option': 7.24.8
1462 | '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.9)
1463 | '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.24.9)
1464 | '@babel/plugin-transform-typescript': 7.24.8(@babel/core@7.24.9)
1465 | transitivePeerDependencies:
1466 | - supports-color
1467 |
1468 | '@babel/template@7.24.7':
1469 | dependencies:
1470 | '@babel/code-frame': 7.24.7
1471 | '@babel/parser': 7.24.8
1472 | '@babel/types': 7.24.9
1473 |
1474 | '@babel/traverse@7.24.8':
1475 | dependencies:
1476 | '@babel/code-frame': 7.24.7
1477 | '@babel/generator': 7.24.10
1478 | '@babel/helper-environment-visitor': 7.24.7
1479 | '@babel/helper-function-name': 7.24.7
1480 | '@babel/helper-hoist-variables': 7.24.7
1481 | '@babel/helper-split-export-declaration': 7.24.7
1482 | '@babel/parser': 7.24.8
1483 | '@babel/types': 7.24.9
1484 | debug: 4.3.5
1485 | globals: 11.12.0
1486 | transitivePeerDependencies:
1487 | - supports-color
1488 |
1489 | '@babel/types@7.24.9':
1490 | dependencies:
1491 | '@babel/helper-string-parser': 7.24.8
1492 | '@babel/helper-validator-identifier': 7.24.7
1493 | to-fast-properties: 2.0.0
1494 |
1495 | '@eslint-community/eslint-utils@4.4.0(eslint@8.57.0)':
1496 | dependencies:
1497 | eslint: 8.57.0
1498 | eslint-visitor-keys: 3.4.3
1499 |
1500 | '@eslint-community/regexpp@4.11.0': {}
1501 |
1502 | '@eslint/eslintrc@2.1.4':
1503 | dependencies:
1504 | ajv: 6.12.6
1505 | debug: 4.3.5
1506 | espree: 9.6.1
1507 | globals: 13.24.0
1508 | ignore: 5.3.1
1509 | import-fresh: 3.3.0
1510 | js-yaml: 4.1.0
1511 | minimatch: 3.1.2
1512 | strip-json-comments: 3.1.1
1513 | transitivePeerDependencies:
1514 | - supports-color
1515 |
1516 | '@eslint/js@8.57.0': {}
1517 |
1518 | '@humanwhocodes/config-array@0.11.14':
1519 | dependencies:
1520 | '@humanwhocodes/object-schema': 2.0.3
1521 | debug: 4.3.5
1522 | minimatch: 3.1.2
1523 | transitivePeerDependencies:
1524 | - supports-color
1525 |
1526 | '@humanwhocodes/module-importer@1.0.1': {}
1527 |
1528 | '@humanwhocodes/object-schema@2.0.3': {}
1529 |
1530 | '@jridgewell/gen-mapping@0.3.5':
1531 | dependencies:
1532 | '@jridgewell/set-array': 1.2.1
1533 | '@jridgewell/sourcemap-codec': 1.5.0
1534 | '@jridgewell/trace-mapping': 0.3.25
1535 |
1536 | '@jridgewell/resolve-uri@3.1.2': {}
1537 |
1538 | '@jridgewell/set-array@1.2.1': {}
1539 |
1540 | '@jridgewell/sourcemap-codec@1.5.0': {}
1541 |
1542 | '@jridgewell/trace-mapping@0.3.25':
1543 | dependencies:
1544 | '@jridgewell/resolve-uri': 3.1.2
1545 | '@jridgewell/sourcemap-codec': 1.5.0
1546 |
1547 | '@nodelib/fs.scandir@2.1.5':
1548 | dependencies:
1549 | '@nodelib/fs.stat': 2.0.5
1550 | run-parallel: 1.2.0
1551 |
1552 | '@nodelib/fs.stat@2.0.5': {}
1553 |
1554 | '@nodelib/fs.walk@1.2.8':
1555 | dependencies:
1556 | '@nodelib/fs.scandir': 2.1.5
1557 | fastq: 1.17.1
1558 |
1559 | '@types/json-schema@7.0.15': {}
1560 |
1561 | '@types/prop-types@15.7.12': {}
1562 |
1563 | '@types/react@17.0.80':
1564 | dependencies:
1565 | '@types/prop-types': 15.7.12
1566 | '@types/scheduler': 0.16.8
1567 | csstype: 3.1.3
1568 |
1569 | '@types/scheduler@0.16.8': {}
1570 |
1571 | '@types/semver@7.5.8': {}
1572 |
1573 | '@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)':
1574 | dependencies:
1575 | '@eslint-community/regexpp': 4.11.0
1576 | '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.5.3)
1577 | '@typescript-eslint/scope-manager': 6.21.0
1578 | '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.5.3)
1579 | '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.3)
1580 | '@typescript-eslint/visitor-keys': 6.21.0
1581 | debug: 4.3.5
1582 | eslint: 8.57.0
1583 | graphemer: 1.4.0
1584 | ignore: 5.3.1
1585 | natural-compare: 1.4.0
1586 | semver: 7.6.3
1587 | ts-api-utils: 1.3.0(typescript@5.5.3)
1588 | optionalDependencies:
1589 | typescript: 5.5.3
1590 | transitivePeerDependencies:
1591 | - supports-color
1592 |
1593 | '@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.5.3)':
1594 | dependencies:
1595 | '@typescript-eslint/scope-manager': 6.21.0
1596 | '@typescript-eslint/types': 6.21.0
1597 | '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.3)
1598 | '@typescript-eslint/visitor-keys': 6.21.0
1599 | debug: 4.3.5
1600 | eslint: 8.57.0
1601 | optionalDependencies:
1602 | typescript: 5.5.3
1603 | transitivePeerDependencies:
1604 | - supports-color
1605 |
1606 | '@typescript-eslint/scope-manager@6.21.0':
1607 | dependencies:
1608 | '@typescript-eslint/types': 6.21.0
1609 | '@typescript-eslint/visitor-keys': 6.21.0
1610 |
1611 | '@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.5.3)':
1612 | dependencies:
1613 | '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.3)
1614 | '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.5.3)
1615 | debug: 4.3.5
1616 | eslint: 8.57.0
1617 | ts-api-utils: 1.3.0(typescript@5.5.3)
1618 | optionalDependencies:
1619 | typescript: 5.5.3
1620 | transitivePeerDependencies:
1621 | - supports-color
1622 |
1623 | '@typescript-eslint/types@6.21.0': {}
1624 |
1625 | '@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.3)':
1626 | dependencies:
1627 | '@typescript-eslint/types': 6.21.0
1628 | '@typescript-eslint/visitor-keys': 6.21.0
1629 | debug: 4.3.5
1630 | globby: 11.1.0
1631 | is-glob: 4.0.3
1632 | minimatch: 9.0.3
1633 | semver: 7.6.3
1634 | ts-api-utils: 1.3.0(typescript@5.5.3)
1635 | optionalDependencies:
1636 | typescript: 5.5.3
1637 | transitivePeerDependencies:
1638 | - supports-color
1639 |
1640 | '@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.5.3)':
1641 | dependencies:
1642 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
1643 | '@types/json-schema': 7.0.15
1644 | '@types/semver': 7.5.8
1645 | '@typescript-eslint/scope-manager': 6.21.0
1646 | '@typescript-eslint/types': 6.21.0
1647 | '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.3)
1648 | eslint: 8.57.0
1649 | semver: 7.6.3
1650 | transitivePeerDependencies:
1651 | - supports-color
1652 | - typescript
1653 |
1654 | '@typescript-eslint/visitor-keys@6.21.0':
1655 | dependencies:
1656 | '@typescript-eslint/types': 6.21.0
1657 | eslint-visitor-keys: 3.4.3
1658 |
1659 | '@ungap/structured-clone@1.2.0': {}
1660 |
1661 | acorn-jsx@5.3.2(acorn@8.12.1):
1662 | dependencies:
1663 | acorn: 8.12.1
1664 |
1665 | acorn@8.12.1: {}
1666 |
1667 | ajv@6.12.6:
1668 | dependencies:
1669 | fast-deep-equal: 3.1.3
1670 | fast-json-stable-stringify: 2.1.0
1671 | json-schema-traverse: 0.4.1
1672 | uri-js: 4.4.1
1673 |
1674 | ansi-regex@5.0.1: {}
1675 |
1676 | ansi-styles@3.2.1:
1677 | dependencies:
1678 | color-convert: 1.9.3
1679 |
1680 | ansi-styles@4.3.0:
1681 | dependencies:
1682 | color-convert: 2.0.1
1683 |
1684 | argparse@2.0.1: {}
1685 |
1686 | array-buffer-byte-length@1.0.1:
1687 | dependencies:
1688 | call-bind: 1.0.7
1689 | is-array-buffer: 3.0.4
1690 |
1691 | array-includes@3.1.8:
1692 | dependencies:
1693 | call-bind: 1.0.7
1694 | define-properties: 1.2.1
1695 | es-abstract: 1.23.3
1696 | es-object-atoms: 1.0.0
1697 | get-intrinsic: 1.2.4
1698 | is-string: 1.0.7
1699 |
1700 | array-union@2.1.0: {}
1701 |
1702 | array.prototype.findlast@1.2.5:
1703 | dependencies:
1704 | call-bind: 1.0.7
1705 | define-properties: 1.2.1
1706 | es-abstract: 1.23.3
1707 | es-errors: 1.3.0
1708 | es-object-atoms: 1.0.0
1709 | es-shim-unscopables: 1.0.2
1710 |
1711 | array.prototype.flat@1.3.2:
1712 | dependencies:
1713 | call-bind: 1.0.7
1714 | define-properties: 1.2.1
1715 | es-abstract: 1.23.3
1716 | es-shim-unscopables: 1.0.2
1717 |
1718 | array.prototype.flatmap@1.3.2:
1719 | dependencies:
1720 | call-bind: 1.0.7
1721 | define-properties: 1.2.1
1722 | es-abstract: 1.23.3
1723 | es-shim-unscopables: 1.0.2
1724 |
1725 | array.prototype.toreversed@1.1.2:
1726 | dependencies:
1727 | call-bind: 1.0.7
1728 | define-properties: 1.2.1
1729 | es-abstract: 1.23.3
1730 | es-shim-unscopables: 1.0.2
1731 |
1732 | array.prototype.tosorted@1.1.4:
1733 | dependencies:
1734 | call-bind: 1.0.7
1735 | define-properties: 1.2.1
1736 | es-abstract: 1.23.3
1737 | es-errors: 1.3.0
1738 | es-shim-unscopables: 1.0.2
1739 |
1740 | arraybuffer.prototype.slice@1.0.3:
1741 | dependencies:
1742 | array-buffer-byte-length: 1.0.1
1743 | call-bind: 1.0.7
1744 | define-properties: 1.2.1
1745 | es-abstract: 1.23.3
1746 | es-errors: 1.3.0
1747 | get-intrinsic: 1.2.4
1748 | is-array-buffer: 3.0.4
1749 | is-shared-array-buffer: 1.0.3
1750 |
1751 | available-typed-arrays@1.0.7:
1752 | dependencies:
1753 | possible-typed-array-names: 1.0.0
1754 |
1755 | balanced-match@1.0.2: {}
1756 |
1757 | brace-expansion@1.1.11:
1758 | dependencies:
1759 | balanced-match: 1.0.2
1760 | concat-map: 0.0.1
1761 |
1762 | brace-expansion@2.0.1:
1763 | dependencies:
1764 | balanced-match: 1.0.2
1765 |
1766 | braces@3.0.3:
1767 | dependencies:
1768 | fill-range: 7.1.1
1769 |
1770 | browserslist@4.23.2:
1771 | dependencies:
1772 | caniuse-lite: 1.0.30001642
1773 | electron-to-chromium: 1.4.829
1774 | node-releases: 2.0.17
1775 | update-browserslist-db: 1.1.0(browserslist@4.23.2)
1776 |
1777 | call-bind@1.0.7:
1778 | dependencies:
1779 | es-define-property: 1.0.0
1780 | es-errors: 1.3.0
1781 | function-bind: 1.1.2
1782 | get-intrinsic: 1.2.4
1783 | set-function-length: 1.2.2
1784 |
1785 | callsites@3.1.0: {}
1786 |
1787 | caniuse-lite@1.0.30001642: {}
1788 |
1789 | chalk@2.4.2:
1790 | dependencies:
1791 | ansi-styles: 3.2.1
1792 | escape-string-regexp: 1.0.5
1793 | supports-color: 5.5.0
1794 |
1795 | chalk@4.1.2:
1796 | dependencies:
1797 | ansi-styles: 4.3.0
1798 | supports-color: 7.2.0
1799 |
1800 | color-convert@1.9.3:
1801 | dependencies:
1802 | color-name: 1.1.3
1803 |
1804 | color-convert@2.0.1:
1805 | dependencies:
1806 | color-name: 1.1.4
1807 |
1808 | color-name@1.1.3: {}
1809 |
1810 | color-name@1.1.4: {}
1811 |
1812 | concat-map@0.0.1: {}
1813 |
1814 | convert-source-map@2.0.0: {}
1815 |
1816 | cross-spawn@7.0.3:
1817 | dependencies:
1818 | path-key: 3.1.1
1819 | shebang-command: 2.0.0
1820 | which: 2.0.2
1821 |
1822 | csstype@3.1.3: {}
1823 |
1824 | data-view-buffer@1.0.1:
1825 | dependencies:
1826 | call-bind: 1.0.7
1827 | es-errors: 1.3.0
1828 | is-data-view: 1.0.1
1829 |
1830 | data-view-byte-length@1.0.1:
1831 | dependencies:
1832 | call-bind: 1.0.7
1833 | es-errors: 1.3.0
1834 | is-data-view: 1.0.1
1835 |
1836 | data-view-byte-offset@1.0.0:
1837 | dependencies:
1838 | call-bind: 1.0.7
1839 | es-errors: 1.3.0
1840 | is-data-view: 1.0.1
1841 |
1842 | debug@4.3.5:
1843 | dependencies:
1844 | ms: 2.1.2
1845 |
1846 | deep-is@0.1.4: {}
1847 |
1848 | define-data-property@1.1.4:
1849 | dependencies:
1850 | es-define-property: 1.0.0
1851 | es-errors: 1.3.0
1852 | gopd: 1.0.1
1853 |
1854 | define-properties@1.2.1:
1855 | dependencies:
1856 | define-data-property: 1.1.4
1857 | has-property-descriptors: 1.0.2
1858 | object-keys: 1.1.1
1859 |
1860 | dir-glob@3.0.1:
1861 | dependencies:
1862 | path-type: 4.0.0
1863 |
1864 | doctrine@2.1.0:
1865 | dependencies:
1866 | esutils: 2.0.3
1867 |
1868 | doctrine@3.0.0:
1869 | dependencies:
1870 | esutils: 2.0.3
1871 |
1872 | electron-to-chromium@1.4.829: {}
1873 |
1874 | es-abstract@1.23.3:
1875 | dependencies:
1876 | array-buffer-byte-length: 1.0.1
1877 | arraybuffer.prototype.slice: 1.0.3
1878 | available-typed-arrays: 1.0.7
1879 | call-bind: 1.0.7
1880 | data-view-buffer: 1.0.1
1881 | data-view-byte-length: 1.0.1
1882 | data-view-byte-offset: 1.0.0
1883 | es-define-property: 1.0.0
1884 | es-errors: 1.3.0
1885 | es-object-atoms: 1.0.0
1886 | es-set-tostringtag: 2.0.3
1887 | es-to-primitive: 1.2.1
1888 | function.prototype.name: 1.1.6
1889 | get-intrinsic: 1.2.4
1890 | get-symbol-description: 1.0.2
1891 | globalthis: 1.0.4
1892 | gopd: 1.0.1
1893 | has-property-descriptors: 1.0.2
1894 | has-proto: 1.0.3
1895 | has-symbols: 1.0.3
1896 | hasown: 2.0.2
1897 | internal-slot: 1.0.7
1898 | is-array-buffer: 3.0.4
1899 | is-callable: 1.2.7
1900 | is-data-view: 1.0.1
1901 | is-negative-zero: 2.0.3
1902 | is-regex: 1.1.4
1903 | is-shared-array-buffer: 1.0.3
1904 | is-string: 1.0.7
1905 | is-typed-array: 1.1.13
1906 | is-weakref: 1.0.2
1907 | object-inspect: 1.13.2
1908 | object-keys: 1.1.1
1909 | object.assign: 4.1.5
1910 | regexp.prototype.flags: 1.5.2
1911 | safe-array-concat: 1.1.2
1912 | safe-regex-test: 1.0.3
1913 | string.prototype.trim: 1.2.9
1914 | string.prototype.trimend: 1.0.8
1915 | string.prototype.trimstart: 1.0.8
1916 | typed-array-buffer: 1.0.2
1917 | typed-array-byte-length: 1.0.1
1918 | typed-array-byte-offset: 1.0.2
1919 | typed-array-length: 1.0.6
1920 | unbox-primitive: 1.0.2
1921 | which-typed-array: 1.1.15
1922 |
1923 | es-define-property@1.0.0:
1924 | dependencies:
1925 | get-intrinsic: 1.2.4
1926 |
1927 | es-errors@1.3.0: {}
1928 |
1929 | es-iterator-helpers@1.0.19:
1930 | dependencies:
1931 | call-bind: 1.0.7
1932 | define-properties: 1.2.1
1933 | es-abstract: 1.23.3
1934 | es-errors: 1.3.0
1935 | es-set-tostringtag: 2.0.3
1936 | function-bind: 1.1.2
1937 | get-intrinsic: 1.2.4
1938 | globalthis: 1.0.4
1939 | has-property-descriptors: 1.0.2
1940 | has-proto: 1.0.3
1941 | has-symbols: 1.0.3
1942 | internal-slot: 1.0.7
1943 | iterator.prototype: 1.1.2
1944 | safe-array-concat: 1.1.2
1945 |
1946 | es-object-atoms@1.0.0:
1947 | dependencies:
1948 | es-errors: 1.3.0
1949 |
1950 | es-set-tostringtag@2.0.3:
1951 | dependencies:
1952 | get-intrinsic: 1.2.4
1953 | has-tostringtag: 1.0.2
1954 | hasown: 2.0.2
1955 |
1956 | es-shim-unscopables@1.0.2:
1957 | dependencies:
1958 | hasown: 2.0.2
1959 |
1960 | es-to-primitive@1.2.1:
1961 | dependencies:
1962 | is-callable: 1.2.7
1963 | is-date-object: 1.0.5
1964 | is-symbol: 1.0.4
1965 |
1966 | escalade@3.1.2: {}
1967 |
1968 | escape-string-regexp@1.0.5: {}
1969 |
1970 | escape-string-regexp@4.0.0: {}
1971 |
1972 | eslint-config-prettier@8.10.0(eslint@8.57.0):
1973 | dependencies:
1974 | eslint: 8.57.0
1975 |
1976 | eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0(eslint@8.57.0))(eslint@8.57.0)(prettier@2.8.8):
1977 | dependencies:
1978 | eslint: 8.57.0
1979 | prettier: 2.8.8
1980 | prettier-linter-helpers: 1.0.0
1981 | optionalDependencies:
1982 | eslint-config-prettier: 8.10.0(eslint@8.57.0)
1983 |
1984 | eslint-plugin-react@7.34.4(eslint@8.57.0):
1985 | dependencies:
1986 | array-includes: 3.1.8
1987 | array.prototype.findlast: 1.2.5
1988 | array.prototype.flatmap: 1.3.2
1989 | array.prototype.toreversed: 1.1.2
1990 | array.prototype.tosorted: 1.1.4
1991 | doctrine: 2.1.0
1992 | es-iterator-helpers: 1.0.19
1993 | eslint: 8.57.0
1994 | estraverse: 5.3.0
1995 | hasown: 2.0.2
1996 | jsx-ast-utils: 3.3.5
1997 | minimatch: 3.1.2
1998 | object.entries: 1.1.8
1999 | object.fromentries: 2.0.8
2000 | object.values: 1.2.0
2001 | prop-types: 15.8.1
2002 | resolve: 2.0.0-next.5
2003 | semver: 6.3.1
2004 | string.prototype.matchall: 4.0.11
2005 | string.prototype.repeat: 1.0.0
2006 |
2007 | eslint-scope@7.2.2:
2008 | dependencies:
2009 | esrecurse: 4.3.0
2010 | estraverse: 5.3.0
2011 |
2012 | eslint-visitor-keys@3.4.3: {}
2013 |
2014 | eslint@8.57.0:
2015 | dependencies:
2016 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
2017 | '@eslint-community/regexpp': 4.11.0
2018 | '@eslint/eslintrc': 2.1.4
2019 | '@eslint/js': 8.57.0
2020 | '@humanwhocodes/config-array': 0.11.14
2021 | '@humanwhocodes/module-importer': 1.0.1
2022 | '@nodelib/fs.walk': 1.2.8
2023 | '@ungap/structured-clone': 1.2.0
2024 | ajv: 6.12.6
2025 | chalk: 4.1.2
2026 | cross-spawn: 7.0.3
2027 | debug: 4.3.5
2028 | doctrine: 3.0.0
2029 | escape-string-regexp: 4.0.0
2030 | eslint-scope: 7.2.2
2031 | eslint-visitor-keys: 3.4.3
2032 | espree: 9.6.1
2033 | esquery: 1.6.0
2034 | esutils: 2.0.3
2035 | fast-deep-equal: 3.1.3
2036 | file-entry-cache: 6.0.1
2037 | find-up: 5.0.0
2038 | glob-parent: 6.0.2
2039 | globals: 13.24.0
2040 | graphemer: 1.4.0
2041 | ignore: 5.3.1
2042 | imurmurhash: 0.1.4
2043 | is-glob: 4.0.3
2044 | is-path-inside: 3.0.3
2045 | js-yaml: 4.1.0
2046 | json-stable-stringify-without-jsonify: 1.0.1
2047 | levn: 0.4.1
2048 | lodash.merge: 4.6.2
2049 | minimatch: 3.1.2
2050 | natural-compare: 1.4.0
2051 | optionator: 0.9.4
2052 | strip-ansi: 6.0.1
2053 | text-table: 0.2.0
2054 | transitivePeerDependencies:
2055 | - supports-color
2056 |
2057 | espree@9.6.1:
2058 | dependencies:
2059 | acorn: 8.12.1
2060 | acorn-jsx: 5.3.2(acorn@8.12.1)
2061 | eslint-visitor-keys: 3.4.3
2062 |
2063 | esquery@1.6.0:
2064 | dependencies:
2065 | estraverse: 5.3.0
2066 |
2067 | esrecurse@4.3.0:
2068 | dependencies:
2069 | estraverse: 5.3.0
2070 |
2071 | estraverse@5.3.0: {}
2072 |
2073 | esutils@2.0.3: {}
2074 |
2075 | fast-deep-equal@3.1.3: {}
2076 |
2077 | fast-diff@1.3.0: {}
2078 |
2079 | fast-glob@3.3.2:
2080 | dependencies:
2081 | '@nodelib/fs.stat': 2.0.5
2082 | '@nodelib/fs.walk': 1.2.8
2083 | glob-parent: 5.1.2
2084 | merge2: 1.4.1
2085 | micromatch: 4.0.7
2086 |
2087 | fast-json-stable-stringify@2.1.0: {}
2088 |
2089 | fast-levenshtein@2.0.6: {}
2090 |
2091 | fastq@1.17.1:
2092 | dependencies:
2093 | reusify: 1.0.4
2094 |
2095 | file-entry-cache@6.0.1:
2096 | dependencies:
2097 | flat-cache: 3.2.0
2098 |
2099 | fill-range@7.1.1:
2100 | dependencies:
2101 | to-regex-range: 5.0.1
2102 |
2103 | find-up@5.0.0:
2104 | dependencies:
2105 | locate-path: 6.0.0
2106 | path-exists: 4.0.0
2107 |
2108 | flat-cache@3.2.0:
2109 | dependencies:
2110 | flatted: 3.3.1
2111 | keyv: 4.5.4
2112 | rimraf: 3.0.2
2113 |
2114 | flatted@3.3.1: {}
2115 |
2116 | for-each@0.3.3:
2117 | dependencies:
2118 | is-callable: 1.2.7
2119 |
2120 | fs.realpath@1.0.0: {}
2121 |
2122 | function-bind@1.1.2: {}
2123 |
2124 | function.prototype.name@1.1.6:
2125 | dependencies:
2126 | call-bind: 1.0.7
2127 | define-properties: 1.2.1
2128 | es-abstract: 1.23.3
2129 | functions-have-names: 1.2.3
2130 |
2131 | functions-have-names@1.2.3: {}
2132 |
2133 | gensync@1.0.0-beta.2: {}
2134 |
2135 | get-intrinsic@1.2.4:
2136 | dependencies:
2137 | es-errors: 1.3.0
2138 | function-bind: 1.1.2
2139 | has-proto: 1.0.3
2140 | has-symbols: 1.0.3
2141 | hasown: 2.0.2
2142 |
2143 | get-symbol-description@1.0.2:
2144 | dependencies:
2145 | call-bind: 1.0.7
2146 | es-errors: 1.3.0
2147 | get-intrinsic: 1.2.4
2148 |
2149 | glob-parent@5.1.2:
2150 | dependencies:
2151 | is-glob: 4.0.3
2152 |
2153 | glob-parent@6.0.2:
2154 | dependencies:
2155 | is-glob: 4.0.3
2156 |
2157 | glob@7.2.3:
2158 | dependencies:
2159 | fs.realpath: 1.0.0
2160 | inflight: 1.0.6
2161 | inherits: 2.0.4
2162 | minimatch: 3.1.2
2163 | once: 1.4.0
2164 | path-is-absolute: 1.0.1
2165 |
2166 | globals@11.12.0: {}
2167 |
2168 | globals@13.24.0:
2169 | dependencies:
2170 | type-fest: 0.20.2
2171 |
2172 | globalthis@1.0.4:
2173 | dependencies:
2174 | define-properties: 1.2.1
2175 | gopd: 1.0.1
2176 |
2177 | globby@11.1.0:
2178 | dependencies:
2179 | array-union: 2.1.0
2180 | dir-glob: 3.0.1
2181 | fast-glob: 3.3.2
2182 | ignore: 5.3.1
2183 | merge2: 1.4.1
2184 | slash: 3.0.0
2185 |
2186 | gopd@1.0.1:
2187 | dependencies:
2188 | get-intrinsic: 1.2.4
2189 |
2190 | graphemer@1.4.0: {}
2191 |
2192 | has-bigints@1.0.2: {}
2193 |
2194 | has-flag@3.0.0: {}
2195 |
2196 | has-flag@4.0.0: {}
2197 |
2198 | has-property-descriptors@1.0.2:
2199 | dependencies:
2200 | es-define-property: 1.0.0
2201 |
2202 | has-proto@1.0.3: {}
2203 |
2204 | has-symbols@1.0.3: {}
2205 |
2206 | has-tostringtag@1.0.2:
2207 | dependencies:
2208 | has-symbols: 1.0.3
2209 |
2210 | hasown@2.0.2:
2211 | dependencies:
2212 | function-bind: 1.1.2
2213 |
2214 | ignore@5.3.1: {}
2215 |
2216 | import-fresh@3.3.0:
2217 | dependencies:
2218 | parent-module: 1.0.1
2219 | resolve-from: 4.0.0
2220 |
2221 | imurmurhash@0.1.4: {}
2222 |
2223 | inflight@1.0.6:
2224 | dependencies:
2225 | once: 1.4.0
2226 | wrappy: 1.0.2
2227 |
2228 | inherits@2.0.4: {}
2229 |
2230 | internal-slot@1.0.7:
2231 | dependencies:
2232 | es-errors: 1.3.0
2233 | hasown: 2.0.2
2234 | side-channel: 1.0.6
2235 |
2236 | is-array-buffer@3.0.4:
2237 | dependencies:
2238 | call-bind: 1.0.7
2239 | get-intrinsic: 1.2.4
2240 |
2241 | is-async-function@2.0.0:
2242 | dependencies:
2243 | has-tostringtag: 1.0.2
2244 |
2245 | is-bigint@1.0.4:
2246 | dependencies:
2247 | has-bigints: 1.0.2
2248 |
2249 | is-boolean-object@1.1.2:
2250 | dependencies:
2251 | call-bind: 1.0.7
2252 | has-tostringtag: 1.0.2
2253 |
2254 | is-callable@1.2.7: {}
2255 |
2256 | is-core-module@2.14.0:
2257 | dependencies:
2258 | hasown: 2.0.2
2259 |
2260 | is-data-view@1.0.1:
2261 | dependencies:
2262 | is-typed-array: 1.1.13
2263 |
2264 | is-date-object@1.0.5:
2265 | dependencies:
2266 | has-tostringtag: 1.0.2
2267 |
2268 | is-extglob@2.1.1: {}
2269 |
2270 | is-finalizationregistry@1.0.2:
2271 | dependencies:
2272 | call-bind: 1.0.7
2273 |
2274 | is-generator-function@1.0.10:
2275 | dependencies:
2276 | has-tostringtag: 1.0.2
2277 |
2278 | is-glob@4.0.3:
2279 | dependencies:
2280 | is-extglob: 2.1.1
2281 |
2282 | is-map@2.0.3: {}
2283 |
2284 | is-negative-zero@2.0.3: {}
2285 |
2286 | is-number-object@1.0.7:
2287 | dependencies:
2288 | has-tostringtag: 1.0.2
2289 |
2290 | is-number@7.0.0: {}
2291 |
2292 | is-path-inside@3.0.3: {}
2293 |
2294 | is-regex@1.1.4:
2295 | dependencies:
2296 | call-bind: 1.0.7
2297 | has-tostringtag: 1.0.2
2298 |
2299 | is-set@2.0.3: {}
2300 |
2301 | is-shared-array-buffer@1.0.3:
2302 | dependencies:
2303 | call-bind: 1.0.7
2304 |
2305 | is-string@1.0.7:
2306 | dependencies:
2307 | has-tostringtag: 1.0.2
2308 |
2309 | is-symbol@1.0.4:
2310 | dependencies:
2311 | has-symbols: 1.0.3
2312 |
2313 | is-typed-array@1.1.13:
2314 | dependencies:
2315 | which-typed-array: 1.1.15
2316 |
2317 | is-weakmap@2.0.2: {}
2318 |
2319 | is-weakref@1.0.2:
2320 | dependencies:
2321 | call-bind: 1.0.7
2322 |
2323 | is-weakset@2.0.3:
2324 | dependencies:
2325 | call-bind: 1.0.7
2326 | get-intrinsic: 1.2.4
2327 |
2328 | isarray@2.0.5: {}
2329 |
2330 | isexe@2.0.0: {}
2331 |
2332 | iterator.prototype@1.1.2:
2333 | dependencies:
2334 | define-properties: 1.2.1
2335 | get-intrinsic: 1.2.4
2336 | has-symbols: 1.0.3
2337 | reflect.getprototypeof: 1.0.6
2338 | set-function-name: 2.0.2
2339 |
2340 | js-tokens@4.0.0: {}
2341 |
2342 | js-yaml@4.1.0:
2343 | dependencies:
2344 | argparse: 2.0.1
2345 |
2346 | jsesc@2.5.2: {}
2347 |
2348 | json-buffer@3.0.1: {}
2349 |
2350 | json-schema-traverse@0.4.1: {}
2351 |
2352 | json-stable-stringify-without-jsonify@1.0.1: {}
2353 |
2354 | json5@2.2.3: {}
2355 |
2356 | jsx-ast-utils@3.3.5:
2357 | dependencies:
2358 | array-includes: 3.1.8
2359 | array.prototype.flat: 1.3.2
2360 | object.assign: 4.1.5
2361 | object.values: 1.2.0
2362 |
2363 | keyv@4.5.4:
2364 | dependencies:
2365 | json-buffer: 3.0.1
2366 |
2367 | levn@0.4.1:
2368 | dependencies:
2369 | prelude-ls: 1.2.1
2370 | type-check: 0.4.0
2371 |
2372 | locate-path@6.0.0:
2373 | dependencies:
2374 | p-locate: 5.0.0
2375 |
2376 | lodash.merge@4.6.2: {}
2377 |
2378 | loose-envify@1.4.0:
2379 | dependencies:
2380 | js-tokens: 4.0.0
2381 |
2382 | lru-cache@5.1.1:
2383 | dependencies:
2384 | yallist: 3.1.1
2385 |
2386 | merge2@1.4.1: {}
2387 |
2388 | micromatch@4.0.7:
2389 | dependencies:
2390 | braces: 3.0.3
2391 | picomatch: 2.3.1
2392 |
2393 | minimatch@3.1.2:
2394 | dependencies:
2395 | brace-expansion: 1.1.11
2396 |
2397 | minimatch@9.0.3:
2398 | dependencies:
2399 | brace-expansion: 2.0.1
2400 |
2401 | ms@2.1.2: {}
2402 |
2403 | natural-compare@1.4.0: {}
2404 |
2405 | node-releases@2.0.17: {}
2406 |
2407 | object-assign@4.1.1: {}
2408 |
2409 | object-inspect@1.13.2: {}
2410 |
2411 | object-keys@1.1.1: {}
2412 |
2413 | object.assign@4.1.5:
2414 | dependencies:
2415 | call-bind: 1.0.7
2416 | define-properties: 1.2.1
2417 | has-symbols: 1.0.3
2418 | object-keys: 1.1.1
2419 |
2420 | object.entries@1.1.8:
2421 | dependencies:
2422 | call-bind: 1.0.7
2423 | define-properties: 1.2.1
2424 | es-object-atoms: 1.0.0
2425 |
2426 | object.fromentries@2.0.8:
2427 | dependencies:
2428 | call-bind: 1.0.7
2429 | define-properties: 1.2.1
2430 | es-abstract: 1.23.3
2431 | es-object-atoms: 1.0.0
2432 |
2433 | object.values@1.2.0:
2434 | dependencies:
2435 | call-bind: 1.0.7
2436 | define-properties: 1.2.1
2437 | es-object-atoms: 1.0.0
2438 |
2439 | once@1.4.0:
2440 | dependencies:
2441 | wrappy: 1.0.2
2442 |
2443 | optionator@0.9.4:
2444 | dependencies:
2445 | deep-is: 0.1.4
2446 | fast-levenshtein: 2.0.6
2447 | levn: 0.4.1
2448 | prelude-ls: 1.2.1
2449 | type-check: 0.4.0
2450 | word-wrap: 1.2.5
2451 |
2452 | p-limit@3.1.0:
2453 | dependencies:
2454 | yocto-queue: 0.1.0
2455 |
2456 | p-locate@5.0.0:
2457 | dependencies:
2458 | p-limit: 3.1.0
2459 |
2460 | parent-module@1.0.1:
2461 | dependencies:
2462 | callsites: 3.1.0
2463 |
2464 | path-exists@4.0.0: {}
2465 |
2466 | path-is-absolute@1.0.1: {}
2467 |
2468 | path-key@3.1.1: {}
2469 |
2470 | path-parse@1.0.7: {}
2471 |
2472 | path-type@4.0.0: {}
2473 |
2474 | picocolors@1.0.1: {}
2475 |
2476 | picomatch@2.3.1: {}
2477 |
2478 | possible-typed-array-names@1.0.0: {}
2479 |
2480 | prelude-ls@1.2.1: {}
2481 |
2482 | prettier-linter-helpers@1.0.0:
2483 | dependencies:
2484 | fast-diff: 1.3.0
2485 |
2486 | prettier@2.8.8: {}
2487 |
2488 | prop-types@15.8.1:
2489 | dependencies:
2490 | loose-envify: 1.4.0
2491 | object-assign: 4.1.1
2492 | react-is: 16.13.1
2493 |
2494 | punycode@2.3.1: {}
2495 |
2496 | queue-microtask@1.2.3: {}
2497 |
2498 | react-is@16.13.1: {}
2499 |
2500 | react@18.3.1:
2501 | dependencies:
2502 | loose-envify: 1.4.0
2503 |
2504 | reflect.getprototypeof@1.0.6:
2505 | dependencies:
2506 | call-bind: 1.0.7
2507 | define-properties: 1.2.1
2508 | es-abstract: 1.23.3
2509 | es-errors: 1.3.0
2510 | get-intrinsic: 1.2.4
2511 | globalthis: 1.0.4
2512 | which-builtin-type: 1.1.3
2513 |
2514 | regexp.prototype.flags@1.5.2:
2515 | dependencies:
2516 | call-bind: 1.0.7
2517 | define-properties: 1.2.1
2518 | es-errors: 1.3.0
2519 | set-function-name: 2.0.2
2520 |
2521 | resolve-from@4.0.0: {}
2522 |
2523 | resolve@2.0.0-next.5:
2524 | dependencies:
2525 | is-core-module: 2.14.0
2526 | path-parse: 1.0.7
2527 | supports-preserve-symlinks-flag: 1.0.0
2528 |
2529 | reusify@1.0.4: {}
2530 |
2531 | rimraf@3.0.2:
2532 | dependencies:
2533 | glob: 7.2.3
2534 |
2535 | run-parallel@1.2.0:
2536 | dependencies:
2537 | queue-microtask: 1.2.3
2538 |
2539 | safe-array-concat@1.1.2:
2540 | dependencies:
2541 | call-bind: 1.0.7
2542 | get-intrinsic: 1.2.4
2543 | has-symbols: 1.0.3
2544 | isarray: 2.0.5
2545 |
2546 | safe-regex-test@1.0.3:
2547 | dependencies:
2548 | call-bind: 1.0.7
2549 | es-errors: 1.3.0
2550 | is-regex: 1.1.4
2551 |
2552 | semver@6.3.1: {}
2553 |
2554 | semver@7.6.3: {}
2555 |
2556 | set-function-length@1.2.2:
2557 | dependencies:
2558 | define-data-property: 1.1.4
2559 | es-errors: 1.3.0
2560 | function-bind: 1.1.2
2561 | get-intrinsic: 1.2.4
2562 | gopd: 1.0.1
2563 | has-property-descriptors: 1.0.2
2564 |
2565 | set-function-name@2.0.2:
2566 | dependencies:
2567 | define-data-property: 1.1.4
2568 | es-errors: 1.3.0
2569 | functions-have-names: 1.2.3
2570 | has-property-descriptors: 1.0.2
2571 |
2572 | shebang-command@2.0.0:
2573 | dependencies:
2574 | shebang-regex: 3.0.0
2575 |
2576 | shebang-regex@3.0.0: {}
2577 |
2578 | side-channel@1.0.6:
2579 | dependencies:
2580 | call-bind: 1.0.7
2581 | es-errors: 1.3.0
2582 | get-intrinsic: 1.2.4
2583 | object-inspect: 1.13.2
2584 |
2585 | slash@3.0.0: {}
2586 |
2587 | string.prototype.matchall@4.0.11:
2588 | dependencies:
2589 | call-bind: 1.0.7
2590 | define-properties: 1.2.1
2591 | es-abstract: 1.23.3
2592 | es-errors: 1.3.0
2593 | es-object-atoms: 1.0.0
2594 | get-intrinsic: 1.2.4
2595 | gopd: 1.0.1
2596 | has-symbols: 1.0.3
2597 | internal-slot: 1.0.7
2598 | regexp.prototype.flags: 1.5.2
2599 | set-function-name: 2.0.2
2600 | side-channel: 1.0.6
2601 |
2602 | string.prototype.repeat@1.0.0:
2603 | dependencies:
2604 | define-properties: 1.2.1
2605 | es-abstract: 1.23.3
2606 |
2607 | string.prototype.trim@1.2.9:
2608 | dependencies:
2609 | call-bind: 1.0.7
2610 | define-properties: 1.2.1
2611 | es-abstract: 1.23.3
2612 | es-object-atoms: 1.0.0
2613 |
2614 | string.prototype.trimend@1.0.8:
2615 | dependencies:
2616 | call-bind: 1.0.7
2617 | define-properties: 1.2.1
2618 | es-object-atoms: 1.0.0
2619 |
2620 | string.prototype.trimstart@1.0.8:
2621 | dependencies:
2622 | call-bind: 1.0.7
2623 | define-properties: 1.2.1
2624 | es-object-atoms: 1.0.0
2625 |
2626 | strip-ansi@6.0.1:
2627 | dependencies:
2628 | ansi-regex: 5.0.1
2629 |
2630 | strip-json-comments@3.1.1: {}
2631 |
2632 | supports-color@5.5.0:
2633 | dependencies:
2634 | has-flag: 3.0.0
2635 |
2636 | supports-color@7.2.0:
2637 | dependencies:
2638 | has-flag: 4.0.0
2639 |
2640 | supports-preserve-symlinks-flag@1.0.0: {}
2641 |
2642 | text-table@0.2.0: {}
2643 |
2644 | to-fast-properties@2.0.0: {}
2645 |
2646 | to-regex-range@5.0.1:
2647 | dependencies:
2648 | is-number: 7.0.0
2649 |
2650 | ts-api-utils@1.3.0(typescript@5.5.3):
2651 | dependencies:
2652 | typescript: 5.5.3
2653 |
2654 | type-check@0.4.0:
2655 | dependencies:
2656 | prelude-ls: 1.2.1
2657 |
2658 | type-fest@0.20.2: {}
2659 |
2660 | typed-array-buffer@1.0.2:
2661 | dependencies:
2662 | call-bind: 1.0.7
2663 | es-errors: 1.3.0
2664 | is-typed-array: 1.1.13
2665 |
2666 | typed-array-byte-length@1.0.1:
2667 | dependencies:
2668 | call-bind: 1.0.7
2669 | for-each: 0.3.3
2670 | gopd: 1.0.1
2671 | has-proto: 1.0.3
2672 | is-typed-array: 1.1.13
2673 |
2674 | typed-array-byte-offset@1.0.2:
2675 | dependencies:
2676 | available-typed-arrays: 1.0.7
2677 | call-bind: 1.0.7
2678 | for-each: 0.3.3
2679 | gopd: 1.0.1
2680 | has-proto: 1.0.3
2681 | is-typed-array: 1.1.13
2682 |
2683 | typed-array-length@1.0.6:
2684 | dependencies:
2685 | call-bind: 1.0.7
2686 | for-each: 0.3.3
2687 | gopd: 1.0.1
2688 | has-proto: 1.0.3
2689 | is-typed-array: 1.1.13
2690 | possible-typed-array-names: 1.0.0
2691 |
2692 | typescript@5.5.3: {}
2693 |
2694 | unbox-primitive@1.0.2:
2695 | dependencies:
2696 | call-bind: 1.0.7
2697 | has-bigints: 1.0.2
2698 | has-symbols: 1.0.3
2699 | which-boxed-primitive: 1.0.2
2700 |
2701 | update-browserslist-db@1.1.0(browserslist@4.23.2):
2702 | dependencies:
2703 | browserslist: 4.23.2
2704 | escalade: 3.1.2
2705 | picocolors: 1.0.1
2706 |
2707 | uri-js@4.4.1:
2708 | dependencies:
2709 | punycode: 2.3.1
2710 |
2711 | wavesurfer.js@7.8.2: {}
2712 |
2713 | which-boxed-primitive@1.0.2:
2714 | dependencies:
2715 | is-bigint: 1.0.4
2716 | is-boolean-object: 1.1.2
2717 | is-number-object: 1.0.7
2718 | is-string: 1.0.7
2719 | is-symbol: 1.0.4
2720 |
2721 | which-builtin-type@1.1.3:
2722 | dependencies:
2723 | function.prototype.name: 1.1.6
2724 | has-tostringtag: 1.0.2
2725 | is-async-function: 2.0.0
2726 | is-date-object: 1.0.5
2727 | is-finalizationregistry: 1.0.2
2728 | is-generator-function: 1.0.10
2729 | is-regex: 1.1.4
2730 | is-weakref: 1.0.2
2731 | isarray: 2.0.5
2732 | which-boxed-primitive: 1.0.2
2733 | which-collection: 1.0.2
2734 | which-typed-array: 1.1.15
2735 |
2736 | which-collection@1.0.2:
2737 | dependencies:
2738 | is-map: 2.0.3
2739 | is-set: 2.0.3
2740 | is-weakmap: 2.0.2
2741 | is-weakset: 2.0.3
2742 |
2743 | which-typed-array@1.1.15:
2744 | dependencies:
2745 | available-typed-arrays: 1.0.7
2746 | call-bind: 1.0.7
2747 | for-each: 0.3.3
2748 | gopd: 1.0.1
2749 | has-tostringtag: 1.0.2
2750 |
2751 | which@2.0.2:
2752 | dependencies:
2753 | isexe: 2.0.0
2754 |
2755 | word-wrap@1.2.5: {}
2756 |
2757 | wrappy@1.0.2: {}
2758 |
2759 | yallist@3.1.1: {}
2760 |
2761 | yocto-queue@0.1.0: {}
2762 |
--------------------------------------------------------------------------------
/src/components/Marker.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import Region, { RegionProps } from "./Region";
3 |
4 | /**
5 | * After wavesurfer.js@^7, Marker can be created with Region w/o end.
6 | * I.e., a region should have no duration to behave like a marker.
7 | */
8 | export default function Marker(props: Omit) {
9 | return
10 | }
11 |
--------------------------------------------------------------------------------
/src/components/Region.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useRef, useState } from "react";
2 | import RegionsPlugin, { Region as RegionWS, RegionParams } from "wavesurfer.js/dist/plugins/regions";
3 | import useRegionEvent, { RegionEventListener } from "../hooks/useRegionEvent";
4 | import useWavesurferContext from "../hooks/useWavesurferContext";
5 | import { UpdatableRegionProps } from "../constants/updatableRegionProps";
6 | import useRegionPluginEvent, { RegionPluginEventListener } from "../hooks/useRegionPluginEvent";
7 |
8 | export interface RegionProps extends RegionParams {
9 | onClick?: RegionEventListener;
10 | onOver?: RegionEventListener;
11 | onLeave?: RegionEventListener;
12 | onDoubleClick?: RegionEventListener;
13 | onIn?: RegionPluginEventListener;
14 | onOut?: RegionPluginEventListener;
15 | onRemove?: RegionEventListener;
16 | onUpdate?: RegionEventListener;
17 | onUpdateEnd?: RegionEventListener;
18 | id: string;
19 | }
20 |
21 | export const Region = ({
22 | onOver,
23 | onLeave,
24 | onClick,
25 | onDoubleClick,
26 | onIn,
27 | onOut,
28 | onRemove,
29 | onUpdate,
30 | onUpdateEnd,
31 | ...props
32 | }: RegionProps) => {
33 | const [waveSurfer, ,plugins] = useWavesurferContext()!;
34 |
35 | const regionPlug = plugins.find(p => p instanceof RegionsPlugin) as RegionsPlugin | undefined;
36 |
37 | const isRenderedCache = useRef(false);
38 |
39 | const [regionRef, setRegionRef] = useState(null);
40 |
41 | useEffect(() => {
42 | return () => {
43 | regionRef?.remove();
44 | };
45 | }, [regionRef]);
46 |
47 | useEffect(
48 | () => {
49 | // If there is a regionRef, then process update on any props update
50 | regionRef?.setOptions(UpdatableRegionProps.reduce(
51 | (result, prop) => {
52 | if (regionRef[prop] !== props[prop]) {
53 | return {
54 | ...result,
55 | [prop]: props[prop],
56 | };
57 | }
58 |
59 | return result;
60 | },
61 | { id: props.id } as Omit
62 | ));
63 | },
64 | UpdatableRegionProps.map((prop) => props[prop])
65 | );
66 |
67 | useEffect(() => {
68 | if (!isRenderedCache.current && waveSurfer) {
69 | isRenderedCache.current = true;
70 |
71 | let region = regionPlug?.getRegions().find(r => r.id === props.id);
72 |
73 | if (!region) {
74 | region = regionPlug?.addRegion(props);
75 | }
76 |
77 | if (!region) return;
78 |
79 | setRegionRef(region);
80 | }
81 | // eslint-disable-next-line
82 | }, [waveSurfer, regionPlug]);
83 |
84 | useRegionEvent(regionRef, "click", onClick);
85 |
86 | useRegionEvent(regionRef, "over", onOver);
87 |
88 | useRegionEvent(regionRef, "leave", onLeave);
89 |
90 | useRegionEvent(regionRef, "dblclick", onDoubleClick);
91 |
92 | useRegionPluginEvent(regionPlug, "region-in", onIn);
93 |
94 | useRegionPluginEvent(regionPlug, "region-out", onOut);
95 |
96 | useRegionEvent(regionRef, "remove", onRemove);
97 |
98 | useRegionEvent(regionRef, "update", onUpdate);
99 |
100 | useRegionEvent(regionRef, "update-end", onUpdateEnd);
101 |
102 | return null;
103 | };
104 |
105 | export default Region;
106 |
--------------------------------------------------------------------------------
/src/components/WaveForm.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { WaveSurferOptions } from "wavesurfer.js";
3 | export interface WaveFormProps extends Partial {
4 | id: string;
5 | children?: React.ReactNode;
6 | }
7 | const WaveForm = ({ id = "waveform", children }: WaveFormProps) => {
8 | return {children}
;
9 | };
10 |
11 | export default WaveForm;
12 |
--------------------------------------------------------------------------------
/src/constants/updatableRegionProps.ts:
--------------------------------------------------------------------------------
1 | export const UpdatableRegionProps = [
2 | "id",
3 | "start",
4 | "end",
5 | "drag",
6 | "resize",
7 | "color",
8 | "content",
9 | "channelIdx"
10 | ] as const;
11 |
--------------------------------------------------------------------------------
/src/containers/WaveSurfer.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import WaveSurferContext from "../contexts/WaveSurferContext";
3 | import { WaveSurfer as WaveSurferRef } from "../utils/createWavesurfer";
4 | import useWavesurfer from "../hooks/useWavesurfer";
5 |
6 | import { PluginType } from "../types";
7 | import { GenericPlugin } from "wavesurfer.js/dist/base-plugin";
8 | import { WaveSurferOptions } from "wavesurfer.js";
9 |
10 | export interface WaveSurferProps extends Omit {
11 | children: React.ReactNode;
12 | plugins: PluginType[];
13 | onMount: (wavesurferRef: null | WaveSurferRef) => void;
14 | }
15 |
16 |
17 | // TODO: research on ref usage
18 | function WaveSurfer({ children, plugins = [], onMount, ...props }: WaveSurferProps) {
19 | const wavesurfer = useWavesurfer({
20 | plugins,
21 | onMount,
22 | ...props,
23 | });
24 |
25 | return (
26 |
27 | {children}
28 |
29 | );
30 | }
31 |
32 | export default WaveSurfer;
33 |
--------------------------------------------------------------------------------
/src/contexts/WaveSurferContext.ts:
--------------------------------------------------------------------------------
1 | import { createContext } from 'react';
2 | import WaveSurfer from 'wavesurfer.js';
3 | import { GenericPlugin } from "wavesurfer.js/dist/base-plugin";
4 | import { PluginDictionary } from "../hooks/useWavesurfer";
5 |
6 | const WaveSurferContext = createContext, GenericPlugin[]] | null>(null);
7 |
8 | export default WaveSurferContext;
9 |
--------------------------------------------------------------------------------
/src/hooks/useRegionEvent.ts:
--------------------------------------------------------------------------------
1 | import { useEffect, useRef } from "react";
2 | import { Region, RegionEvents } from "wavesurfer.js/dist/plugins/regions";
3 |
4 | import { EventListener } from "../types";
5 |
6 | export type RegionEventListener = (region: Region, ...rest: Parameters>) => void;
7 |
8 | function useRegionEvent(
9 | ref: Region | null | undefined,
10 | eventName: K,
11 | callback?: RegionEventListener
12 | ) {
13 | const callbackRef = useRef | null>(null);
14 |
15 | useEffect(() => {
16 | if (!ref) {
17 | return;
18 | }
19 |
20 | if (callback) {
21 | callbackRef.current = (...args) => callback(ref, ...args);
22 |
23 | ref.on(eventName, callbackRef.current);
24 | }
25 |
26 | return () => {
27 | callbackRef.current && ref.un(eventName, callbackRef.current);
28 | callbackRef.current = null;
29 | };
30 | }, [ref, eventName, callback]);
31 | }
32 |
33 | export default useRegionEvent;
34 |
--------------------------------------------------------------------------------
/src/hooks/useRegionPluginEvent.ts:
--------------------------------------------------------------------------------
1 | import { useEffect, useRef } from "react";
2 | import RegionsPlugin, { RegionsPluginEvents } from "wavesurfer.js/dist/plugins/regions";
3 |
4 | import { EventListener } from "../types";
5 |
6 | export type RegionPluginEventListener = (...rest: Parameters>) => void;
7 |
8 | // TODO: try to merge it with useRegionEvent
9 | function useRegionPluginEvent(
10 | ref: RegionsPlugin | null | undefined,
11 | eventName: K,
12 | callback?: RegionPluginEventListener
13 | ) {
14 | const callbackRef = useRef | null>(null);
15 |
16 | useEffect(() => {
17 | if (!ref) {
18 | return;
19 | }
20 |
21 | if (callback) {
22 | callbackRef.current = (...args) => callback(...args);
23 |
24 | ref.on(eventName, callbackRef.current);
25 | }
26 |
27 | return () => {
28 | callbackRef.current && ref.un(eventName, callbackRef.current);
29 | callbackRef.current = null;
30 | };
31 | }, [ref, eventName, callback]);
32 | }
33 |
34 | export default useRegionPluginEvent;
35 |
--------------------------------------------------------------------------------
/src/hooks/useWavesurfer.ts:
--------------------------------------------------------------------------------
1 | import {useEffect, useRef, useState} from "react";
2 | import { GenericPlugin } from "wavesurfer.js/dist/base-plugin";
3 | import createWavesurfer, {WaveSurfer as WaveSurferRef, WaveSurfer} from "../utils/createWavesurfer";
4 | import createPlugin from "../utils/createPlugin";
5 | import getDifference from "../utils/getDifference";
6 | import { PluginType } from "../types";
7 |
8 | export type UseWaveSurferParams = {
9 | container?: string | HTMLElement,
10 | plugins: PluginType[],
11 | onMount: (wavesurferRef: null | WaveSurferRef) => any
12 | };
13 |
14 | export type PluginDictionary = Record;
15 |
16 |
17 | function createPluginsMap(curr: PluginDictionary, plugins: PluginType[]): PluginDictionary {
18 | const result: PluginDictionary = {};
19 |
20 | const stack = [...plugins];
21 |
22 | while (stack.length >= 1) {
23 | const node = stack.shift()!;
24 |
25 | const hasThisPluginAlready = !!curr[node.key];
26 |
27 | if (hasThisPluginAlready) {
28 | result[node.key] = curr[node.key]!;
29 | } else {
30 | result[node.key] = createPlugin(node);
31 | }
32 | }
33 |
34 | return result;
35 | }
36 |
37 | export default function useWavesurfer({ container, plugins = [], onMount, ...props }: UseWaveSurferParams) {
38 | const isInitilizing$ = useRef(false);
39 |
40 | const [pluginsMap, setPluginsMap] = useState>({});
41 | // is used to keep track of initialized plugins
42 | const initialized$ = useRef([]);
43 |
44 | const [wavesurfer, setWavesurfer] = useState(null);
45 |
46 | useEffect(() => {
47 | if (!container) return;
48 |
49 | // keep track of container
50 | const prevContainer = container;
51 |
52 | // do not allot to create WaveSurfer instance twice
53 | if (isInitilizing$.current) return;
54 | isInitilizing$.current = true;
55 |
56 |
57 | const _plugins = createPluginsMap(pluginsMap, plugins);
58 |
59 | initialized$.current = Object.keys(_plugins);
60 |
61 | const ws = createWavesurfer({
62 | container,
63 | ...props,
64 | plugins: Object.values(_plugins),
65 | })
66 |
67 | onMount?.(ws);
68 |
69 | setPluginsMap(_plugins);
70 | setWavesurfer(ws);
71 |
72 | return () => {
73 | // if container did not changed, but useEffect is still called,
74 | // prevent destroy if container or all-others hook dependencies are not changed
75 | if (prevContainer === container) return;
76 | ws.destroy();
77 | };
78 | }, [container]);
79 |
80 | useEffect(() => {
81 | if (wavesurfer) {
82 | const _plugins = createPluginsMap(pluginsMap, plugins);
83 |
84 | const { disabled, enabled } = getDifference(
85 | pluginsMap,
86 | _plugins
87 | );
88 |
89 | // destroy plugin, wavesurfer self removes it from plugin array
90 | Object.keys(disabled).forEach(plugKey => {
91 | disabled[plugKey]!.destroy();
92 | })
93 |
94 | Object.keys(enabled).forEach((pluginKey) => {
95 | // do not initialize plugin under the same key twice or more times
96 | if (initialized$.current.includes(pluginKey)) return;
97 |
98 | console.log('register plugin', pluginKey, enabled[pluginKey]);
99 |
100 | wavesurfer?.registerPlugin(enabled[pluginKey]!);
101 | });
102 |
103 | // register only enabled plugins
104 | initialized$.current = Object.keys(enabled);
105 |
106 | setPluginsMap(_plugins);
107 | }
108 | }, [plugins]);
109 |
110 | return [wavesurfer as WaveSurfer, pluginsMap, Object.values(pluginsMap)] as const;
111 | }
112 |
--------------------------------------------------------------------------------
/src/hooks/useWavesurferContext.ts:
--------------------------------------------------------------------------------
1 | import WaveSurferContext from "../contexts/WaveSurferContext";
2 | import {useContext} from "react";
3 |
4 | export default function useWavesurferContext() {
5 | return useContext(WaveSurferContext);
6 | }
7 |
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | import Region from "./components/Region";
2 | import Marker from "./components/Marker";
3 | import WaveSurfer from "./containers/WaveSurfer";
4 | import WaveForm from "./components/WaveForm";
5 | import useWavesurfer from "./hooks/useWavesurfer";
6 | import useWavesurferContext from "./hooks/useWavesurferContext";
7 |
8 | export { Region, WaveSurfer, WaveForm, Marker, useWavesurfer, useWavesurferContext };
9 |
--------------------------------------------------------------------------------
/src/types.ts:
--------------------------------------------------------------------------------
1 | import { GenericPlugin } from "wavesurfer.js/dist/base-plugin";
2 | import { GeneralEventTypes } from "wavesurfer.js/dist/event-emitter";
3 |
4 | export interface PluginType {
5 | key: string;
6 | plugin: GPlug;
7 | options: any;
8 | creator?: string;
9 | }
10 |
11 | export type EventListener = (...args: EventTypes[EventName]) => void;
12 |
--------------------------------------------------------------------------------
/src/utils/createPlugin.ts:
--------------------------------------------------------------------------------
1 | import { GenericPlugin } from "wavesurfer.js/dist/base-plugin";
2 | import { PluginType } from "../types";
3 |
4 | export default function createPlugin(pluginObj: PluginType): GPlug {
5 | const { plugin, options, creator = 'create'} = pluginObj;
6 |
7 | const createMethod: any = plugin[creator as keyof typeof plugin];
8 |
9 | if (!plugin) throw new Error(`Please pass a valid plugin in plugin list`);
10 | if (!creator) throw new Error(`Please pass the creator function name in 'creator' property.`)
11 |
12 | if (typeof createMethod !== 'function') {
13 | throw new Error(`"${creator}" is not callable on given plugin. Please pass a valid 'creator' in plugins list.`)
14 | }
15 |
16 | return createMethod(options);
17 | }
18 |
--------------------------------------------------------------------------------
/src/utils/createWavesurfer.ts:
--------------------------------------------------------------------------------
1 | import WaveSurfer, { WaveSurferOptions } from "wavesurfer.js";
2 |
3 | export default function createWavesurfer(options: WaveSurferOptions): WaveSurfer {
4 | return WaveSurfer.create(options);
5 | }
6 |
7 | export { WaveSurfer };
8 |
--------------------------------------------------------------------------------
/src/utils/getDifference.ts:
--------------------------------------------------------------------------------
1 | import { GenericPlugin } from "wavesurfer.js/dist/base-plugin";
2 | import { PluginDictionary } from "../hooks/useWavesurfer";
3 |
4 | const fromPairs = (arr: Array<[string, T]>): Record => arr.reduce((acc, item) => {
5 | acc[item[0]] = item[1];
6 |
7 | return acc;
8 | }, {} as Record);
9 |
10 | const getDifference = (arr1: PluginDictionary, arr2: PluginDictionary) => {
11 | const nextArr1 = Object.entries(arr1);
12 | const nextArr2 = Object.entries(arr2);
13 |
14 | const disabled = nextArr1.filter(([item]) => nextArr2.findIndex(([nextItem]) => nextItem === item) === -1);
15 |
16 | const enabled = nextArr2.filter(([item]) => nextArr1.findIndex(([nextItem]) => nextItem === item) === -1);
17 |
18 | return { disabled: fromPairs(disabled), enabled: fromPairs(enabled) };
19 | };
20 |
21 | export default getDifference;
22 |
--------------------------------------------------------------------------------
/src/utils/getWaveFormOptionsFromProps.ts:
--------------------------------------------------------------------------------
1 | import { WaveSurferOptions } from "wavesurfer.js";
2 | import { WaveFormProps } from "../components/WaveForm";
3 |
4 |
5 | export const waveFormPropsList = [
6 | "audioRate",
7 | "autoCenter",
8 | "backend",
9 | "barGap",
10 | "barHeight",
11 | "barRadius",
12 | "barWidth",
13 | "cursorColor",
14 | "cursorWidth",
15 | "fillParent",
16 | "height",
17 | "hideScrollbar",
18 | "interact",
19 | "media",
20 | "mediaControls",
21 | "minPxPerSec",
22 | "normalize",
23 | "progressColor",
24 | "splitChannels",
25 | "waveColor",
26 |
27 | "duration",
28 |
29 | "fetchParams"
30 | ] as const;
31 |
32 | const getWaveFormOptionsFromProps = (props: WaveFormProps): Omit => {
33 | if (!props) return {};
34 |
35 | return waveFormPropsList.reduce>((waveFormOptions, optionName) => {
36 | if (!Object.prototype.hasOwnProperty.call(props,optionName)) {
37 | return waveFormOptions;
38 | }
39 |
40 | return {
41 | ...waveFormOptions,
42 | [optionName]: props[optionName]
43 | };
44 | }, {} as Record);
45 | };
46 |
47 | export default getWaveFormOptionsFromProps;
48 |
--------------------------------------------------------------------------------
/src/utils/isReactElement.ts:
--------------------------------------------------------------------------------
1 | import React from "react";
2 |
3 | export default function isReactElement(el: React.ReactNode): el is React.ReactElement {
4 | return !!el && typeof el !== "string" && typeof el !== "number" && typeof el !== "boolean" && "type" in el && "props" in el;
5 | }
6 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "esModuleInterop": true,
4 | "skipLibCheck": true,
5 | "target": "esnext",
6 | "jsx": "react",
7 | "allowJs": true,
8 | "resolveJsonModule": true,
9 | "strict": true,
10 | "allowSyntheticDefaultImports": true,
11 | "noUncheckedIndexedAccess": true,
12 | "module": "esnext",
13 | "moduleResolution": "node",
14 | "outDir": "dist",
15 | "sourceMap": true,
16 | "declaration": true
17 | },
18 | "include": [
19 | "src/**/*"
20 | ],
21 | "exclude": [
22 | "src/**/*.spec.tsx",
23 | "src/setupTests.tsx",
24 | "src/stories",
25 | "dist",
26 | "node_modules"
27 | ]
28 | }
29 |
--------------------------------------------------------------------------------