From 7a0355fabdc60ba07d2bdbfd4b46f502a515316b Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Mon, 1 Apr 2024 11:37:16 +0200 Subject: [PATCH 01/29] Update Node version for Github builds --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7c39ebe..89d71a7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,7 +16,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - name: Install Dependencies run: npm install From 60a4c73e8203d8e90ff12112bb1d991504558359 Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Mon, 1 Apr 2024 11:50:45 +0200 Subject: [PATCH 02/29] Remove private package --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e4ec2fc..249f2cc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "simple-voice-changer", "version": "2.2.0", - "private": true, + "private": false, "scripts": { "dev": "next dev", "build": "next build", From f46cec829877309f7d30c93965912e212da8b440 Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Mon, 1 Apr 2024 12:03:24 +0200 Subject: [PATCH 03/29] Update package.json --- package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/package.json b/package.json index 249f2cc..711e621 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,10 @@ "start": "next start", "lint": "next lint" }, + "repository": { + "type": "git", + "url": "git+https://github.com/Eliastik/simple-voice-changer.git" + }, "dependencies": { "@eliastik/simple-sound-studio-components": "^2.2.0", "@eliastik/simple-sound-studio-lib": "^2.2.0", From 705e3ee3e7761d2ef9f7ecdc93cad7d27b629447 Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Fri, 3 May 2024 15:11:54 +0200 Subject: [PATCH 04/29] Update ROADMAP --- ROADMAP.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index ee76fb2..79f5e15 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -72,10 +72,11 @@ ### Would be good but not important +* [x] - Simplify code: split AudioEditor classe into smaller classes +* [ ] - Use dependency injection (instead of Singleton) - for AudioEditor subclasses and AudioEditorObjectsSingleton * [ ] - Create new filters (equalizer?, volume/gain?) * [ ] - If adding new filters: hide some advanced filters, and make possible to add them if needed in the UI * [ ] - Save into localstorage filters settings + filter presets that can be set by the user? -* [ ] - Use dependency injection instead of Singleton? * [ ] - Graphical visualization of audio + apply filters in a portion of the audio? * [ ] - Real-time filters editing when recording audio (reuse existing filters)? * [ ] - Enhance limiter? From 90b0f3bab3fdcacd4e1bd7544007aba43ae5b0fe Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Mon, 6 May 2024 17:46:07 +0200 Subject: [PATCH 05/29] Update dependencies, uses SoundStudioApplicationFactory --- package-lock.json | 875 ++++++++++--------- package.json | 28 +- src/app/context/ApplicationConfigContext.tsx | 4 +- src/app/context/AudioRecorderContext.tsx | 4 +- src/app/model/Constants.ts | 2 +- src/app/page.tsx | 6 +- 6 files changed, 481 insertions(+), 438 deletions(-) diff --git a/package-lock.json b/package-lock.json index ac7c76b..ce1b9a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,44 +10,35 @@ "dependencies": { "@eliastik/simple-sound-studio-components": "^2.2.0", "@eliastik/simple-sound-studio-lib": "^2.2.0", - "i18next": "^23.10.1", + "i18next": "^23.11.3", "lodash": "^4.17.21", - "next": "^14.1.4", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-i18next": "^14.1.0", + "next": "^14.2.3", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-i18next": "^14.1.1", "semver": "^7.6.0" }, "devDependencies": { "@types/audioworklet": "^0.0.54", - "@types/lodash": "^4.17.0", - "@types/node": "^20.12.2", - "@types/react": "^18.2.70", - "@types/react-dom": "^18.2.22", + "@types/lodash": "^4.17.1", + "@types/node": "^20.12.9", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", "@types/semver": "^7.5.8", - "@typescript-eslint/eslint-plugin": "^7.4.0", - "@typescript-eslint/parser": "^7.4.0", + "@typescript-eslint/eslint-plugin": "^7.8.0", + "@typescript-eslint/parser": "^7.8.0", "autoprefixer": "^10.4.19", "copy-webpack-plugin": "^12.0.2", - "daisyui": "^4.9.0", + "daisyui": "^4.10.5", "dotenv": "^16.4.5", "eslint": "^8.57.0", - "eslint-config-next": "^14.1.4", + "eslint-config-next": "^14.2.3", "eslint-plugin-react": "^7.34.1", "glob": "^10.3.10", "next-pwa": "^5.6.0", "postcss": "^8.4.38", "tailwindcss": "^3.4.3", - "typescript": "^5.4.3" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "typescript": "^5.4.5" } }, "node_modules/@alloc/quick-lru": { @@ -89,30 +80,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", - "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", - "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.1", + "@babel/generator": "^7.24.5", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.1", - "@babel/parser": "^7.24.1", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -137,12 +128,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", - "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", "dev": true, "dependencies": { - "@babel/types": "^7.24.0", + "@babel/types": "^7.24.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -201,19 +192,19 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.1.tgz", - "integrity": "sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.5.tgz", + "integrity": "sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.24.5", "@babel/helper-optimise-call-expression": "^7.22.5", "@babel/helper-replace-supers": "^7.24.1", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "semver": "^6.3.1" }, "engines": { @@ -259,9 +250,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", @@ -309,12 +300,12 @@ } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.5.tgz", + "integrity": "sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -333,16 +324,16 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -364,9 +355,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", - "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -407,12 +398,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -431,12 +422,12 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -452,9 +443,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", "dev": true, "engines": { "node": ">=6.9.0" @@ -470,40 +461,40 @@ } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.5.tgz", + "integrity": "sha512-/xxzuNvgRl4/HLNKvnFwdhdgN3cpLxgLROeLDl83Yx0AJ1SGvq1ak0OszTOjDfiB8Vx03eJbeDWh9r+jCCWttw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/helper-function-name": "^7.23.0", + "@babel/template": "^7.24.0", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", - "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", "dev": true, "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.5", "chalk": "^2.4.2", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" @@ -584,9 +575,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -595,6 +586,22 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.5.tgz", + "integrity": "sha512-LdXRi1wEMTrHVR4Zc9F8OewC3vdm5h4QB6L71zy6StmYeqGi1b3ttIO8UC+BfZKcH9jdr4aI249rBkm+3+YvHw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", @@ -956,12 +963,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.1.tgz", - "integrity": "sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.5.tgz", + "integrity": "sha512-sMfBc3OxghjC95BkYrYocHL3NaOplrcaunblzwXhGmlPwpmfsxr4vK+mBBt49r+S240vahmv+kUxkeKgs+haCw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -987,12 +994,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.1.tgz", - "integrity": "sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", + "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", + "@babel/helper-create-class-features-plugin": "^7.24.4", "@babel/helper-plugin-utils": "^7.24.0", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, @@ -1004,18 +1011,18 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.5.tgz", + "integrity": "sha512-gWkLP25DFj2dwe9Ck8uwMOpko4YsqyfZJrOmqqcegeDYEbp7rmn4U6UQZNj08UF6MaX39XenSpKRCvpDRBtZ7Q==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-split-export-declaration": "^7.24.5", "globals": "^11.1.0" }, "engines": { @@ -1051,12 +1058,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.5.tgz", + "integrity": "sha512-SZuuLyfxvsm+Ah57I/i1HVjveBENYK9ue8MJ7qkc7ndoNjqquJiElzA7f5yaAXjyW2hKojosOTAQQRX50bPSVg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1370,15 +1377,15 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.5.tgz", + "integrity": "sha512-7EauQHszLGM3ay7a161tTQH7fj+3vVM/gThlz5HpFtnygTxjrlvoeq7MPVA1Vy9Q555OB8SnAOsMkLShNkkrHA==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/plugin-transform-parameters": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1420,12 +1427,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.5.tgz", + "integrity": "sha512-xWCkmwKT+ihmA6l7SSTpk8e4qQl/274iNbSKRRS8mpqFR32ksy36+a+LWY8OXCCEefF8WFlnOHVsaDI2231wBg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1437,12 +1444,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.5.tgz", + "integrity": "sha512-9Co00MqZ2aoky+4j2jhofErthm6QVLKbpQrvz20c3CH9KQCLHyNB+t2ya4/UrRpQGR+Wrwjg9foopoeSdnHOkA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1468,14 +1475,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.5.tgz", + "integrity": "sha512-JM4MHZqnWR04jPMujQDTBVRnqxpLLpx2tkn7iPn+Hmsc0Gnb79yvRWOkvqFOx3Z7P7VxiRIR22c4eGSNj87OBQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-create-class-features-plugin": "^7.24.5", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1593,12 +1600,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.5.tgz", + "integrity": "sha512-UTGnhYVZtTAjdwOTzT+sCyXmTn8AhaxOS/MjG9REclZ6ULHWF9KoCZur0HSGU7hk8PdBFKKbYe6+gqdXWz84Jg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.24.5" }, "engines": { "node": ">=6.9.0" @@ -1671,15 +1678,16 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.3.tgz", - "integrity": "sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.5.tgz", + "integrity": "sha512-UGK2ifKtcC8i5AI4cH+sbLLuLc2ktYSFJgBAXorKAsHUZmrQ1q6aQ6i3BvU24wWs2AAKqQB6kq3N9V9Gw1HiMQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.1", + "@babel/compat-data": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.24.5", "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.5", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", @@ -1706,12 +1714,12 @@ "@babel/plugin-transform-async-generator-functions": "^7.24.3", "@babel/plugin-transform-async-to-generator": "^7.24.1", "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.1", + "@babel/plugin-transform-block-scoping": "^7.24.5", "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.1", - "@babel/plugin-transform-classes": "^7.24.1", + "@babel/plugin-transform-class-static-block": "^7.24.4", + "@babel/plugin-transform-classes": "^7.24.5", "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", + "@babel/plugin-transform-destructuring": "^7.24.5", "@babel/plugin-transform-dotall-regex": "^7.24.1", "@babel/plugin-transform-duplicate-keys": "^7.24.1", "@babel/plugin-transform-dynamic-import": "^7.24.1", @@ -1731,13 +1739,13 @@ "@babel/plugin-transform-new-target": "^7.24.1", "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", + "@babel/plugin-transform-object-rest-spread": "^7.24.5", "@babel/plugin-transform-object-super": "^7.24.1", "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", + "@babel/plugin-transform-optional-chaining": "^7.24.5", + "@babel/plugin-transform-parameters": "^7.24.5", "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", + "@babel/plugin-transform-private-property-in-object": "^7.24.5", "@babel/plugin-transform-property-literals": "^7.24.1", "@babel/plugin-transform-regenerator": "^7.24.1", "@babel/plugin-transform-reserved-words": "^7.24.1", @@ -1745,7 +1753,7 @@ "@babel/plugin-transform-spread": "^7.24.1", "@babel/plugin-transform-sticky-regex": "^7.24.1", "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", + "@babel/plugin-transform-typeof-symbol": "^7.24.5", "@babel/plugin-transform-unicode-escapes": "^7.24.1", "@babel/plugin-transform-unicode-property-regex": "^7.24.1", "@babel/plugin-transform-unicode-regex": "^7.24.1", @@ -1794,9 +1802,9 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -1819,19 +1827,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1849,13 +1857,13 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2025,9 +2033,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "node_modules/@isaacs/cliui": { @@ -2133,14 +2141,14 @@ } }, "node_modules/@next/env": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.4.tgz", - "integrity": "sha512-e7X7bbn3Z6DWnDi75UWn+REgAbLEqxI8Tq2pkFOFAMpWAWApz/YCUhtWMWn410h8Q2fYiYL7Yg5OlxMOCfFjJQ==" + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.3.tgz", + "integrity": "sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==" }, "node_modules/@next/eslint-plugin-next": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.1.4.tgz", - "integrity": "sha512-n4zYNLSyCo0Ln5b7qxqQeQ34OZKXwgbdcx6kmkQbywr+0k6M3Vinft0T72R6CDAcDrne2IAgSud4uWCzFgc5HA==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.3.tgz", + "integrity": "sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==", "dev": true, "dependencies": { "glob": "10.3.10" @@ -2169,9 +2177,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.4.tgz", - "integrity": "sha512-ubmUkbmW65nIAOmoxT1IROZdmmJMmdYvXIe8211send9ZYJu+SqxSnJM4TrPj9wmL6g9Atvj0S/2cFmMSS99jg==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.3.tgz", + "integrity": "sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==", "cpu": [ "arm64" ], @@ -2184,9 +2192,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.4.tgz", - "integrity": "sha512-b0Xo1ELj3u7IkZWAKcJPJEhBop117U78l70nfoQGo4xUSvv0PJSTaV4U9xQBLvZlnjsYkc8RwQN1HoH/oQmLlQ==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.3.tgz", + "integrity": "sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==", "cpu": [ "x64" ], @@ -2199,9 +2207,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.4.tgz", - "integrity": "sha512-457G0hcLrdYA/u1O2XkRMsDKId5VKe3uKPvrKVOyuARa6nXrdhJOOYU9hkKKyQTMru1B8qEP78IAhf/1XnVqKA==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.3.tgz", + "integrity": "sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==", "cpu": [ "arm64" ], @@ -2214,9 +2222,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.4.tgz", - "integrity": "sha512-l/kMG+z6MB+fKA9KdtyprkTQ1ihlJcBh66cf0HvqGP+rXBbOXX0dpJatjZbHeunvEHoBBS69GYQG5ry78JMy3g==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.3.tgz", + "integrity": "sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==", "cpu": [ "arm64" ], @@ -2229,9 +2237,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.4.tgz", - "integrity": "sha512-BapIFZ3ZRnvQ1uWbmqEGJuPT9cgLwvKtxhK/L2t4QYO7l+/DxXuIGjvp1x8rvfa/x1FFSsipERZK70pewbtJtw==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.3.tgz", + "integrity": "sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==", "cpu": [ "x64" ], @@ -2244,9 +2252,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.1.4.tgz", - "integrity": "sha512-mqVxTwk4XuBl49qn2A5UmzFImoL1iLm0KQQwtdRJRKl21ylQwwGCxJtIYo2rbfkZHoSKlh/YgztY0qH3wG1xIg==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.3.tgz", + "integrity": "sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==", "cpu": [ "x64" ], @@ -2259,9 +2267,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.4.tgz", - "integrity": "sha512-xzxF4ErcumXjO2Pvg/wVGrtr9QQJLk3IyQX1ddAC/fi6/5jZCZ9xpuL9Tzc4KPWMFq8GGWFVDMshZOdHGdkvag==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.3.tgz", + "integrity": "sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==", "cpu": [ "arm64" ], @@ -2274,9 +2282,9 @@ } }, "node_modules/@next/swc-win32-ia32-msvc": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.4.tgz", - "integrity": "sha512-WZiz8OdbkpRw6/IU/lredZWKKZopUMhcI2F+XiMAcPja0uZYdMTZQRoQ0WZcvinn9xZAidimE7tN9W5v9Yyfyw==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.3.tgz", + "integrity": "sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==", "cpu": [ "ia32" ], @@ -2289,9 +2297,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.4.tgz", - "integrity": "sha512-4Rto21sPfw555sZ/XNLqfxDUNeLhNYGO2dlPqsnuCg8N8a2a9u1ltqBOPQ4vj1Gf7eJC0W2hHG2eYUHuiXgY2w==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.3.tgz", + "integrity": "sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==", "cpu": [ "x64" ], @@ -2428,9 +2436,9 @@ "dev": true }, "node_modules/@rushstack/eslint-patch": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.1.tgz", - "integrity": "sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.2.tgz", + "integrity": "sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==", "dev": true }, "node_modules/@sindresorhus/merge-streams": { @@ -2457,11 +2465,17 @@ "string.prototype.matchall": "^4.0.6" } }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==" + }, "node_modules/@swc/helpers": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz", - "integrity": "sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", "dependencies": { + "@swc/counter": "^0.1.3", "tslib": "^2.4.0" } }, @@ -2471,9 +2485,9 @@ "integrity": "sha512-WR1XcwT2LhCaUiKDDgHdTjrVjoBZnTz6FhszeIKgY9i2UYfIRKtnNvqToUDnbCPXBpVuu4Qo5+mMJt+wDphRew==" }, "node_modules/@types/eslint": { - "version": "8.56.6", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.6.tgz", - "integrity": "sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A==", + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dev": true, "peer": true, "dependencies": { @@ -2522,9 +2536,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", - "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz", + "integrity": "sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==", "dev": true }, "node_modules/@types/minimatch": { @@ -2534,9 +2548,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.2.tgz", - "integrity": "sha512-zQ0NYO87hyN6Xrclcqp7f8ZbXNbRfoGWNcMvHTPQp9UUrwI0mI7XBz+cu7/W6/VClYo2g63B0cjull/srU7LgQ==", + "version": "20.12.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.9.tgz", + "integrity": "sha512-o93r47yu04MHumPBCFg0bMPBMNgtMg3jzbhl7e68z50+BMHmRMGDJv13eBlUgOdc9i/uoJXGMGYLtJV4ReTXEg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -2549,9 +2563,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.73", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.73.tgz", - "integrity": "sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz", + "integrity": "sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -2559,9 +2573,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.2.23", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.23.tgz", - "integrity": "sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, "dependencies": { "@types/react": "*" @@ -2589,22 +2603,22 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.4.0.tgz", - "integrity": "sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", + "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.4.0", - "@typescript-eslint/type-utils": "7.4.0", - "@typescript-eslint/utils": "7.4.0", - "@typescript-eslint/visitor-keys": "7.4.0", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/type-utils": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2624,15 +2638,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.4.0.tgz", - "integrity": "sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.4.0", - "@typescript-eslint/types": "7.4.0", - "@typescript-eslint/typescript-estree": "7.4.0", - "@typescript-eslint/visitor-keys": "7.4.0", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4" }, "engines": { @@ -2652,13 +2666,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.4.0.tgz", - "integrity": "sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.4.0", - "@typescript-eslint/visitor-keys": "7.4.0" + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2669,15 +2683,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.4.0.tgz", - "integrity": "sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", + "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.4.0", - "@typescript-eslint/utils": "7.4.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/utils": "7.8.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2696,9 +2710,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.4.0.tgz", - "integrity": "sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2709,19 +2723,19 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.4.0.tgz", - "integrity": "sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", + "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.4.0", - "@typescript-eslint/visitor-keys": "7.4.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2737,18 +2751,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.4.0.tgz", - "integrity": "sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", + "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.4.0", - "@typescript-eslint/types": "7.4.0", - "@typescript-eslint/typescript-estree": "7.4.0", - "semver": "^7.5.4" + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "semver": "^7.6.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2762,13 +2776,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.4.0.tgz", - "integrity": "sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", + "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.4.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.8.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -3024,15 +3038,15 @@ } }, "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -3424,13 +3438,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", + "@babel/helper-define-polyfill-provider": "^0.6.2", "semver": "^6.3.1" }, "peerDependencies": { @@ -3460,12 +3474,12 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1" + "@babel/helper-define-polyfill-provider": "^0.6.2" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -3618,9 +3632,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001603", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001603.tgz", - "integrity": "sha512-iL2iSS0eDILMb9n5yKQoTBim9jMZ0Yrk8g0N9K7UzYyWnfIKzXBZD5ngpM37ZcL/cv0Mli8XtVMRYMQAfFpi5Q==", + "version": "1.0.30001616", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001616.tgz", + "integrity": "sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==", "funding": [ { "type": "opencollective", @@ -3841,9 +3855,9 @@ } }, "node_modules/core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "version": "3.37.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.0.tgz", + "integrity": "sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==", "dev": true, "dependencies": { "browserslist": "^4.23.0" @@ -3914,9 +3928,9 @@ } }, "node_modules/daisyui": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.9.0.tgz", - "integrity": "sha512-9JsDx4E+30kPxThE+6yEwQokqg1957uwTx/skP2RE98fG6Ten6U+S9YXeQg1a3CI958aF5aOb0oEA+KZFfrZUA==", + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.10.5.tgz", + "integrity": "sha512-eOFUo5yEg0WV+3VK2C/+/XN1WH/OhFV4HzrMG5etAzcnB2hPg3aoR7gF1ZUpIv+b5MglLuAVMgub0rv660EgZg==", "dev": true, "dependencies": { "css-selector-tokenizer": "^0.8", @@ -4228,9 +4242,9 @@ "dev": true }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, "dependencies": { "jake": "^10.8.5" @@ -4243,9 +4257,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.722", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.722.tgz", - "integrity": "sha512-5nLE0TWFFpZ80Crhtp4pIp8LXCztjYX41yUcV6b+bKR2PqzjskTMOOlBi1VjBHlvHwS+4gar7kNKOrsbsewEZQ==", + "version": "1.4.756", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.756.tgz", + "integrity": "sha512-RJKZ9+vEBMeiPAvKNWyZjuYyUqMndcP1f335oHqn3BEQbs2NFtVrnK5+6Xg5wSM9TknNNpWghGDUCKGYF+xWXw==", "dev": true }, "node_modules/emoji-regex": { @@ -4358,14 +4372,14 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.0.18", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", - "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz", + "integrity": "sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==", "dev": true, "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", + "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", @@ -4383,9 +4397,9 @@ } }, "node_modules/es-module-lexer": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", - "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.2.tgz", + "integrity": "sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==", "dev": true, "peer": true }, @@ -4518,14 +4532,14 @@ } }, "node_modules/eslint-config-next": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.1.4.tgz", - "integrity": "sha512-cihIahbhYAWwXJwZkAaRPpUi5t9aOi/HdfWXOjZeUOqNWXHD8X22kd1KG58Dc3MVaRx3HoR/oMGk2ltcrqDn8g==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-14.2.3.tgz", + "integrity": "sha512-ZkNztm3Q7hjqvB1rRlOX8P9E/cXRL9ajRcs8jufEtwMfTVYRqnmtnaSu57QqHyBlovMuiB8LEzfLBkh5RYV6Fg==", "dev": true, "dependencies": { - "@next/eslint-plugin-next": "14.1.4", + "@next/eslint-plugin-next": "14.2.3", "@rushstack/eslint-patch": "^1.3.3", - "@typescript-eslint/parser": "^5.4.2 || ^6.0.0", + "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || 7.0.0 - 7.2.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.28.1", @@ -4544,15 +4558,15 @@ } }, "node_modules/eslint-config-next/node_modules/@typescript-eslint/parser": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", + "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.21.0", - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/typescript-estree": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/scope-manager": "7.2.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/typescript-estree": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", "debug": "^4.3.4" }, "engines": { @@ -4563,7 +4577,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -4572,13 +4586,13 @@ } }, "node_modules/eslint-config-next/node_modules/@typescript-eslint/scope-manager": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", + "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0" + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -4589,9 +4603,9 @@ } }, "node_modules/eslint-config-next/node_modules/@typescript-eslint/types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", - "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", + "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -4602,13 +4616,13 @@ } }, "node_modules/eslint-config-next/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", - "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", + "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", - "@typescript-eslint/visitor-keys": "6.21.0", + "@typescript-eslint/types": "7.2.0", + "@typescript-eslint/visitor-keys": "7.2.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4630,12 +4644,12 @@ } }, "node_modules/eslint-config-next/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", - "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", + "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/types": "7.2.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -4646,6 +4660,21 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", @@ -4885,9 +4914,9 @@ } }, "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, "engines": { "node": ">=10" @@ -5401,9 +5430,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", - "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", + "version": "4.7.4", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.4.tgz", + "integrity": "sha512-ofbkKj+0pjXjhejr007J/fLf+sW+8H7K5GCm+msC8q3IpvgjobpyPqSRFemNyIMxklC0zeJpi7VDFna19FacvQ==", "dev": true, "dependencies": { "resolve-pkg-maps": "^1.0.0" @@ -5469,12 +5498,13 @@ } }, "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -5616,9 +5646,9 @@ } }, "node_modules/i18next": { - "version": "23.10.1", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.1.tgz", - "integrity": "sha512-NDiIzFbcs3O9PXpfhkjyf7WdqFn5Vq6mhzhtkXzj51aOcNuPNcTwuYNuXCpHsanZGHlHKL35G7huoFeVic1hng==", + "version": "23.11.3", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.3.tgz", + "integrity": "sha512-Pq/aSKowir7JM0rj+Wa23Kb6KKDUGno/HjG+wRQu0PxoTbpQ4N89MAT0rFGvXmLkRLNMb1BbBOKGozl01dabzg==", "funding": [ { "type": "individual", @@ -6187,9 +6217,9 @@ } }, "node_modules/jake": { - "version": "10.8.7", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", - "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", "dev": true, "dependencies": { "async": "^3.2.3", @@ -6611,9 +6641,9 @@ } }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -6635,9 +6665,9 @@ } }, "node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz", + "integrity": "sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -6691,12 +6721,12 @@ "peer": true }, "node_modules/next": { - "version": "14.1.4", - "resolved": "https://registry.npmjs.org/next/-/next-14.1.4.tgz", - "integrity": "sha512-1WTaXeSrUwlz/XcnhGTY7+8eiaFvdet5z9u3V2jb+Ek1vFo0VhHKSAIJvDWfQpttWjnyw14kBeq28TPq7bTeEQ==", + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.3.tgz", + "integrity": "sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==", "dependencies": { - "@next/env": "14.1.4", - "@swc/helpers": "0.5.2", + "@next/env": "14.2.3", + "@swc/helpers": "0.5.5", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "graceful-fs": "^4.2.11", @@ -6710,18 +6740,19 @@ "node": ">=18.17.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "14.1.4", - "@next/swc-darwin-x64": "14.1.4", - "@next/swc-linux-arm64-gnu": "14.1.4", - "@next/swc-linux-arm64-musl": "14.1.4", - "@next/swc-linux-x64-gnu": "14.1.4", - "@next/swc-linux-x64-musl": "14.1.4", - "@next/swc-win32-arm64-msvc": "14.1.4", - "@next/swc-win32-ia32-msvc": "14.1.4", - "@next/swc-win32-x64-msvc": "14.1.4" + "@next/swc-darwin-arm64": "14.2.3", + "@next/swc-darwin-x64": "14.2.3", + "@next/swc-linux-arm64-gnu": "14.2.3", + "@next/swc-linux-arm64-musl": "14.2.3", + "@next/swc-linux-x64-gnu": "14.2.3", + "@next/swc-linux-x64-musl": "14.2.3", + "@next/swc-win32-arm64-msvc": "14.2.3", + "@next/swc-win32-ia32-msvc": "14.2.3", + "@next/swc-win32-x64-msvc": "14.2.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "sass": "^1.3.0" @@ -6730,6 +6761,9 @@ "@opentelemetry/api": { "optional": true }, + "@playwright/test": { + "optional": true + }, "sass": { "optional": true } @@ -6947,17 +6981,17 @@ } }, "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -7079,9 +7113,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -7445,9 +7479,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -7456,21 +7490,21 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-i18next": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.0.tgz", - "integrity": "sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ==", + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.1.tgz", + "integrity": "sha512-QSiKw+ihzJ/CIeIYWrarCmXJUySHDwQr5y8uaNIkbxoGRm/5DukkxZs+RPla79IKyyDPzC/DRlgQCABHtrQuQQ==", "dependencies": { "@babel/runtime": "^7.23.9", "html-parse-stringify": "^3.0.1" @@ -7877,9 +7911,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -7904,15 +7938,15 @@ } }, "node_modules/schema-utils/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -8484,9 +8518,9 @@ } }, "node_modules/terser": { - "version": "5.30.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.0.tgz", - "integrity": "sha512-Y/SblUl5kEyEFzhMAQdsxVHh+utAxd4IuRNJzKywY/4uzSogh3G219jqbDDxYu4MXO9CzY3tSEqmZvW6AoEDJw==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -8761,9 +8795,9 @@ } }, "node_modules/typescript": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", - "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -8878,9 +8912,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", + "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", "dev": true, "funding": [ { @@ -8897,7 +8931,7 @@ } ], "dependencies": { - "escalade": "^3.1.1", + "escalade": "^3.1.2", "picocolors": "^1.0.0" }, "bin": { @@ -9161,6 +9195,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/workbox-background-sync": { "version": "6.6.0", "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", @@ -9246,15 +9289,15 @@ } }, "node_modules/workbox-build/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -9583,9 +9626,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", - "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", "dev": true, "bin": { "yaml": "bin.mjs" diff --git a/package.json b/package.json index 711e621..6752a9f 100644 --- a/package.json +++ b/package.json @@ -15,34 +15,34 @@ "dependencies": { "@eliastik/simple-sound-studio-components": "^2.2.0", "@eliastik/simple-sound-studio-lib": "^2.2.0", - "i18next": "^23.10.1", + "i18next": "^23.11.3", "lodash": "^4.17.21", - "next": "^14.1.4", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-i18next": "^14.1.0", + "next": "^14.2.3", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-i18next": "^14.1.1", "semver": "^7.6.0" }, "devDependencies": { "@types/audioworklet": "^0.0.54", - "@types/lodash": "^4.17.0", - "@types/node": "^20.12.2", - "@types/react": "^18.2.70", - "@types/react-dom": "^18.2.22", + "@types/lodash": "^4.17.1", + "@types/node": "^20.12.9", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", "@types/semver": "^7.5.8", - "@typescript-eslint/eslint-plugin": "^7.4.0", - "@typescript-eslint/parser": "^7.4.0", + "@typescript-eslint/eslint-plugin": "^7.8.0", + "@typescript-eslint/parser": "^7.8.0", "autoprefixer": "^10.4.19", "copy-webpack-plugin": "^12.0.2", - "daisyui": "^4.9.0", + "daisyui": "^4.10.5", "dotenv": "^16.4.5", "eslint": "^8.57.0", - "eslint-config-next": "^14.1.4", + "eslint-config-next": "^14.2.3", "eslint-plugin-react": "^7.34.1", "glob": "^10.3.10", "next-pwa": "^5.6.0", "postcss": "^8.4.38", "tailwindcss": "^3.4.3", - "typescript": "^5.4.3" + "typescript": "^5.4.5" } } diff --git a/src/app/context/ApplicationConfigContext.tsx b/src/app/context/ApplicationConfigContext.tsx index 46bad56..b167045 100644 --- a/src/app/context/ApplicationConfigContext.tsx +++ b/src/app/context/ApplicationConfigContext.tsx @@ -2,7 +2,7 @@ import { createContext, useContext, useState, ReactNode, FC, useEffect } from "react"; import { AudioEditor, EventType, Constants } from "@eliastik/simple-sound-studio-lib"; -import { ApplicationObjectsSingleton } from "@eliastik/simple-sound-studio-components"; +import { SoundStudioApplicationFactory } from "@eliastik/simple-sound-studio-components"; import i18n from "@eliastik/simple-sound-studio-components/lib/i18n"; import i18next from "i18next"; import ApplicationConfigContextProps from "../model/contextProps/ApplicationConfigContextProps"; @@ -29,7 +29,7 @@ const getService = (): ApplicationConfigService => { }; const getAudioEditor = (): AudioEditor => { - return ApplicationObjectsSingleton.getAudioEditorInstance()!; + return SoundStudioApplicationFactory.getAudioEditorInstance()!; }; let isReady = false; diff --git a/src/app/context/AudioRecorderContext.tsx b/src/app/context/AudioRecorderContext.tsx index a738a74..be96677 100644 --- a/src/app/context/AudioRecorderContext.tsx +++ b/src/app/context/AudioRecorderContext.tsx @@ -1,7 +1,7 @@ "use client"; import { createContext, useContext, useState, ReactNode, FC, useEffect } from "react"; -import { ApplicationObjectsSingleton } from "@eliastik/simple-sound-studio-components"; +import { SoundStudioApplicationFactory } from "@eliastik/simple-sound-studio-components"; import { VoiceRecorder, EventType, RecorderSettings } from "@eliastik/simple-sound-studio-lib"; import AudioRecorderContextProps from "../model/contextProps/AudioRecorderContextProps"; @@ -20,7 +20,7 @@ interface AudioRecorderProviderProps { } const getRecorderInstance = (): VoiceRecorder => { - return ApplicationObjectsSingleton.getAudioRecorderInstance()!; + return SoundStudioApplicationFactory.getAudioRecorderInstance()!; }; let isReady = false; diff --git a/src/app/model/Constants.ts b/src/app/model/Constants.ts index 554bd07..df318d3 100644 --- a/src/app/model/Constants.ts +++ b/src/app/model/Constants.ts @@ -11,7 +11,7 @@ const Constants = { APP_LICENSE: "GNU GPL v3", RELEASE_LINK: "https://github.com/Eliastik/simple-voice-changer/releases/tag/2.2.0", AUDIO_BUFFERS_TO_FETCH: ["impulse_response.wav","modulator.mp3"], - SERVICE_WORKER_SCOPE: process.env.NEXT_PUBLIC_BASE_PATH, + SERVICE_WORKER_SCOPE: process.env.NEXT_PUBLIC_BASE_PATH || "", PREFERENCES_KEYS: { CURRENT_THEME: "current-theme", CURRENT_LANGUAGE: "current-language", diff --git a/src/app/page.tsx b/src/app/page.tsx index 54f234b..e8f27ee 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -2,7 +2,7 @@ import { useEffect } from "react"; import MainComponent from "./components/MainComponent"; -import { ApplicationObjectsSingleton, useAudioEditor } from "@eliastik/simple-sound-studio-components"; +import { SoundStudioApplicationFactory, useAudioEditor } from "@eliastik/simple-sound-studio-components"; import { useApplicationConfig } from "./context/ApplicationConfigContext"; import ApplicationConfigSingleton from "./context/ApplicationConfigSingleton"; import Constants from "./model/Constants"; @@ -12,8 +12,8 @@ const Home = () => { const { updateCurrentTheme } = useApplicationConfig(); useEffect(() => { - // Initialize ApplicationObjectsSingleton - ApplicationObjectsSingleton.initializeApplicationObjects(ApplicationConfigSingleton.getConfigServiceInstance(), Constants.AUDIO_BUFFERS_TO_FETCH); + // Initialize SoundStudioApplicationFactory + SoundStudioApplicationFactory.initializeApplication(ApplicationConfigSingleton.getConfigServiceInstance(), Constants.AUDIO_BUFFERS_TO_FETCH); }, []); useEffect(() => { From a60d194aad53dff00fd0179725fc5f98592f4449 Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Mon, 6 May 2024 17:57:48 +0200 Subject: [PATCH 06/29] Update ROADMAP --- ROADMAP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index 79f5e15..c5c69eb 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -73,7 +73,7 @@ ### Would be good but not important * [x] - Simplify code: split AudioEditor classe into smaller classes -* [ ] - Use dependency injection (instead of Singleton) - for AudioEditor subclasses and AudioEditorObjectsSingleton +* [x] - Use dependency injection (instead of Singleton) - for AudioEditor subclasses and AudioEditorObjectsSingleton * [ ] - Create new filters (equalizer?, volume/gain?) * [ ] - If adding new filters: hide some advanced filters, and make possible to add them if needed in the UI * [ ] - Save into localstorage filters settings + filter presets that can be set by the user? From 638758d914c4692ffcf9d465122513c4a4fb83e4 Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Tue, 7 May 2024 12:36:55 +0200 Subject: [PATCH 07/29] Update dependency --- package-lock.json | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index ce1b9a9..3e93760 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "devDependencies": { "@types/audioworklet": "^0.0.54", "@types/lodash": "^4.17.1", - "@types/node": "^20.12.9", + "@types/node": "^20.12.10", "@types/react": "^18.3.1", "@types/react-dom": "^18.3.0", "@types/semver": "^7.5.8", @@ -2548,9 +2548,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.9.tgz", - "integrity": "sha512-o93r47yu04MHumPBCFg0bMPBMNgtMg3jzbhl7e68z50+BMHmRMGDJv13eBlUgOdc9i/uoJXGMGYLtJV4ReTXEg==", + "version": "20.12.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", + "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", "dev": true, "dependencies": { "undici-types": "~5.26.4" diff --git a/package.json b/package.json index 6752a9f..80088cc 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "devDependencies": { "@types/audioworklet": "^0.0.54", "@types/lodash": "^4.17.1", - "@types/node": "^20.12.9", + "@types/node": "^20.12.10", "@types/react": "^18.3.1", "@types/react-dom": "^18.3.0", "@types/semver": "^7.5.8", From df1ae866948da678eb38c67abb10b2008dfc484f Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Sun, 26 May 2024 22:11:21 +0200 Subject: [PATCH 08/29] Setup Playwright tests --- .github/workflows/build.yml | 6 + .gitignore | 4 + package-lock.json | 303 ++++++++++++++++++++++-------------- package.json | 24 +-- playwright.config.ts | 72 +++++++++ src/app/globals.css | 6 + src/app/locales/fr.json | 2 +- tests/example.spec.ts | 6 + 8 files changed, 298 insertions(+), 125 deletions(-) create mode 100644 playwright.config.ts create mode 100644 tests/example.spec.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 89d71a7..1481277 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -23,3 +23,9 @@ jobs: - name: Build and Lint run: npm run build + + - name: Install Playwright Browsers + run: npx playwright install --with-deps + + - name: Run Playwright tests + run: npm run test diff --git a/.gitignore b/.gitignore index d7ca4fb..c45940f 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,7 @@ public/workbox-* public/worklets/* public/workers/* .rollup.cache +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/package-lock.json b/package-lock.json index 3e93760..f8e431d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,31 +10,32 @@ "dependencies": { "@eliastik/simple-sound-studio-components": "^2.2.0", "@eliastik/simple-sound-studio-lib": "^2.2.0", - "i18next": "^23.11.3", + "i18next": "^23.11.5", "lodash": "^4.17.21", "next": "^14.2.3", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-i18next": "^14.1.1", - "semver": "^7.6.0" + "react-i18next": "^14.1.2", + "semver": "^7.6.2" }, "devDependencies": { + "@playwright/test": "^1.44.1", "@types/audioworklet": "^0.0.54", - "@types/lodash": "^4.17.1", - "@types/node": "^20.12.10", - "@types/react": "^18.3.1", + "@types/lodash": "^4.17.4", + "@types/node": "^20.12.12", + "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@types/semver": "^7.5.8", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", + "@typescript-eslint/eslint-plugin": "^7.10.0", + "@typescript-eslint/parser": "^7.10.0", "autoprefixer": "^10.4.19", "copy-webpack-plugin": "^12.0.2", - "daisyui": "^4.10.5", + "daisyui": "^4.11.1", "dotenv": "^16.4.5", "eslint": "^8.57.0", "eslint-config-next": "^14.2.3", "eslint-plugin-react": "^7.34.1", - "glob": "^10.3.10", + "glob": "^10.4.1", "next-pwa": "^5.6.0", "postcss": "^8.4.38", "tailwindcss": "^3.4.3", @@ -2356,6 +2357,22 @@ "node": ">=14" } }, + "node_modules/@playwright/test": { + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.44.1.tgz", + "integrity": "sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.44.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@rollup/plugin-babel": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", @@ -2536,10 +2553,11 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz", - "integrity": "sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==", - "dev": true + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==", + "dev": true, + "license": "MIT" }, "node_modules/@types/minimatch": { "version": "5.1.2", @@ -2548,10 +2566,11 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", - "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~5.26.4" } @@ -2563,10 +2582,11 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.1.tgz", - "integrity": "sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "dev": true, + "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -2603,21 +2623,20 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", - "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz", + "integrity": "sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/type-utils": "7.8.0", - "@typescript-eslint/utils": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", - "debug": "^4.3.4", + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/type-utils": "7.10.0", + "@typescript-eslint/utils": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { @@ -2638,15 +2657,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.10.0.tgz", + "integrity": "sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/typescript-estree": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", "debug": "^4.3.4" }, "engines": { @@ -2666,13 +2686,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", - "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", + "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0" + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2683,13 +2704,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", - "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz", + "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/typescript-estree": "7.10.0", + "@typescript-eslint/utils": "7.10.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2710,10 +2732,11 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", - "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", + "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", "dev": true, + "license": "MIT", "engines": { "node": "^18.18.0 || >=20.0.0" }, @@ -2723,13 +2746,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", - "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", + "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2751,18 +2775,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", "dev": true, + "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/typescript-estree": "7.10.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2776,12 +2798,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", - "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", + "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", "dev": true, + "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/types": "7.10.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -3928,10 +3951,11 @@ } }, "node_modules/daisyui": { - "version": "4.10.5", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.10.5.tgz", - "integrity": "sha512-eOFUo5yEg0WV+3VK2C/+/XN1WH/OhFV4HzrMG5etAzcnB2hPg3aoR7gF1ZUpIv+b5MglLuAVMgub0rv660EgZg==", + "version": "4.11.1", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.11.1.tgz", + "integrity": "sha512-obT9CUbQdW6eoHwSeT5VwaRrWlwrM4OT5qlfdJ0oQlSIEYhwnEl2+L2fwu5PioLbitwuMdYC2X8I1cyy8Pf6LQ==", "dev": true, + "license": "MIT", "dependencies": { "css-selector-tokenizer": "^0.8", "culori": "^3", @@ -5442,22 +5466,23 @@ } }, "node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", "dev": true, + "license": "ISC", "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5482,6 +5507,25 @@ "dev": true, "peer": true }, + "node_modules/glob/node_modules/jackspeak": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.1.2.tgz", + "integrity": "sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -5646,9 +5690,9 @@ } }, "node_modules/i18next": { - "version": "23.11.3", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.3.tgz", - "integrity": "sha512-Pq/aSKowir7JM0rj+Wa23Kb6KKDUGno/HjG+wRQu0PxoTbpQ4N89MAT0rFGvXmLkRLNMb1BbBOKGozl01dabzg==", + "version": "23.11.5", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.11.5.tgz", + "integrity": "sha512-41pvpVbW9rhZPk5xjCX2TPJi2861LEig/YRhUkY+1FQ2IQPS0bKUDYnEqY8XPPbB48h1uIwLnP9iiEfuSl20CA==", "funding": [ { "type": "individual", @@ -5663,6 +5707,7 @@ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" } ], + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.2" } @@ -6665,10 +6710,11 @@ } }, "node_modules/minipass": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz", - "integrity": "sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, + "license": "ISC", "engines": { "node": ">=16 || 14 >=14.17" } @@ -7097,16 +7143,17 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, + "license": "BlueOak-1.0.0", "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -7250,6 +7297,53 @@ "node": ">=8" } }, + "node_modules/playwright": { + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.1.tgz", + "integrity": "sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.44.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.1.tgz", + "integrity": "sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/possible-typed-array-names": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", @@ -7502,9 +7596,10 @@ } }, "node_modules/react-i18next": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.1.tgz", - "integrity": "sha512-QSiKw+ihzJ/CIeIYWrarCmXJUySHDwQr5y8uaNIkbxoGRm/5DukkxZs+RPla79IKyyDPzC/DRlgQCABHtrQuQQ==", + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.2.tgz", + "integrity": "sha512-FSIcJy6oauJbGEXfhUgVeLzvWBhIBIS+/9c6Lj4niwKZyGaGb4V4vUbATXSlsHJDXXB+ociNxqFNiFuV1gmoqg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.23.9", "html-parse-stringify": "^3.0.1" @@ -7972,12 +8067,10 @@ "dev": true }, "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -7985,22 +8078,6 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", diff --git a/package.json b/package.json index 80088cc..d045c28 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "next lint" + "lint": "next lint", + "test": "npx playwright test" }, "repository": { "type": "git", @@ -15,31 +16,32 @@ "dependencies": { "@eliastik/simple-sound-studio-components": "^2.2.0", "@eliastik/simple-sound-studio-lib": "^2.2.0", - "i18next": "^23.11.3", + "i18next": "^23.11.5", "lodash": "^4.17.21", "next": "^14.2.3", "react": "^18.3.1", "react-dom": "^18.3.1", - "react-i18next": "^14.1.1", - "semver": "^7.6.0" + "react-i18next": "^14.1.2", + "semver": "^7.6.2" }, "devDependencies": { + "@playwright/test": "^1.44.1", "@types/audioworklet": "^0.0.54", - "@types/lodash": "^4.17.1", - "@types/node": "^20.12.10", - "@types/react": "^18.3.1", + "@types/lodash": "^4.17.4", + "@types/node": "^20.12.12", + "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@types/semver": "^7.5.8", - "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.8.0", + "@typescript-eslint/eslint-plugin": "^7.10.0", + "@typescript-eslint/parser": "^7.10.0", "autoprefixer": "^10.4.19", "copy-webpack-plugin": "^12.0.2", - "daisyui": "^4.10.5", + "daisyui": "^4.11.1", "dotenv": "^16.4.5", "eslint": "^8.57.0", "eslint-config-next": "^14.2.3", "eslint-plugin-react": "^7.34.1", - "glob": "^10.3.10", + "glob": "^10.4.1", "next-pwa": "^5.6.0", "postcss": "^8.4.38", "tailwindcss": "^3.4.3", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 0000000..1f37b62 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,72 @@ +import { defineConfig, devices } from "@playwright/test"; + +/** + * Read environment variables from file. + * https://github.com/motdotla/dotenv + */ +// require('dotenv').config(); + +/** + * See https://playwright.dev/docs/test-configuration. + */ +export default defineConfig({ + testDir: "./tests", + /* Run tests in files in parallel */ + fullyParallel: true, + /* Fail the build on CI if you accidentally left test.only in the source code. */ + forbidOnly: !!process.env.CI, + /* Retry on CI only */ + retries: process.env.CI ? 2 : 0, + /* Opt out of parallel tests on CI. */ + workers: process.env.CI ? 1 : undefined, + /* Reporter to use. See https://playwright.dev/docs/test-reporters */ + reporter: "html", + /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ + use: { + /* Base URL to use in actions like `await page.goto('/')`. */ + // baseURL: 'http://127.0.0.1:3000', + + /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ + trace: "on-first-retry", + }, + + /* Configure projects for major browsers */ + projects: [ + { + name: "chromium", + use: { ...devices["Desktop Chrome"] }, + }, + + { + name: "firefox", + use: { ...devices["Desktop Firefox"] }, + }, + + /* Test against mobile viewports. */ + // { + // name: 'Mobile Chrome', + // use: { ...devices['Pixel 5'] }, + // }, + // { + // name: 'Mobile Safari', + // use: { ...devices['iPhone 12'] }, + // }, + + /* Test against branded browsers. */ + // { + // name: 'Microsoft Edge', + // use: { ...devices['Desktop Edge'], channel: 'msedge' }, + // }, + // { + // name: 'Google Chrome', + // use: { ...devices['Desktop Chrome'], channel: 'chrome' }, + // }, + ], + + /* Run your local dev server before starting the tests */ + webServer: { + command: "npm run dev", + url: "http://127.0.0.1:3000", + reuseExistingServer: !process.env.CI, + } +}); diff --git a/src/app/globals.css b/src/app/globals.css index 79f9ab7..fc3188a 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -39,3 +39,9 @@ .collapse[open] > .collapse-content, .collapse-open > .collapse-content, .collapse:focus:not(.collapse-close) > .collapse-content, .collapse:not(.collapse-close) > input[type="checkbox"]:checked ~ .collapse-content, .collapse:not(.collapse-close) > input[type="radio"]:checked ~ .collapse-content { display: initial; } + +@layer base { + :root:has(:is(.modal-open, .modal:target, .modal-toggle:checked + .modal, .modal[open])) { + scrollbar-gutter: revert !important; + } +} diff --git a/src/app/locales/fr.json b/src/app/locales/fr.json index c4a4abc..baf563f 100644 --- a/src/app/locales/fr.json +++ b/src/app/locales/fr.json @@ -17,7 +17,7 @@ "bufferSize": "Taille de tampon :", "bufferSizeInfos": "Cette taille de tampon est utilisée dans les traitements audio lorsque le support des AudioWorklet est désactivé. En laissant cette valeur à auto, votre navigateur détermine automatiquement la meilleure taille pour votre environnement. Une valeur plus élevée améliore la qualité audio, mais au détriment de la latence.", "defaultBufferSize": "Auto", - "samplingFrequency": "Fréquence d'échantillonage :", + "samplingFrequency": "Fréquence d'échantillonnage :", "samplingFrequencyInfo": "Paramètre la fréquence d'échantillonage utilisée pour les traitements audio. Plus elle est élevée, meilleure est la qualité, mais le traitement audio nécessitera plus de mémoire. Utilise par défaut la fréquence d'échantillonage paramétrée sur votre système.", "defaultSampleRate": "Par défaut", "sampleRateHz": "Hz", diff --git a/tests/example.spec.ts b/tests/example.spec.ts new file mode 100644 index 0000000..d2ae506 --- /dev/null +++ b/tests/example.spec.ts @@ -0,0 +1,6 @@ +import { test, expect } from "@playwright/test"; + +test("should display title", async ({ page }) => { + await page.goto("http://localhost:3000/"); + await expect(page.locator(".navbar .btn:first-child div:first-child")).toContainText("Simple Voice Changer"); +}); From cd004cd70090b76965a8010548dad17cd06bbf33 Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Sun, 2 Jun 2024 18:17:43 +0200 Subject: [PATCH 09/29] Add Playwright tests --- playwright.config.ts | 4 +++- tests/audioeditor.spec.ts | 2 ++ tests/example.spec.ts | 6 ----- tests/files/audio.mp3 | Bin 0 -> 91210 bytes tests/files/document.pdf | Bin 0 -> 8232 bytes tests/homepage.spec.ts | 46 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 51 insertions(+), 7 deletions(-) create mode 100644 tests/audioeditor.spec.ts delete mode 100644 tests/example.spec.ts create mode 100644 tests/files/audio.mp3 create mode 100644 tests/files/document.pdf create mode 100644 tests/homepage.spec.ts diff --git a/playwright.config.ts b/playwright.config.ts index 1f37b62..7de258c 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -34,7 +34,9 @@ export default defineConfig({ projects: [ { name: "chromium", - use: { ...devices["Desktop Chrome"] }, + use: { + ...devices["Desktop Chrome"] + } }, { diff --git a/tests/audioeditor.spec.ts b/tests/audioeditor.spec.ts new file mode 100644 index 0000000..d148bc8 --- /dev/null +++ b/tests/audioeditor.spec.ts @@ -0,0 +1,2 @@ + + diff --git a/tests/example.spec.ts b/tests/example.spec.ts deleted file mode 100644 index d2ae506..0000000 --- a/tests/example.spec.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { test, expect } from "@playwright/test"; - -test("should display title", async ({ page }) => { - await page.goto("http://localhost:3000/"); - await expect(page.locator(".navbar .btn:first-child div:first-child")).toContainText("Simple Voice Changer"); -}); diff --git a/tests/files/audio.mp3 b/tests/files/audio.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..5b7fb52fad67a74923f442bcc7be68ee34ac30ce GIT binary patch literal 91210 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

N3ykYK6z6XRxg>Xr&CJ{ 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 fmg|?wfG7)8kYG)4I1ttSKcD{q&no@~ literal 0 HcmV?d00001 diff --git a/tests/files/document.pdf b/tests/files/document.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7681da53e4fed68570c27069a28d830b6fb90df4 GIT binary patch literal 8232 zcma)h1z1#D_qU3Gw1}V}G15K76x~R7NY?-(FvJX9qJ)$nDFPxTA`Jo(7BwJJl9Hm* zor;9tjPJeoz3+Sf-}nE{^PD;R{Lb2IulTJ!&$Abwp0cVKSR78x*H+lp(pKM=OAP^l z03PW>puZxN<(jPD5%1!hz6k+U%_iS=y+(PV^z3kIp#* z#ntBK6*B1F{G!U5S8?D|p9$<%%fR*T_f4i$)vfMI%0E$|T>Gr)EG5D8AZgHnp~Hm% z^S#gCW#{F4Oi{Xp%#ac0X=a$t;q_>0G}iGCbBH672h=3PNdqtxLi+j}gZ;xj`2WSd zKimfcP)NAM-+i4&1_c|raTkiGUen<;t za+1i*bfUOe$~RnZfBD_WD7IYjJE5uE_@%;wAJ6P9j?9W=pBuYcxfE5FvrLe?c4!?0 z&rZ>X=N}!dd;FS|+MV8P=|Aj4%_6?*1mg|QKx}E1^@4e3TzvA3DQ;(+0TCKd;+t<~ zhLpFw&e#$3@L#(S^fp0k^3><9a?T=Ke3nw@2z+N)ac8x*ZQriW?rq{k&hGf8B=p=- zHp~5yAHJ1)F;v}?H}tD+e9sD1Snd|OjWM?Y@twixjH}Sx&b{xQOJ}#y54L=xqF?cZ zziQq%x$U`=A$uvI{fh^;4jFRB{&>j+Ky8>Paq*O~qdk~AWIRpb$>X^@g3Egp1wvvn zJW!g`Usg>Sc;Gv+ru8IBi^G!^O>>IIDstOLBMzf7UcGy>r@#WxjueYMI6GXf*It@I zF1lDgGQ(N(tD>mGNEVYtuus8}SVhS3YNb z@tqTFxdFD}TjQOOXrThy(bX%^az;nL48M9fiJIiDJ9_hWY;F{1G=16*ZCW>kCCQvz zmp#CMePOIEk>_keWOMB)cS*bRO7ja`Wx))l9Wg@2Nu3`MQ-IHg8Dq3t& z36w*`L4RQWYb=hqdj zo$-()S@dJs6p5#^;_l(n%kHB}LqOhoee1+l8=)f)+q{}v)8>iIVcIqxx_)EEroO(G z)lDI3rR8-+0Yx8Q*av)_?_o<9Z!8Pd*Y+_+t1P!Bf6>gQVL!Mt<-+5A&KJYC^ zh0};RnY~HgKwU#vNc}}u!a$cL620$IYWTRlP6m6&uU=B7=I7by%5POhtq-&m+37!i z)~|M%hmX{ukTdWb;4jL7=5e)rNhUYXGGUg_KV>RRmn>j1YdVJlq}GdNU3~knd+MXc zWJ_pWGhur477i($##}lg>MY`{K!Ye*u`nV-2t}JMc}7d?dpREWsnfV!746@WI+<~u ze!j#v?N#j_d<=&*TZ-Z8pQ8~uf=|*YhpC-iv&{R-eD|Inqt<4B=)11NK>dI@;3!pG_F7+7uSM=ErpAZ^{N&e_$hIvODZ>UHZ&xWrO}?OShZ z6Ck0{rW}*<(>^jH@k9AeAuc#10ar60b&DY*P3ZZ^X;RsWhM;;O%p&|}R7t!AGI`(5 z`{!F#dW{;~HwuAFJKu?H_q!8*xT@QX4p08Jr?0Khs!5WKOe)M@UPBy5~8V| zI_QMSDZ%DJ3h2knQRe&&4hz1vMD-J-t8t%i%m6s z_<)s#!>}D>5LW*Jcc}+`)-~|cIxSMB?@5{PG`1d|&iNQE#wxvNUOt)~-K)V;M8)3z zSiuZpY})AV>pf!3uA8@hrOLFwYTm1$w!kBs)$bNXIJZstIafP0ramE;+)YVpc`Z%s zMbTjtXRhAm`pmmM4;dG4{d!s3KiyTdEZx}Q%e0$D#xY*~w6W&S{rUwefsLh1Jx{e+ z^Y1BpDI%L@Uu6ZK3_!-$GG9jcZwR2zL>iK-qLrh%XzkJisleU=lPT11uP$n2zxA5s zJy*=?>~i6?`gQeMUXCFG{E!tD&))MLQOddZ9%OLB`%VdY2Fv;bJBfLiZbzOT>) zgX(4HBJG1()y7Xu>|A?Qy%Z+GbRqgGi`2p?ICAp*e!ZdWa3|RGrw>co@iVD~tE|)V zVzDN?`{3sx4Y6fpqm3Ld_~!F-CpyKrsx$(Y^jI5?>yz(DY3TCQ?M(^ZIlHFu)OsN1 zjtgW(Ip&78T4|!wqOFpWua)m~{v*_VH$t|X+JU~1=fSDY_A~4eVG_UZyjvudsT2D=9*aN@l44ZxmrJBslr@Zj~dex zhBC4jBz1AZB_T5rj7+|sz24Z2_|S~nQ7_45tt>sHQ)`Cy%Q(VK2gOXucM(ymqXL!T z`?+7omKt57ioE(3pFR{i>vBuDKT1-=Ka@-pVep(||Gu<-hQHJxK<2uP=cs^;=a=*I z=C?PNzZYpN3wMPp-V+o%#H72q1~v&g701+by9QPgR;nBuvdSM8)tW0*<_@h6S^!E3 zwY_&(4#-zIuc^8rZQI1JnM@{8p3|-ySslwzIvbfxMn^tEHdYPfW}o^S_Pvu~#OobEPf0+*$ zk(sP){xw)RZ9LpkQ&AnLt}~e2C-!2rby<$aZ#Dg6^Tho778ENhCbLsZy=K9AWv@wG z_tA{YaMtza9x@Xbjn2nb#Xc0|R)jZY)O`D&`hGU?`2_d`^toAI2)sY*w`+=h(_hXh zGco?njPpa|y6+rKKmVnEos+Us9@k&zW~5vN$HqQd6fm<_DL&Zk$j(OXYT>kKvQbI; z!}DNgv%LfH#AgkP*26Jn;8lP2wRA}a!FUyz(QaVzOrv~P{kN*%5wXIjy}g7EK2diT zjpA{kBF)vOZ@$+ygs~qrXehi@bola0yC9e5&9%nvmb$&@J#m-(uP^*PKLcjGOb#|L zW>dcQ`;pnc!BzP4m~&+p|K23QAho>zjLbI+?FI3~Ztewx)KM2%`URdzIrG`4^rC@d zxGig+uD6QGH`5)LAGcRtiYaOLO4a9G9FDem>BWZq6rT^0+y35u%`7}{*e>9U*%x5{ zrtVb8Qc(A9LPt%6z0hr^`Q)hh=`_<>BjF5__5jb(+e%_5?58}9bVrHFan`T2Bf{;vcA0};jI_zUb$a)fk z1xoufe%!K`{@fqG#`U?{-2qnA5F&yX8o5bvm$6LMRUyXHvF?OGS;<$w8*>z^Yoq?4AD-OQ>KG9fW(BFhQF0q(=7-DTIO2h^@ z8kocP%iDt}u~*FHGT9k6toIL>`fV=JSB+x}5Clq$N5)&3_dbVwXM77nUU%4Ldx%=S zl>bn4M(j|o*gW%%Jx#As1&I2n3m)D9e6#2JYwh=1& zE;MBr>rjO33Mkpd+l~fkuI5M1kM)|fSy<>O)kM~cm6>8fUTkyhf-AA)9At;bShQm& z+%b;z=%>ex3VSx#F(yA4m($NMogCXV$M~FyX6fyEElET zg|3vH!eG}&jf516wc?f@sG4(U%i@lgXzraaYGkY1-(Ht$^TV1e;D@^^1SYu~ySw87 zAcobQt@U;;&fu-Apr&9ndOhRK^_k=DjP|VDlPMX$oAjA%6Gyq|pwKJiyY8`fWl}85 zE&17K0qUwLeWLT%_X1pab_A%>*%}12=kBNAvOv8tkV^+uSADhx4qW z1$=(Q(vx&;oGX6RrULU(*KNv>wWdA(rJ1*t`)Wb=wVW+hS}801SHn)q$h%}**re8* z%CIDEd60qZ3%RFfXhklWD)cnIc`p8=Qb3cz(gP=;8EQx1W zo<+HyZ5Qc)?TPlj+y!UHF0U8`-!M0It&&eZOUIITL6J>VL44}@JIStyBMCDGoNX?} zwa@&>vUjRo9V%>YcSPNWK1dc&z<9^8A;c-nKai`fB~@N(`2R z&YiY%-oPf)(xUd6sx@eA$Kh)XDy_yCu`977?_W9QPhYD{GK~%~&dH+- zFD#o{q$51yX**2=+W^)W;@_w3kWbO*Wvbh7TulHgx{u^P|A{*nZ`1vw7Ox2YBtlSo zb^7+6-yQ`Df)5qkaj|s}WMPQE1iqYpRQmJzH>`*B#rr)oRW{Zs25W3=)Q9J?muTWU zU-7cXPzrrsMI=PopC%;+#2FWjf<>-}Y`U7<-xocx#$jC+S)8i@I3kk)ADr_mtrY1{WiDSjJpK|#gtMFP!g9o65JN%j5~u1 z!sQ+iiD$?-N#-T9jT*-`t6;$zGQ72`OGE2*7&5}c*6kx`}G1=mWO zEprAmC_k#Qd9fh|73L{3qcS{!3bOa)FW0vUW>8-;emcg?#SsG;R-_ZnzuqRC9D6bB z;T~GDjE9$N-VfMtEgWQ|z_u7%UuS+NuugEI(U)AIRDD*BMN-{^%*%N)EibVO)cz!M z%kHD4dR1a!>v`x+R$)wV{f0AcK6SmcQA?ChUsGQ!Uq4Kr2KqBi=p^ol%8N^M)~nCX zD{(-Y8gWtVoKkKkbLO{mEm7bv=aCDGCYkG@$xB}irY%$E`TAZ(HV!|E^IzjmR4Uy3 zx}W`E&ug*_n4HdYp0bYCh9S$}*nziu&uNr}r~j8(Vw~R%u0$;KdjMZCRJt>uH-hlO zhYweue01%4{JcGlO6xHNYHj{-59dCLvD3zp?LR)w40Y5VD;?p}%DvFdU*IUoZ2mg> zhfL>5RCl!2mR3Xi4@spKY;8eOKxd2eukJ^Q7ZH8v5M{2X{U+{X33{Q))(DrQTQsvp z?}jJTAJ6PP@9R;iv50yho`!;Hct#LpQ(kFUGqQx;R_g!&XZNq&aCms6-pTk)W^SID z&V~8@u8VWcw=t6r?s#tvz8BkA+aQ@I=p8mm9!cOWaAx@@4%V+hXlOt2+{BKvJa>q@ zAG>+^%->c+F@hed)@BMi~ZV`yKHlehs!BtxS9g)!sZxLvBtP$ z8TMb%9|8hGc^+A(B0rcy(ivZi+-cd&uZrgsDixAEDETst2&(+?BFCVp!}8?KsDqbE z0EP2r?4Xe-&t-?=`o*@ASM`|DikuQl0LNSBNx=!dFzqu1!o+2`a20sI^&5!t7gpWq=iT}Yej!> zZwK2(JGo_OcvJ>cuG5k#nT&(!?$O!QRBSMsIyXzP=dx;FzBdb@Z%wxLd;E_K!~KI5 z!yp|hGJ)!!-`;k2b;}4O<_w=~M7aH0kC{K1Ww&wpwZA=o;LtO>{wr~QZ|@Y_+uYhL zcwkzoML2YvRP@V?QdG*8y|bJ4v9+`K`{^1 zv!%10qT4P+&$qpwd)GGDCJA4cJ$^rD810iHD3ZC(8|bo?RP}v8B>H?!nInfrzjr1B zJ^N+;c2y~w=8KP9@Pik_XIL?e)GWe9d}#5b@D(y`$^-VK50rYSB(%@FfQ&@)PTk9%j12$%+10K(qj`oeN0GH|MhbJgqUSr*xPt3;@kDBTb6Jt#* zpB9G~_Ew)Y8I+H6F%F8tW323zr}$SWe(EiYlzR$=>|Pmg*9l*Zn(6;OGbnO^@2&G2 z5?m8ry(DdwCvJBMm#Se}9a2|1Ftg!3ZaSDR=dFLq6Wd%qYo0Zho3Ie7S>9+Pzhd^V zUf2FWAuEPI&Op6(ddiU#M?M0imG>4a(F_vK@!a{!yjE12onCk^jNGO^kCZn7gfFollR~m4;iH}ygdfD2+3DMp6SS)X&YC0 z4sP|Idjq7!i1?h9Y@3q0qiIyueAbw+i;-n`MiTaKG`JE(V^)I6Qo527Q!40T^Mjpmk45`ruAhG2? z=tETXSC>we*rEEzckti76TKr+^S204&)dVn5RJD05*vR&BeXx>>hG-l+pOQg(X(?# z1NH2@Nlcd@DF7OvaUMS24rm+zOcFK#YNH)7cBJ|tEdWEo#EHd&f+9d51QHF)+UaMGe&TL}L{kNZXFZzjOi3ZkhwIK5lOR`T-Gj zYuRC)1)aRbR1JjwBMpBxE{X0b5gV+;T}@h5MO769f{_9X0fFEs;!}e7gpuB5sY!Wt z^l?D{DJP-yFBv#d_P0DyPJ%ce4*%mO&WA&ZHxVa_fJh00s1Tn}qORXd675zdc6tSs zB_SY)1PBg-fDteh7$yRO2!KEWLVt^gzc<>68U!Gg15wi-7XS`}L16$Vz#kX_j3hcm zx&YWeF%Sq$B<_D<5C}24|A`@>uzz4goBn|j9U{j5Kj*@s5aQnZUlg45R36Y=OQGCRs7!=jL81KFub=N@o&JJL{~#hAetB|pn-=6kyRun5i4CC z>*PWF+xg=~8DIgBhD#_YC?a5rD7b { + await page.goto("http://localhost:3000/"); + + const closeWelcomeModal = page.locator("#modalFirstLaunch +div .modal-action button"); + + await closeWelcomeModal.waitFor({ state: "visible", timeout: 1000 }); + + if (await closeWelcomeModal.isVisible()) { + await closeWelcomeModal.click(); + } +}); + +test("should display title", async ({ page }) => { + await expect(page.locator(".navbar .btn:first-child div:first-child")).toContainText("Simple Voice Changer"); +}); + +test("opening wrong file should display error", async ({ page }) => { + const openFileButton = page.locator("body > div:not(.navbar) > button"); + const fileChooserPromise = page.waitForEvent("filechooser"); + + openFileButton.click(); + + const fileChooser = await fileChooserPromise; + await fileChooser.setFiles(path.join(__dirname, "files/document.pdf")); + + const modalErrorLoadingDialog = page.locator("#errorLoadingAudioDialog +.modal"); + + expect(await modalErrorLoadingDialog.isVisible()); +}); + +test("opening audio file should not display error", async ({ page }) => { + const openFileButton = page.locator("body > div:not(.navbar) > button"); + const fileChooserPromise = page.waitForEvent("filechooser"); + + openFileButton.click(); + + const fileChooser = await fileChooserPromise; + await fileChooser.setFiles(path.join(__dirname, "files/audio.mp3")); + + const modalErrorLoadingDialog = page.locator("#errorLoadingAudioDialog +.modal"); + + expect(!(await modalErrorLoadingDialog.isVisible())); +}); From 6172e15e21271efb9039f27ac18500413fbbe566 Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Sun, 2 Jun 2024 21:13:57 +0200 Subject: [PATCH 10/29] Update ROADMAP --- ROADMAP.md | 1 + 1 file changed, 1 insertion(+) diff --git a/ROADMAP.md b/ROADMAP.md index c5c69eb..f0039e7 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -66,6 +66,7 @@ * [x] - (Minor) Enable reverb filter when choosing custom environment, and no other environment was downloaded (network error) * [ ] - (Major) Fix Soundtouch Worklet audio speed adjustment not working (as now, fallback to classic script processor node, not working in Firefox) - use another library for time stretch? * [ ] - If fixed: enable Soundtouch Worklet in compatibility/direct mode +* [ ] - (Minor) When compatibility mode is enabled and initial audio rendering is disabled, when loading a new audio file then playing audio, the compatibility mode setting is ignored (normal mode instead) * [ ] - (Medium) Bug when changing recorder settings on Chrome mobile * [ ] - (Medium) Vocoder doesn't work well on sample rate > 96,000 Hz * [ ] - (Very minor) Fix sourcemaps for libraries + worklets copy (cache) From 7dd54edc33fa6d8db84f769c92afd33bdcd3b05a Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Sun, 2 Jun 2024 21:39:13 +0200 Subject: [PATCH 11/29] Update dependencies --- package-lock.json | 122 +++++++++++++++++++++++----------------------- package.json | 8 +-- 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/package-lock.json b/package-lock.json index f8e431d..c6eea3c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,19 +22,19 @@ "@playwright/test": "^1.44.1", "@types/audioworklet": "^0.0.54", "@types/lodash": "^4.17.4", - "@types/node": "^20.12.12", + "@types/node": "^20.13.0", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@types/semver": "^7.5.8", - "@typescript-eslint/eslint-plugin": "^7.10.0", - "@typescript-eslint/parser": "^7.10.0", + "@typescript-eslint/eslint-plugin": "^7.11.0", + "@typescript-eslint/parser": "^7.11.0", "autoprefixer": "^10.4.19", "copy-webpack-plugin": "^12.0.2", "daisyui": "^4.11.1", "dotenv": "^16.4.5", "eslint": "^8.57.0", "eslint-config-next": "^14.2.3", - "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react": "^7.34.2", "glob": "^10.4.1", "next-pwa": "^5.6.0", "postcss": "^8.4.38", @@ -2566,9 +2566,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "version": "20.13.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.13.0.tgz", + "integrity": "sha512-FM6AOb3khNkNIXPnHFDYaHerSv8uN22C91z098AnGccVu+Pcdhi+pNUFDi0iLmPIsVE0JBD0KVS7mzUYt4nRzQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2623,17 +2623,17 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz", - "integrity": "sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.11.0.tgz", + "integrity": "sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/type-utils": "7.10.0", - "@typescript-eslint/utils": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", + "@typescript-eslint/scope-manager": "7.11.0", + "@typescript-eslint/type-utils": "7.11.0", + "@typescript-eslint/utils": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2657,16 +2657,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.10.0.tgz", - "integrity": "sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.11.0.tgz", + "integrity": "sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/typescript-estree": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", + "@typescript-eslint/scope-manager": "7.11.0", + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/typescript-estree": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", "debug": "^4.3.4" }, "engines": { @@ -2686,14 +2686,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", - "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.11.0.tgz", + "integrity": "sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0" + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2704,14 +2704,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz", - "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.11.0.tgz", + "integrity": "sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "7.10.0", - "@typescript-eslint/utils": "7.10.0", + "@typescript-eslint/typescript-estree": "7.11.0", + "@typescript-eslint/utils": "7.11.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2732,9 +2732,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", - "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", + "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==", "dev": true, "license": "MIT", "engines": { @@ -2746,14 +2746,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", - "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.11.0.tgz", + "integrity": "sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2775,16 +2775,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", - "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.11.0.tgz", + "integrity": "sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/typescript-estree": "7.10.0" + "@typescript-eslint/scope-manager": "7.11.0", + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/typescript-estree": "7.11.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2798,13 +2798,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", - "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", + "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/types": "7.11.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -4906,29 +4906,30 @@ } }, "node_modules/eslint-plugin-react": { - "version": "7.34.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", - "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "version": "7.34.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.2.tgz", + "integrity": "sha512-2HCmrU+/JNigDN6tg55cRDKCQWicYAPB38JGSFDQt95jDm8rrvSUo7YPkOIm5l6ts1j1zCvysNcasvfTMQzUOw==", "dev": true, + "license": "MIT", "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.2", "array.prototype.toreversed": "^1.1.2", "array.prototype.tosorted": "^1.1.3", "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", + "es-iterator-helpers": "^1.0.19", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", + "object.entries": "^1.1.8", + "object.fromentries": "^2.0.8", + "object.hasown": "^1.1.4", + "object.values": "^1.2.0", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" + "string.prototype.matchall": "^4.0.11" }, "engines": { "node": ">=4" @@ -7333,7 +7334,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, diff --git a/package.json b/package.json index d045c28..bd56946 100644 --- a/package.json +++ b/package.json @@ -28,19 +28,19 @@ "@playwright/test": "^1.44.1", "@types/audioworklet": "^0.0.54", "@types/lodash": "^4.17.4", - "@types/node": "^20.12.12", + "@types/node": "^20.13.0", "@types/react": "^18.3.3", "@types/react-dom": "^18.3.0", "@types/semver": "^7.5.8", - "@typescript-eslint/eslint-plugin": "^7.10.0", - "@typescript-eslint/parser": "^7.10.0", + "@typescript-eslint/eslint-plugin": "^7.11.0", + "@typescript-eslint/parser": "^7.11.0", "autoprefixer": "^10.4.19", "copy-webpack-plugin": "^12.0.2", "daisyui": "^4.11.1", "dotenv": "^16.4.5", "eslint": "^8.57.0", "eslint-config-next": "^14.2.3", - "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react": "^7.34.2", "glob": "^10.4.1", "next-pwa": "^5.6.0", "postcss": "^8.4.38", From a2647d5adcdba05310703e529126cf990b8f8985 Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Sun, 2 Jun 2024 22:27:59 +0200 Subject: [PATCH 12/29] Update ROADMAP --- ROADMAP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ROADMAP.md b/ROADMAP.md index f0039e7..f9a6640 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -66,7 +66,7 @@ * [x] - (Minor) Enable reverb filter when choosing custom environment, and no other environment was downloaded (network error) * [ ] - (Major) Fix Soundtouch Worklet audio speed adjustment not working (as now, fallback to classic script processor node, not working in Firefox) - use another library for time stretch? * [ ] - If fixed: enable Soundtouch Worklet in compatibility/direct mode -* [ ] - (Minor) When compatibility mode is enabled and initial audio rendering is disabled, when loading a new audio file then playing audio, the compatibility mode setting is ignored (normal mode instead) +* [x] - (Minor) When compatibility mode is enabled and initial audio rendering is disabled, when loading a new audio file then playing audio, the compatibility mode setting is ignored (normal mode instead) * [ ] - (Medium) Bug when changing recorder settings on Chrome mobile * [ ] - (Medium) Vocoder doesn't work well on sample rate > 96,000 Hz * [ ] - (Very minor) Fix sourcemaps for libraries + worklets copy (cache) From 644d03c34cad720b9124e5a87158a52d8d6605d9 Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Tue, 4 Jun 2024 21:03:46 +0200 Subject: [PATCH 13/29] Add new tests --- package.json | 2 +- playwright.config.ts | 7 ++++--- tests/audioeditor.spec.ts | 44 +++++++++++++++++++++++++++++++++++++++ tests/homepage.spec.ts | 2 +- 4 files changed, 50 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index bd56946..46af9cb 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "build": "next build", "start": "next start", "lint": "next lint", - "test": "npx playwright test" + "test": "npx playwright test tests/audioeditor.spec.ts" }, "repository": { "type": "git", diff --git a/playwright.config.ts b/playwright.config.ts index 7de258c..af7dbf8 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -35,14 +35,15 @@ export default defineConfig({ { name: "chromium", use: { - ...devices["Desktop Chrome"] + ...devices["Desktop Chrome"], + headless: false } }, - { + /*{ name: "firefox", use: { ...devices["Desktop Firefox"] }, - }, + },*/ /* Test against mobile viewports. */ // { diff --git a/tests/audioeditor.spec.ts b/tests/audioeditor.spec.ts index d148bc8..4295dd5 100644 --- a/tests/audioeditor.spec.ts +++ b/tests/audioeditor.spec.ts @@ -1,2 +1,46 @@ +import { test, expect } from "@playwright/test"; +import path from "path"; +test.beforeEach(async ({ page }) => { + await page.goto("http://localhost:3000/"); + + const closeWelcomeModal = page.locator("#modalFirstLaunch +div .modal-action button"); + + await closeWelcomeModal.waitFor({ state: "visible", timeout: 2000 }); + + if (await closeWelcomeModal.isVisible()) { + await closeWelcomeModal.click(); + } + + const openFileButton = page.locator("body > div:not(.navbar) > button"); + const fileChooserPromise = page.waitForEvent("filechooser"); + + openFileButton.click(); + + const fileChooser = await fileChooserPromise; + await fileChooser.setFiles(path.join(__dirname, "files/audio.mp3")); + + const loadingBufferModal = page.locator("#loadingBufferModal +.modal"); + + await loadingBufferModal.waitFor({ state: "hidden", timeout: 10000 }); +}); +test("enabling filter should work", async ({ page }) => { + const filter = page.locator("button", { hasText: "Bass booster" }); + + await filter.waitFor({ state: "visible", timeout: 3000 }); + + await filter.click(); + + expect(filter).toHaveClass(/(.*)(btn-secondary)(.*)/, { timeout: 500 }); +}); + +test("disabling filter should work", async ({ page }) => { + const filter = page.locator("button", { hasText: "Limiter" }); + + await filter.waitFor({ state: "visible", timeout: 3000 }); + + await filter.click(); + + expect(filter).not.toHaveClass(/(.*)(btn-secondary)(.*)/, { timeout: 500 }); +}); \ No newline at end of file diff --git a/tests/homepage.spec.ts b/tests/homepage.spec.ts index c53554a..3ba1442 100644 --- a/tests/homepage.spec.ts +++ b/tests/homepage.spec.ts @@ -6,7 +6,7 @@ test.beforeEach(async ({ page }) => { const closeWelcomeModal = page.locator("#modalFirstLaunch +div .modal-action button"); - await closeWelcomeModal.waitFor({ state: "visible", timeout: 1000 }); + await closeWelcomeModal.waitFor({ state: "visible", timeout: 2000 }); if (await closeWelcomeModal.isVisible()) { await closeWelcomeModal.click(); From 36179b93e418aebb9fc3f6a2b3f5d2d824393168 Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Tue, 4 Jun 2024 22:27:39 +0200 Subject: [PATCH 14/29] Add new tests --- package.json | 2 +- playwright.config.ts | 7 +- .../components/dialogs/AppConfigDialog.tsx | 2 +- src/app/locales/en.json | 2 +- src/app/locales/fr.json | 2 +- tests/audioeditor.spec.ts | 78 +++++++++++++++++-- 6 files changed, 80 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 46af9cb..bd56946 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "build": "next build", "start": "next start", "lint": "next lint", - "test": "npx playwright test tests/audioeditor.spec.ts" + "test": "npx playwright test" }, "repository": { "type": "git", diff --git a/playwright.config.ts b/playwright.config.ts index af7dbf8..7de258c 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -35,15 +35,14 @@ export default defineConfig({ { name: "chromium", use: { - ...devices["Desktop Chrome"], - headless: false + ...devices["Desktop Chrome"] } }, - /*{ + { name: "firefox", use: { ...devices["Desktop Firefox"] }, - },*/ + }, /* Test against mobile viewports. */ // { diff --git a/src/app/components/dialogs/AppConfigDialog.tsx b/src/app/components/dialogs/AppConfigDialog.tsx index ab74b49..e73abc9 100644 --- a/src/app/components/dialogs/AppConfigDialog.tsx +++ b/src/app/components/dialogs/AppConfigDialog.tsx @@ -87,7 +87,7 @@ const AppConfigDialog = () => {

