├── .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 | [![minified](https://badgen.net/bundlephobia/min/wavesurfer-react)](https://bundlephobia.com/package/wavesurfer-react) 6 | [![minzipped](https://badgen.net/bundlephobia/minzip/wavesurfer-react)](https://bundlephobia.com/package/wavesurfer-react) 7 | [![downloads](https://badgen.net/npm/dw/wavesurfer-react)](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 | [Static Badge 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 | [![Star History Chart](https://api.star-history.com/svg?repos=ShiiRochi/wavesurfer-react&type=Date)](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 | --------------------------------------------------------------------------------