diff --git a/.github/dependabot.yml b/.github/dependabot.yml index afd2e74..6854ca4 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -15,4 +15,4 @@ updates: - "*" update-types: - "minor" - - "patch" \ No newline at end of file + - "patch" diff --git a/.github/workflows/dependabotautomerge.yml b/.github/workflows/dependabotautomerge.yml index ffc9ef2..744c796 100644 --- a/.github/workflows/dependabotautomerge.yml +++ b/.github/workflows/dependabotautomerge.yml @@ -19,4 +19,4 @@ jobs: run: gh pr merge --auto --rebase "$PR_URL" env: PR_URL: ${{github.event.pull_request.html_url}} - GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} \ No newline at end of file + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yml deleted file mode 100644 index 08ea6a4..0000000 --- a/.github/workflows/eslint.yml +++ /dev/null @@ -1,47 +0,0 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. -# ESLint is a tool for identifying and reporting on patterns -# found in ECMAScript/JavaScript code. -# More details at https://github.com/eslint/eslint -# and https://eslint.org - -name: ESLint - -on: - push: - branches: [ "main" ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ "main" ] -jobs: - eslint: - name: Run eslint scanning - runs-on: ubuntu-latest - permissions: - contents: read - security-events: write - actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status - steps: - - name: Checkout - uses: actions/checkout@v4 - - - uses: pnpm/action-setup@v4 - name: Install pnpm - with: - version: 10 - run_install: false - - - name: Install Node.js - uses: actions/setup-node@v4 - with: - node-version: 20 - cache: 'pnpm' - - - name: Install dependencies - run: pnpm install ${{ github.actor == 'dependabot[bot]' && '--no-frozen-lockfile' || '--frozen-lockfile' }} - - - name: run ESLint + Prettier - run: pnpm run quality:eslint - diff --git a/.github/workflows/generate-apk.yml b/.github/workflows/generate-apk.yml index df040b4..371989d 100644 --- a/.github/workflows/generate-apk.yml +++ b/.github/workflows/generate-apk.yml @@ -18,7 +18,7 @@ jobs: if: startsWith(github.ref, 'refs/tags/') steps: - uses: actions/checkout@v4 - + - name: Set version env vars run: | TAG=${GITHUB_REF#refs/tags/v} @@ -105,4 +105,3 @@ jobs: android/app/build/outputs/apk/release/shazarr-signed.apk - run: echo Build status report=${{ job.status }} - diff --git a/.github/workflows/generate-pr-apk.yml b/.github/workflows/generate-pr-apk.yml index d933d3e..43dfbac 100644 --- a/.github/workflows/generate-pr-apk.yml +++ b/.github/workflows/generate-pr-apk.yml @@ -62,7 +62,6 @@ jobs: working-directory: ./android run: chmod +x gradlew - - name: Setup Gradle uses: gradle/actions/setup-gradle@v3 @@ -92,4 +91,3 @@ jobs: with: name: app-bundle path: android/app/build/outputs/apk/release/shazarr-signed.apk - \ No newline at end of file diff --git a/.github/workflows/oxlint.yml b/.github/workflows/oxlint.yml new file mode 100644 index 0000000..f360ef4 --- /dev/null +++ b/.github/workflows/oxlint.yml @@ -0,0 +1,69 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +name: Oxc (oxlint + oxfmt) + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +jobs: + oxlint: + name: Run oxlint scanning + runs-on: ubuntu-latest + permissions: + contents: read + security-events: write + actions: read + steps: + - name: Checkout + uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + name: Install pnpm + with: + version: 10 + run_install: false + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + + - name: Install dependencies + run: pnpm install ${{ github.actor == 'dependabot[bot]' && '--no-frozen-lockfile' || '--frozen-lockfile' }} + + - name: Run Oxlint + run: pnpm run quality:lint + + oxfmt: + name: Check formatting with oxfmt + runs-on: ubuntu-latest + permissions: + contents: read + steps: + - name: Checkout + uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + name: Install pnpm + with: + version: 10 + run_install: false + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + + - name: Install dependencies + run: pnpm install ${{ github.actor == 'dependabot[bot]' && '--no-frozen-lockfile' || '--frozen-lockfile' }} + + - name: Check formatting + run: pnpm run quality:format-check diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index dbb36c5..71cc52a 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -1,17 +1,17 @@ name: Playwright Tests on: push: - branches: [ main ] + branches: [main] pull_request: - branches: [ main ] + branches: [main] concurrency: group: ${{ github.ref }} - cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} jobs: test: timeout-minutes: 60 runs-on: ubuntu-latest - name: 'Playwright Tests' + name: "Playwright Tests" steps: - name: Checkout uses: actions/checkout@v4 @@ -25,14 +25,14 @@ jobs: - uses: actions/setup-node@v4 with: node-version: "22.x" - cache: 'pnpm' + cache: "pnpm" - name: Install dependencies run: pnpm install ${{ github.actor == 'dependabot[bot]' && '--no-frozen-lockfile' || '--frozen-lockfile' }} - name: Run Playwright tests run: pnpm run testing:ci - + - uses: actions/upload-artifact@v4 if: failure() with: diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 0000000..aa2a2f1 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/schemas/oxfmtrc.json", + + "ignorePatterns": [ + "**/node_modules", + "**/public", + "**/playwright-report", + "**/dist", + "**/android", + "**/ios", + "**/.git" + ], + + "settings": { + "typescript": { + "tsconfig": "./tsconfig.json" + } + }, + + "options": { + "quoteStyle": "double", + "semicolons": "always", + "trailingCommas": "es5", + "indentWidth": 2, + "useTabs": false, + "lineEndings": "lf" + } +} diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..1125b36 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,62 @@ +{ + "$schema": "https://raw.githubusercontent.com/oxc-project/oxc/main/schemas/oxlintrc.json", + + "ignorePatterns": [ + "**/node_modules", + "**/public", + "**/playwright-report", + "**/dist", + "**/android", + "**/ios" + ], + + "plugins": ["react", "jsx_a11y"], + + "rules": { + "react/exhaustive-deps": "warn", + "react/forward-ref-uses-ref": "warn", + "react/jsx-key": "error", + "react/no-children-prop": "error", + "react/no-danger-with-children": "error", + + "jsx_a11y/alt-text": "error", + "jsx_a11y/anchor-has-content": "error", + "jsx_a11y/anchor-is-valid": "error", + "jsx_a11y/aria-activedescendant-has-tabindex": "error", + "jsx_a11y/aria-props": "error", + "jsx_a11y/aria-proptypes": "error", + "jsx_a11y/aria-role": "error", + "jsx_a11y/aria-unsupported-elements": "error", + "jsx_a11y/autocomplete-valid": "error", + "jsx_a11y/click-events-have-key-events": "error", + "jsx_a11y/control-has-associated-label": "error", + "jsx_a11y/heading-has-content": "error", + "jsx_a11y/html-has-lang": "error", + "jsx_a11y/iframe-has-title": "error", + "jsx_a11y/img-redundant-alt": "error", + "jsx_a11y/interactive-supports-focus": "error", + "jsx_a11y/label-has-associated-control": "error", + "jsx_a11y/lang": "error", + "jsx_a11y/media-has-caption": "error", + "jsx_a11y/mouse-events-have-key-events": "error", + "jsx_a11y/no-access-key": "error", + "jsx_a11y/no-autofocus": "error", + "jsx_a11y/no-distracting-elements": "error", + "jsx_a11y/no-interactive-element-to-noninteractive-role": "error", + "jsx_a11y/no-noninteractive-element-interactions": "error", + "jsx_a11y/no-noninteractive-element-to-interactive-role": "error", + "jsx_a11y/no-noninteractive-tabindex": "error", + "jsx_a11y/no-redundant-roles": "error", + "jsx_a11y/no-static-element-interactions": "error", + "jsx_a11y/role-has-required-aria-props": "error", + "jsx_a11y/role-supports-aria-props": "error", + "jsx_a11y/scope": "error", + "jsx_a11y/tabindex-no-positive": "error" + }, + + "settings": { + "typescript": { + "tsconfig": "./tsconfig.json" + } + } +} diff --git a/CHANGELOG.md b/CHANGELOG.md index ed29422..3658569 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,163 +1,250 @@ # Changelog + Shazarr notable changes. [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) format. ## ๐Ÿ“ฆ 0.3.7 + ### ๐Ÿ– Changed -* Remove alarm and reminder permission request #366 + +- Remove alarm and reminder permission request #366 ## ๐Ÿ“ฆ 0.3.6 + ### ๐Ÿš€ Added -* Add Soulsync support #358 + +- Add Soulsync support #358 + ### ๐Ÿ– Changed -* Move from Matomo to Umami + +- Move from Matomo to Umami ## ๐Ÿ“ฆ 0.3.5 + ### ๐Ÿš€ Added -* Add new option to auto-shazam on app open #337 -* Dedup records on new tags and store previous tag dates #339 + +- Add new option to auto-shazam on app open #337 +- Dedup records on new tags and store previous tag dates #339 ## ๐Ÿ“ฆ 0.3.4 -### ๐Ÿ– Changed -* Wait for Lidarr's artist sync to actually finish instead of guessing with a timeout +### ๐Ÿ– Changed + +- Wait for Lidarr's artist sync to actually finish instead of guessing with a timeout ## ๐Ÿ“ฆ 0.3.3 + ### ๐Ÿ– Changed -* Keep tidarr and lidarr button state instead of returning to initial state + +- Keep tidarr and lidarr button state instead of returning to initial state ## ๐Ÿ“ฆ 0.3.2 + ### ๐Ÿš€ Added -* Use back button to close panel + +- Use back button to close panel + ### ๐Ÿ– Changed -* Download the APK directly on update + +- Download the APK directly on update + ### ๐Ÿ› Fixed -* Rewrite Lidarr album monitoring #308 + +- Rewrite Lidarr album monitoring #308 ## ๐Ÿ“ฆ 0.3.1 + ### ๐Ÿ› Fixed -* Fix Lidarr monitored artist instead of album only #308 + +- Fix Lidarr monitored artist instead of album only #308 ## ๐Ÿ“ฆ 0.3.0 + ### ๐Ÿ– Changed -* Results shows now as a inline card instead of a dedicated screen. -* Enhance UI for landscape mode + +- Results shows now as a inline card instead of a dedicated screen. +- Enhance UI for landscape mode ## ๐Ÿ“ฆ 0.2.1 + ### ๐Ÿ› Fixed -* Fix Tidarr network error + +- Fix Tidarr network error ## ๐Ÿ“ฆ 0.2.0 + ### ๐Ÿš€ Added -* Lidarr button now auto seearch if API key is set #241 -* Tidarr search is now integrated in the app if API key is set + +- Lidarr button now auto seearch if API key is set #241 +- Tidarr search is now integrated in the app if API key is set + ### ๐Ÿ– Changed -* Gradle version is synched with the github tag in ci #227 + +- Gradle version is synched with the github tag in ci #227 + ### ๐Ÿงน Renovate -* Dependencies update + +- Dependencies update ## ๐Ÿ“ฆ 0.1.6 + ### ๐Ÿ› Changed -* Use github tag as project version + +- Use github tag as project version ## ๐Ÿ“ฆ 0.1.5 + ### ๐Ÿ› Fixed -* Fix issue with android navigation button overlap in history + +- Fix issue with android navigation button overlap in history ## ๐Ÿ“ฆ 0.1.4 + ### ๐Ÿ› Fixed -* Fix issue with android navigation button overlap + +- Fix issue with android navigation button overlap + ### ๐Ÿงน Renovate -* Update other node dependencies + +- Update other node dependencies ## ๐Ÿ“ฆ 0.1.3 + ### ๐Ÿ› Fixed -* Update tidarr search url according version 0.3.0 + +- Update tidarr search url according version 0.3.0 + ### ๐Ÿงน Renovate -* Update `Android SDK` from version 34 to 35 -* Move from `npm`to `pnpm` -* Update other node dependencies + +- Update `Android SDK` from version 34 to 35 +- Move from `npm`to `pnpm` +- Update other node dependencies ## ๐Ÿ“ฆ 0.1.2 + ### ๐Ÿงน Renovate -* Update `capacitor` from version 6 to 7 -* Update `react` from version 18 to 19 -* Update other node dependencies -* Move from `react-scripts`to `vite` + +- Update `capacitor` from version 6 to 7 +- Update `react` from version 18 to 19 +- Update other node dependencies +- Move from `react-scripts`to `vite` ## ๐Ÿ“ฆ 0.1.1 -### ๐Ÿ› Fixed -* Fix application crash when track result does not have album information -### ๐Ÿงน Renovate -* Add Matomo cookie free and anonimyzed data +### ๐Ÿ› Fixed + +- Fix application crash when track result does not have album information + +### ๐Ÿงน Renovate + +- Add Matomo cookie free and anonimyzed data ## ๐Ÿ“ฆ 0.1.0 + ### ๐Ÿ– Changed -* Change notification message to specify prerelease ou release update status + +- Change notification message to specify prerelease ou release update status + ### ๐Ÿ› Fixed -* Fix issue with track image not updating when picking an history item -* Fix readme apk download link + +- Fix issue with track image not updating when picking an history item +- Fix readme apk download link + ### ๐Ÿงน Renovate -* Update node deps -* Migrate capacitor from v5 to v6 -* Typescript 5 -* Eslint 9 + +- Update node deps +- Migrate capacitor from v5 to v6 +- Typescript 5 +- Eslint 9 ## ๐Ÿ“ฆ 0.0.9 + ### ๐Ÿš€ Added -* Playwright testing -* Github CI Eslint + testing + +- Playwright testing +- Github CI Eslint + testing + ### ๐Ÿ› Fixed -* Fix history order issue on delete / recognize offline record + +- Fix history order issue on delete / recognize offline record ## ๐Ÿ“ฆ 0.0.8 + ### ๐Ÿ› Fixed -* Fix missing "not found" message + +- Fix missing "not found" message ## ๐Ÿ“ฆ 0.0.7 + ### ๐Ÿ– Changed -* Update `shazam-api` node package to 0.2.0 -* Remove git patch package and clean code + +- Update `shazam-api` node package to 0.2.0 +- Remove git patch package and clean code + ### ๐Ÿ› Fixed -* Fix datetime issue on android + +- Fix datetime issue on android ## ๐Ÿ“ฆ 0.0.6 + ### ๐Ÿ– Changed -* Use Lidarr in lazy mode to avoid API issue + +- Use Lidarr in lazy mode to avoid API issue Clean code - code style ## ๐Ÿ“ฆ 0.0.5 + ### ๐Ÿ› Fixed -* Fix Audio player keeps playing issue + +- Fix Audio player keeps playing issue + ### ๐Ÿš€ Added -* Add error handling on Shazam and Lidarr queries. + +- Add error handling on Shazam and Lidarr queries. ## ๐Ÿ“ฆ 0.0.4 + ### ๐Ÿ– Changed -* Remove FFmpeg -* Use JS Audio API (make song identification much faster) + +- Remove FFmpeg +- Use JS Audio API (make song identification much faster) + ### ๐Ÿ› Fixed -* Fix offline record + +- Fix offline record ## ๐Ÿ“ฆ 0.0.3 + ### ๐Ÿš€ Added -* Add app update notifications + +- Add app update notifications + ### ๐Ÿ– Changed -* Refacto transcoding + +- Refacto transcoding + ### ๐Ÿ› Fixed -* Fix Lidarr API fetches + +- Fix Lidarr API fetches ## ๐Ÿ“ฆ 0.0.2 + ### ๐Ÿš€ Added -* Add github page + +- Add github page + ### ๐Ÿ– Changed -* Improve ffmpeg + +- Improve ffmpeg + ### ๐Ÿ› Fixed -* Fix "not found" response + +- Fix "not found" response ## ๐Ÿ“ฆ 0.0.1 + ### ๐Ÿš€ Added -* Initial project package \ No newline at end of file + +- Initial project package diff --git a/README.md b/README.md index 26a4b07..15c7a6b 100644 --- a/README.md +++ b/README.md @@ -14,6 +14,7 @@ Shazarr is a mobile app (Android, iOS) providing Shazam song recognition with de ## Features ### Core + - Audio microphone capture and song recognition using reverse Shazam API with [node-shazam-api](https://github.com/asivery/node-shazam-api) - Listen on streaming apps: Spotify, Apple Music and Deezer - Show lyrics for recognized tracks @@ -22,6 +23,7 @@ Shazarr is a mobile app (Android, iOS) providing Shazam song recognition with de - Privacy: No login, no tracking, no mandatory API key ### Music Services Integration + - **Lidarr**: Auto-search and download discovered albums via API - **Tidarr**: Search Tidal content in-app, queue tracks or full album downloads, add to Tidal favorites - **SoulSync**: Add to wishlist to trigger automatic download via API @@ -32,7 +34,7 @@ Shazarr is a mobile app (Android, iOS) providing Shazam song recognition with de - **Android**: โœ… Download APK [here](https://github.com/cstaelen/shazarr/releases/latest/download/shazarr-signed.apk) - **iOS**: โš ๏ธ Build from Xcode only (requires Xcode and paired device) -Get last release : +Get last release : [](https://github.com/cstaelen/shazarr-app/releases/latest) @@ -41,10 +43,12 @@ Get last release : Configure Shazarr to connect with your music automation services: ### Services + - **Lidarr URL**: `http://` (optional API key for auto-search, falls back to browser) - **Tidarr URL**: `http://` (optional API key for auto-search) ### SoulSync + - **SoulSync URL**: `http://:8008` - **SoulSync API Key**: `your-api-key` (generated from SoulSync settings: Settings > API) - **SoulSync Profile ID**: `1` (optional, defaults to profile 1) @@ -52,6 +56,7 @@ Configure Shazarr to connect with your music automation services: > **Note**: When configured with API key, Shazarr will automatically search and add tracks/albums to your SoulSync wishlist, triggering automatic downloads based on your SoulSync configuration. ### Custom Service + - **Custom service URL**: `http://?query=` (e.g., `http://my-service.local/search?q=`) - **Custom service name**: Display name for the button (e.g., "My Music Service") @@ -74,17 +79,21 @@ Configure Shazarr to connect with your music automation services: 6. After a few seconds, the app will be installed on your iPad/iPhone ## Roadmap + - [x] Android app - [x] Record history: access last shazamed songs - [x] Offline record: record without API access, recognize song later -- [x] Update notifications +- [x] Update notifications - [ ] iOS app: find a way to distribute packaged app without using app store and without have to clone and build it ## Development + - Android + iOS mobile app (ReactJS + Ionic/Capacitor) ### Watch mode + Start app in watch mode : + ```sh pnpm run start # Listening on http://localhost:3000/ pnpm run android:live # Listening on http://localhost:8100/ + emulate @@ -92,11 +101,15 @@ pnpm run ios:live # Listening on http://localhost:8100/ + emulate ``` ### Build + Build APK with Android studio: + ``` pnpm run android:build ``` + Build ios app with Xcode: + ``` make ios/build ``` @@ -108,9 +121,9 @@ If you like this project you can support here: Buy Me A Coffee ## Credits + - Big thanks to the [node-shazam-api](https://github.com/asivery/node-shazam-api) team for the awesome works and reactivness ๐Ÿ‘๐Ÿ’ช๐Ÿ™ - UI inspiration : https://github.com/codrops/ShazamButtonEffect -- See Lidarr project: https://github.com/linuxserver/docker-lidarr +- See Lidarr project: https://github.com/linuxserver/docker-lidarr - See Tidarr project: https://github.com/cstaelen/tidarr - See SoulSync project: https://github.com/Nezreka/SoulSync - diff --git a/capacitor.config.json b/capacitor.config.json index 1b4e1b2..d9945a4 100644 --- a/capacitor.config.json +++ b/capacitor.config.json @@ -1,8 +1,8 @@ { - "appId": "io.ionic.shazarr", - "appName": "Shazarr", - "bundledWebRuntime": false, - "npmClient": "pnpm", - "webDir": "dist", - "cordova": {} - } \ No newline at end of file + "appId": "io.ionic.shazarr", + "appName": "Shazarr", + "bundledWebRuntime": false, + "npmClient": "pnpm", + "webDir": "dist", + "cordova": {} +} diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index 5d4a6e9..0000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,63 +0,0 @@ -import js from "@eslint/js"; -import jsxA11Y from "eslint-plugin-jsx-a11y"; -import reactHooksEslint from "eslint-plugin-react-hooks"; -import reactRefresh from 'eslint-plugin-react-refresh' -import simpleImportSort from "eslint-plugin-simple-import-sort"; - -import globals from 'globals' -import tseslint from 'typescript-eslint' - -export default tseslint.config( - { ignores: [ - "**/node_modules", - "**/public", - "**/playwright-report", - "**/dist", - "**/android", - "**/ios", - ], }, - { - extends: [js.configs.recommended, - ...tseslint.configs.recommended], - files: ['**/*.{ts,tsx}'], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - }, - plugins: { - 'react-hooks': reactHooksEslint, - 'react-refresh': reactRefresh, - "jsx-a11y": jsxA11Y, - "simple-import-sort": simpleImportSort, - }, - rules: { - ...reactHooksEslint.configs.recommended.rules, - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - "simple-import-sort/imports": [ - "error", - { - groups: [ - // Packages `react` related packages come first. - ["^react", "^@?\\w"], - // Internal packages. - ["^(@|components)(/.*|$)"], - // Internal packages. - ["^(assets/js)(/.*|$)"], - // Side effect imports. - ["^\\u0000"], - // Parent imports. Put `..` last. - ["^\\.\\.(?!/?$)", "^\\.\\./?$"], - // Other relative imports. Put same-folder imports and `.` last. - ["^\\./(?=.*/)(?!/?$)", "^\\.(?!/?$)", "^\\./?$"], - // Style imports. - ["^.+\\.?(css)$"], - ], - }, - ], - "simple-import-sort/exports": "error", - }, - }, -) \ No newline at end of file diff --git a/index.html b/index.html index a83117a..1c08b15 100644 --- a/index.html +++ b/index.html @@ -1,19 +1,17 @@ - + + + + + + - - - - - + Shazarr - Unoffical Shazam app + - Shazarr - Unoffical Shazam app - - - - -
- - - - \ No newline at end of file + + +
+ + + diff --git a/ionic.config.json b/ionic.config.json index 3a6266e..c6673c1 100644 --- a/ionic.config.json +++ b/ionic.config.json @@ -1,7 +1,7 @@ { - "name": "shazarr", - "integrations": { - "capacitor": {} - }, - "type": "react" - } \ No newline at end of file + "name": "shazarr", + "integrations": { + "capacitor": {} + }, + "type": "react" +} diff --git a/package.json b/package.json index a9a6cb2..02af45b 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,28 @@ { "name": "shazarr-app", "private": true, - "engines": { - "node": ">=18", - "npm": ">=10" + "scripts": { + "start": "vite dev", + "build": "tsc && vite build", + "preview": "vite preview", + "ionic:serve": "pnpm run start", + "ios:open": "ionic capacitor open ios", + "ios:sync": "npx cap sync ios", + "ios:live": "ionic capacitor run ios -l --external --port 5173", + "android:open": "ionic capacitor open android", + "android:sync": "npx cap sync android", + "android:live": "ionic capacitor run android -l --external --port 5173", + "quality:deadcode": "ts-prune | (! grep -v 'used in module')", + "quality:depcheck": "npx depcheck", + "quality:lint": "oxlint", + "quality:lint-fix": "oxlint --fix", + "quality:format": "oxfmt", + "quality:format-check": "oxfmt --check", + "testing:run": "docker run --rm -it -v .:/srv -w /srv mcr.microsoft.com/playwright:v1.63.0-noble sh -c 'npm i -g pnpm@10.28.2 && pnpm install --no-frozen-lockfile && npx playwright test'", + "testing:ui": "npx playwright test --ui", + "testing:ci": "docker run --rm -e CI=true -v .:/srv -w /srv mcr.microsoft.com/playwright:v1.63.0-noble sh -c 'npm i -g pnpm@10.28.2 && pnpm install --no-frozen-lockfile && npx playwright test'", + "testing:show-report": "docker run --rm -it -p 9323:9323 -v .:/srv -w /srv mcr.microsoft.com/playwright:v1.63.0-noble npx playwright show-report ./testing/playwright-report --host 0.0.0.0", + "testing:update-snapshots": "docker run --rm -it -v .:/srv -w /srv mcr.microsoft.com/playwright:v1.63.0-noble sh -c 'npm i -g pnpm@10.28.2 && pnpm install --no-frozen-lockfile && npx playwright test --update-snapshots'" }, "dependencies": { "@capacitor/android": "^8.5.2", @@ -21,7 +40,6 @@ "@emotion/styled": "^11.14.1", "@mui/icons-material": "^9.4.0", "@mui/material": "^9.4.0", - "@typescript-eslint/parser": "^8.71.1", "@uidotdev/usehooks": "^2.4.1", "capacitor-voice-recorder": "^7.0.6", "node": "^26.10.0", @@ -32,45 +50,33 @@ "devDependencies": { "@capacitor/assets": "^3.0.5", "@capacitor/cli": "^8.5.2", - "@eslint/js": "^10.0.1", "@ionic/cli": "^7.2.1", "@playwright/test": "^1.63.0", "@types/react": "^19.3.0", "@types/react-dom": "^19.3.0", "@vitejs/plugin-react": "^6.1.2", "depcheck": "^1.4.7", - "eslint": "^10.12.0", - "eslint-plugin-jsx-a11y": "^6.10.2", - "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-react-refresh": "^0.5.7", - "eslint-plugin-simple-import-sort": "^14.0.0", - "globals": "^17.13.0", - "prettier": "^3.9.9", + "oxfmt": "^0.72.0", + "oxlint": "^1.87.0", "ts-prune": "^0.10.3", "typescript": "^6.0.3", - "typescript-eslint": "^8.71.1", "vite": "^8.3.3" }, - "scripts": { - "start": "vite dev", - "build": "tsc && vite build", - "preview": "vite preview", - "ionic:serve": "pnpm run start", - "ios:open": "ionic capacitor open ios", - "ios:sync": "npx cap sync ios", - "ios:live": "ionic capacitor run ios -l --external --port 5173", - "android:open": "ionic capacitor open android", - "android:sync": "npx cap sync android", - "android:live": "ionic capacitor run android -l --external --port 5173", - "quality:deadcode": "ts-prune | (! grep -v 'used in module')", - "quality:depcheck": "npx depcheck", - "quality:eslint": "eslint .", - "quality:eslint-fix": "eslint --fix .", - "testing:run": "docker run --rm -it -v .:/srv -w /srv mcr.microsoft.com/playwright:v1.63.0-noble sh -c 'npm i -g pnpm@10.28.2 && pnpm install --no-frozen-lockfile && npx playwright test'", - "testing:ui": "npx playwright test --ui", - "testing:ci": "docker run --rm -e CI=true -v .:/srv -w /srv mcr.microsoft.com/playwright:v1.63.0-noble sh -c 'npm i -g pnpm@10.28.2 && pnpm install --no-frozen-lockfile && npx playwright test'", - "testing:show-report": "docker run --rm -it -p 9323:9323 -v .:/srv -w /srv mcr.microsoft.com/playwright:v1.63.0-noble npx playwright show-report ./testing/playwright-report --host 0.0.0.0", - "testing:update-snapshots": "docker run --rm -it -v .:/srv -w /srv mcr.microsoft.com/playwright:v1.63.0-noble sh -c 'npm i -g pnpm@10.28.2 && pnpm install --no-frozen-lockfile && npx playwright test --update-snapshots'" + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "engines": { + "node": ">=18", + "npm": ">=10" }, "pnpm": { "overrides": { @@ -93,17 +99,5 @@ "uuid": ">=11.1.1", "yaml": ">=1.10.3" } - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3edf485..08e07dc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -73,9 +73,6 @@ importers: '@mui/material': specifier: ^9.4.0 version: 9.4.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.0))(@types/react@19.3.0)(react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0) - '@typescript-eslint/parser': - specifier: ^8.71.1 - version: 8.71.1(eslint@10.12.0)(typescript@6.0.3) '@uidotdev/usehooks': specifier: ^2.4.1 version: 2.4.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0) @@ -101,9 +98,6 @@ importers: '@capacitor/cli': specifier: ^8.5.2 version: 8.5.2 - '@eslint/js': - specifier: ^10.0.1 - version: 10.0.1(eslint@10.12.0) '@ionic/cli': specifier: ^7.2.1 version: 7.2.1 @@ -122,36 +116,18 @@ importers: depcheck: specifier: ^1.4.7 version: 1.4.7 - eslint: - specifier: ^10.12.0 - version: 10.12.0 - eslint-plugin-jsx-a11y: - specifier: ^6.10.2 - version: 6.10.2(eslint@10.12.0) - eslint-plugin-react-hooks: - specifier: ^7.1.1 - version: 7.1.1(eslint@10.12.0) - eslint-plugin-react-refresh: - specifier: ^0.5.7 - version: 0.5.7(eslint@10.12.0) - eslint-plugin-simple-import-sort: - specifier: ^14.0.0 - version: 14.0.0(eslint@10.12.0) - globals: - specifier: ^17.13.0 - version: 17.13.0 - prettier: - specifier: ^3.9.9 - version: 3.9.9 + oxfmt: + specifier: ^0.72.0 + version: 0.72.0 + oxlint: + specifier: ^1.87.0 + version: 1.87.0 ts-prune: specifier: ^0.10.3 version: 0.10.3 typescript: specifier: ^6.0.3 version: 6.0.3 - typescript-eslint: - specifier: ^8.71.1 - version: 8.71.1(eslint@10.12.0)(typescript@6.0.3) vite: specifier: ^8.3.3 version: 8.3.3(@types/node@22.14.0)(esbuild@0.27.2)(yaml@2.8.3) @@ -166,18 +142,6 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/code-frame@7.29.7': - resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.29.7': - resolution: {integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.29.7': - resolution: {integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.27.0': resolution: {integrity: sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw==} engines: {node: '>=6.9.0'} @@ -186,36 +150,14 @@ packages: resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.8': - resolution: {integrity: sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.29.7': - resolution: {integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==} - engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} - '@babel/helper-globals@7.29.7': - resolution: {integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.29.7': - resolution: {integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.29.7': - resolution: {integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': '>=7.29.6' - '@babel/helper-string-parser@7.25.9': resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} engines: {node: '>=6.9.0'} @@ -224,10 +166,6 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-string-parser@7.29.7': - resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==} - engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} engines: {node: '>=6.9.0'} @@ -236,18 +174,6 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.29.7': - resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.29.7': - resolution: {integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.29.7': - resolution: {integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==} - engines: {node: '>=6.9.0'} - '@babel/parser@7.27.0': resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} engines: {node: '>=6.0.0'} @@ -258,11 +184,6 @@ packages: engines: {node: '>=6.0.0'} hasBin: true - '@babel/parser@7.29.8': - resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==} - engines: {node: '>=6.0.0'} - hasBin: true - '@babel/runtime@7.27.0': resolution: {integrity: sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==} engines: {node: '>=6.9.0'} @@ -283,10 +204,6 @@ packages: resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} - '@babel/template@7.29.7': - resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==} - engines: {node: '>=6.9.0'} - '@babel/traverse@7.27.0': resolution: {integrity: sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA==} engines: {node: '>=6.9.0'} @@ -295,10 +212,6 @@ packages: resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.29.8': - resolution: {integrity: sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==} - engines: {node: '>=6.9.0'} - '@babel/types@7.27.0': resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} engines: {node: '>=6.9.0'} @@ -307,16 +220,6 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} - '@babel/types@7.29.8': - resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==} - engines: {node: '>=6.9.0'} - - '@cacheable/memory@2.2.0': - resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} - - '@cacheable/utils@2.5.0': - resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} - '@capacitor/android@8.5.2': resolution: {integrity: sha512-rtiaz78egCcS+vs29wkWCL3C+RhazKMSygXcjutwWP8NmO6r5UBxOvGf3Wjz5+ahobyQ723tn9gCePwRwcNDZQ==} peerDependencies: @@ -605,65 +508,6 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.10.1': - resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.12.2': - resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/config-array@0.23.5': - resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/config-helpers@0.7.0': - resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/core@1.2.1': - resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/js@10.0.1': - resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - peerDependencies: - eslint: ^10.0.0 - peerDependenciesMeta: - eslint: - optional: true - - '@eslint/object-schema@3.0.5': - resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@eslint/plugin-kit@0.7.3': - resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - '@humanfs/core@0.19.2': - resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} - engines: {node: '>=18.18.0'} - - '@humanfs/node@0.16.8': - resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} - engines: {node: '>=18.18.0'} - - '@humanfs/types@0.15.0': - resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} - engines: {node: '>=18.18.0'} - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/retry@0.4.3': - resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} - engines: {node: '>=18.18'} - '@hutson/parse-repository-url@3.0.2': resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} engines: {node: '>=6.9.0'} @@ -890,9 +734,6 @@ packages: resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} engines: {node: '>=6.0.0'} - '@jridgewell/remapping@2.3.5': - resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} - '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -916,15 +757,6 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - '@keyv/bigmap@1.3.1': - resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} - engines: {node: '>= 18'} - peerDependencies: - keyv: ^5.6.0 - - '@keyv/serialize@1.1.1': - resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} - '@mui/core-downloads-tracker@9.4.0': resolution: {integrity: sha512-d+gIYM1raJP87yrVQcVg+Q3vycVMArMkgu/TjJLi2vTvO9FHKWNRR1xs9nnN4eLpM9nGxxm02UMvc9BrmcUKvQ==} @@ -1035,6 +867,234 @@ packages: '@oxc-project/types@0.152.0': resolution: {integrity: sha512-oM/5rLBm2tPkg0iBgkH/FOeR3PCDpY19GTgAZjMFM8h9WI9VW7cLgzp6nwtarYKmovavIQZ+Fe/RKX/8C8O/Rw==} + '@oxfmt/binding-android-arm-eabi@0.72.0': + resolution: {integrity: sha512-u4U1uaDOVBuorGNC/07NLm48nECHOiJJka002YGML16Md2DRvf38RGBt01lH60EOGvNlFVmbLoksQedNBoZHKw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.72.0': + resolution: {integrity: sha512-GCnM+Ae2mWOKC+92y3FOb6eZJeVnBAVz82e3lITUUg+kxukYKzBNAvJ/hhHIfa2A0md55SYYhdWPddSSy3KPVA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.72.0': + resolution: {integrity: sha512-LjQ8tlevdtwraFlWC6AnQ1Forzde0clRmnsP3QmK+ydSElDt/J+5Jc+m+//Ly1G97aP7WCNUw110QMIUw2K7xA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.72.0': + resolution: {integrity: sha512-+ZbcxhB1C34RQR5IldSyY6Z/yalJIxHXhP36PGE4sEq0f/lgL5jCLmOKoDeVm8dqd9gFGDsd1bNWHSGCAwdSkw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.72.0': + resolution: {integrity: sha512-yGPhA8sePEBFV9iGcprhyOk3Bz3fZshswMH3DpYIPZFLT1DG5LjiZ0j6AJQpSueaL6bUK0av1K+5+fe+ldy5EQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.72.0': + resolution: {integrity: sha512-/g5axuqFMcAtoQrFLR5EJEMDjR5Ea4GuzpdDmMpPWAgrF1DmL4kD1NPNVlpXEOxpFJnD6lPvLKYj1lzdlrfifA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.72.0': + resolution: {integrity: sha512-InVitdHbS09PM+w+WinIiyX37rC9R3L7lUP9mKy9uKTEDSUFaLjWsLoreRIxKivnv7Ndqc6Trvi+K+b6ZzhiJg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.72.0': + resolution: {integrity: sha512-WKjlyRAxpPjXoqeuwFBim5LscgvY+RNEiZ971C9JlRQZONhJTsXDki/oHFYQE+fzzRpzXh3owZvOdT3kNL2g+g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-arm64-musl@0.72.0': + resolution: {integrity: sha512-poafnbsPpJhR+5Mbwpf8CscugTyiRAzjTOxRVn8ra3X2jnURs2xL5Du2xl5g2iW85lICMglpmLf8jDjZEbNgzQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxfmt/binding-linux-ppc64-gnu@0.72.0': + resolution: {integrity: sha512-zNUi0gKRsO7S3IfPzsTbnm88OedPuX32hmZFWZRWHvWJlAoZRwVbeO6Nb3hng4vDgL7qUKp4TGqzPz1mhsycYg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-gnu@0.72.0': + resolution: {integrity: sha512-qTY7z/iyF/rWI2HWwWMevXqZW5PZUOofUy2afK7v6rseXnpld3yjgyIk6pCux3DqWQ0lB+f5atvLJNBwzLvFsw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-riscv64-musl@0.72.0': + resolution: {integrity: sha512-w18qfo8vEMD6EKEHtzTvjc6jH8yCyXIT1Bn7PFWJd0PpZyzH/VQDx4xvjCh0LGz6GRzqiezbisTdG9AoXtpkZQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxfmt/binding-linux-s390x-gnu@0.72.0': + resolution: {integrity: sha512-grW8HwEir+vK7fCcq1ZgL3NHQCfZ1PidiERE9Hbf+24xGys+DoDaoqTht4ccfn0PcBwbViLkwkda/KNpJu2KRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxfmt/binding-linux-x64-gnu@0.72.0': + resolution: {integrity: sha512-wQJRQfWBRIn88Pkr449EUViwRayrYUScg7ty+Ihiem21mQ9BUA6S9e/4RAgyNk9lMag0KBouyKskjq61rOC0WQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-linux-x64-musl@0.72.0': + resolution: {integrity: sha512-T1B0uQzafxuGPjjaPrZJ497nxoi1BiI65JfsYc56nNpmev3msfb/iaTmH2kQuNFqa8PKxpMlf3GhWrWBvBPORQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxfmt/binding-openharmony-arm64@0.72.0': + resolution: {integrity: sha512-OKxxgTurl7+hypVplO8QRAbbQlwEs0j1Y6FZv+ZN2qNbdxQk2muMlzuJNBGTCWwxQ0rkkOD1uK/DW1fvzoUSJA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.72.0': + resolution: {integrity: sha512-L78TKzURqvjuZOCo88ixMbPXf/RP7u31Y0cmjJ/KEmrHmfYhmhEvsDaTYPiyTRne64jUgCbADfY0YeoQk4/Xyw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.72.0': + resolution: {integrity: sha512-gQtFW+Ii8BWgtJTAD17TY/WsdNS5gUfAPov8iI1jeq4r9lRRYImmxPL08UU00/RLaCfBJwh2UgINnDY0iOiZ+A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.72.0': + resolution: {integrity: sha512-uhooIN+DCzWX5uH7mQkSVCsODqsGluGJ4n3ch4+mITtWKpESMDjUJUSDBAVFuYQDwqY2McPDKdKJbM0oZVW/Qw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.87.0': + resolution: {integrity: sha512-22tVIHlB9898OYsBKmYB6He1MCSqdTmK1BVWuSNUTVrpS0KWNege+U9uEYqGJ+KatQag0r/oU44i3OOs46z7HQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.87.0': + resolution: {integrity: sha512-JfZQ3MWf74n8ov0DojZpkOduIubYJvZL5tbTMMhDutsal6u1xH1QuNpN+lK+EQwF8AeAfgwTR2fgh5U2br27XA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.87.0': + resolution: {integrity: sha512-rkx6Xvvw93z2GImVOyvbZwAZcoY0Z6MJW177XNsSB+i/CBsH7ANyelTp01VZyIkM3iSXtqKVb4+ptBgPHap5pQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.87.0': + resolution: {integrity: sha512-cw5nYw7L/pQ2SgGBgOcg/Qo89llQre3vIc/kuBLhSICzu1r5s8L76H3ug6AIFsD98WpROj8/z5JVzkf4daxHaQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.87.0': + resolution: {integrity: sha512-x/SuznE6loRZK9gz9AS4ZmzNzSu+5KdeoCS+sVHhnrE8HM6AD8UyTjwldQTTqlXGvkwHASgB0NiTNOc3o3PdAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.87.0': + resolution: {integrity: sha512-+JEDmCAXiiFmKhAjZhgAOwaHWY6WENOQ5QA+lFuY59tgsUCDOTRi46B+lENK6CWvtxsXpwkZXNOgpjAQcpIpnA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.87.0': + resolution: {integrity: sha512-/uC9XqXLAC9AHFLNycwmSQEvKqGrOCgU+uXALI7gNW0DG81TJ/3T2eHnKdRvcb5R1gFEfjxDwI4e4zIa29rICQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.87.0': + resolution: {integrity: sha512-FTRYPsBy/M728vnUv7l+KAwSAa3Qi4BQbhVvy7NYuMTZ0sUa/OWsbMx79HVFw6u/5KWcaYayDsoOiv7xbevzDg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-arm64-musl@1.87.0': + resolution: {integrity: sha512-6sC+N7IY0h1egd8SrYUGNN7CUyKJZ4bIZakKa7V7hfinf4jfi8Kq4+klJvFp5DqXcwMn44I5MeBwmJluO1odFg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxlint/binding-linux-ppc64-gnu@1.87.0': + resolution: {integrity: sha512-d5Mnn+ICbhoJPi37Ccjy+86T5qfH2+mSTrTMBXNPfB+wqSWOayBBLLIrCXdUy1YssluCVdGkl+DO9w5r5ODmUA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + + '@oxlint/binding-linux-riscv64-gnu@1.87.0': + resolution: {integrity: sha512-sf5YWuUo1Dx9loqWCgF8P278MycfcD4JHjDC/LV5j11L3Lqa4PFiwCjD6B8kP4AjsgZZkLn3xbpJEtZBaccs4Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-riscv64-musl@1.87.0': + resolution: {integrity: sha512-+aCraYbmK3uU3P0rFojjeaK9pGY6JvBDXh/0CM+gPyWKmNmXmnFe0qj4qj02U4ibFpbd9Pa9CmDvIdjJUd29rA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxlint/binding-linux-s390x-gnu@1.87.0': + resolution: {integrity: sha512-7rzbZQIljo6VLWVPqUyLa2P/WV3VFsJB4M52R4NCUJn1A50yjtUsHxiMHFL9opEKGFIiTbZ3VQzmtcJOPUq4NQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxlint/binding-linux-x64-gnu@1.87.0': + resolution: {integrity: sha512-Dry46Fa+AXE/xt9J/YriujU1pU9mzfNWHGQwtOYibAFH8HLrKWCi93AhIGnuUMiwn2JbuBkRyz51f50Ly4r4ow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-linux-x64-musl@1.87.0': + resolution: {integrity: sha512-f/HMZez74gJvnRpGz+b5sdGyWrEgRLmFTXg9sNoqjPWogGxYHUhXKTKyMiYsu9rUGR2ciYqL3fk+Ua4JhMJbRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxlint/binding-openharmony-arm64@1.87.0': + resolution: {integrity: sha512-lEC6ZfPZm/07JlB7FsOWX9o1RiHlXiBW594LSUGuXmekC8LZmvUPP9XzE2WZcNxJi5cHA/Fw56o02c3JxgMA5g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxlint/binding-win32-arm64-msvc@1.87.0': + resolution: {integrity: sha512-afBWKOD36dUiA9AenaiWpCg8xfyUVPYznyAAVXu413brK4RA5UI/Xoc4yfeGIT8G1a44MV+JR7hioryerBDzGQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxlint/binding-win32-ia32-msvc@1.87.0': + resolution: {integrity: sha512-daptNsEOuru4/nJTxV4DBHNJ5GepzmaBVQf+jjgKQGi9NRlZKik+RFq4hUL7ewsF1pwjKM+SkYaMbF82UwFGnw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxlint/binding-win32-x64-msvc@1.87.0': + resolution: {integrity: sha512-k+m/EShyXE29J/r1fjk0HlAzhN5JhIvj044oSJkXTEkCLrWZQgXb/3r4q5LTw/eaKW/4GuMXG2xmiJs3s5rPNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@paralleldrive/cuid2@2.2.2': resolution: {integrity: sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==} @@ -1166,18 +1226,9 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - '@types/esrecurse@4.3.1': - resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - - '@types/estree@1.0.9': - resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/fs-extra@8.1.5': resolution: {integrity: sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==} - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/minimatch@3.0.5': resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} @@ -1212,65 +1263,6 @@ packages: '@types/slice-ansi@4.0.0': resolution: {integrity: sha512-+OpjSaq85gvlZAYINyzKpLeiFkSC4EsC6IIiT6v6TLSU5k5U83fHGj9Lel8oKEXM0HqgrMVCjXPDPVICtxF7EQ==} - '@typescript-eslint/eslint-plugin@8.71.1': - resolution: {integrity: sha512-nNlBf6HuotqMgZvSkWD5hNdemiBIxQ2NmrlgfcUIeZRs+BbakjscCQRq/Hb74EFVnFiSWWdL12JruqwBy3ERDw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - '@typescript-eslint/parser': ^8.71.1 - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/parser@8.71.1': - resolution: {integrity: sha512-oM/5sAqz/l1v/zYK1qTOPrn2+JIrBGC1V6uNYucRO5gh6eT9vWJ/RhPbGE59byvZEUQ4VP6XkLBaS5Jti5jpvw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/project-service@8.71.1': - resolution: {integrity: sha512-Oijc9RUsohHjncg6iGi7gCtjnEjYt9FWv9u6ygK8uKcHK5eLjLAkqERQ9BaytbpceOFdk6kifPCS/zAZE+A99g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/scope-manager@8.71.1': - resolution: {integrity: sha512-1YUDZXdTnXLlob03SFHBipdyMBsDVm7zoSz0ytTJ39dk5J1TgsTK03VlR/dLXG/RLLUrPcYbD4rp23BmHxHP0w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/tsconfig-utils@8.71.1': - resolution: {integrity: sha512-oTvkml5SxXhgg+WWKhod5qWQICDXtOB+/Hi9VdPKFAANJ2b7YOgMffgvzXuqog7R6A/JtrzRf128dsxummyWhg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/type-utils@8.71.1': - resolution: {integrity: sha512-kH3t3jZCYv2PZSBEWPKTariLrCaoF1CLoPitYFBJOhAGEwWnSRAtGEifrfrpBa4K9JlwWNZotgA5w3/wLSk/FQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/types@8.71.1': - resolution: {integrity: sha512-ybYnPTUwg3VQQOFEiBPLs8Jxl1ry2vXdn1kVKguomBbvxpetdu3MKTNDqFNUrlG8ylP9MpZosmXMFYlGQHk1oQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/typescript-estree@8.71.1': - resolution: {integrity: sha512-pSKSEK1JJpHs6KiKVtABCE4iJK5d7FLFzDXQNBQ2oRY7LEd3UwOt3TZemTgu9syTIf56dJWlTn/pdmrO9oKUXQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/utils@8.71.1': - resolution: {integrity: sha512-CBjT6gfAz3DW2j9Q4moFnqt208Aq+506sVGXfpRcyAeqn0EpayL0mjdWoCO2t3RC7GewNrFxdeehuEaPg6DMzQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - - '@typescript-eslint/visitor-keys@8.71.1': - resolution: {integrity: sha512-0GxiUGqMU0qXJt58cBsiG3DP8lUmBaFo2vChtUX+CT7PnR3v/VGLLrzVP4K9r1lNiZXjHYefMBbPunplr09v6w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@uidotdev/usehooks@2.4.1': resolution: {integrity: sha512-1I+RwWyS+kdv3Mv0Vmc+p0dPYH0DTRAo04HLyXReYBL9AeseDWUJyi4THuksBJcu9F0Pih69Ak150VDnqbVnXg==} engines: {node: '>=16'} @@ -1320,11 +1312,6 @@ packages: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-walk@8.3.4: resolution: {integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==} engines: {node: '>=0.4.0'} @@ -1345,9 +1332,6 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} - ajv@6.15.0: - resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -1370,14 +1354,6 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - aria-query@5.3.2: - resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} - engines: {node: '>= 0.4'} - - array-buffer-byte-length@1.0.2: - resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} - engines: {node: '>= 0.4'} - array-differ@3.0.0: resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} engines: {node: '>=8'} @@ -1385,26 +1361,10 @@ packages: array-ify@1.0.0: resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} - array.prototype.flat@1.3.3: - resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.3: - resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.4: - resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} - engines: {node: '>= 0.4'} - arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} @@ -1416,9 +1376,6 @@ packages: asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} @@ -1427,10 +1384,6 @@ packages: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - async-function@1.0.0: - resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} - engines: {node: '>= 0.4'} - asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1438,18 +1391,6 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - axe-core@4.10.3: - resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} - engines: {node: '>=4'} - - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} @@ -1464,11 +1405,6 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.11.25: - resolution: {integrity: sha512-gMmEShwwq7FJqMwvfRwvCl00v4kN+KOfJqXn+f4nrufak5gNHJOksd/60Dvjuz7sI8Y5WiSFBa8FEYr+zoyqCw==} - engines: {node: '>=6.0.0'} - hasBin: true - basic-ftp@5.3.1: resolution: {integrity: sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==} engines: {node: '>=10.0.0'} @@ -1502,28 +1438,16 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.29.0: - resolution: {integrity: sha512-3GSvyjvDI4Dur1Meg2BekJquu5uF+9R9a1+5M1Mde192eZoXbeXjzgOsgqPS2V8D5wrrip0gR5Hf/GhWQ9ZzaA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - cacheable@2.5.0: - resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} - call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - call-bind@1.0.8: - resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==} - engines: {node: '>= 0.4'} - call-bound@1.0.4: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} @@ -1547,9 +1471,6 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001810: - resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==} - capacitor-blob-writer@1.1.19: resolution: {integrity: sha512-2uZjL/y6F2yblA6lc5SP0JE+rQhxZcinmsLQKwGuSIDQySAdrcDkCAoQ07nqQV9qMtaeWsVTD6n08wo4R2sSjA==} peerDependencies: @@ -1720,9 +1641,6 @@ packages: convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookiejar@2.1.4: resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} @@ -1754,9 +1672,6 @@ packages: csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - dargs@7.0.0: resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} engines: {node: '>=8'} @@ -1765,18 +1680,6 @@ packages: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} - data-view-buffer@1.0.2: - resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.2: - resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.1: - resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} - engines: {node: '>= 0.4'} - dateformat@3.0.3: resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} @@ -1823,21 +1726,10 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - define-lazy-prop@2.0.0: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - degenerator@5.0.1: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} @@ -1904,9 +1796,6 @@ packages: duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} - electron-to-chromium@1.5.434: - resolution: {integrity: sha512-7EeFW9OLf1NN9NKQP9xdOE/XKqjxv7JDPP6AEAkHli11+Fae1OaLoNuAf13hQv1PPNtuES0pLQSPk2+fS3s8ww==} - elementtree@0.1.7: resolution: {integrity: sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==} engines: {node: '>= 0.4.0'} @@ -1914,9 +1803,6 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -1938,10 +1824,6 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - es-abstract@1.23.9: - resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} - engines: {node: '>= 0.4'} - es-define-property@1.0.1: resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} engines: {node: '>= 0.4'} @@ -1958,14 +1840,6 @@ packages: resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} engines: {node: '>= 0.4'} - es-shim-unscopables@1.1.0: - resolution: {integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==} - engines: {node: '>= 0.4'} - - es-to-primitive@1.3.0: - resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} - engines: {node: '>= 0.4'} - esbuild@0.27.2: resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} @@ -1988,67 +1862,11 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-plugin-jsx-a11y@6.10.2: - resolution: {integrity: sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - - eslint-plugin-react-hooks@7.1.1: - resolution: {integrity: sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0 - - eslint-plugin-react-refresh@0.5.7: - resolution: {integrity: sha512-XhJSzLljuYD4UjNuFGJu2v7aD3sqNVK12w5/DCUfrNfHWegZo2+TsavNx8MuxMwEquuFAzNbNfXKU0WoZ+YUIg==} - peerDependencies: - eslint: ^9 || ^10 - - eslint-plugin-simple-import-sort@14.0.0: - resolution: {integrity: sha512-NUJO0+XFCkk+o5EsAJruTgnfMEpeWrPWeJS15UVF60GgXmqz1BJ9/3hzlvG7lkL8Bubzos5cCLptThbFfPnSMQ==} - peerDependencies: - eslint: '>=5.0.0' - - eslint-scope@9.1.2: - resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@5.0.1: - resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - - eslint@10.12.0: - resolution: {integrity: sha512-npHjrHb2o4ehH3mE+YuxABR+0gyb0aVWCIolgJDArwCiHEIsonBm3ZKjel5b0U5+a+MbEvIyRCGCzD3eKKK2NA==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - hasBin: true - peerDependencies: - jiti: '*' - peerDependenciesMeta: - jiti: - optional: true - - espree@11.2.0: - resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} - engines: {node: ^20.19.0 || ^22.13.0 || >=24} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - esquery@1.7.0: - resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -2072,19 +1890,10 @@ packages: resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} engines: {node: '>=4'} - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} @@ -2110,9 +1919,6 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} - file-entry-cache@11.1.5: - resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -2128,24 +1934,10 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - findup-sync@5.0.0: resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} engines: {node: '>= 10.13.0'} - flat-cache@6.1.23: - resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} - - flatted@3.4.4: - resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} - - for-each@0.3.5: - resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} - engines: {node: '>= 0.4'} - form-data@4.0.6: resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==} engines: {node: '>= 6'} @@ -2177,17 +1969,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - function.prototype.name@1.1.8: - resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - get-blob-duration@1.2.0: resolution: {integrity: sha512-2xNJa+oKznR21eC2ThMzw4a1931a3ogA8aHoY92xruZufc/02G7pl/P793GJZytkyI8xMJ2DepEQ7MWvg/tn/Q==} @@ -2212,10 +1993,6 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} - get-symbol-description@1.1.0: - resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} - engines: {node: '>= 0.4'} - get-uri@6.0.4: resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} engines: {node: '>= 14'} @@ -2243,10 +2020,6 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - glob@13.0.6: resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} engines: {node: 18 || 20 || >=22} @@ -2272,14 +2045,6 @@ packages: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} - globals@17.13.0: - resolution: {integrity: sha512-RwMTC61u7hrG3ZJMkZQOK4JLJrKS8QtoTii63EmWvFXHqycY9FObBJQCbsLxSO8kjKhWE5kV1GC+Vb1g3RI0Zg==} - engines: {node: '>=18'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -2304,10 +2069,6 @@ packages: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} - has-bigints@1.1.0: - resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} - engines: {node: '>= 0.4'} - has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -2316,13 +2077,6 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.2.0: - resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==} - engines: {node: '>= 0.4'} - has-symbols@1.1.0: resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} engines: {node: '>= 0.4'} @@ -2331,10 +2085,6 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hashery@1.5.1: - resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} - engines: {node: '>=20'} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -2347,12 +2097,6 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - hermes-estree@0.25.1: - resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} - - hermes-parser@0.25.1: - resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} - hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -2360,12 +2104,6 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} - hookified@1.15.1: - resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} - - hookified@2.2.0: - resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} - hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -2396,10 +2134,6 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.8: - resolution: {integrity: sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==} - engines: {node: '>= 4'} - import-fresh@3.3.1: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} @@ -2434,49 +2168,17 @@ packages: resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} engines: {node: '>=8.0.0'} - internal-slot@1.1.0: - resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} - engines: {node: '>= 0.4'} - ip-address@10.7.3: resolution: {integrity: sha512-A1kdq/tSb5QjvKvAMgIoEvDBIgL7qaqVP/jkvSwYYRZ9iEzvPpopxp2wQfu3SuZRHtpHNxMn8Fs0bS+gf5Xmwg==} engines: {node: '>= 12'} - is-array-buffer@3.0.5: - resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} - engines: {node: '>= 0.4'} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-async-function@2.1.1: - resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} - engines: {node: '>= 0.4'} - - is-bigint@1.1.0: - resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} - engines: {node: '>= 0.4'} - - is-boolean-object@1.2.2: - resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} - engines: {node: '>= 0.4'} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} - is-data-view@1.0.2: - resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==} - engines: {node: '>= 0.4'} - - is-date-object@1.1.0: - resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==} - engines: {node: '>= 0.4'} - is-docker@2.2.1: resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} engines: {node: '>=8'} @@ -2486,30 +2188,14 @@ packages: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} - is-finalizationregistry@1.1.1: - resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} - engines: {node: '>= 0.4'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-generator-function@1.1.0: - resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} - engines: {node: '>= 0.4'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-number-object@1.1.1: - resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} - engines: {node: '>= 0.4'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -2530,53 +2216,17 @@ packages: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} - is-regex@1.2.1: - resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.4: - resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} - engines: {node: '>= 0.4'} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} - is-string@1.1.1: - resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} - engines: {node: '>= 0.4'} - - is-symbol@1.1.1: - resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} - engines: {node: '>= 0.4'} - is-text-path@1.0.1: resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} engines: {node: '>=0.10.0'} - is-typed-array@1.1.15: - resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} - engines: {node: '>= 0.4'} - is-typedarray@1.0.0: resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.1.1: - resolution: {integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==} - engines: {node: '>= 0.4'} - - is-weakset@2.0.4: - resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==} - engines: {node: '>= 0.4'} - is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -2588,9 +2238,6 @@ packages: isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} @@ -2612,12 +2259,6 @@ packages: json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -2636,13 +2277,6 @@ packages: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} engines: {'0': node >= 0.2.0} - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - - keyv@5.6.0: - resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} - kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -2655,20 +2289,9 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - leek@0.0.24: resolution: {integrity: sha512-6PVFIYXxlYF0o6hrAsHtGpTmi06otkwNrMcmQ0K96SeSRHPREPa9J3nJZ1frliVH7XT0XFswoJFQoXsDukzGNQ==} - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - lightningcss-android-arm64@1.33.0: resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} engines: {node: '>= 12.0.0'} @@ -2754,10 +2377,6 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - lodash._baseassign@3.2.0: resolution: {integrity: sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==} @@ -2811,9 +2430,6 @@ packages: resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} engines: {node: 20 || >=22} - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -2949,9 +2565,6 @@ packages: engines: {node: '>=16.0.0'} hasBin: true - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -2974,10 +2587,6 @@ packages: node-html-parser@5.4.2: resolution: {integrity: sha512-RaBPP3+51hPne/OolXxcz89iYvQvKOydaqoePpOgXcrOKZhjVIzmpKZz+Hd/RBO2/zN2q6CNJhQzucVz+u3Jyw==} - node-releases@2.0.56: - resolution: {integrity: sha512-x0InOIyzgdk+eyaWaRJFH5snEtiImgBgblZ2CyPrLmqqcuMQkEvcDPHbzqbD8eDsSeJbVOjn+crzyzHaM4D+/A==} - engines: {node: '>=18'} - node@26.10.0: resolution: {integrity: sha512-iqvbVmkYIK5ioMlgjQim7A2MUTMqRgNrEDw6bRs0sIx2j7/R9dLC4358Eh5g8NOs4jSMtLCO+vl/+A0nO24sPA==} engines: {npm: '>=5.0.0'} @@ -3005,22 +2614,6 @@ packages: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.7: - resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.1: - resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} - engines: {node: '>= 0.4'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -3036,17 +2629,35 @@ packages: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - os-name@4.0.1: resolution: {integrity: sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==} engines: {node: '>=10'} - own-keys@1.0.1: - resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==} - engines: {node: '>= 0.4'} + oxfmt@0.72.0: + resolution: {integrity: sha512-16OQeL0uhPZbfmT9S9WWM0Nv9+BmVi8Ra1uTYaSKj/qSCs6FB30KOhz9JoNYw6thT+K5bVxsk/tSEOu497i34g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + svelte: ^5.0.0 + vite-plus: '*' + peerDependenciesMeta: + svelte: + optional: true + vite-plus: + optional: true + + oxlint@1.87.0: + resolution: {integrity: sha512-drxVlaW7Oqq7wSy1CN25znRu00aRq8n57Q2wniJRxCmtYVz07ufCm7EVDPQFZURrTgQIjzKrVEHAD/HcvJXObg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=7.0.2003' + vite-plus: '*' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + vite-plus: + optional: true p-limit@1.3.0: resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} @@ -3056,10 +2667,6 @@ packages: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} @@ -3068,10 +2675,6 @@ packages: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - p-map@4.0.0: resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} engines: {node: '>=10'} @@ -3188,18 +2791,10 @@ packages: resolution: {integrity: sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==} engines: {node: '>=10.4.0'} - possible-typed-array-names@1.1.0: - resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} - engines: {node: '>= 0.4'} - postcss@8.5.28: resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} engines: {node: ^10 || ^12 || >=14} - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -3230,10 +2825,6 @@ packages: pump@3.0.2: resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - q@1.5.1: resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} @@ -3242,10 +2833,6 @@ packages: (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) - qified@0.10.1: - resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} - engines: {node: '>=20'} - qs@6.15.3: resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} engines: {node: '>=0.6'} @@ -3309,20 +2896,12 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} - reflect.getprototypeof@1.0.10: - resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} - engines: {node: '>= 0.4'} - regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} regexp-to-ast@0.5.0: resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} - regexp.prototype.flags@1.5.4: - resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} - engines: {node: '>= 0.4'} - replace@1.2.2: resolution: {integrity: sha512-C4EDifm22XZM2b2JOYe6Mhn+lBsLBAvLbK8drfUQLTfD1KYl/n3VaW/CDju0Ny4w3xTtegBpg8YNSpFJPUDSjA==} engines: {node: '>= 6'} @@ -3398,24 +2977,12 @@ packages: resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} engines: {npm: '>=2.0.0'} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} - engines: {node: '>=0.4'} - safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-push-apply@1.0.0: - resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} - engines: {node: '>= 0.4'} - - safe-regex-test@1.1.0: - resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} - engines: {node: '>= 0.4'} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -3453,18 +3020,6 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - set-proto@1.0.0: - resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} - engines: {node: '>= 0.4'} - sharp@0.35.5: resolution: {integrity: sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==} engines: {node: '>=20.9.0'} @@ -3485,10 +3040,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - side-channel-list@1.0.1: resolution: {integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==} engines: {node: '>= 0.4'} @@ -3501,10 +3052,6 @@ packages: resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} engines: {node: '>= 0.4'} - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - side-channel@1.1.1: resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} engines: {node: '>= 0.4'} @@ -3586,22 +3133,6 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string.prototype.includes@2.0.1: - resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} - engines: {node: '>= 0.4'} - - string.prototype.trim@1.2.10: - resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.9: - resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} - engines: {node: '>= 0.4'} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -3673,6 +3204,10 @@ packages: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} + tinypool@2.2.0: + resolution: {integrity: sha512-jBrmx4lYmaC9k/mgPbylxs7kBUxHtD8256up+HjLaDFfXScKJQyil+SWXSvhAtT7XHo+yTVlpB81PGmHP8oLSQ==} + engines: {node: ^20.0.0 || >=22.0.0} + tmp@0.2.7: resolution: {integrity: sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==} engines: {node: '>=14.14'} @@ -3696,12 +3231,6 @@ packages: resolution: {integrity: sha512-rqy30BSpxPznbbTcAcci90oZ1YR4DqvKcNXNerG5gQBU2v4jk0cygheiul5J6ExIMrgDVuanv/MkGfqZbKrNNg==} engines: {node: 10.* || >= 12.*} - ts-api-utils@2.5.0: - resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} - engines: {node: '>=18.12'} - peerDependencies: - typescript: '>=4.8.4' - ts-morph@13.0.3: resolution: {integrity: sha512-pSOfUMx8Ld/WUreoSzvMFQG5i9uEiWIsBYjpU9+TTASOeUa89j5HykomeqVULm1oqWtBdleI3KEFRLrlA3zGIw==} @@ -3732,10 +3261,6 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - type-fest@0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} @@ -3756,32 +3281,9 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} - typed-array-buffer@1.0.3: - resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.3: - resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.4: - resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.7: - resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} - engines: {node: '>= 0.4'} - typedarray-to-buffer@3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - typescript-eslint@8.71.1: - resolution: {integrity: sha512-oiNVPC3/NbV1FpaHU07l8O6ynqG9v4PAiW2WvTrAmZdR0f2HI/gE668ElMLCK7Xbsu5k2fK5C4fXNiq05j7/nQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 - typescript: '>=4.8.4 <6.1.0' - typescript@6.0.3: resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} @@ -3792,10 +3294,6 @@ packages: engines: {node: '>=0.8.0'} hasBin: true - unbox-primitive@1.1.0: - resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} - engines: {node: '>= 0.4'} - undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} @@ -3811,15 +3309,6 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} - update-browserslist-db@1.3.3: - resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -3882,25 +3371,9 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} - - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} - which-typed-array@1.1.19: - resolution: {integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==} - engines: {node: '>= 0.4'} - which@1.3.1: resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} hasBin: true @@ -3914,10 +3387,6 @@ packages: resolution: {integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==} engines: {node: '>=10'} - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} @@ -3978,9 +3447,6 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -4028,19 +3494,6 @@ packages: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - zod-validation-error@4.0.2: - resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - zod: ^3.25.0 || ^4.0.0 - - zod@4.3.6: - resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} - snapshots: '@babel/code-frame@7.26.2': @@ -4055,34 +3508,6 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/code-frame@7.29.7': - dependencies: - '@babel/helper-validator-identifier': 7.29.7 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.29.7': {} - - '@babel/core@7.29.7': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.8 - '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) - '@babel/helpers': 7.29.7 - '@babel/parser': 7.29.8 - '@babel/template': 7.29.7 - '@babel/traverse': 7.29.8 - '@babel/types': 7.29.8 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - '@babel/generator@7.27.0': dependencies: '@babel/parser': 7.29.2 @@ -4099,26 +3524,8 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@7.29.8': - dependencies: - '@babel/parser': 7.29.8 - '@babel/types': 7.29.8 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/helper-compilation-targets@7.29.7': - dependencies: - '@babel/compat-data': 7.29.7 - '@babel/helper-validator-option': 7.29.7 - browserslist: 4.29.0 - lru-cache: 5.1.1 - semver: 6.3.1 - '@babel/helper-globals@7.28.0': {} - '@babel/helper-globals@7.29.7': {} - '@babel/helper-module-imports@7.27.1': dependencies: '@babel/traverse': 7.29.0 @@ -4126,41 +3533,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.29.7': - dependencies: - '@babel/traverse': 7.29.8 - '@babel/types': 7.29.8 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-module-imports': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - '@babel/traverse': 7.29.8 - transitivePeerDependencies: - - supports-color - '@babel/helper-string-parser@7.25.9': {} '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-string-parser@7.29.7': {} - '@babel/helper-validator-identifier@7.25.9': {} '@babel/helper-validator-identifier@7.28.5': {} - '@babel/helper-validator-identifier@7.29.7': {} - - '@babel/helper-validator-option@7.29.7': {} - - '@babel/helpers@7.29.7': - dependencies: - '@babel/template': 7.29.7 - '@babel/types': 7.29.8 - '@babel/parser@7.27.0': dependencies: '@babel/types': 7.27.0 @@ -4169,10 +3549,6 @@ snapshots: dependencies: '@babel/types': 7.29.0 - '@babel/parser@7.29.8': - dependencies: - '@babel/types': 7.29.8 - '@babel/runtime@7.27.0': dependencies: regenerator-runtime: 0.14.1 @@ -4193,12 +3569,6 @@ snapshots: '@babel/parser': 7.29.2 '@babel/types': 7.29.0 - '@babel/template@7.29.7': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/parser': 7.29.8 - '@babel/types': 7.29.8 - '@babel/traverse@7.27.0': dependencies: '@babel/code-frame': 7.26.2 @@ -4223,18 +3593,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/traverse@7.29.8': - dependencies: - '@babel/code-frame': 7.29.7 - '@babel/generator': 7.29.8 - '@babel/helper-globals': 7.29.7 - '@babel/parser': 7.29.8 - '@babel/template': 7.29.7 - '@babel/types': 7.29.8 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - '@babel/types@7.27.0': dependencies: '@babel/helper-string-parser': 7.25.9 @@ -4245,23 +3603,6 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@babel/types@7.29.8': - dependencies: - '@babel/helper-string-parser': 7.29.7 - '@babel/helper-validator-identifier': 7.29.7 - - '@cacheable/memory@2.2.0': - dependencies: - '@cacheable/utils': 2.5.0 - '@keyv/bigmap': 1.3.1(keyv@5.6.0) - hookified: 1.15.1 - keyv: 5.6.0 - - '@cacheable/utils@2.5.0': - dependencies: - hashery: 1.5.1 - keyv: 5.6.0 - '@capacitor/android@8.5.2(@capacitor/core@8.5.2)': dependencies: '@capacitor/core': 8.5.2 @@ -4546,56 +3887,6 @@ snapshots: '@esbuild/win32-x64@0.27.2': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.12.0)': - dependencies: - eslint: 10.12.0 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.12.2': {} - - '@eslint/config-array@0.23.5': - dependencies: - '@eslint/object-schema': 3.0.5 - debug: 4.4.3 - minimatch: 10.2.6 - transitivePeerDependencies: - - supports-color - - '@eslint/config-helpers@0.7.0': - dependencies: - '@eslint/core': 1.2.1 - - '@eslint/core@1.2.1': - dependencies: - '@types/json-schema': 7.0.15 - - '@eslint/js@10.0.1(eslint@10.12.0)': - optionalDependencies: - eslint: 10.12.0 - - '@eslint/object-schema@3.0.5': {} - - '@eslint/plugin-kit@0.7.3': - dependencies: - '@eslint/core': 1.2.1 - levn: 0.4.1 - - '@humanfs/core@0.19.2': - dependencies: - '@humanfs/types': 0.15.0 - - '@humanfs/node@0.16.8': - dependencies: - '@humanfs/core': 0.19.2 - '@humanfs/types': 0.15.0 - '@humanwhocodes/retry': 0.4.3 - - '@humanfs/types@0.15.0': {} - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/retry@0.4.3': {} - '@hutson/parse-repository-url@3.0.2': {} '@img/colour@1.1.0': {} @@ -4907,11 +4198,6 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -4935,14 +4221,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@keyv/bigmap@1.3.1(keyv@5.6.0)': - dependencies: - hashery: 1.5.1 - hookified: 1.15.1 - keyv: 5.6.0 - - '@keyv/serialize@1.1.1': {} - '@mui/core-downloads-tracker@9.4.0': {} '@mui/icons-material@9.4.0(@mui/material@9.4.0(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.0))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@19.3.0)(react@19.3.0))(@types/react@19.3.0)(react@19.3.0))(@types/react@19.3.0)(react-dom@19.3.0(react@19.3.0))(react@19.3.0))(@types/react@19.3.0)(react@19.3.0)': @@ -5046,6 +4324,120 @@ snapshots: '@oxc-project/types@0.152.0': {} + '@oxfmt/binding-android-arm-eabi@0.72.0': + optional: true + + '@oxfmt/binding-android-arm64@0.72.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.72.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.72.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.72.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.72.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.72.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.72.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.72.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.72.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.72.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.72.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.72.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.72.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.72.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.72.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.72.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.72.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.72.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.87.0': + optional: true + + '@oxlint/binding-android-arm64@1.87.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.87.0': + optional: true + + '@oxlint/binding-darwin-x64@1.87.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.87.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.87.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.87.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.87.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.87.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.87.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.87.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.87.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.87.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.87.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.87.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.87.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.87.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.87.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.87.0': + optional: true + '@paralleldrive/cuid2@2.2.2': dependencies: '@noble/hashes': 1.8.0 @@ -5161,16 +4553,10 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@types/esrecurse@4.3.1': {} - - '@types/estree@1.0.9': {} - '@types/fs-extra@8.1.5': dependencies: '@types/node': 22.14.0 - '@types/json-schema@7.0.15': {} - '@types/minimatch@3.0.5': {} '@types/minimist@1.2.5': {} @@ -5199,97 +4585,6 @@ snapshots: '@types/slice-ansi@4.0.0': {} - '@typescript-eslint/eslint-plugin@8.71.1(@typescript-eslint/parser@8.71.1(eslint@10.12.0)(typescript@6.0.3))(eslint@10.12.0)(typescript@6.0.3)': - dependencies: - '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.71.1(eslint@10.12.0)(typescript@6.0.3) - '@typescript-eslint/scope-manager': 8.71.1 - '@typescript-eslint/type-utils': 8.71.1(eslint@10.12.0)(typescript@6.0.3) - '@typescript-eslint/utils': 8.71.1(eslint@10.12.0)(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.71.1 - eslint: 10.12.0 - ignore: 7.0.8 - natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@8.71.1(eslint@10.12.0)(typescript@6.0.3)': - dependencies: - '@typescript-eslint/scope-manager': 8.71.1 - '@typescript-eslint/types': 8.71.1 - '@typescript-eslint/typescript-estree': 8.71.1(typescript@6.0.3) - '@typescript-eslint/visitor-keys': 8.71.1 - debug: 4.4.3 - eslint: 10.12.0 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.71.1(typescript@6.0.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.71.1(typescript@6.0.3) - '@typescript-eslint/types': 8.71.1 - debug: 4.4.3 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@8.71.1': - dependencies: - '@typescript-eslint/types': 8.71.1 - '@typescript-eslint/visitor-keys': 8.71.1 - - '@typescript-eslint/tsconfig-utils@8.71.1(typescript@6.0.3)': - dependencies: - typescript: 6.0.3 - - '@typescript-eslint/type-utils@8.71.1(eslint@10.12.0)(typescript@6.0.3)': - dependencies: - '@typescript-eslint/types': 8.71.1 - '@typescript-eslint/typescript-estree': 8.71.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.71.1(eslint@10.12.0)(typescript@6.0.3) - debug: 4.4.3 - eslint: 10.12.0 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.71.1': {} - - '@typescript-eslint/typescript-estree@8.71.1(typescript@6.0.3)': - dependencies: - '@typescript-eslint/project-service': 8.71.1(typescript@6.0.3) - '@typescript-eslint/tsconfig-utils': 8.71.1(typescript@6.0.3) - '@typescript-eslint/types': 8.71.1 - '@typescript-eslint/visitor-keys': 8.71.1 - debug: 4.4.3 - minimatch: 10.2.6 - semver: 7.8.5 - tinyglobby: 0.2.17 - ts-api-utils: 2.5.0(typescript@6.0.3) - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.71.1(eslint@10.12.0)(typescript@6.0.3)': - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0) - '@typescript-eslint/scope-manager': 8.71.1 - '@typescript-eslint/types': 8.71.1 - '@typescript-eslint/typescript-estree': 8.71.1(typescript@6.0.3) - eslint: 10.12.0 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.71.1': - dependencies: - '@typescript-eslint/types': 8.71.1 - eslint-visitor-keys: 5.0.1 - '@uidotdev/usehooks@2.4.1(react-dom@19.3.0(react@19.3.0))(react@19.3.0)': dependencies: react: 19.3.0 @@ -5343,10 +4638,6 @@ snapshots: jsonparse: 1.3.1 through: 2.3.8 - acorn-jsx@5.3.2(acorn@8.18.0): - dependencies: - acorn: 8.18.0 - acorn-walk@8.3.4: dependencies: acorn: 8.18.0 @@ -5362,13 +4653,6 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 - ajv@6.15.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -5387,80 +4671,28 @@ snapshots: argparse@2.0.1: {} - aria-query@5.3.2: {} - - array-buffer-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - is-array-buffer: 3.0.5 - array-differ@3.0.0: {} array-ify@1.0.0: {} - array-includes@3.1.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - is-string: 1.1.1 - array-union@2.1.0: {} - array.prototype.flat@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-shim-unscopables: 1.1.0 - - array.prototype.flatmap@1.3.3: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-shim-unscopables: 1.1.0 - - arraybuffer.prototype.slice@1.0.4: - dependencies: - array-buffer-byte-length: 1.0.2 - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - is-array-buffer: 3.0.5 - arrify@1.0.1: {} arrify@2.0.1: {} asap@2.0.6: {} - ast-types-flow@0.0.8: {} - ast-types@0.13.4: dependencies: tslib: 2.8.1 astral-regex@2.0.0: {} - async-function@1.0.0: {} - asynckit@0.4.0: {} at-least-node@1.0.0: {} - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.1.0 - - axe-core@4.10.3: {} - - axobject-query@4.1.0: {} - babel-plugin-macros@3.1.0: dependencies: '@babel/runtime': 7.29.7 @@ -5473,8 +4705,6 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.11.25: {} - basic-ftp@5.3.1: {} big-integer@1.6.52: {} @@ -5505,14 +4735,6 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.29.0: - dependencies: - baseline-browser-mapping: 2.11.25 - caniuse-lite: 1.0.30001810 - electron-to-chromium: 1.5.434 - node-releases: 2.0.56 - update-browserslist-db: 1.3.3(browserslist@4.29.0) - buffer-crc32@0.2.13: {} buffer@6.0.3: @@ -5520,26 +4742,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - cacheable@2.5.0: - dependencies: - '@cacheable/memory': 2.2.0 - '@cacheable/utils': 2.5.0 - hookified: 1.15.1 - keyv: 5.6.0 - qified: 0.10.1 - call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 function-bind: 1.1.2 - call-bind@1.0.8: - dependencies: - call-bind-apply-helpers: 1.0.2 - es-define-property: 1.0.1 - get-intrinsic: 1.3.0 - set-function-length: 1.2.2 - call-bound@1.0.4: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5559,8 +4766,6 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001810: {} - capacitor-blob-writer@1.1.19(@capacitor/core@8.5.2)(@capacitor/filesystem@8.1.4(@capacitor/core@8.5.2)): dependencies: '@capacitor/core': 8.5.2 @@ -5755,8 +4960,6 @@ snapshots: convert-source-map@1.9.0: {} - convert-source-map@2.0.0: {} - cookiejar@2.1.4: {} core-util-is@1.0.3: {} @@ -5791,30 +4994,10 @@ snapshots: csstype@3.2.3: {} - damerau-levenshtein@1.0.8: {} - dargs@7.0.0: {} data-uri-to-buffer@6.0.2: {} - data-view-buffer@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-length@1.0.2: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - - data-view-byte-offset@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-data-view: 1.0.2 - dateformat@3.0.3: {} debug@2.6.9: @@ -5840,22 +5023,8 @@ snapshots: decamelize@1.2.0: {} - deep-is@0.1.4: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.1 - es-errors: 1.3.0 - gopd: 1.2.0 - define-lazy-prop@2.0.0: {} - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - degenerator@5.0.1: dependencies: ast-types: 0.13.4 @@ -5957,16 +5126,12 @@ snapshots: dependencies: readable-stream: 2.3.8 - electron-to-chromium@1.5.434: {} - elementtree@0.1.7: dependencies: sax: 1.1.4 emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -5983,60 +5148,6 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.23.9: - dependencies: - array-buffer-byte-length: 1.0.2 - arraybuffer.prototype.slice: 1.0.4 - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - data-view-buffer: 1.0.2 - data-view-byte-length: 1.0.2 - data-view-byte-offset: 1.0.1 - es-define-property: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - es-set-tostringtag: 2.1.0 - es-to-primitive: 1.3.0 - function.prototype.name: 1.1.8 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - get-symbol-description: 1.1.0 - globalthis: 1.0.4 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - has-proto: 1.2.0 - has-symbols: 1.1.0 - hasown: 2.0.2 - internal-slot: 1.1.0 - is-array-buffer: 3.0.5 - is-callable: 1.2.7 - is-data-view: 1.0.2 - is-regex: 1.2.1 - is-shared-array-buffer: 1.0.4 - is-string: 1.1.1 - is-typed-array: 1.1.15 - is-weakref: 1.1.1 - math-intrinsics: 1.1.0 - object-inspect: 1.13.4 - object-keys: 1.1.1 - object.assign: 4.1.7 - own-keys: 1.0.1 - regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 - safe-push-apply: 1.0.0 - safe-regex-test: 1.1.0 - set-proto: 1.0.0 - string.prototype.trim: 1.2.10 - string.prototype.trimend: 1.0.9 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.3 - typed-array-byte-length: 1.0.3 - typed-array-byte-offset: 1.0.4 - typed-array-length: 1.0.7 - unbox-primitive: 1.1.0 - which-typed-array: 1.1.19 - es-define-property@1.0.1: {} es-errors@1.3.0: {} @@ -6052,16 +5163,6 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 - es-shim-unscopables@1.1.0: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.3.0: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.1.0 - is-symbol: 1.1.1 - esbuild@0.27.2: optionalDependencies: '@esbuild/aix-ppc64': 0.27.2 @@ -6106,106 +5207,8 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-plugin-jsx-a11y@6.10.2(eslint@10.12.0): - dependencies: - aria-query: 5.3.2 - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.3 - ast-types-flow: 0.0.8 - axe-core: 4.10.3 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - eslint: 10.12.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 10.2.6 - object.fromentries: 2.0.8 - safe-regex-test: 1.1.0 - string.prototype.includes: 2.0.1 - - eslint-plugin-react-hooks@7.1.1(eslint@10.12.0): - dependencies: - '@babel/core': 7.29.7 - '@babel/parser': 7.29.2 - eslint: 10.12.0 - hermes-parser: 0.25.1 - zod: 4.3.6 - zod-validation-error: 4.0.2(zod@4.3.6) - transitivePeerDependencies: - - supports-color - - eslint-plugin-react-refresh@0.5.7(eslint@10.12.0): - dependencies: - eslint: 10.12.0 - - eslint-plugin-simple-import-sort@14.0.0(eslint@10.12.0): - dependencies: - eslint: 10.12.0 - - eslint-scope@9.1.2: - dependencies: - '@types/esrecurse': 4.3.1 - '@types/estree': 1.0.9 - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint-visitor-keys@5.0.1: {} - - eslint@10.12.0: - dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0) - '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.23.5 - '@eslint/config-helpers': 0.7.0 - '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.3 - '@humanfs/node': 0.16.8 - '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.3 - '@types/estree': 1.0.9 - ajv: 6.15.0 - cross-spawn: 7.0.6 - debug: 4.4.3 - escape-string-regexp: 4.0.0 - eslint-scope: 9.1.2 - eslint-visitor-keys: 5.0.1 - espree: 11.2.0 - esquery: 1.7.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 11.1.5 - find-up: 5.0.0 - glob-parent: 6.0.2 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - json-stable-stringify-without-jsonify: 1.0.1 - minimatch: 10.2.6 - natural-compare: 1.4.0 - optionator: 0.9.4 - transitivePeerDependencies: - - supports-color - - espree@11.2.0: - dependencies: - acorn: 8.18.0 - acorn-jsx: 5.3.2(acorn@8.18.0) - eslint-visitor-keys: 5.0.1 - esprima@4.0.1: {} - esquery@1.7.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - estraverse@5.3.0: {} estree-walker@2.0.2: {} @@ -6234,8 +5237,6 @@ snapshots: iconv-lite: 0.4.24 tmp: 0.2.7 - fast-deep-equal@3.1.3: {} - fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -6244,10 +5245,6 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - fast-safe-stringify@2.1.1: {} fastq@1.19.1: @@ -6268,10 +5265,6 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - file-entry-cache@11.1.5: - dependencies: - flat-cache: 6.1.23 - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -6287,11 +5280,6 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - findup-sync@5.0.0: dependencies: detect-file: 1.0.0 @@ -6299,18 +5287,6 @@ snapshots: micromatch: 4.0.8 resolve-dir: 1.0.1 - flat-cache@6.1.23: - dependencies: - cacheable: 2.5.0 - flatted: 3.4.4 - hookified: 1.15.1 - - flatted@3.4.4: {} - - for-each@0.3.5: - dependencies: - is-callable: 1.2.7 - form-data@4.0.6: dependencies: asynckit: 0.4.0 @@ -6351,19 +5327,6 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.8: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - functions-have-names: 1.2.3 - hasown: 2.0.2 - is-callable: 1.2.7 - - functions-have-names@1.2.3: {} - - gensync@1.0.0-beta.2: {} - get-blob-duration@1.2.0: dependencies: '@babel/runtime': 7.29.7 @@ -6399,12 +5362,6 @@ snapshots: dependencies: pump: 3.0.2 - get-symbol-description@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - get-uri@6.0.4: dependencies: basic-ftp: 5.3.1 @@ -6439,10 +5396,6 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - glob@13.0.6: dependencies: minimatch: 10.2.6 @@ -6481,13 +5434,6 @@ snapshots: globals@11.12.0: {} - globals@17.13.0: {} - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.2.0 - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -6516,30 +5462,16 @@ snapshots: hard-rejection@2.1.0: {} - has-bigints@1.1.0: {} - has-flag@3.0.0: {} has-flag@4.0.0: {} - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.1 - - has-proto@1.2.0: - dependencies: - dunder-proto: 1.0.1 - has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: has-symbols: 1.1.0 - hashery@1.5.1: - dependencies: - hookified: 1.15.1 - hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -6550,12 +5482,6 @@ snapshots: he@1.2.0: {} - hermes-estree@0.25.1: {} - - hermes-parser@0.25.1: - dependencies: - hermes-estree: 0.25.1 - hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 @@ -6564,10 +5490,6 @@ snapshots: dependencies: parse-passwd: 1.0.0 - hookified@1.15.1: {} - - hookified@2.2.0: {} - hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: @@ -6598,8 +5520,6 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.8: {} - import-fresh@3.3.1: dependencies: parent-module: 1.0.1 @@ -6638,84 +5558,24 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 - internal-slot@1.1.0: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.1.0 - ip-address@10.7.3: {} - is-array-buffer@3.0.5: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-arrayish@0.2.1: {} - is-async-function@2.1.1: - dependencies: - async-function: 1.0.0 - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - - is-bigint@1.1.0: - dependencies: - has-bigints: 1.1.0 - - is-boolean-object@1.2.2: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-callable@1.2.7: {} - is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-data-view@1.0.2: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-typed-array: 1.1.15 - - is-date-object@1.1.0: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-docker@2.2.1: {} is-extglob@2.1.1: {} - is-finalizationregistry@1.1.1: - dependencies: - call-bound: 1.0.4 - is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.0: - dependencies: - call-bound: 1.0.4 - get-proto: 1.0.1 - has-tostringtag: 1.0.2 - safe-regex-test: 1.1.0 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 - is-map@2.0.3: {} - - is-number-object@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - is-number@7.0.0: {} is-obj@2.0.0: {} @@ -6726,53 +5586,14 @@ snapshots: is-plain-obj@1.1.0: {} - is-regex@1.2.1: - dependencies: - call-bound: 1.0.4 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.4: - dependencies: - call-bound: 1.0.4 - is-stream@2.0.1: {} - is-string@1.1.1: - dependencies: - call-bound: 1.0.4 - has-tostringtag: 1.0.2 - - is-symbol@1.1.1: - dependencies: - call-bound: 1.0.4 - has-symbols: 1.1.0 - safe-regex-test: 1.1.0 - is-text-path@1.0.1: dependencies: text-extensions: 1.9.0 - is-typed-array@1.1.15: - dependencies: - which-typed-array: 1.1.19 - is-typedarray@1.0.0: {} - is-weakmap@2.0.2: {} - - is-weakref@1.1.1: - dependencies: - call-bound: 1.0.4 - - is-weakset@2.0.4: - dependencies: - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - is-windows@1.0.2: {} is-wsl@2.2.0: @@ -6781,8 +5602,6 @@ snapshots: isarray@1.0.0: {} - isarray@2.0.5: {} - isexe@2.0.0: {} js-tokens@4.0.0: {} @@ -6797,10 +5616,6 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-schema-traverse@0.4.1: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - json-stringify-safe@5.0.1: {} json5@2.2.3: {} @@ -6819,29 +5634,12 @@ snapshots: jsonparse@1.3.1: {} - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.8 - array.prototype.flat: 1.3.3 - object.assign: 4.1.7 - object.values: 1.2.1 - - keyv@5.6.0: - dependencies: - '@keyv/serialize': 1.1.1 - kind-of@6.0.3: {} kleur@3.0.3: {} kleur@4.1.5: {} - language-subtag-registry@0.3.23: {} - - language-tags@1.0.9: - dependencies: - language-subtag-registry: 0.3.23 - leek@0.0.24: dependencies: debug: 2.6.9 @@ -6850,11 +5648,6 @@ snapshots: transitivePeerDependencies: - supports-color - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - lightningcss-android-arm64@1.33.0: optional: true @@ -6922,10 +5715,6 @@ snapshots: dependencies: p-locate: 4.1.0 - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - lodash._baseassign@3.2.0: dependencies: lodash._basecopy: 3.0.1 @@ -6977,10 +5766,6 @@ snapshots: lru-cache@11.5.2: {} - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - lru-cache@6.0.0: dependencies: yallist: 4.0.0 @@ -7106,8 +5891,6 @@ snapshots: transitivePeerDependencies: - supports-color - natural-compare@1.4.0: {} - neo-async@2.6.2: {} netmask@2.0.2: {} @@ -7123,8 +5906,6 @@ snapshots: css-select: 4.3.0 he: 1.2.0 - node-releases@2.0.56: {} - node@26.10.0: dependencies: node-bin-setup: 1.1.4 @@ -7155,31 +5936,6 @@ snapshots: object-inspect@1.13.4: {} - object-keys@1.1.1: {} - - object.assign@4.1.7: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - has-symbols: 1.1.0 - object-keys: 1.1.1 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-object-atoms: 1.1.1 - - object.values@1.2.1: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -7199,25 +5955,56 @@ snapshots: is-docker: 2.2.1 is-wsl: 2.2.0 - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - os-name@4.0.1: dependencies: macos-release: 2.5.1 windows-release: 4.0.0 - own-keys@1.0.1: + oxfmt@0.72.0: dependencies: - get-intrinsic: 1.3.0 - object-keys: 1.1.1 - safe-push-apply: 1.0.0 + tinypool: 2.2.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.72.0 + '@oxfmt/binding-android-arm64': 0.72.0 + '@oxfmt/binding-darwin-arm64': 0.72.0 + '@oxfmt/binding-darwin-x64': 0.72.0 + '@oxfmt/binding-freebsd-x64': 0.72.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.72.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.72.0 + '@oxfmt/binding-linux-arm64-gnu': 0.72.0 + '@oxfmt/binding-linux-arm64-musl': 0.72.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.72.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.72.0 + '@oxfmt/binding-linux-riscv64-musl': 0.72.0 + '@oxfmt/binding-linux-s390x-gnu': 0.72.0 + '@oxfmt/binding-linux-x64-gnu': 0.72.0 + '@oxfmt/binding-linux-x64-musl': 0.72.0 + '@oxfmt/binding-openharmony-arm64': 0.72.0 + '@oxfmt/binding-win32-arm64-msvc': 0.72.0 + '@oxfmt/binding-win32-ia32-msvc': 0.72.0 + '@oxfmt/binding-win32-x64-msvc': 0.72.0 + + oxlint@1.87.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.87.0 + '@oxlint/binding-android-arm64': 1.87.0 + '@oxlint/binding-darwin-arm64': 1.87.0 + '@oxlint/binding-darwin-x64': 1.87.0 + '@oxlint/binding-freebsd-x64': 1.87.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.87.0 + '@oxlint/binding-linux-arm-musleabihf': 1.87.0 + '@oxlint/binding-linux-arm64-gnu': 1.87.0 + '@oxlint/binding-linux-arm64-musl': 1.87.0 + '@oxlint/binding-linux-ppc64-gnu': 1.87.0 + '@oxlint/binding-linux-riscv64-gnu': 1.87.0 + '@oxlint/binding-linux-riscv64-musl': 1.87.0 + '@oxlint/binding-linux-s390x-gnu': 1.87.0 + '@oxlint/binding-linux-x64-gnu': 1.87.0 + '@oxlint/binding-linux-x64-musl': 1.87.0 + '@oxlint/binding-openharmony-arm64': 1.87.0 + '@oxlint/binding-win32-arm64-msvc': 1.87.0 + '@oxlint/binding-win32-ia32-msvc': 1.87.0 + '@oxlint/binding-win32-x64-msvc': 1.87.0 p-limit@1.3.0: dependencies: @@ -7227,10 +6014,6 @@ snapshots: dependencies: p-try: 2.2.0 - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - p-locate@2.0.0: dependencies: p-limit: 1.3.0 @@ -7239,10 +6022,6 @@ snapshots: dependencies: p-limit: 2.3.0 - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - p-map@4.0.0: dependencies: aggregate-error: 3.1.0 @@ -7345,16 +6124,12 @@ snapshots: base64-js: 1.5.1 xmlbuilder: 15.1.1 - possible-typed-array-names@1.1.0: {} - postcss@8.5.28: dependencies: nanoid: 3.3.18 picocolors: 1.1.1 source-map-js: 1.2.2 - prelude-ls@1.2.1: {} - prettier@2.8.8: {} prettier@3.9.9: {} @@ -7392,14 +6167,8 @@ snapshots: end-of-stream: 1.4.4 once: 1.4.0 - punycode@2.3.1: {} - q@1.5.1: {} - qified@0.10.1: - dependencies: - hookified: 2.2.0 - qs@6.15.3: dependencies: es-define-property: 1.0.1 @@ -7478,30 +6247,10 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 - reflect.getprototypeof@1.0.10: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - get-intrinsic: 1.3.0 - get-proto: 1.0.1 - which-builtin-type: 1.2.1 - regenerator-runtime@0.14.1: {} regexp-to-ast@0.5.0: {} - regexp.prototype.flags@1.5.4: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-errors: 1.3.0 - get-proto: 1.0.1 - gopd: 1.2.0 - set-function-name: 2.0.2 - replace@1.2.2: dependencies: chalk: 2.4.2 @@ -7582,29 +6331,10 @@ snapshots: dependencies: tslib: 1.14.1 - safe-array-concat@1.1.3: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - get-intrinsic: 1.3.0 - has-symbols: 1.1.0 - isarray: 2.0.5 - safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: - dependencies: - es-errors: 1.3.0 - isarray: 2.0.5 - - safe-regex-test@1.1.0: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-regex: 1.2.1 - safer-buffer@2.1.2: {} sax@1.1.4: {} @@ -7625,28 +6355,6 @@ snapshots: set-blocking@2.0.0: {} - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.3.0 - gopd: 1.2.0 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - set-proto@1.0.0: - dependencies: - dunder-proto: 1.0.1 - es-errors: 1.3.0 - es-object-atoms: 1.1.1 - sharp@0.35.5(@types/node@22.14.0): dependencies: '@img/colour': 1.1.0 @@ -7694,11 +6402,6 @@ snapshots: shebang-regex@3.0.0: {} - side-channel-list@1.0.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 @@ -7719,14 +6422,6 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.0: - dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - side-channel@1.1.1: dependencies: es-errors: 1.3.0 @@ -7813,35 +6508,6 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string.prototype.includes@2.0.1: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-abstract: 1.23.9 - - string.prototype.trim@1.2.10: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-data-property: 1.1.4 - define-properties: 1.2.1 - es-abstract: 1.23.9 - es-object-atoms: 1.1.1 - has-property-descriptors: 1.0.2 - - string.prototype.trimend@1.0.9: - dependencies: - call-bind: 1.0.8 - call-bound: 1.0.4 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.8 - define-properties: 1.2.1 - es-object-atoms: 1.1.1 - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -7924,6 +6590,8 @@ snapshots: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 + tinypool@2.2.0: {} + tmp@0.2.7: {} to-regex-range@5.0.1: @@ -7938,10 +6606,6 @@ snapshots: true-myth@4.1.1: {} - ts-api-utils@2.5.0(typescript@6.0.3): - dependencies: - typescript: 6.0.3 - ts-morph@13.0.3: dependencies: '@ts-morph/common': 0.12.3 @@ -7980,10 +6644,6 @@ snapshots: tslib@2.8.1: {} - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - type-fest@0.16.0: {} type-fest@0.18.1: {} @@ -7994,66 +6654,15 @@ snapshots: type-fest@0.8.1: {} - typed-array-buffer@1.0.3: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - is-typed-array: 1.1.15 - - typed-array-byte-length@1.0.3: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - - typed-array-byte-offset@1.0.4: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - has-proto: 1.2.0 - is-typed-array: 1.1.15 - reflect.getprototypeof: 1.0.10 - - typed-array-length@1.0.7: - dependencies: - call-bind: 1.0.8 - for-each: 0.3.5 - gopd: 1.2.0 - is-typed-array: 1.1.15 - possible-typed-array-names: 1.1.0 - reflect.getprototypeof: 1.0.10 - typedarray-to-buffer@3.1.5: dependencies: is-typedarray: 1.0.0 - typescript-eslint@8.71.1(eslint@10.12.0)(typescript@6.0.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.71.1(@typescript-eslint/parser@8.71.1(eslint@10.12.0)(typescript@6.0.3))(eslint@10.12.0)(typescript@6.0.3) - '@typescript-eslint/parser': 8.71.1(eslint@10.12.0)(typescript@6.0.3) - '@typescript-eslint/typescript-estree': 8.71.1(typescript@6.0.3) - '@typescript-eslint/utils': 8.71.1(eslint@10.12.0)(typescript@6.0.3) - eslint: 10.12.0 - typescript: 6.0.3 - transitivePeerDependencies: - - supports-color - typescript@6.0.3: {} uglify-js@3.19.3: optional: true - unbox-primitive@1.1.0: - dependencies: - call-bound: 1.0.4 - has-bigints: 1.1.0 - has-symbols: 1.1.0 - which-boxed-primitive: 1.1.1 - undici-types@6.21.0: {} unique-string@2.0.0: @@ -8064,16 +6673,6 @@ snapshots: untildify@4.0.0: {} - update-browserslist-db@1.3.3(browserslist@4.29.0): - dependencies: - browserslist: 4.29.0 - escalade: 3.2.0 - picocolors: 1.1.1 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - util-deprecate@1.0.2: {} uuid@14.0.2: {} @@ -8105,49 +6704,8 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.1.1: - dependencies: - is-bigint: 1.1.0 - is-boolean-object: 1.2.2 - is-number-object: 1.1.1 - is-string: 1.1.1 - is-symbol: 1.1.1 - - which-builtin-type@1.2.1: - dependencies: - call-bound: 1.0.4 - function.prototype.name: 1.1.8 - has-tostringtag: 1.0.2 - is-async-function: 2.1.1 - is-date-object: 1.1.0 - is-finalizationregistry: 1.1.1 - is-generator-function: 1.1.0 - is-regex: 1.2.1 - is-weakref: 1.1.1 - isarray: 2.0.5 - which-boxed-primitive: 1.1.1 - which-collection: 1.0.2 - which-typed-array: 1.1.19 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.4 - which-module@2.0.1: {} - which-typed-array@1.1.19: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.8 - call-bound: 1.0.4 - for-each: 0.3.5 - get-proto: 1.0.1 - gopd: 1.2.0 - has-tostringtag: 1.0.2 - which@1.3.1: dependencies: isexe: 2.0.0 @@ -8160,8 +6718,6 @@ snapshots: dependencies: execa: 4.1.0 - word-wrap@1.2.5: {} - wordwrap@1.0.0: {} wrap-ansi@6.2.0: @@ -8218,8 +6774,6 @@ snapshots: y18n@5.0.8: {} - yallist@3.1.1: {} - yallist@4.0.0: {} yallist@5.0.0: {} @@ -8278,11 +6832,3 @@ snapshots: fd-slicer: 1.1.0 yn@3.1.1: {} - - yocto-queue@0.1.0: {} - - zod-validation-error@4.0.2(zod@4.3.6): - dependencies: - zod: 4.3.6 - - zod@4.3.6: {} diff --git a/src/App.tsx b/src/App.tsx index 3c75c45..49030b3 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,14 +2,7 @@ import { useEffect, useState } from "react"; import { Device } from "@capacitor/device"; import { ThemeProvider } from "@emotion/react"; import styled from "@emotion/styled"; -import { - Box, - Container, - createTheme, - CssBaseline, - Stack, - Typography, -} from "@mui/material"; +import { Box, Container, createTheme, CssBaseline, Stack, Typography } from "@mui/material"; import { AlertHandler } from "./components/Common/Alert/AlertHandler"; import { Analytics } from "./components/Common/Analytics"; diff --git a/src/components/Common/Alert/AlertHandler.tsx b/src/components/Common/Alert/AlertHandler.tsx index 41e1650..0251424 100644 --- a/src/components/Common/Alert/AlertHandler.tsx +++ b/src/components/Common/Alert/AlertHandler.tsx @@ -8,7 +8,12 @@ import { useShazarrProvider } from "../../Shazarr/useShazarr"; import ApiErrorAlert from "./Alert"; export const AlertHandler = () => { - const { recordingStatus, recordingError, showInlineResult, actions: { dismissInlineResult, setOpenResultDate } } = useShazarrProvider(); + const { + recordingStatus, + recordingError, + showInlineResult, + actions: { dismissInlineResult, setOpenResultDate }, + } = useShazarrProvider(); const { isNetworkConnected } = useConfigProvider(); const { history } = useHistoryProvider(); @@ -33,9 +38,7 @@ export const AlertHandler = () => { onOpen={handleOpenResult} /> )} - {!isNetworkConnected && recordingStatus === "inactive" && ( - - )} + {!isNetworkConnected && recordingStatus === "inactive" && } {recordingError && recordingStatus === "inactive" && ( )} diff --git a/src/components/Common/Analytics/Analytics.tsx b/src/components/Common/Analytics/Analytics.tsx index 66b5332..42e6155 100644 --- a/src/components/Common/Analytics/Analytics.tsx +++ b/src/components/Common/Analytics/Analytics.tsx @@ -1,16 +1,16 @@ -import { useEffect } from 'react'; +import { useEffect } from "react"; -const WEBSITE_ID = '24631c72-dafb-4fb7-8992-8e719aec2c7a'; -const SCRIPT_URL = 'https://um.cl-st.me/x.js'; +const WEBSITE_ID = "24631c72-dafb-4fb7-8992-8e719aec2c7a"; +const SCRIPT_URL = "https://um.cl-st.me/x.js"; export function Analytics() { useEffect(() => { if (import.meta.env.DEV) return; - const script = document.createElement('script'); + const script = document.createElement("script"); script.defer = true; script.src = SCRIPT_URL; - script.setAttribute('data-website-id', WEBSITE_ID); + script.setAttribute("data-website-id", WEBSITE_ID); document.head.appendChild(script); return () => { diff --git a/src/components/Common/Analytics/index.ts b/src/components/Common/Analytics/index.ts index a32f972..3b1f650 100644 --- a/src/components/Common/Analytics/index.ts +++ b/src/components/Common/Analytics/index.ts @@ -1 +1 @@ -export { Analytics } from './Analytics'; +export { Analytics } from "./Analytics"; diff --git a/src/components/Config/Provider.tsx b/src/components/Config/Provider.tsx index cc2ed92..48b3f5c 100644 --- a/src/components/Config/Provider.tsx +++ b/src/components/Config/Provider.tsx @@ -5,7 +5,7 @@ import { Preferences } from "@capacitor/preferences"; import { SHAZARR_STORE_KEY } from "../../constant"; -import { ConfigContext, ConfigFieldsType,ConfigStoreType } from "./context"; +import { ConfigContext, ConfigFieldsType, ConfigStoreType } from "./context"; export function ConfigProvider({ children }: { children: ReactNode }) { const [config, setConfig] = useState(null); @@ -79,20 +79,13 @@ export function ConfigProvider({ children }: { children: ReactNode }) { [loadForm], ); - - async function sendNotification( - name: string, - prerelease: boolean, - apkUrl?: string, - ) { + async function sendNotification(name: string, prerelease: boolean, apkUrl?: string) { let allowed = false; - const { display: currentPerm } = - await LocalNotifications.checkPermissions(); + const { display: currentPerm } = await LocalNotifications.checkPermissions(); if (currentPerm !== "granted") { - const { display: requestStatus } = - await LocalNotifications.requestPermissions(); + const { display: requestStatus } = await LocalNotifications.requestPermissions(); if (requestStatus === "granted") { allowed = true; @@ -104,10 +97,7 @@ export function ConfigProvider({ children }: { children: ReactNode }) { if (!allowed) return; LocalNotifications.addListener("localNotificationActionPerformed", () => { - window.open( - apkUrl ?? - `https://github.com${import.meta.env.VITE_REPO_API_URL}/releases`, - ); + window.open(apkUrl ?? `https://github.com${import.meta.env.VITE_REPO_API_URL}/releases`); }); LocalNotifications.show({ notifications: [ @@ -129,26 +119,16 @@ export function ConfigProvider({ children }: { children: ReactNode }) { `https://api.github.com/repos${import.meta.env.VITE_REPO_API_URL}/releases`, ); const data = await response.json(); - const latestVersion = data[0].tag_name.substring( - 1, - data[0].tag_name.length, - ); + const latestVersion = data[0].tag_name.substring(1, data[0].tag_name.length); const currentVersion = import.meta.env.VITE_CURRENT_VERSION.substring( 1, data[0].tag_name.length, ); - if ( - latestVersion !== currentVersion && - latestVersion > currentVersion - ) { + if (latestVersion !== currentVersion && latestVersion > currentVersion) { const apkAsset = data[0].assets?.find((asset: { name: string }) => asset.name.endsWith(".apk"), ); - sendNotification( - data[0].tag_name, - data[0].prerelease, - apkAsset?.browser_download_url, - ); + sendNotification(data[0].tag_name, data[0].prerelease, apkAsset?.browser_download_url); } } catch (e) { console.log("fetch github issue", e); @@ -160,9 +140,7 @@ export function ConfigProvider({ children }: { children: ReactNode }) { async function init() { const { value: store } = await Preferences.get({ key: SHAZARR_STORE_KEY }); const storeData: ConfigStoreType = - store && store !== "undefined" - ? JSON.parse(store) - : ({} as ConfigStoreType); + store && store !== "undefined" ? JSON.parse(store) : ({} as ConfigStoreType); setConfig(storeData); loadForm(storeData); } @@ -189,8 +167,5 @@ export function ConfigProvider({ children }: { children: ReactNode }) { }, }; - return ( - {children} - ); + return {children}; } - diff --git a/src/components/Config/context.ts b/src/components/Config/context.ts index a744d2c..61c908c 100644 --- a/src/components/Config/context.ts +++ b/src/components/Config/context.ts @@ -32,6 +32,4 @@ type ConfigContextType = { }; }; -export const ConfigContext = createContext( - {} as ConfigContextType, -); +export const ConfigContext = createContext({} as ConfigContextType); diff --git a/src/components/Config/errorCode.ts b/src/components/Config/errorCode.ts index 9a957c4..412b1b2 100644 --- a/src/components/Config/errorCode.ts +++ b/src/components/Config/errorCode.ts @@ -4,8 +4,7 @@ export const data = { MISSING_PERMISSION: "Access to microphone denied.", DEVICE_CANNOT_VOICE_RECORD: "This device does not allow voice recording.", NOT_SUPPORTED_OS_VERSION: "A feature seems to not being supported by OS.", - SHAZAM_API_ERROR: - "An error occured while connecting to shazam service. Try later.", + SHAZAM_API_ERROR: "An error occured while connecting to shazam service. Try later.", SHAZARR_NOT_FOUND: "Song not found. Get closer ;)", }; diff --git a/src/components/Config/index.tsx b/src/components/Config/index.tsx index 0c3b5b5..5dc2b40 100644 --- a/src/components/Config/index.tsx +++ b/src/components/Config/index.tsx @@ -33,11 +33,7 @@ const SERVICE_GROUPS = [ id: "lidarr", name: "Lidarr", icon: ( - Lidarr + Lidarr ), fields: ["lidarr_url", "lidarr_api_key"], }, @@ -110,8 +106,7 @@ export default function Config({ open, onClose }: Props) { const handleAccordionChange = (groupId: string) => { setExpanded((prev) => { - const isCurrentlyExpanded = - prev.includes(groupId); + const isCurrentlyExpanded = prev.includes(groupId); if (isCurrentlyExpanded) { return prev.filter((id) => id !== groupId); } else { @@ -130,10 +125,7 @@ export default function Config({ open, onClose }: Props) { return group.fields.some((field) => config?.[field as keyof typeof config]); }; - const renderField = ( - fieldKey: string, - fieldConfig: ConfigFieldsType[keyof ConfigFieldsType] - ) => { + const renderField = (fieldKey: string, fieldConfig: ConfigFieldsType[keyof ConfigFieldsType]) => { if (fieldConfig.type === "checkbox") { return ( - } + control={} label={fieldConfig.placeholder} /> ); @@ -220,9 +207,9 @@ export default function Config({ open, onClose }: Props) { return fieldConfig ? { key: fieldKey, config: fieldConfig } : null; }) .filter(Boolean) as Array<{ - key: string; - config: ConfigFieldsType[keyof ConfigFieldsType]; - }>; + key: string; + config: ConfigFieldsType[keyof ConfigFieldsType]; + }>; if (groupFields.length === 0) return null; @@ -253,11 +240,7 @@ export default function Config({ open, onClose }: Props) { }, }} > - + {history?.map((item, index) => ( - + ))}   - diff --git a/src/components/Shazarr/ui/InlineResultCard.tsx b/src/components/Shazarr/ui/InlineResultCard.tsx index a59cbda..2498546 100644 --- a/src/components/Shazarr/ui/InlineResultCard.tsx +++ b/src/components/Shazarr/ui/InlineResultCard.tsx @@ -1,5 +1,14 @@ import { Close, RemoveRedEye } from "@mui/icons-material"; -import { Box, ButtonBase, Card, CardActions, CardContent, CardMedia, IconButton, Typography } from "@mui/material"; +import { + Box, + ButtonBase, + Card, + CardActions, + CardContent, + CardMedia, + IconButton, + Typography, +} from "@mui/material"; import { ShazamTrack } from "shazam-api/dist/types"; import { ImageWithFallback } from "../../Common/ImageWithFallback"; @@ -16,19 +25,22 @@ export default function InlineResultCard({ track, onDismiss, onOpen }: Props) { - + - + {track.title} - {track.subtitle && <>
{track.subtitle}} + {track.subtitle && ( + <> +
+ {track.subtitle} + + )}
diff --git a/src/components/Shazarr/ui/LidarrButton.tsx b/src/components/Shazarr/ui/LidarrButton.tsx index dc8bca1..93f9ebe 100644 --- a/src/components/Shazarr/ui/LidarrButton.tsx +++ b/src/components/Shazarr/ui/LidarrButton.tsx @@ -43,7 +43,7 @@ export default function LidarrButton({ if (!apiKey) { window.open( `${url}/add/search?term=${encodeURIComponent(`${albumTitle} ${artistName}`)}`, - "_blank" + "_blank", ); return; } @@ -52,7 +52,7 @@ export default function LidarrButton({ const result = await lidarrAutoSearch(url, apiKey, albumTitle, artistName, isrc); if (result.success) { const s = result.status ?? "queued"; - switch (s){ + switch (s) { case "available": setSuccessMessage("Exists in Lidarr"); break; @@ -92,13 +92,7 @@ export default function LidarrButton({ ) } - color={ - status === "success" - ? "success" - : status === "error" - ? "warning" - : "primary" - } + color={status === "success" ? "success" : status === "error" ? "warning" : "primary"} onClick={handleClick} > {label} diff --git a/src/components/Shazarr/ui/SoulsyncButton.tsx b/src/components/Shazarr/ui/SoulsyncButton.tsx index b478091..63580dc 100644 --- a/src/components/Shazarr/ui/SoulsyncButton.tsx +++ b/src/components/Shazarr/ui/SoulsyncButton.tsx @@ -66,8 +66,8 @@ export default function SoulsyncButton({ const [dialogOpen, setDialogOpen] = useState(false); const apiKey = config?.soulsync_api_key; - const profileId = config?.soulsync_profile_id - ? parseInt(config.soulsync_profile_id, 10) + const profileId = config?.soulsync_profile_id + ? parseInt(config.soulsync_profile_id, 10) : undefined; async function handleAdd(type: "track" | "album") { @@ -79,20 +79,14 @@ export default function SoulsyncButton({ let result: SoulsyncQueueResult; if (type === "track") { - result = await soulsyncAddTrackToWishlist( - url, - trackTitle, - artistName, - apiKey, - profileId - ); + result = await soulsyncAddTrackToWishlist(url, trackTitle, artistName, apiKey, profileId); } else { result = await soulsyncAddAlbumToWishlist( url, effectiveAlbumTitle, artistName, apiKey, - profileId + profileId, ); } @@ -136,19 +130,13 @@ export default function SoulsyncButton({ ) } - color={ - status === "success" - ? "success" - : status === "error" - ? "warning" - : "primary" - } + color={status === "success" ? "success" : status === "error" ? "warning" : "primary"} onClick={handleClick} data-testid="soulsync-button" > {label} - + {apiKey && ( @@ -164,7 +152,7 @@ export default function SoulsyncButton({ )}
- + {/* Dialog to choose between Track and Album */} } onClick={handleClick} style={{ - background: - type === "SPOTIFY" - ? "#18d860" - : type === "DEEZER" - ? "#a239ff" - : "#fff", - color: - type === "DEEZER" ? "#fff" : type === "APPLE" ? "#fa586a" : "#212121", + background: type === "SPOTIFY" ? "#18d860" : type === "DEEZER" ? "#a239ff" : "#fff", + color: type === "DEEZER" ? "#fff" : type === "APPLE" ? "#fa586a" : "#212121", fontWeight: "bold", margin: "0.25rem", }} diff --git a/src/components/Shazarr/ui/TidarrButton.tsx b/src/components/Shazarr/ui/TidarrButton.tsx index a7d161d..c37ba72 100644 --- a/src/components/Shazarr/ui/TidarrButton.tsx +++ b/src/components/Shazarr/ui/TidarrButton.tsx @@ -66,10 +66,7 @@ export default function TidarrButton({ async function handleClick() { if (!apiKey) { - window.open( - `${url}/search/${encodeURIComponent(`${trackTitle} ${artistName}`)}`, - "_blank" - ); + window.open(`${url}/search/${encodeURIComponent(`${trackTitle} ${artistName}`)}`, "_blank"); return; } @@ -123,50 +120,40 @@ export default function TidarrButton({ return ( <> - - {apiKey && ( - - - window.open(`${url}/search/${encodeURIComponent(`${trackTitle} ${artistName}`)}`, "_blank")} - disabled={!isNetworkConnected} - sx={{ border: 2, borderRadius: 1 }} - > - - - - - )} + + {apiKey && ( + + + + window.open( + `${url}/search/${encodeURIComponent(`${trackTitle} ${artistName}`)}`, + "_blank", + ) + } + disabled={!isNetworkConnected} + sx={{ border: 2, borderRadius: 1 }} + > + + + + + )} - setDialogOpen(false)} - fullWidth - maxWidth="xs" - > + setDialogOpen(false)} fullWidth maxWidth="xs"> Choose an album @@ -192,10 +179,20 @@ export default function TidarrButton({ {album.title} - + {album.artists?.[0]?.name} - + {album.releaseDate?.slice(0, 4)} ยท {album.numberOfTracks} tracks @@ -215,7 +212,12 @@ export default function TidarrButton({ variant="text" startIcon={} onClick={() => handleQueue(album, "track")} - sx={{ flex: 1, borderRadius: 0, borderLeft: "1px solid", borderColor: "divider" }} + sx={{ + flex: 1, + borderRadius: 0, + borderLeft: "1px solid", + borderColor: "divider", + }} > Track @@ -224,7 +226,12 @@ export default function TidarrButton({ variant="text" color="secondary" onClick={() => handleQueue(album, "favorite")} - sx={{ borderRadius: 0, borderLeft: "1px solid", borderColor: "divider", px: 1.5 }} + sx={{ + borderRadius: 0, + borderLeft: "1px solid", + borderColor: "divider", + px: 1.5, + }} > diff --git a/src/components/Shazarr/utils.tsx b/src/components/Shazarr/utils.tsx index d2f37c2..f28fab5 100644 --- a/src/components/Shazarr/utils.tsx +++ b/src/components/Shazarr/utils.tsx @@ -1,8 +1,4 @@ -export const b64toBlob = ( - b64Data: string, - contentType = "", - sliceSize = 512, -) => { +export const b64toBlob = (b64Data: string, contentType = "", sliceSize = 512) => { const byteCharacters = atob(b64Data); const byteArrays = []; diff --git a/src/main.tsx b/src/main.tsx index 8b389bb..7ac7ae2 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -3,9 +3,7 @@ import ReactDOM from "react-dom/client"; import App from "./App"; -const root = ReactDOM.createRoot( - document.getElementById("root") as HTMLElement, -); +const root = ReactDOM.createRoot(document.getElementById("root") as HTMLElement); root.render( diff --git a/src/resources/favicon/manifest.json b/src/resources/favicon/manifest.json index 94693da..76d5064 100644 --- a/src/resources/favicon/manifest.json +++ b/src/resources/favicon/manifest.json @@ -1,21 +1,21 @@ { - "name": "Shazarr", - "short_name": "Shazarr", - "scope": "/", - "start_url": "/", - "icons": [ - { - "src": "/favicon/android-chrome-192x192.png", - "sizes": "192x192", - "type": "image/png" - }, - { - "src": "/favicon/android-chrome-512x512.png", - "sizes": "512x512", - "type": "image/png" - } - ], - "theme_color": "#000000", - "background_color": "#000000", - "display": "standalone" + "name": "Shazarr", + "short_name": "Shazarr", + "scope": "/", + "start_url": "/", + "icons": [ + { + "src": "/favicon/android-chrome-192x192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "/favicon/android-chrome-512x512.png", + "sizes": "512x512", + "type": "image/png" + } + ], + "theme_color": "#000000", + "background_color": "#000000", + "display": "standalone" } diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 1afd3c4..a378631 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -1,4 +1,4 @@ /// interface ImportMeta { readonly env: Record; -} \ No newline at end of file +} diff --git a/testing/tests/critical.spec.ts b/testing/tests/critical.spec.ts index f349270..84702bd 100644 --- a/testing/tests/critical.spec.ts +++ b/testing/tests/critical.spec.ts @@ -1,16 +1,12 @@ import test, { expect } from "@playwright/test"; -test("Critical: Should be able to record, recognize and display result", async ({ - page, -}) => { +test("Critical: Should be able to record, recognize and display result", async ({ page }) => { page.goto("/"); // Home testing await expect(page.getByText("Shazarr")).toBeVisible(); await expect(page.getByText("Offroad")).toBeVisible(); await expect(page.getByText("Ready")).toBeVisible(); - await expect( - page.getByRole("button", { name: "Configuration" }), - ).toBeVisible(); + await expect(page.getByRole("button", { name: "Configuration" })).toBeVisible(); await expect(page).toHaveScreenshot(); // Run song recognition @@ -34,21 +30,20 @@ test("Critical: Should be able to record, recognize and display result", async ( await expect(page).toHaveScreenshot(); // Dismiss inline card (close button, NOT delete from history) - await page.getByTestId("inline-result-card").getByRole("button", { name: "Dismiss result" }).click(); + await page + .getByTestId("inline-result-card") + .getByRole("button", { name: "Dismiss result" }) + .click(); await expect(page.getByTestId("inline-result-card")).not.toBeVisible(); // Expect to be on main screen with Records button visible await expect(page.getByText("Ready")).toBeVisible(); - await expect( - page.getByRole("button", { name: "Records" }), - ).toBeVisible(); + await expect(page.getByRole("button", { name: "Records" })).toBeVisible(); // Open history drawer await page.getByRole("button", { name: "Records" }).click(); await expect(page.getByTestId("history-item")).toBeVisible(); - await expect(page.getByTestId("history-item")).toContainText( - "Chillin' - Modjo", - ); + await expect(page.getByTestId("history-item")).toContainText("Chillin' - Modjo"); // Click history item to open Result drawer await page.getByTestId("history-item").getByRole("button").first().click(); diff --git a/testing/tests/fixtures/history.json b/testing/tests/fixtures/history.json index 1509859..393ddef 100644 --- a/testing/tests/fixtures/history.json +++ b/testing/tests/fixtures/history.json @@ -1,566 +1,566 @@ [ - { - "title": "Chillin'", - "artist": "Modjo", - "date": 1715939118463, - "data": { - "layout": "5", - "type": "MUSIC", - "key": "5748248", - "title": "Chillin'", - "subtitle": "Modjo", + { + "title": "Chillin'", + "artist": "Modjo", + "date": 1715939118463, + "data": { + "layout": "5", + "type": "MUSIC", + "key": "5748248", + "title": "Chillin'", + "subtitle": "Modjo", + "images": { + "background": "https://is1-ssl.mzstatic.com/image/thumb/Features115/v4/a7/2e/3f/a72e3fa5-1a8f-f1c3-4691-2f42206000a2/pr_source.png/800x800cc.jpg", + "coverart": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/f5/25/2b/f5252b6e-0659-890b-7e9d-0e691944b95b/cover.jpg/400x400cc.jpg", + "coverarthq": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/f5/25/2b/f5252b6e-0659-890b-7e9d-0e691944b95b/cover.jpg/400x400cc.jpg", + "joecolor": "b:1c211dp:fefefcs:90b0e3t:d1d2cfq:7993bb" + }, + "share": { + "subject": "Chillin' - Modjo", + "text": "Chillin' by Modjo", + "href": "https://www.shazam.com/track/5748248/chillin", + "image": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/f5/25/2b/f5252b6e-0659-890b-7e9d-0e691944b95b/cover.jpg/400x400cc.jpg", + "twitter": "I used @Shazam to discover Chillin' by Modjo.", + "html": "https://www.shazam.com/snippets/email-share/5748248?lang=en&country=US", + "avatar": "https://is1-ssl.mzstatic.com/image/thumb/Features115/v4/a7/2e/3f/a72e3fa5-1a8f-f1c3-4691-2f42206000a2/pr_source.png/800x800cc.jpg", + "snapchat": "https://www.shazam.com/partner/sc/track/5748248" + }, + "hub": { + "type": "APPLEMUSIC", + "image": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic_{scalefactor}.png", + "actions": [ + { + "name": "apple", + "type": "applemusicplay", + "id": "692624263" + }, + { + "name": "apple", + "type": "uri", + "uri": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview122/v4/3d/91/96/3d919613-1c6c-e350-34c5-dcb5acbbef69/mzaf_1715107421462239116.plus.aac.ep.m4a" + } + ], + "options": [ + { + "caption": "OPEN IN", + "actions": [ + { + "name": "hub:applemusic:deeplink", + "type": "applemusicopen", + "uri": "https://music.apple.com/us/album/chillin/692624255?i=692624263&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" + }, + { + "name": "hub:applemusic:deeplink", + "type": "uri", + "uri": "https://music.apple.com/us/album/chillin/692624255?i=692624263&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" + } + ], + "beacondata": { + "type": "open", + "providername": "applemusic" + }, + "image": "https://images.shazam.com/static/icons/hub/ios/v5/overflow-open-option_{scalefactor}.png", + "type": "open", + "listcaption": "Open in Apple Music", + "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic-overflow_{scalefactor}.png", + "colouroverflowimage": false, + "providername": "applemusic" + }, + { + "caption": "BUY", + "actions": [ + { + "type": "uri", + "uri": "https://itunes.apple.com/us/album/chillin/692624255?i=692624263&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=itunes&itsct=Shazam_ios" + } + ], + "beacondata": { + "type": "buy", + "providername": "itunes" + }, + "image": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", + "type": "buy", + "listcaption": "Buy on iTunes", + "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", + "colouroverflowimage": false, + "providername": "itunes" + } + ], + "providers": [ + { + "caption": "Open in Spotify", "images": { - "background": "https://is1-ssl.mzstatic.com/image/thumb/Features115/v4/a7/2e/3f/a72e3fa5-1a8f-f1c3-4691-2f42206000a2/pr_source.png/800x800cc.jpg", - "coverart": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/f5/25/2b/f5252b6e-0659-890b-7e9d-0e691944b95b/cover.jpg/400x400cc.jpg", - "coverarthq": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/f5/25/2b/f5252b6e-0659-890b-7e9d-0e691944b95b/cover.jpg/400x400cc.jpg", - "joecolor": "b:1c211dp:fefefcs:90b0e3t:d1d2cfq:7993bb" + "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/spotify-overflow_{scalefactor}.png", + "default": "https://images.shazam.com/static/icons/hub/ios/v5/spotify_{scalefactor}.png" }, - "share": { - "subject": "Chillin' - Modjo", - "text": "Chillin' by Modjo", - "href": "https://www.shazam.com/track/5748248/chillin", - "image": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/f5/25/2b/f5252b6e-0659-890b-7e9d-0e691944b95b/cover.jpg/400x400cc.jpg", - "twitter": "I used @Shazam to discover Chillin' by Modjo.", - "html": "https://www.shazam.com/snippets/email-share/5748248?lang=en&country=US", - "avatar": "https://is1-ssl.mzstatic.com/image/thumb/Features115/v4/a7/2e/3f/a72e3fa5-1a8f-f1c3-4691-2f42206000a2/pr_source.png/800x800cc.jpg", - "snapchat": "https://www.shazam.com/partner/sc/track/5748248" - }, - "hub": { - "type": "APPLEMUSIC", - "image": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic_{scalefactor}.png", - "actions": [ - { - "name": "apple", - "type": "applemusicplay", - "id": "692624263" - }, - { - "name": "apple", - "type": "uri", - "uri": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview122/v4/3d/91/96/3d919613-1c6c-e350-34c5-dcb5acbbef69/mzaf_1715107421462239116.plus.aac.ep.m4a" - } - ], - "options": [ - { - "caption": "OPEN IN", - "actions": [ - { - "name": "hub:applemusic:deeplink", - "type": "applemusicopen", - "uri": "https://music.apple.com/us/album/chillin/692624255?i=692624263&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" - }, - { - "name": "hub:applemusic:deeplink", - "type": "uri", - "uri": "https://music.apple.com/us/album/chillin/692624255?i=692624263&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" - } - ], - "beacondata": { - "type": "open", - "providername": "applemusic" - }, - "image": "https://images.shazam.com/static/icons/hub/ios/v5/overflow-open-option_{scalefactor}.png", - "type": "open", - "listcaption": "Open in Apple Music", - "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic-overflow_{scalefactor}.png", - "colouroverflowimage": false, - "providername": "applemusic" - }, - { - "caption": "BUY", - "actions": [ - { - "type": "uri", - "uri": "https://itunes.apple.com/us/album/chillin/692624255?i=692624263&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=itunes&itsct=Shazam_ios" - } - ], - "beacondata": { - "type": "buy", - "providername": "itunes" - }, - "image": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", - "type": "buy", - "listcaption": "Buy on iTunes", - "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", - "colouroverflowimage": false, - "providername": "itunes" - } - ], - "providers": [ - { - "caption": "Open in Spotify", - "images": { - "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/spotify-overflow_{scalefactor}.png", - "default": "https://images.shazam.com/static/icons/hub/ios/v5/spotify_{scalefactor}.png" - }, - "actions": [ - { - "name": "hub:spotify:searchdeeplink", - "type": "uri", - "uri": "spotify:search:Chillin%27%20Modjo" - } - ], - "type": "SPOTIFY" - }, - { - "caption": "Open in Deezer", - "images": { - "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/deezer-overflow_{scalefactor}.png", - "default": "https://images.shazam.com/static/icons/hub/ios/v5/deezer_{scalefactor}.png" - }, - "actions": [ - { - "name": "hub:deezer:searchdeeplink", - "type": "uri", - "uri": "deezer-query://www.deezer.com/play?query=%7Btrack%3A%27Chillin%5C%27%27%20artist%3A%27Modjo%27%7D" - } - ], - "type": "DEEZER" - } - ], - "explicit": false, - "displayname": "APPLE MUSIC" - }, - "sections": [ - { - "type": "SONG", - "metapages": [ - { - "image": "https://is1-ssl.mzstatic.com/image/thumb/Features115/v4/a7/2e/3f/a72e3fa5-1a8f-f1c3-4691-2f42206000a2/pr_source.png/800x800cc.jpg", - "caption": "Modjo" - }, - { - "image": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/f5/25/2b/f5252b6e-0659-890b-7e9d-0e691944b95b/cover.jpg/400x400cc.jpg", - "caption": "Chillin'" - } - ], - "tabname": "Song", - "metadata": [ - { - "title": "Album", - "text": "Modjo (Remastered)" - }, - { - "title": "Label", - "text": "Modjo Music" - }, - { - "title": "Released", - "text": "2001" - } - ] - }, - { - "type": "RELATED", - "url": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-5748248?startFrom=0&pageSize=20&connected=", - "tabname": "Related" - } + "actions": [ + { + "name": "hub:spotify:searchdeeplink", + "type": "uri", + "uri": "spotify:search:Chillin%27%20Modjo" + } ], - "url": "https://www.shazam.com/track/5748248/chillin", - "artists": [ - { - "id": "42", - "adamid": "13453219" - } - ], - "isrc": "FR9W10100534", - "genres": { - "primary": "Pop" - }, - "urlparams": { - "{tracktitle}": "Chillin%27", - "{trackartist}": "Modjo" - }, - "myshazam": { - "apple": { - "actions": [ - { - "name": "myshazam:apple", - "type": "uri", - "uri": "https://music.apple.com/us/album/chillin/692624255?i=692624263&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" - } - ] - } - }, - "highlightsurls": {}, - "relatedtracksurl": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-5748248?startFrom=0&pageSize=20&connected=", - "albumadamid": "692624255" - } - }, - { - "title": "Fly Like an Eagle", - "artist": "Steve Miller Band", - "date": 1715939146777, - "data": { - "layout": "5", - "type": "MUSIC", - "key": "10015269", - "title": "Fly Like an Eagle", - "subtitle": "Steve Miller Band", + "type": "SPOTIFY" + }, + { + "caption": "Open in Deezer", "images": { - "background": "https://is1-ssl.mzstatic.com/image/thumb/Features125/v4/f5/a3/e0/f5a3e04c-07c0-1128-4a41-728d5345c4c8/mza_5307523159630067331.png/800x800cc.jpg", - "coverart": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/29/fb/fb/29fbfb3e-9c63-fe43-b46b-f52a5081b66f/00602547847348.rgb.jpg/400x400cc.jpg", - "coverarthq": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/29/fb/fb/29fbfb3e-9c63-fe43-b46b-f52a5081b66f/00602547847348.rgb.jpg/400x400cc.jpg", - "joecolor": "b:231f20p:ffc428s:f1a84dt:d2a226q:c88d44" + "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/deezer-overflow_{scalefactor}.png", + "default": "https://images.shazam.com/static/icons/hub/ios/v5/deezer_{scalefactor}.png" }, - "share": { - "subject": "Fly Like an Eagle - Steve Miller Band", - "text": "Fly Like an Eagle by Steve Miller Band", - "href": "https://www.shazam.com/track/10015269/fly-like-an-eagle", - "image": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/29/fb/fb/29fbfb3e-9c63-fe43-b46b-f52a5081b66f/00602547847348.rgb.jpg/400x400cc.jpg", - "twitter": "I used @Shazam to discover Fly Like an Eagle by Steve Miller Band.", - "html": "https://www.shazam.com/snippets/email-share/10015269?lang=en&country=US", - "avatar": "https://is1-ssl.mzstatic.com/image/thumb/Features125/v4/f5/a3/e0/f5a3e04c-07c0-1128-4a41-728d5345c4c8/mza_5307523159630067331.png/800x800cc.jpg", - "snapchat": "https://www.shazam.com/partner/sc/track/10015269" - }, - "hub": { - "type": "APPLEMUSIC", - "image": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic_{scalefactor}.png", - "actions": [ - { - "name": "apple", - "type": "applemusicplay", - "id": "1440832763" - }, - { - "name": "apple", - "type": "uri", - "uri": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview126/v4/f4/e1/fe/f4e1fe4f-d36f-43ec-06b4-a5ac92ec9f68/mzaf_5821903771995822541.plus.aac.ep.m4a" - } - ], - "options": [ - { - "caption": "OPEN IN", - "actions": [ - { - "name": "hub:applemusic:deeplink", - "type": "applemusicopen", - "uri": "https://music.apple.com/us/album/fly-like-an-eagle/1440832463?i=1440832763&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" - }, - { - "name": "hub:applemusic:deeplink", - "type": "uri", - "uri": "https://music.apple.com/us/album/fly-like-an-eagle/1440832463?i=1440832763&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" - } - ], - "beacondata": { - "type": "open", - "providername": "applemusic" - }, - "image": "https://images.shazam.com/static/icons/hub/ios/v5/overflow-open-option_{scalefactor}.png", - "type": "open", - "listcaption": "Open in Apple Music", - "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic-overflow_{scalefactor}.png", - "colouroverflowimage": false, - "providername": "applemusic" - }, - { - "caption": "BUY", - "actions": [ - { - "type": "uri", - "uri": "https://itunes.apple.com/us/album/fly-like-an-eagle/1440832463?i=1440832763&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=itunes&itsct=Shazam_ios" - } - ], - "beacondata": { - "type": "buy", - "providername": "itunes" - }, - "image": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", - "type": "buy", - "listcaption": "Buy on iTunes", - "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", - "colouroverflowimage": false, - "providername": "itunes" - } - ], - "providers": [ - { - "caption": "Open in Spotify", - "images": { - "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/spotify-overflow_{scalefactor}.png", - "default": "https://images.shazam.com/static/icons/hub/ios/v5/spotify_{scalefactor}.png" - }, - "actions": [ - { - "name": "hub:spotify:searchdeeplink", - "type": "uri", - "uri": "spotify:search:Fly%20Like%20an%20Eagle%20Steve%20Miller%20Band" - } - ], - "type": "SPOTIFY" - }, - { - "caption": "Open in Deezer", - "images": { - "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/deezer-overflow_{scalefactor}.png", - "default": "https://images.shazam.com/static/icons/hub/ios/v5/deezer_{scalefactor}.png" - }, - "actions": [ - { - "name": "hub:deezer:searchdeeplink", - "type": "uri", - "uri": "deezer-query://www.deezer.com/play?query=%7Btrack%3A%27Fly+Like+an+Eagle%27%20artist%3A%27Steve+Miller+Band%27%7D" - } - ], - "type": "DEEZER" - } - ], - "explicit": false, - "displayname": "APPLE MUSIC" - }, - "sections": [ - { - "type": "SONG", - "metapages": [ - { - "image": "https://is1-ssl.mzstatic.com/image/thumb/Features125/v4/f5/a3/e0/f5a3e04c-07c0-1128-4a41-728d5345c4c8/mza_5307523159630067331.png/800x800cc.jpg", - "caption": "Steve Miller Band" - }, - { - "image": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/29/fb/fb/29fbfb3e-9c63-fe43-b46b-f52a5081b66f/00602547847348.rgb.jpg/400x400cc.jpg", - "caption": "Fly Like an Eagle" - } - ], - "tabname": "Song", - "metadata": [ - { - "title": "Album", - "text": "Fly Like an Eagle" - }, - { - "title": "Label", - "text": "Steve Miller - Owned" - }, - { - "title": "Released", - "text": "1976" - } - ] - }, - { - "type": "RELATED", - "url": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-10015269?startFrom=0&pageSize=20&connected=", - "tabname": "Related" - } + "actions": [ + { + "name": "hub:deezer:searchdeeplink", + "type": "uri", + "uri": "deezer-query://www.deezer.com/play?query=%7Btrack%3A%27Chillin%5C%27%27%20artist%3A%27Modjo%27%7D" + } ], - "url": "https://www.shazam.com/track/10015269/fly-like-an-eagle", - "artists": [ - { - "id": "42", - "adamid": "488933" - } - ], - "isrc": "USCA28700717", - "genres": { - "primary": "Rock" + "type": "DEEZER" + } + ], + "explicit": false, + "displayname": "APPLE MUSIC" + }, + "sections": [ + { + "type": "SONG", + "metapages": [ + { + "image": "https://is1-ssl.mzstatic.com/image/thumb/Features115/v4/a7/2e/3f/a72e3fa5-1a8f-f1c3-4691-2f42206000a2/pr_source.png/800x800cc.jpg", + "caption": "Modjo" }, - "urlparams": { - "{tracktitle}": "Fly+Like+an+Eagle", - "{trackartist}": "Steve+Miller+Band" + { + "image": "https://is1-ssl.mzstatic.com/image/thumb/Music115/v4/f5/25/2b/f5252b6e-0659-890b-7e9d-0e691944b95b/cover.jpg/400x400cc.jpg", + "caption": "Chillin'" + } + ], + "tabname": "Song", + "metadata": [ + { + "title": "Album", + "text": "Modjo (Remastered)" }, - "myshazam": { - "apple": { - "actions": [ - { - "name": "myshazam:apple", - "type": "uri", - "uri": "https://music.apple.com/us/album/fly-like-an-eagle/1440832463?i=1440832763&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" - } - ] - } + { + "title": "Label", + "text": "Modjo Music" }, - "highlightsurls": {}, - "relatedtracksurl": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-10015269?startFrom=0&pageSize=20&connected=", - "albumadamid": "1440832463" + { + "title": "Released", + "text": "2001" + } + ] + }, + { + "type": "RELATED", + "url": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-5748248?startFrom=0&pageSize=20&connected=", + "tabname": "Related" } - }, - { - "title": "Yakuza", - "artist": "Szymon", - "date": 1715939178023, - "data": { - "layout": "5", - "type": "MUSIC", - "key": "491039356", - "title": "Yakuza", - "subtitle": "Szymon", - "images": { - "background": "https://is1-ssl.mzstatic.com/image/thumb/Features124/v4/0b/f9/39/0bf93955-dcb6-ce1b-a8bf-84e8b0116204/mzl.cvqrotnt.jpg/800x800cc.jpg", - "coverart": "https://is1-ssl.mzstatic.com/image/thumb/Music123/v4/ee/6b/57/ee6b57b6-b3a5-1fe0-840c-fb460d25432e/859734115197_cover.jpg/400x400cc.jpg", - "coverarthq": "https://is1-ssl.mzstatic.com/image/thumb/Music123/v4/ee/6b/57/ee6b57b6-b3a5-1fe0-840c-fb460d25432e/859734115197_cover.jpg/400x400cc.jpg", - "joecolor": "b:245e3ep:fcfcfcs:ebad43t:d1dcd6q:c39d42" - }, - "share": { - "subject": "Yakuza - Szymon", - "text": "Yakuza by Szymon", - "href": "https://www.shazam.com/track/491039356/yakuza", - "image": "https://is1-ssl.mzstatic.com/image/thumb/Music123/v4/ee/6b/57/ee6b57b6-b3a5-1fe0-840c-fb460d25432e/859734115197_cover.jpg/400x400cc.jpg", - "twitter": "I used @Shazam to discover Yakuza by Szymon.", - "html": "https://www.shazam.com/snippets/email-share/491039356?lang=en&country=US", - "avatar": "https://is1-ssl.mzstatic.com/image/thumb/Features124/v4/0b/f9/39/0bf93955-dcb6-ce1b-a8bf-84e8b0116204/mzl.cvqrotnt.jpg/800x800cc.jpg", - "snapchat": "https://www.shazam.com/partner/sc/track/491039356" - }, - "hub": { - "type": "APPLEMUSIC", - "image": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic_{scalefactor}.png", - "actions": [ - { - "name": "apple", - "type": "applemusicplay", - "id": "1478120350" - }, - { - "name": "apple", - "type": "uri", - "uri": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview125/v4/e4/dc/a4/e4dca4d0-da13-f88f-ab27-9cf366429fcc/mzaf_8980097846142306679.plus.aac.ep.m4a" - } - ], - "options": [ - { - "caption": "OPEN IN", - "actions": [ - { - "name": "hub:applemusic:deeplink", - "type": "applemusicopen", - "uri": "https://music.apple.com/us/album/yakuza/1478120343?i=1478120350&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" - }, - { - "name": "hub:applemusic:deeplink", - "type": "uri", - "uri": "https://music.apple.com/us/album/yakuza/1478120343?i=1478120350&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" - } - ], - "beacondata": { - "type": "open", - "providername": "applemusic" - }, - "image": "https://images.shazam.com/static/icons/hub/ios/v5/overflow-open-option_{scalefactor}.png", - "type": "open", - "listcaption": "Open in Apple Music", - "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic-overflow_{scalefactor}.png", - "colouroverflowimage": false, - "providername": "applemusic" - }, - { - "caption": "BUY", - "actions": [ - { - "type": "uri", - "uri": "https://itunes.apple.com/us/album/yakuza/1478120343?i=1478120350&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=itunes&itsct=Shazam_ios" - } - ], - "beacondata": { - "type": "buy", - "providername": "itunes" - }, - "image": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", - "type": "buy", - "listcaption": "Buy on iTunes", - "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", - "colouroverflowimage": false, - "providername": "itunes" - } - ], - "providers": [ - { - "caption": "Open in Spotify", - "images": { - "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/spotify-overflow_{scalefactor}.png", - "default": "https://images.shazam.com/static/icons/hub/ios/v5/spotify_{scalefactor}.png" - }, - "actions": [ - { - "name": "hub:spotify:searchdeeplink", - "type": "uri", - "uri": "spotify:search:Yakuza%20Szymon" - } - ], - "type": "SPOTIFY" - }, - { - "caption": "Open in Deezer", - "images": { - "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/deezer-overflow_{scalefactor}.png", - "default": "https://images.shazam.com/static/icons/hub/ios/v5/deezer_{scalefactor}.png" - }, - "actions": [ - { - "name": "hub:deezer:searchdeeplink", - "type": "uri", - "uri": "deezer-query://www.deezer.com/play?query=%7Btrack%3A%27Yakuza%27%20artist%3A%27Szymon%27%7D" - } - ], - "type": "DEEZER" - } - ], - "explicit": false, - "displayname": "APPLE MUSIC" - }, - "sections": [ - { - "type": "SONG", - "metapages": [ - { - "image": "https://is1-ssl.mzstatic.com/image/thumb/Features124/v4/0b/f9/39/0bf93955-dcb6-ce1b-a8bf-84e8b0116204/mzl.cvqrotnt.jpg/800x800cc.jpg", - "caption": "Szymon" - }, - { - "image": "https://is1-ssl.mzstatic.com/image/thumb/Music123/v4/ee/6b/57/ee6b57b6-b3a5-1fe0-840c-fb460d25432e/859734115197_cover.jpg/400x400cc.jpg", - "caption": "Yakuza" - } - ], - "tabname": "Song", - "metadata": [ - { - "title": "Album", - "text": "Blue Coloured Mountain" - }, - { - "title": "Label", - "text": "Eloper Music" - }, - { - "title": "Released", - "text": "2019" - } - ] - }, - { - "type": "RELATED", - "url": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-491039356?startFrom=0&pageSize=20&connected=", - "tabname": "Related" - } - ], - "url": "https://www.shazam.com/track/491039356/yakuza", - "artists": [ - { - "id": "42", - "adamid": "663866874" - } - ], - "isrc": "AUMXD1800014", - "genres": { - "primary": "Alternative" - }, - "urlparams": { - "{tracktitle}": "Yakuza", - "{trackartist}": "Szymon" - }, - "myshazam": { - "apple": { - "actions": [ - { - "name": "myshazam:apple", - "type": "uri", - "uri": "https://music.apple.com/us/album/yakuza/1478120343?i=1478120350&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" - } - ] - } - }, - "highlightsurls": {}, - "relatedtracksurl": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-491039356?startFrom=0&pageSize=20&connected=", - "albumadamid": "1478120343" + ], + "url": "https://www.shazam.com/track/5748248/chillin", + "artists": [ + { + "id": "42", + "adamid": "13453219" } + ], + "isrc": "FR9W10100534", + "genres": { + "primary": "Pop" + }, + "urlparams": { + "{tracktitle}": "Chillin%27", + "{trackartist}": "Modjo" + }, + "myshazam": { + "apple": { + "actions": [ + { + "name": "myshazam:apple", + "type": "uri", + "uri": "https://music.apple.com/us/album/chillin/692624255?i=692624263&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" + } + ] + } + }, + "highlightsurls": {}, + "relatedtracksurl": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-5748248?startFrom=0&pageSize=20&connected=", + "albumadamid": "692624255" } -] \ No newline at end of file + }, + { + "title": "Fly Like an Eagle", + "artist": "Steve Miller Band", + "date": 1715939146777, + "data": { + "layout": "5", + "type": "MUSIC", + "key": "10015269", + "title": "Fly Like an Eagle", + "subtitle": "Steve Miller Band", + "images": { + "background": "https://is1-ssl.mzstatic.com/image/thumb/Features125/v4/f5/a3/e0/f5a3e04c-07c0-1128-4a41-728d5345c4c8/mza_5307523159630067331.png/800x800cc.jpg", + "coverart": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/29/fb/fb/29fbfb3e-9c63-fe43-b46b-f52a5081b66f/00602547847348.rgb.jpg/400x400cc.jpg", + "coverarthq": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/29/fb/fb/29fbfb3e-9c63-fe43-b46b-f52a5081b66f/00602547847348.rgb.jpg/400x400cc.jpg", + "joecolor": "b:231f20p:ffc428s:f1a84dt:d2a226q:c88d44" + }, + "share": { + "subject": "Fly Like an Eagle - Steve Miller Band", + "text": "Fly Like an Eagle by Steve Miller Band", + "href": "https://www.shazam.com/track/10015269/fly-like-an-eagle", + "image": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/29/fb/fb/29fbfb3e-9c63-fe43-b46b-f52a5081b66f/00602547847348.rgb.jpg/400x400cc.jpg", + "twitter": "I used @Shazam to discover Fly Like an Eagle by Steve Miller Band.", + "html": "https://www.shazam.com/snippets/email-share/10015269?lang=en&country=US", + "avatar": "https://is1-ssl.mzstatic.com/image/thumb/Features125/v4/f5/a3/e0/f5a3e04c-07c0-1128-4a41-728d5345c4c8/mza_5307523159630067331.png/800x800cc.jpg", + "snapchat": "https://www.shazam.com/partner/sc/track/10015269" + }, + "hub": { + "type": "APPLEMUSIC", + "image": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic_{scalefactor}.png", + "actions": [ + { + "name": "apple", + "type": "applemusicplay", + "id": "1440832763" + }, + { + "name": "apple", + "type": "uri", + "uri": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview126/v4/f4/e1/fe/f4e1fe4f-d36f-43ec-06b4-a5ac92ec9f68/mzaf_5821903771995822541.plus.aac.ep.m4a" + } + ], + "options": [ + { + "caption": "OPEN IN", + "actions": [ + { + "name": "hub:applemusic:deeplink", + "type": "applemusicopen", + "uri": "https://music.apple.com/us/album/fly-like-an-eagle/1440832463?i=1440832763&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" + }, + { + "name": "hub:applemusic:deeplink", + "type": "uri", + "uri": "https://music.apple.com/us/album/fly-like-an-eagle/1440832463?i=1440832763&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" + } + ], + "beacondata": { + "type": "open", + "providername": "applemusic" + }, + "image": "https://images.shazam.com/static/icons/hub/ios/v5/overflow-open-option_{scalefactor}.png", + "type": "open", + "listcaption": "Open in Apple Music", + "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic-overflow_{scalefactor}.png", + "colouroverflowimage": false, + "providername": "applemusic" + }, + { + "caption": "BUY", + "actions": [ + { + "type": "uri", + "uri": "https://itunes.apple.com/us/album/fly-like-an-eagle/1440832463?i=1440832763&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=itunes&itsct=Shazam_ios" + } + ], + "beacondata": { + "type": "buy", + "providername": "itunes" + }, + "image": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", + "type": "buy", + "listcaption": "Buy on iTunes", + "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", + "colouroverflowimage": false, + "providername": "itunes" + } + ], + "providers": [ + { + "caption": "Open in Spotify", + "images": { + "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/spotify-overflow_{scalefactor}.png", + "default": "https://images.shazam.com/static/icons/hub/ios/v5/spotify_{scalefactor}.png" + }, + "actions": [ + { + "name": "hub:spotify:searchdeeplink", + "type": "uri", + "uri": "spotify:search:Fly%20Like%20an%20Eagle%20Steve%20Miller%20Band" + } + ], + "type": "SPOTIFY" + }, + { + "caption": "Open in Deezer", + "images": { + "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/deezer-overflow_{scalefactor}.png", + "default": "https://images.shazam.com/static/icons/hub/ios/v5/deezer_{scalefactor}.png" + }, + "actions": [ + { + "name": "hub:deezer:searchdeeplink", + "type": "uri", + "uri": "deezer-query://www.deezer.com/play?query=%7Btrack%3A%27Fly+Like+an+Eagle%27%20artist%3A%27Steve+Miller+Band%27%7D" + } + ], + "type": "DEEZER" + } + ], + "explicit": false, + "displayname": "APPLE MUSIC" + }, + "sections": [ + { + "type": "SONG", + "metapages": [ + { + "image": "https://is1-ssl.mzstatic.com/image/thumb/Features125/v4/f5/a3/e0/f5a3e04c-07c0-1128-4a41-728d5345c4c8/mza_5307523159630067331.png/800x800cc.jpg", + "caption": "Steve Miller Band" + }, + { + "image": "https://is1-ssl.mzstatic.com/image/thumb/Music125/v4/29/fb/fb/29fbfb3e-9c63-fe43-b46b-f52a5081b66f/00602547847348.rgb.jpg/400x400cc.jpg", + "caption": "Fly Like an Eagle" + } + ], + "tabname": "Song", + "metadata": [ + { + "title": "Album", + "text": "Fly Like an Eagle" + }, + { + "title": "Label", + "text": "Steve Miller - Owned" + }, + { + "title": "Released", + "text": "1976" + } + ] + }, + { + "type": "RELATED", + "url": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-10015269?startFrom=0&pageSize=20&connected=", + "tabname": "Related" + } + ], + "url": "https://www.shazam.com/track/10015269/fly-like-an-eagle", + "artists": [ + { + "id": "42", + "adamid": "488933" + } + ], + "isrc": "USCA28700717", + "genres": { + "primary": "Rock" + }, + "urlparams": { + "{tracktitle}": "Fly+Like+an+Eagle", + "{trackartist}": "Steve+Miller+Band" + }, + "myshazam": { + "apple": { + "actions": [ + { + "name": "myshazam:apple", + "type": "uri", + "uri": "https://music.apple.com/us/album/fly-like-an-eagle/1440832463?i=1440832763&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" + } + ] + } + }, + "highlightsurls": {}, + "relatedtracksurl": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-10015269?startFrom=0&pageSize=20&connected=", + "albumadamid": "1440832463" + } + }, + { + "title": "Yakuza", + "artist": "Szymon", + "date": 1715939178023, + "data": { + "layout": "5", + "type": "MUSIC", + "key": "491039356", + "title": "Yakuza", + "subtitle": "Szymon", + "images": { + "background": "https://is1-ssl.mzstatic.com/image/thumb/Features124/v4/0b/f9/39/0bf93955-dcb6-ce1b-a8bf-84e8b0116204/mzl.cvqrotnt.jpg/800x800cc.jpg", + "coverart": "https://is1-ssl.mzstatic.com/image/thumb/Music123/v4/ee/6b/57/ee6b57b6-b3a5-1fe0-840c-fb460d25432e/859734115197_cover.jpg/400x400cc.jpg", + "coverarthq": "https://is1-ssl.mzstatic.com/image/thumb/Music123/v4/ee/6b/57/ee6b57b6-b3a5-1fe0-840c-fb460d25432e/859734115197_cover.jpg/400x400cc.jpg", + "joecolor": "b:245e3ep:fcfcfcs:ebad43t:d1dcd6q:c39d42" + }, + "share": { + "subject": "Yakuza - Szymon", + "text": "Yakuza by Szymon", + "href": "https://www.shazam.com/track/491039356/yakuza", + "image": "https://is1-ssl.mzstatic.com/image/thumb/Music123/v4/ee/6b/57/ee6b57b6-b3a5-1fe0-840c-fb460d25432e/859734115197_cover.jpg/400x400cc.jpg", + "twitter": "I used @Shazam to discover Yakuza by Szymon.", + "html": "https://www.shazam.com/snippets/email-share/491039356?lang=en&country=US", + "avatar": "https://is1-ssl.mzstatic.com/image/thumb/Features124/v4/0b/f9/39/0bf93955-dcb6-ce1b-a8bf-84e8b0116204/mzl.cvqrotnt.jpg/800x800cc.jpg", + "snapchat": "https://www.shazam.com/partner/sc/track/491039356" + }, + "hub": { + "type": "APPLEMUSIC", + "image": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic_{scalefactor}.png", + "actions": [ + { + "name": "apple", + "type": "applemusicplay", + "id": "1478120350" + }, + { + "name": "apple", + "type": "uri", + "uri": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview125/v4/e4/dc/a4/e4dca4d0-da13-f88f-ab27-9cf366429fcc/mzaf_8980097846142306679.plus.aac.ep.m4a" + } + ], + "options": [ + { + "caption": "OPEN IN", + "actions": [ + { + "name": "hub:applemusic:deeplink", + "type": "applemusicopen", + "uri": "https://music.apple.com/us/album/yakuza/1478120343?i=1478120350&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" + }, + { + "name": "hub:applemusic:deeplink", + "type": "uri", + "uri": "https://music.apple.com/us/album/yakuza/1478120343?i=1478120350&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" + } + ], + "beacondata": { + "type": "open", + "providername": "applemusic" + }, + "image": "https://images.shazam.com/static/icons/hub/ios/v5/overflow-open-option_{scalefactor}.png", + "type": "open", + "listcaption": "Open in Apple Music", + "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic-overflow_{scalefactor}.png", + "colouroverflowimage": false, + "providername": "applemusic" + }, + { + "caption": "BUY", + "actions": [ + { + "type": "uri", + "uri": "https://itunes.apple.com/us/album/yakuza/1478120343?i=1478120350&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=itunes&itsct=Shazam_ios" + } + ], + "beacondata": { + "type": "buy", + "providername": "itunes" + }, + "image": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", + "type": "buy", + "listcaption": "Buy on iTunes", + "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", + "colouroverflowimage": false, + "providername": "itunes" + } + ], + "providers": [ + { + "caption": "Open in Spotify", + "images": { + "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/spotify-overflow_{scalefactor}.png", + "default": "https://images.shazam.com/static/icons/hub/ios/v5/spotify_{scalefactor}.png" + }, + "actions": [ + { + "name": "hub:spotify:searchdeeplink", + "type": "uri", + "uri": "spotify:search:Yakuza%20Szymon" + } + ], + "type": "SPOTIFY" + }, + { + "caption": "Open in Deezer", + "images": { + "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/deezer-overflow_{scalefactor}.png", + "default": "https://images.shazam.com/static/icons/hub/ios/v5/deezer_{scalefactor}.png" + }, + "actions": [ + { + "name": "hub:deezer:searchdeeplink", + "type": "uri", + "uri": "deezer-query://www.deezer.com/play?query=%7Btrack%3A%27Yakuza%27%20artist%3A%27Szymon%27%7D" + } + ], + "type": "DEEZER" + } + ], + "explicit": false, + "displayname": "APPLE MUSIC" + }, + "sections": [ + { + "type": "SONG", + "metapages": [ + { + "image": "https://is1-ssl.mzstatic.com/image/thumb/Features124/v4/0b/f9/39/0bf93955-dcb6-ce1b-a8bf-84e8b0116204/mzl.cvqrotnt.jpg/800x800cc.jpg", + "caption": "Szymon" + }, + { + "image": "https://is1-ssl.mzstatic.com/image/thumb/Music123/v4/ee/6b/57/ee6b57b6-b3a5-1fe0-840c-fb460d25432e/859734115197_cover.jpg/400x400cc.jpg", + "caption": "Yakuza" + } + ], + "tabname": "Song", + "metadata": [ + { + "title": "Album", + "text": "Blue Coloured Mountain" + }, + { + "title": "Label", + "text": "Eloper Music" + }, + { + "title": "Released", + "text": "2019" + } + ] + }, + { + "type": "RELATED", + "url": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-491039356?startFrom=0&pageSize=20&connected=", + "tabname": "Related" + } + ], + "url": "https://www.shazam.com/track/491039356/yakuza", + "artists": [ + { + "id": "42", + "adamid": "663866874" + } + ], + "isrc": "AUMXD1800014", + "genres": { + "primary": "Alternative" + }, + "urlparams": { + "{tracktitle}": "Yakuza", + "{trackartist}": "Szymon" + }, + "myshazam": { + "apple": { + "actions": [ + { + "name": "myshazam:apple", + "type": "uri", + "uri": "https://music.apple.com/us/album/yakuza/1478120343?i=1478120350&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" + } + ] + } + }, + "highlightsurls": {}, + "relatedtracksurl": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-491039356?startFrom=0&pageSize=20&connected=", + "albumadamid": "1478120343" + } + } +] diff --git a/testing/tests/fixtures/result.json b/testing/tests/fixtures/result.json index f21f5d9..5f7a35a 100644 --- a/testing/tests/fixtures/result.json +++ b/testing/tests/fixtures/result.json @@ -1,199 +1,199 @@ { - "matches": [ - { - "id": "265200025", - "offset": 12.782737304, - "timeskew": 0.0013953447, - "frequencyskew": -0.00020134449 - } - ], - "location": { - "accuracy": 0.01 + "matches": [ + { + "id": "265200025", + "offset": 12.782737304, + "timeskew": 0.0013953447, + "frequencyskew": -0.00020134449 + } + ], + "location": { + "accuracy": 0.01 + }, + "timestamp": 1715808867833, + "timezone": "Europe/Paris", + "track": { + "layout": "5", + "type": "MUSIC", + "key": "60010180", + "title": "Randy Dandy-Oh", + "subtitle": "The Dreadnoughts", + "images": { + "background": "https://is1-ssl.mzstatic.com/image/thumb/Music122/v4/89/2c/1a/892c1adc-e9d8-77cb-46d7-dd70e1cd97da/pr_source.png/800x800cc.jpg", + "coverart": "https://is1-ssl.mzstatic.com/image/thumb/Music124/v4/8a/4e/6e/8a4e6e9f-6a82-5847-c64d-5dc3129df21b/cover.jpg/400x400cc.jpg", + "coverarthq": "https://is1-ssl.mzstatic.com/image/thumb/Music124/v4/8a/4e/6e/8a4e6e9f-6a82-5847-c64d-5dc3129df21b/cover.jpg/400x400cc.jpg", + "joecolor": "b:f0f0f0p:000000s:292827t:303030q:51504f" }, - "timestamp": 1715808867833, - "timezone": "Europe/Paris", - "track": { - "layout": "5", - "type": "MUSIC", - "key": "60010180", - "title": "Randy Dandy-Oh", - "subtitle": "The Dreadnoughts", - "images": { - "background": "https://is1-ssl.mzstatic.com/image/thumb/Music122/v4/89/2c/1a/892c1adc-e9d8-77cb-46d7-dd70e1cd97da/pr_source.png/800x800cc.jpg", - "coverart": "https://is1-ssl.mzstatic.com/image/thumb/Music124/v4/8a/4e/6e/8a4e6e9f-6a82-5847-c64d-5dc3129df21b/cover.jpg/400x400cc.jpg", - "coverarthq": "https://is1-ssl.mzstatic.com/image/thumb/Music124/v4/8a/4e/6e/8a4e6e9f-6a82-5847-c64d-5dc3129df21b/cover.jpg/400x400cc.jpg", - "joecolor": "b:f0f0f0p:000000s:292827t:303030q:51504f" + "share": { + "subject": "Randy Dandy-Oh - The Dreadnoughts", + "text": "Randy Dandy-Oh by The Dreadnoughts", + "href": "https://www.shazam.com/track/60010180/randy-dandy-oh", + "image": "https://is1-ssl.mzstatic.com/image/thumb/Music124/v4/8a/4e/6e/8a4e6e9f-6a82-5847-c64d-5dc3129df21b/cover.jpg/400x400cc.jpg", + "twitter": "I used @Shazam to discover Randy Dandy-Oh by The Dreadnoughts.", + "html": "https://www.shazam.com/snippets/email-share/60010180?lang=en&country=US", + "avatar": "https://is1-ssl.mzstatic.com/image/thumb/Music122/v4/89/2c/1a/892c1adc-e9d8-77cb-46d7-dd70e1cd97da/pr_source.png/800x800cc.jpg", + "snapchat": "https://www.shazam.com/partner/sc/track/60010180" + }, + "hub": { + "type": "APPLEMUSIC", + "image": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic_{scalefactor}.png", + "actions": [ + { + "name": "apple", + "type": "applemusicplay", + "id": "896288089" }, - "share": { - "subject": "Randy Dandy-Oh - The Dreadnoughts", - "text": "Randy Dandy-Oh by The Dreadnoughts", - "href": "https://www.shazam.com/track/60010180/randy-dandy-oh", - "image": "https://is1-ssl.mzstatic.com/image/thumb/Music124/v4/8a/4e/6e/8a4e6e9f-6a82-5847-c64d-5dc3129df21b/cover.jpg/400x400cc.jpg", - "twitter": "I used @Shazam to discover Randy Dandy-Oh by The Dreadnoughts.", - "html": "https://www.shazam.com/snippets/email-share/60010180?lang=en&country=US", - "avatar": "https://is1-ssl.mzstatic.com/image/thumb/Music122/v4/89/2c/1a/892c1adc-e9d8-77cb-46d7-dd70e1cd97da/pr_source.png/800x800cc.jpg", - "snapchat": "https://www.shazam.com/partner/sc/track/60010180" - }, - "hub": { - "type": "APPLEMUSIC", - "image": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic_{scalefactor}.png", - "actions": [ - { - "name": "apple", - "type": "applemusicplay", - "id": "896288089" - }, - { - "name": "apple", - "type": "uri", - "uri": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview115/v4/61/68/3b/61683bbc-bcca-411f-d460-5a894bb513c9/mzaf_2797442894212639830.plus.aac.p.m4a" - } - ], - "options": [ - { - "caption": "OPEN IN", - "actions": [ - { - "name": "hub:applemusic:deeplink", - "type": "applemusicopen", - "uri": "https://music.apple.com/us/album/randy-dandy-oh/896288077?i=896288089&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" - }, - { - "name": "hub:applemusic:deeplink", - "type": "uri", - "uri": "https://music.apple.com/us/album/randy-dandy-oh/896288077?i=896288089&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" - } - ], - "beacondata": { - "type": "open", - "providername": "applemusic" - }, - "image": "https://images.shazam.com/static/icons/hub/ios/v5/overflow-open-option_{scalefactor}.png", - "type": "open", - "listcaption": "Open in Apple Music", - "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic-overflow_{scalefactor}.png", - "colouroverflowimage": false, - "providername": "applemusic" - }, - { - "caption": "BUY", - "actions": [ - { - "type": "uri", - "uri": "https://itunes.apple.com/us/album/randy-dandy-oh/896288077?i=896288089&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=itunes&itsct=Shazam_ios" - } - ], - "beacondata": { - "type": "buy", - "providername": "itunes" - }, - "image": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", - "type": "buy", - "listcaption": "Buy on iTunes", - "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", - "colouroverflowimage": false, - "providername": "itunes" - } - ], - "providers": [ - { - "caption": "Open in Spotify", - "images": { - "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/spotify-overflow_{scalefactor}.png", - "default": "https://images.shazam.com/static/icons/hub/ios/v5/spotify_{scalefactor}.png" - }, - "actions": [ - { - "name": "hub:spotify:searchdeeplink", - "type": "uri", - "uri": "spotify:search:Randy%20Dandy-Oh%20The%20Dreadnoughts" - } - ], - "type": "SPOTIFY" - }, - { - "caption": "Open in Deezer", - "images": { - "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/deezer-overflow_{scalefactor}.png", - "default": "https://images.shazam.com/static/icons/hub/ios/v5/deezer_{scalefactor}.png" - }, - "actions": [ - { - "name": "hub:deezer:searchdeeplink", - "type": "uri", - "uri": "deezer-query://www.deezer.com/play?query=%7Btrack%3A%27Randy+Dandy-Oh%27%20artist%3A%27The+Dreadnoughts%27%7D" - } - ], - "type": "DEEZER" - } - ], - "explicit": false, - "displayname": "APPLE MUSIC" - }, - "sections": [ + { + "name": "apple", + "type": "uri", + "uri": "https://audio-ssl.itunes.apple.com/itunes-assets/AudioPreview115/v4/61/68/3b/61683bbc-bcca-411f-d460-5a894bb513c9/mzaf_2797442894212639830.plus.aac.p.m4a" + } + ], + "options": [ + { + "caption": "OPEN IN", + "actions": [ { - "type": "SONG", - "metapages": [ - { - "image": "https://is1-ssl.mzstatic.com/image/thumb/Music122/v4/89/2c/1a/892c1adc-e9d8-77cb-46d7-dd70e1cd97da/pr_source.png/800x800cc.jpg", - "caption": "The Dreadnoughts" - }, - { - "image": "https://is1-ssl.mzstatic.com/image/thumb/Music124/v4/8a/4e/6e/8a4e6e9f-6a82-5847-c64d-5dc3129df21b/cover.jpg/400x400cc.jpg", - "caption": "Randy Dandy-Oh" - } - ], - "tabname": "Song", - "metadata": [ - { - "title": "Album", - "text": "Polka's Not Dead" - }, - { - "title": "Label", - "text": "Stomp Records" - }, - { - "title": "Released", - "text": "2010" - } - ] + "name": "hub:applemusic:deeplink", + "type": "applemusicopen", + "uri": "https://music.apple.com/us/album/randy-dandy-oh/896288077?i=896288089&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" }, { - "type": "RELATED", - "url": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-60010180?startFrom=0&pageSize=20&connected=", - "tabname": "Related" + "name": "hub:applemusic:deeplink", + "type": "uri", + "uri": "https://music.apple.com/us/album/randy-dandy-oh/896288077?i=896288089&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" } - ], - "url": "https://www.shazam.com/track/60010180/randy-dandy-oh", - "artists": [ + ], + "beacondata": { + "type": "open", + "providername": "applemusic" + }, + "image": "https://images.shazam.com/static/icons/hub/ios/v5/overflow-open-option_{scalefactor}.png", + "type": "open", + "listcaption": "Open in Apple Music", + "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/applemusic-overflow_{scalefactor}.png", + "colouroverflowimage": false, + "providername": "applemusic" + }, + { + "caption": "BUY", + "actions": [ { - "id": "42", - "adamid": "292280012" + "type": "uri", + "uri": "https://itunes.apple.com/us/album/randy-dandy-oh/896288077?i=896288089&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=itunes&itsct=Shazam_ios" } - ], - "isrc": "CASE11000099", - "genres": { - "primary": "Punk" - }, - "urlparams": { - "{tracktitle}": "Randy+Dandy-Oh", - "{trackartist}": "The+Dreadnoughts" - }, - "myshazam": { - "apple": { - "actions": [ - { - "name": "myshazam:apple", - "type": "uri", - "uri": "https://music.apple.com/us/album/randy-dandy-oh/896288077?i=896288089&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" - } - ] + ], + "beacondata": { + "type": "buy", + "providername": "itunes" + }, + "image": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", + "type": "buy", + "listcaption": "Buy on iTunes", + "overflowimage": "https://images.shazam.com/static/icons/hub/ios/v5/itunes-overflow-buy_{scalefactor}.png", + "colouroverflowimage": false, + "providername": "itunes" + } + ], + "providers": [ + { + "caption": "Open in Spotify", + "images": { + "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/spotify-overflow_{scalefactor}.png", + "default": "https://images.shazam.com/static/icons/hub/ios/v5/spotify_{scalefactor}.png" + }, + "actions": [ + { + "name": "hub:spotify:searchdeeplink", + "type": "uri", + "uri": "spotify:search:Randy%20Dandy-Oh%20The%20Dreadnoughts" } + ], + "type": "SPOTIFY" }, - "highlightsurls": {}, - "relatedtracksurl": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-60010180?startFrom=0&pageSize=20&connected=", - "albumadamid": "896288077" + { + "caption": "Open in Deezer", + "images": { + "overflow": "https://images.shazam.com/static/icons/hub/ios/v5/deezer-overflow_{scalefactor}.png", + "default": "https://images.shazam.com/static/icons/hub/ios/v5/deezer_{scalefactor}.png" + }, + "actions": [ + { + "name": "hub:deezer:searchdeeplink", + "type": "uri", + "uri": "deezer-query://www.deezer.com/play?query=%7Btrack%3A%27Randy+Dandy-Oh%27%20artist%3A%27The+Dreadnoughts%27%7D" + } + ], + "type": "DEEZER" + } + ], + "explicit": false, + "displayname": "APPLE MUSIC" }, - "tagid": "461A1003-235D-4859-B067-CA1FCC7B726A" -} \ No newline at end of file + "sections": [ + { + "type": "SONG", + "metapages": [ + { + "image": "https://is1-ssl.mzstatic.com/image/thumb/Music122/v4/89/2c/1a/892c1adc-e9d8-77cb-46d7-dd70e1cd97da/pr_source.png/800x800cc.jpg", + "caption": "The Dreadnoughts" + }, + { + "image": "https://is1-ssl.mzstatic.com/image/thumb/Music124/v4/8a/4e/6e/8a4e6e9f-6a82-5847-c64d-5dc3129df21b/cover.jpg/400x400cc.jpg", + "caption": "Randy Dandy-Oh" + } + ], + "tabname": "Song", + "metadata": [ + { + "title": "Album", + "text": "Polka's Not Dead" + }, + { + "title": "Label", + "text": "Stomp Records" + }, + { + "title": "Released", + "text": "2010" + } + ] + }, + { + "type": "RELATED", + "url": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-60010180?startFrom=0&pageSize=20&connected=", + "tabname": "Related" + } + ], + "url": "https://www.shazam.com/track/60010180/randy-dandy-oh", + "artists": [ + { + "id": "42", + "adamid": "292280012" + } + ], + "isrc": "CASE11000099", + "genres": { + "primary": "Punk" + }, + "urlparams": { + "{tracktitle}": "Randy+Dandy-Oh", + "{trackartist}": "The+Dreadnoughts" + }, + "myshazam": { + "apple": { + "actions": [ + { + "name": "myshazam:apple", + "type": "uri", + "uri": "https://music.apple.com/us/album/randy-dandy-oh/896288077?i=896288089&mttnagencyid=s2n&mttnsiteid=125115&mttn3pid=Apple-Shazam&mttnsub1=Shazam_ios&mttnsub2=5348615A-616D-3235-3830-44754D6D5973&itscg=30201&app=music&itsct=Shazam_ios" + } + ] + } + }, + "highlightsurls": {}, + "relatedtracksurl": "https://cdn.shazam.com/shazam/v3/en/US/iphone/-/tracks/track-similarities-id-60010180?startFrom=0&pageSize=20&connected=", + "albumadamid": "896288077" + }, + "tagid": "461A1003-235D-4859-B067-CA1FCC7B726A" +} diff --git a/testing/tests/history.spec.ts b/testing/tests/history.spec.ts index b824dee..de4054f 100644 --- a/testing/tests/history.spec.ts +++ b/testing/tests/history.spec.ts @@ -88,9 +88,7 @@ test("History: Should be able to remove 2 items", async ({ page }) => { await expect(page.getByText(expectedHistory[2])).toBeVisible(); }); -test("History: Should be able to consult 2 different items", async ({ - page, -}) => { +test("History: Should be able to consult 2 different items", async ({ page }) => { // Load localstorage gotoWithLocalStorage("/", page); @@ -102,9 +100,9 @@ test("History: Should be able to consult 2 different items", async ({ // Click on history item await page.getByTestId("history-item").nth(0).getByRole("button").first().click(); - await expect( - page.getByText("Chillin'ModjoPlay AlbumModjo"), - ).toHaveScreenshot({ maxDiffPixelRatio: 0.15 }); + await expect(page.getByText("Chillin'ModjoPlay AlbumModjo")).toHaveScreenshot({ + maxDiffPixelRatio: 0.15, + }); // Close result โ€” the history panel stays open underneath, no need to reopen it await page.getByRole("button", { name: "Close" }).click(); diff --git a/testing/tests/lidarr.spec.ts b/testing/tests/lidarr.spec.ts index 3dc81ec..cd56df3 100644 --- a/testing/tests/lidarr.spec.ts +++ b/testing/tests/lidarr.spec.ts @@ -8,14 +8,8 @@ const LIDARR_API_KEY = "test-lidarr-api-key"; async function gotoWithConfig(page: Page, config: Record) { await page.addInitScript( ({ config, history }) => { - window.localStorage.setItem( - "CapacitorStorage.com.shazarr.config", - JSON.stringify(config), - ); - window.localStorage.setItem( - "CapacitorStorage.com.shazarr.history", - JSON.stringify(history), - ); + window.localStorage.setItem("CapacitorStorage.com.shazarr.config", JSON.stringify(config)); + window.localStorage.setItem("CapacitorStorage.com.shazarr.history", JSON.stringify(history)); }, { config, history: historyFixtures }, ); @@ -36,7 +30,13 @@ async function openModjoResult(page: Page) { } const DEFAULT_ARTIST = { id: 1, artistName: "Szymon", foreignArtistId: "abc-123" }; -const DEFAULT_ALBUM = { id: 10, title: "Blue Coloured Mountain", artistId: 1, monitored: false, statistics: { percentOfTracks: 0 } }; +const DEFAULT_ALBUM = { + id: 10, + title: "Blue Coloured Mountain", + artistId: 1, + monitored: false, + statistics: { percentOfTracks: 0 }, +}; function mockLidarrRoutes( page: Page, @@ -65,17 +65,33 @@ function mockLidarrRoutes( if (idMatch && method === "GET") { const [, kind, id] = idMatch; const store = kind === "artist" ? artists : albums; - await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify(store.get(Number(id))) }); + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify(store.get(Number(id))), + }); } else if (idMatch && method === "PUT") { const [, kind, id] = idMatch; const store = kind === "artist" ? artists : albums; const body = route.request().postDataJSON(); store.set(Number(id), body); - await route.fulfill({ status: 202, contentType: "application/json", body: JSON.stringify(body) }); + await route.fulfill({ + status: 202, + contentType: "application/json", + body: JSON.stringify(body), + }); } else if (url.includes("/api/v1/artist") && !url.includes("lookup") && method === "GET") { - await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify([...artists.values()]) }); + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify([...artists.values()]), + }); } else if (url.includes("/api/v1/artist/lookup")) { - await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify(overrides.artistLookup ?? [DEFAULT_ARTIST]) }); + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify(overrides.artistLookup ?? [DEFAULT_ARTIST]), + }); } else if (url.includes("/api/v1/artist") && method === "POST") { const body = route.request().postDataJSON(); overrides.onArtistCreate?.(body); @@ -83,20 +99,48 @@ function mockLidarrRoutes( // Real Lidarr often doesn't honor monitored: true on create โ€” simulate // that so ensureArtistMonitored's verify-then-retry loop is exercised. artists.set(id, { ...body, id, monitored: false }); - await route.fulfill({ status: 201, contentType: "application/json", body: JSON.stringify({ id }) }); + await route.fulfill({ + status: 201, + contentType: "application/json", + body: JSON.stringify({ id }), + }); } else if (url.includes("/api/v1/album") && url.includes("artistId=")) { - await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify([...albums.values()]) }); + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify([...albums.values()]), + }); } else if (url.includes("/api/v1/qualityprofile")) { - await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify([{ id: 1, name: "Any" }]) }); + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify([{ id: 1, name: "Any" }]), + }); } else if (url.includes("/api/v1/metadataprofile")) { - await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify([{ id: 1, name: "Standard" }]) }); + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify([{ id: 1, name: "Standard" }]), + }); } else if (url.includes("/api/v1/rootfolder")) { - await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify([{ path: "/music" }]) }); + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify([{ path: "/music" }]), + }); } else if (url.includes("/api/v1/command") && method === "GET") { // No RefreshArtist commands pending โ€” waitForArtistRefresh returns immediately. - await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify([]) }); + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify([]), + }); } else if (url.includes("/api/v1/command")) { - await route.fulfill({ status: 201, contentType: "application/json", body: JSON.stringify({ id: 99 }) }); + await route.fulfill({ + status: 201, + contentType: "application/json", + body: JSON.stringify({ id: 99 }), + }); } else { await route.continue(); } @@ -122,9 +166,7 @@ test("Lidarr: Without API key โ€” opens browser search", async ({ page }) => { await page.waitForTimeout(200); await ctx.unroute(`${LIDARR_URL}/**`); - expect(capturedUrl).toEqual( - `${LIDARR_URL}/add/search?term=Blue%20Coloured%20Mountain%20Szymon`, - ); + expect(capturedUrl).toEqual(`${LIDARR_URL}/add/search?term=Blue%20Coloured%20Mountain%20Szymon`); }); test("Lidarr: With API key โ€” calls API and shows success", async ({ page }) => { @@ -139,10 +181,18 @@ test("Lidarr: With API key โ€” calls API and shows success", async ({ page }) => }); }); -test("Lidarr: With API key โ€” matches album despite (Remastered) suffix in title", async ({ page }) => { +test("Lidarr: With API key โ€” matches album despite (Remastered) suffix in title", async ({ + page, +}) => { // Modjo fixture has album "Modjo (Remastered)" โ€” Lidarr stores it as "Modjo" const modjoArtist = { id: 1, artistName: "Modjo", foreignArtistId: "modjo-123" }; - const modjoAlbum = { id: 20, title: "Modjo", artistId: 1, monitored: false, statistics: { percentOfTracks: 0 } }; + const modjoAlbum = { + id: 20, + title: "Modjo", + artistId: 1, + monitored: false, + statistics: { percentOfTracks: 0 }, + }; await mockLidarrRoutes(page, { artists: [modjoArtist], artistLookup: [modjoArtist], @@ -158,10 +208,18 @@ test("Lidarr: With API key โ€” matches album despite (Remastered) suffix in titl }); }); -test("Lidarr: With API key โ€” newly added artist's matched album is explicitly monitored, others left untouched", async ({ page }) => { +test("Lidarr: With API key โ€” newly added artist's matched album is explicitly monitored, others left untouched", async ({ + page, +}) => { // Artist doesn't exist locally yet; ensureArtist creates it with monitor: "none", // so Lidarr populates albums unmonitored โ€” only the matched album gets PUT-monitored. - const otherAlbum = { id: 11, title: "Some Other Album", artistId: 1, monitored: false, statistics: { percentOfTracks: 0 } }; + const otherAlbum = { + id: 11, + title: "Some Other Album", + artistId: 1, + monitored: false, + statistics: { percentOfTracks: 0 }, + }; let artistPostBody: { monitored?: boolean; addOptions?: { monitor?: string } } | undefined; const { albums } = await mockLidarrRoutes(page, { @@ -191,7 +249,9 @@ test("Lidarr: With API key โ€” newly added artist's matched album is explicitly expect(albums.get(otherAlbum.id)?.monitored).toBe(false); }); -test("Lidarr: With API key โ€” monitors an already-existing artist's unmonitored album before searching", async ({ page }) => { +test("Lidarr: With API key โ€” monitors an already-existing artist's unmonitored album before searching", async ({ + page, +}) => { // Artist already exists locally with the album present but unmonitored (e.g. user // added it manually before) โ€” Shazarr must monitor it before triggering the search. const { albums } = await mockLidarrRoutes(page, { albums: [DEFAULT_ALBUM] }); @@ -208,15 +268,16 @@ test("Lidarr: With API key โ€” monitors an already-existing artist's unmonitored expect(albums.get(DEFAULT_ALBUM.id)?.monitored).toBe(true); }); -test("Lidarr: With API key โ€” shows error when album not found for existing artist", async ({ page }) => { +test("Lidarr: With API key โ€” shows error when album not found for existing artist", async ({ + page, +}) => { // Artist found locally but the identified album isn't in its album list. await mockLidarrRoutes(page, { albums: [] }); await gotoWithConfig(page, { lidarr_url: LIDARR_URL, lidarr_api_key: LIDARR_API_KEY }); await openYakuzaResult(page); await page.getByRole("button", { name: "Download with Lidarr" }).click(); - await expect( - page.getByRole("button", { name: "Album not found in Lidarr" }), - ).toBeVisible({ timeout: 10000 }); + await expect(page.getByRole("button", { name: "Album not found in Lidarr" })).toBeVisible({ + timeout: 10000, + }); }); - diff --git a/testing/tests/offline.spec.ts b/testing/tests/offline.spec.ts index f45c148..8098b69 100644 --- a/testing/tests/offline.spec.ts +++ b/testing/tests/offline.spec.ts @@ -1,8 +1,6 @@ import test, { expect } from "@playwright/test"; -test("Offline: Should save record for further recognition", async ({ - page, -}) => { +test("Offline: Should save record for further recognition", async ({ page }) => { await page.context().setOffline(false); await page.goto("/"); await page.evaluate(() => window.localStorage.clear()); @@ -17,16 +15,12 @@ test("Offline: Should save record for further recognition", async ({ // Run song recognition and cut internet connection await page.getByTestId("record-button").click(); - // Open history panel await page.getByRole("button", { name: "Records" }).click(); await expect(page.getByTestId("history-item")).toHaveCount(1); await expect( - page - .getByTestId("history-item") - .locator("div") - .filter({ hasText: "Offline record - Not" }), + page.getByTestId("history-item").locator("div").filter({ hasText: "Offline record - Not" }), ).toHaveCount(1); // Set online diff --git a/testing/tests/options.spec.ts b/testing/tests/options.spec.ts index e4c68b9..c1966d9 100644 --- a/testing/tests/options.spec.ts +++ b/testing/tests/options.spec.ts @@ -2,11 +2,7 @@ import test, { expect, Page } from "@playwright/test"; import { gotoWithLocalStorage, waitForImgLoaded } from "./utils/helpers"; -async function testExternalServiceButtons( - label: string, - url: string, - page: Page, -) { +async function testExternalServiceButtons(label: string, url: string, page: Page) { await expect(page.locator(".MuiTypography-h5")).toHaveText("Yakuza"); const ctx = page.context(); @@ -25,9 +21,7 @@ async function testExternalServiceButtons( await expect(await capturedUrl).toEqual(url); } -test("Options: Should see options panel and use service buttons", async ({ - page, -}) => { +test("Options: Should see options panel and use service buttons", async ({ page }) => { await gotoWithLocalStorage("/", page); // Open config panel @@ -40,12 +34,8 @@ test("Options: Should see options panel and use service buttons", async ({ await page.getByText("Custom Service").click(); // Fill fields and save - await page - .getByPlaceholder("Lidarr URL (http://...)") - .fill("http://lidarr.server.docker"); - await page - .getByPlaceholder("Tidarr URL (http://...)") - .fill("http://tidarr.server.docker"); + await page.getByPlaceholder("Lidarr URL (http://...)").fill("http://lidarr.server.docker"); + await page.getByPlaceholder("Tidarr URL (http://...)").fill("http://tidarr.server.docker"); await page .getByPlaceholder("Custom service (http://...?") .fill("http://custom.server.docker?query="); @@ -53,9 +43,7 @@ test("Options: Should see options panel and use service buttons", async ({ await page.getByRole("button", { name: "Save configuration" }).click(); - await expect( - page.getByPlaceholder("Lidarr URL (http://...)"), - ).not.toBeVisible(); + await expect(page.getByPlaceholder("Lidarr URL (http://...)")).not.toBeVisible(); // Go to result page await page.getByRole("button", { name: "Records" }).click(); @@ -64,9 +52,9 @@ test("Options: Should see options panel and use service buttons", async ({ await waitForImgLoaded(page); await page.waitForTimeout(1000); - await expect(page.getByText("Download with Lidarr")).toHaveScreenshot( - { maxDiffPixelRatio: 0.05 }, - ); + await expect(page.getByText("Download with Lidarr")).toHaveScreenshot({ + maxDiffPixelRatio: 0.05, + }); // Test button availability on result screen await testExternalServiceButtons( @@ -92,9 +80,7 @@ test("Options: Should see options panel and use service buttons", async ({ await expect(page.getByRole("dialog")).toHaveScreenshot(); }); -test("Options: Auto-listen on launch starts recording automatically", async ({ - page, -}) => { +test("Options: Auto-listen on launch starts recording automatically", async ({ page }) => { await page.addInitScript(() => { window.localStorage.setItem( "CapacitorStorage.com.shazarr.config", @@ -107,9 +93,7 @@ test("Options: Auto-listen on launch starts recording automatically", async ({ await expect(page.getByTestId("inline-result-card")).toBeVisible(); }); -test("Options: Auto-listen disabled by default does not start recording", async ({ - page, -}) => { +test("Options: Auto-listen disabled by default does not start recording", async ({ page }) => { await page.goto("/"); await expect(page.getByText("Ready")).toBeVisible(); diff --git a/testing/tests/soulsync.spec.ts b/testing/tests/soulsync.spec.ts index c5e14f6..308d135 100644 --- a/testing/tests/soulsync.spec.ts +++ b/testing/tests/soulsync.spec.ts @@ -8,14 +8,8 @@ const SOULSYNC_API_KEY = "test-soulsync-api-key"; async function gotoWithConfig(page: Page, config: Record) { await page.addInitScript( ({ config, history }) => { - window.localStorage.setItem( - "CapacitorStorage.com.shazarr.config", - JSON.stringify(config), - ); - window.localStorage.setItem( - "CapacitorStorage.com.shazarr.history", - JSON.stringify(history), - ); + window.localStorage.setItem("CapacitorStorage.com.shazarr.config", JSON.stringify(config)); + window.localStorage.setItem("CapacitorStorage.com.shazarr.history", JSON.stringify(history)); }, { config, history: historyFixtures }, ); @@ -88,7 +82,10 @@ function mockSoulsyncNotFound(page: Page) { await route.fulfill({ status: 200, contentType: "application/json", - body: JSON.stringify({ success: false, error: { code: "NOT_FOUND", message: "No tracks found" } }), + body: JSON.stringify({ + success: false, + error: { code: "NOT_FOUND", message: "No tracks found" }, + }), }); } else if (url.includes("/api/v1/wishlist") && method === "POST") { await route.fulfill({ @@ -140,7 +137,9 @@ test("SoulSync: With API key โ€” adds track to wishlist and shows success", asyn await expect(page.getByTestId("soulsync-dialog")).toBeVisible({ timeout: 10000 }); await page.getByTestId("soulsync-add-track").click(); // Skip "Searching" check - too fast in CI, goes straight to success - await expect(page.getByTestId("soulsync-button")).toContainText(/Added|added|wishlist/i, { timeout: 20000 }); + await expect(page.getByTestId("soulsync-button")).toContainText(/Added|added|wishlist/i, { + timeout: 20000, + }); }); test("SoulSync: With API key โ€” adds album to wishlist and shows success", async ({ page }) => { @@ -153,7 +152,10 @@ test("SoulSync: With API key โ€” adds album to wishlist and shows success", asyn await expect(page.getByTestId("soulsync-dialog")).toBeVisible({ timeout: 10000 }); await page.getByTestId("soulsync-add-album").click(); // Skip "Searching" check - too fast in CI, goes straight to success - await expect(page.getByTestId("soulsync-button")).toContainText(/Added|tracks from|to SoulSync/i, { timeout: 20000 }); + await expect(page.getByTestId("soulsync-button")).toContainText( + /Added|tracks from|to SoulSync/i, + { timeout: 20000 }, + ); }); test("SoulSync: With API key โ€” shows error when track not found", async ({ page }) => { @@ -166,5 +168,8 @@ test("SoulSync: With API key โ€” shows error when track not found", async ({ pag await expect(page.getByTestId("soulsync-dialog")).toBeVisible({ timeout: 10000 }); await page.getByTestId("soulsync-add-track").click(); // Skip "Searching" check - too fast in CI, goes straight to error - await expect(page.getByTestId("soulsync-button")).toContainText(/not found|No match|Error|unreachable/i, { timeout: 20000 }); + await expect(page.getByTestId("soulsync-button")).toContainText( + /not found|No match|Error|unreachable/i, + { timeout: 20000 }, + ); }); diff --git a/testing/tests/tidarr.spec.ts b/testing/tests/tidarr.spec.ts index e70a6ed..efa4343 100644 --- a/testing/tests/tidarr.spec.ts +++ b/testing/tests/tidarr.spec.ts @@ -26,14 +26,8 @@ const MOCK_SETTINGS = { async function gotoWithConfig(page: Page, config: Record) { await page.addInitScript( ({ config, history }) => { - window.localStorage.setItem( - "CapacitorStorage.com.shazarr.config", - JSON.stringify(config), - ); - window.localStorage.setItem( - "CapacitorStorage.com.shazarr.history", - JSON.stringify(history), - ); + window.localStorage.setItem("CapacitorStorage.com.shazarr.config", JSON.stringify(config)); + window.localStorage.setItem("CapacitorStorage.com.shazarr.history", JSON.stringify(history)); }, { config, history: historyFixtures }, ); @@ -47,23 +41,32 @@ async function openYakuzaResult(page: Page) { await expect(page.locator(".MuiTypography-h5")).toHaveText("Yakuza"); } -function mockTidarrRoutes( - page: Page, - overrides: { search?: unknown; albumTracks?: unknown } = {}, -) { +function mockTidarrRoutes(page: Page, overrides: { search?: unknown; albumTracks?: unknown } = {}) { return page.route(`${TIDARR_URL}/**`, async (route) => { const url = route.request().url(); if (url.includes("/proxy/tidal/v2/search")) { const body = overrides.search ?? { albums: { items: [MOCK_ALBUM] } }; - await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify(body) }); + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify(body), + }); } else if (url.includes("/proxy/tidal/v1/pages/album")) { const body = overrides.albumTracks ?? { rows: [null, { modules: [{ pagedList: { items: [{ item: MOCK_TRACK }] } }] }], }; - await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify(body) }); + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify(body), + }); } else if (url.includes("/api/settings")) { - await route.fulfill({ status: 200, contentType: "application/json", body: JSON.stringify(MOCK_SETTINGS) }); + await route.fulfill({ + status: 200, + contentType: "application/json", + body: JSON.stringify(MOCK_SETTINGS), + }); } else if (url.includes("/api/save") && route.request().method() === "POST") { await route.fulfill({ status: 201, body: "Created" }); } else if (url.includes("/proxy/tidal/v1/users/12345/favorites/tracks")) { @@ -114,8 +117,7 @@ test("Tidarr: With API key โ€” shows error when no albums found", async ({ page await openYakuzaResult(page); await page.getByRole("button", { name: "Download with Tidarr" }).click(); - await expect( - page.getByRole("button", { name: "Track not found on Tidal" }), - ).toBeVisible({ timeout: 10000 }); + await expect(page.getByRole("button", { name: "Track not found on Tidal" })).toBeVisible({ + timeout: 10000, + }); }); - diff --git a/testing/tests/utils/helpers.ts b/testing/tests/utils/helpers.ts index 7a61a1c..47109a2 100644 --- a/testing/tests/utils/helpers.ts +++ b/testing/tests/utils/helpers.ts @@ -9,10 +9,7 @@ export async function gotoWithLocalStorage(url: string, page: Page) { const stringifiedData = JSON.stringify(historyFixtures); await page.evaluate( (stringifiedData) => - window.localStorage.setItem( - "CapacitorStorage.com.shazarr.history", - stringifiedData, - ), + window.localStorage.setItem("CapacitorStorage.com.shazarr.history", stringifiedData), stringifiedData, ); // Reload page with diff --git a/tsconfig.json b/tsconfig.json index 1ffef60..d32ff68 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,4 @@ { "files": [], - "references": [ - { "path": "./tsconfig.app.json" }, - { "path": "./tsconfig.node.json" } - ] + "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }] } diff --git a/tsconfig.node.json b/tsconfig.node.json index 501e4f8..0d3d714 100644 --- a/tsconfig.node.json +++ b/tsconfig.node.json @@ -16,7 +16,7 @@ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, + "noFallthroughCasesInSwitch": true }, "include": ["vite.config.ts"] } diff --git a/vite.config.ts b/vite.config.ts index ae96734..256abe4 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,5 +1,5 @@ -import react from '@vitejs/plugin-react' -import { defineConfig } from 'vite' +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; // https://vite.dev/config/ export default defineConfig({ @@ -12,4 +12,4 @@ export default defineConfig({ define: { global: {}, }, -}) +});