- toggleEnableInitialRendering(e.target.checked)} /> + toggleEnableInitialRendering(e.target.checked)} />
{InfoIcon}
diff --git a/src/app/locales/en.json b/src/app/locales/en.json index 7596ea2..8d2709d 100644 --- a/src/app/locales/en.json +++ b/src/app/locales/en.json @@ -25,7 +25,7 @@ "actualSampleRate": "Current rate:", "samplingFrequencyTooHigh": "You have selected a sample rate that is too high for your device to handle. You risk encountering unexpected problems.", "audioWorkletNotAvailable": "AudioWorklet support is currently unavailable in this environment. This setting will therefore have no effect.", - "enableInitialRendering": "Enable initial audio rendering", + "enableInitialRendering": "Enable initial audio rendering:", "enableInitialRenderingInfos": "Enables initial audio rendering when selecting an audio file or validating an audio recording. If disabled, audio initialization will be faster, but you'll have to manually validate your settings to perform initial audio rendering. This parameter has no effect in compatibility mode.", "bitRateMP3": "MP3 encoding bitrate:", "bitRateMP3Infos": "Defines the bitrate used by the encoder when saving audio in MP3 format. The higher the value, the better the quality, at the expense of final file size.", diff --git a/src/app/locales/fr.json b/src/app/locales/fr.json index baf563f..1a69ebc 100644 --- a/src/app/locales/fr.json +++ b/src/app/locales/fr.json @@ -25,7 +25,7 @@ "actualSampleRate": "Fréquence actuelle :", "samplingFrequencyTooHigh": "Vous avez sélectionné une fréquence d'échantillonage trop élevée que votre appareil ne peut potentiellement pas supporter. Vous risquez de rencontrer des problèmes inattendus.", "audioWorkletNotAvailable": "Le support des AudioWorklet est actuellement indisponible dans cet environnement. Ce paramètre n'aura donc aucun effet.", - "enableInitialRendering": "Activer le rendu audio initial", + "enableInitialRendering": "Activer le rendu audio initial :", "enableInitialRenderingInfos": "Active le rendu audio initial lors de la sélection d'un fichier audio ou la validation d'un enregistrement audio. Si désactivé, l'initialisation d'un audio sera plus rapide, mais vous devrez valider manuellement vos paramètres pour effectuer le rendu audio initial. Ce paramètre n'a aucun effet en mode de compatibilité.", "bitRateMP3": "Bitrate de l'encodeur MP3 :", "bitRateMP3Infos": "Défini le bitrate utilisé par l'encodeur lorsque vous sauvegardez l'audio au format MP3. Plus la valeur est élevée, meilleure est la qualité, au détriment de la taille finale du fichier.", diff --git a/tests/audioeditor.spec.ts b/tests/audioeditor.spec.ts index 4295dd5..f88718d 100644 --- a/tests/audioeditor.spec.ts +++ b/tests/audioeditor.spec.ts @@ -28,19 +28,87 @@ test.beforeEach(async ({ page }) => { test("enabling filter should work", async ({ page }) => { const filter = page.locator("button", { hasText: "Bass booster" }); - await filter.waitFor({ state: "visible", timeout: 3000 }); + await filter.waitFor({ state: "visible", timeout: 10000 }); await filter.click(); - expect(filter).toHaveClass(/(.*)(btn-secondary)(.*)/, { timeout: 500 }); + const classList = await filter.evaluate(button => button.className); + + expect(classList).toContain("btn-secondary"); }); test("disabling filter should work", async ({ page }) => { const filter = page.locator("button", { hasText: "Limiter" }); - await filter.waitFor({ state: "visible", timeout: 3000 }); + await filter.waitFor({ state: "visible", timeout: 10000 }); + + await filter.click(); + + const classList = await filter.evaluate(button => button.className); + + expect(classList).not.toContain("btn-secondary"); +}); + +test("resetting filters should work", async ({ page }) => { + const filter = page.locator("button", { hasText: "Bass booster" }); + const resetButton = page.locator("div > button.btn-error", { hasText: "Reset" }); + + await filter.waitFor({ state: "visible", timeout: 10000 }); await filter.click(); + await resetButton.click(); + + const classList = await filter.evaluate(button => button.className); + + expect(classList).not.toContain("btn-secondary"); +}); + +test("changing settings of filter should work", async ({ page }) => { + const filter = page.locator("div.join", { hasText: "Bass booster" }); + + await filter.waitFor({ state: "visible", timeout: 10000 }); + + const filterSettings = filter.locator(".flex.join > button:first-child"); + + await filterSettings.click(); + + const modalSettings = page.locator("#modalSettings_bassboost"); + + expect(modalSettings).toHaveAttribute("open", { timeout: 10000 }); - expect(filter).not.toHaveClass(/(.*)(btn-secondary)(.*)/, { timeout: 500 }); -}); \ No newline at end of file + await page.locator("#bassboost_frequencyBooster").fill("25"); + + const validateButton = modalSettings.locator("button", { hasText: "Validate" }); + + await validateButton.click(); + + await page.waitForTimeout(5000); + + const isOpen = await modalSettings.evaluate(modal => window.getComputedStyle(modal).opacity != "0"); + + expect(isOpen).toBe(false); +}); + +test("resetting settings of filter should work", async ({ page }) => { + const filter = page.locator("div.join", { hasText: "Bass booster" }); + + await filter.waitFor({ state: "visible", timeout: 3000 }); + + const filterSettings = filter.locator(".flex.join > button:first-child"); + + await filterSettings.click(); + + const modalSettings = page.locator("#modalSettings_bassboost"); + + await modalSettings.waitFor({ state: "visible", timeout: 3000 }); + + const input = page.locator("#bassboost_frequencyBooster"); + + await input.fill("25"); + + const resetButton = modalSettings.locator("button", { hasText: "Reset" }); + + await resetButton.click(); + + expect(input.inputValue).not.toBe("25"); +}); From e02c464556ec48a167c77f9dc08d8401f38ba7e9 Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Thu, 6 Jun 2024 21:34:52 +0200 Subject: [PATCH 15/29] Add new tests --- tests/audioeditor.spec.ts | 53 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/tests/audioeditor.spec.ts b/tests/audioeditor.spec.ts index f88718d..7184eb2 100644 --- a/tests/audioeditor.spec.ts +++ b/tests/audioeditor.spec.ts @@ -112,3 +112,56 @@ test("resetting settings of filter should work", async ({ page }) => { expect(input.inputValue).not.toBe("25"); }); + +test("validating settings should work", async ({ page }) => { + const filter = page.locator("button", { hasText: "Bass booster" }); + + await filter.waitFor({ state: "visible", timeout: 10000 }); + + await filter.click(); + + const validateButton = page.locator("div > button", { hasText: "Validate settings" }); + + await validateButton.click(); + + const loadingPopup = page.locator("#loadingAudioProcessing"); + + await loadingPopup.waitFor({ state: "attached", timeout: 5000 }); + + expect(await loadingPopup.count()).toBe(1); + + await loadingPopup.waitFor({ state: "detached", timeout: 5000 }); + + const errorPopup = page.locator("#errorProcessingAudioDialog"); + + expect(await errorPopup.count()).toBe(0); +}); + +test("cancelling audio processing should work", async ({ page }) => { + const bassBooster = page.locator("button", { hasText: "Bass booster" }); + const vocoder = page.locator("button", { hasText: "Vocoder" }); + const bitcrusher = page.locator("button", { hasText: "8-bit effect" }); + + await bassBooster.waitFor({ state: "visible", timeout: 10000 }); + + await bassBooster.click(); + await vocoder.click(); + await bitcrusher.click(); + + const validateButton = page.locator("div > button", { hasText: "Validate settings" }); + + await validateButton.click(); + + const loadingPopup = page.locator("#loadingAudioProcessing"); + const cancelButton = page.locator("#loadingAudioProcessing + div button", { hasText: "Cancel" }); + + await cancelButton.waitFor({ state: "visible", timeout: 10000 }); + + expect(await loadingPopup.count()).toBe(1); + + await cancelButton.click(); + + await loadingPopup.waitFor({ state: "detached", timeout: 10000 }); + + expect(await loadingPopup.count()).toBe(0); +}); \ No newline at end of file From 4fdc0dafbfbcbc7a0e65427687c500ce02fd1e96 Mon Sep 17 00:00:00 2001 From: Eliastik <26941242+Eliastik@users.noreply.github.com> Date: Fri, 14 Jun 2024 22:08:42 +0200 Subject: [PATCH 16/29] Add new tests --- package.json | 2 +- .../components/audioEditor/AudioPlayer.tsx | 12 +-- tests/audioplayer.spec.ts | 102 ++++++++++++++++++ 3 files changed, 109 insertions(+), 7 deletions(-) create mode 100644 tests/audioplayer.spec.ts diff --git a/package.json b/package.json index bd56946..b4fa979 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "build": "next build", "start": "next start", "lint": "next lint", - "test": "npx playwright test" + "test": "npx playwright test tests/audioplayer.spec.ts" }, "repository": { "type": "git", diff --git a/src/app/components/audioEditor/AudioPlayer.tsx b/src/app/components/audioEditor/AudioPlayer.tsx index 521e121..3d8a8fc 100644 --- a/src/app/components/audioEditor/AudioPlayer.tsx +++ b/src/app/components/audioEditor/AudioPlayer.tsx @@ -33,7 +33,7 @@ const AudioPlayer = () => { return ( <> -
+
{
{!playing && -
} {playing && !isCompatibilityModeEnabled && -
} {playing && isCompatibilityModeEnabled && -
} - {currentTimeDisplay} / {maxTimeDisplay} + {currentTimeDisplay} / {maxTimeDisplay}
-
- - } - {audioRecording && } -
-