From 4726881b6975ccc68e77320b70f04d86d01cfd04 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Wed, 29 Jul 2026 18:06:38 +0000 Subject: [PATCH 1/2] feature: repurpose Hacker News PWA into Vantage 4% cashback card app on Angular 20 Co-Authored-By: Arjun Mishra --- .github/workflows/ci.yml | 30 + .gitignore | 13 +- .travis.yml | 23 - CONTRIBUTING.md | 40 +- README.md | 125 +- angular.json | 119 +- browserslist | 12 - database.rules.json | 6 - e2e/cashback.spec.ts | 54 + e2e/protractor.conf.js | 32 - e2e/src/app.e2e-spec.ts | 23 - e2e/src/app.po.ts | 11 - e2e/tsconfig.json | 13 - eslint.config.js | 44 + firebase.json | 16 +- karma.conf.js | 62 +- ngsw-config.json | 11 +- package-lock.json | 11977 ++++++++++++++++ package.json | 68 +- playwright.config.ts | 23 + .../assets/icons/android-chrome-144x144.png | Bin 0 -> 3766 bytes .../assets/icons/android-chrome-192x192.png | Bin 0 -> 4904 bytes .../assets/icons/android-chrome-256x256.png | Bin 0 -> 6900 bytes .../assets/icons/android-chrome-512x512.png | Bin 0 -> 6938 bytes .../assets/icons/apple-touch-icon-120x120.png | Bin 0 -> 3022 bytes .../assets/icons/apple-touch-icon-152x152.png | Bin 0 -> 3958 bytes .../assets/icons/apple-touch-icon-180x180.png | Bin 0 -> 4548 bytes .../assets/icons/apple-touch-icon-60x60.png | Bin 0 -> 1614 bytes .../assets/icons/apple-touch-icon-76x76.png | Bin 0 -> 2017 bytes public/assets/icons/apple-touch-icon.png | Bin 0 -> 4548 bytes .../assets/icons/browserconfig.xml | 0 public/assets/icons/favicon-16x16.png | Bin 0 -> 485 bytes public/assets/icons/favicon-32x32.png | Bin 0 -> 817 bytes public/assets/icons/mstile-150x150.png | Bin 0 -> 3886 bytes public/assets/icons/safari-pinned-tab.svg | 3 + {src => public}/assets/images/cog.svg | 0 public/assets/images/logo.svg | 7 + public/favicon.ico | Bin 0 -> 4445 bytes .../manifest.webmanifest | 23 +- scripts/generate-icons.py | 50 + src/app/account/account.component.html | 71 + src/app/account/account.component.scss | 38 + src/app/account/account.component.ts | 45 + src/app/account/account.routes.ts | 9 + src/app/app.component.html | 16 +- src/app/app.component.scss | 34 +- src/app/app.component.ts | 35 +- src/app/app.config.ts | 28 + src/app/app.module.ts | 32 - src/app/app.routes.ts | 62 +- src/app/core/core.module.ts | 13 - src/app/core/footer/footer.component.html | 10 +- src/app/core/footer/footer.component.scss | 39 +- src/app/core/footer/footer.component.ts | 20 +- src/app/core/header/header.component.html | 45 +- src/app/core/header/header.component.scss | 204 +- src/app/core/header/header.component.ts | 37 +- .../settings/settings-controls.component.html | 57 + .../settings/settings-controls.component.scss | 38 + .../settings/settings-controls.component.ts | 37 + src/app/core/settings/settings.component.html | 83 +- src/app/core/settings/settings.component.scss | 28 +- src/app/core/settings/settings.component.ts | 45 +- src/app/dashboard/dashboard.component.html | 108 + src/app/dashboard/dashboard.component.scss | 14 + src/app/dashboard/dashboard.component.spec.ts | 41 + src/app/dashboard/dashboard.component.ts | 62 + src/app/feeds/feed/feed.component.html | 24 - src/app/feeds/feed/feed.component.scss | 108 - src/app/feeds/feed/feed.component.ts | 49 - src/app/feeds/item/item.component.html | 39 - src/app/feeds/item/item.component.scss | 68 - src/app/feeds/item/item.component.ts | 26 - .../comment/comment.component.html | 22 - .../comment/comment.component.scss | 85 - .../item-details/comment/comment.component.ts | 19 - .../item-details/item-details.component.html | 59 - .../item-details/item-details.component.scss | 151 - .../item-details/item-details.component.ts | 50 - src/app/item-details/item-details.module.ts | 22 - src/app/rewards/rewards.component.html | 67 + src/app/rewards/rewards.component.scss | 26 + src/app/rewards/rewards.component.spec.ts | 38 + src/app/rewards/rewards.component.ts | 43 + src/app/rewards/rewards.routes.ts | 9 + .../error-message.component.html | 18 +- .../error-message.component.scss | 125 +- .../error-message/error-message.component.ts | 19 +- .../components/loader/loader.component.html | 6 +- .../components/loader/loader.component.scss | 3 +- .../components/loader/loader.component.ts | 18 +- .../components/shared-components.module.ts | 11 - src/app/shared/data/mock-cashback-data.ts | 89 + src/app/shared/models/card-account.ts | 18 + src/app/shared/models/comment.ts | 10 - src/app/shared/models/feed-type.type.ts | 1 - src/app/shared/models/poll-result.ts | 4 - src/app/shared/models/reward.ts | 31 + src/app/shared/models/settings.ts | 13 +- src/app/shared/models/story.ts | 21 - src/app/shared/models/transaction.ts | 27 + src/app/shared/models/user.ts | 8 - src/app/shared/pipes/amount.pipe.ts | 18 + src/app/shared/pipes/comment.pipe.ts | 15 - src/app/shared/pipes/percent-rate.pipe.ts | 12 + src/app/shared/pipes/pipes.module.ts | 8 - src/app/shared/scss/_media.scss | 3 - src/app/shared/scss/_theme_variables.scss | 37 - src/app/shared/scss/_themes.scss | 316 +- src/app/shared/scss/_ui.scss | 190 + src/app/shared/scss/_variables.scss | 47 + .../services/cashback-api.service.spec.ts | 102 + .../shared/services/cashback-api.service.ts | 113 + .../shared/services/hackernews-api.service.ts | 66 - src/app/shared/services/settings.service.ts | 131 +- src/app/shared/util/load-state.ts | 31 + .../transaction-details.component.html | 48 + .../transaction-details.component.scss | 6 + .../transaction-details.component.ts | 44 + .../transactions/transactions.component.html | 69 + .../transactions/transactions.component.scss | 5 + .../transactions.component.spec.ts | 42 + .../transactions/transactions.component.ts | 73 + src/app/transactions/transactions.routes.ts | 15 + src/app/user/user.component.html | 19 - src/app/user/user.component.scss | 89 - src/app/user/user.component.ts | 37 - src/app/user/user.module.ts | 21 - src/assets/icons/android-chrome-144x144.png | Bin 29992 -> 0 bytes src/assets/icons/android-chrome-192x192.png | Bin 5033 -> 0 bytes src/assets/icons/android-chrome-256x256.png | Bin 6756 -> 0 bytes src/assets/icons/android-chrome-512x512.png | Bin 30053 -> 0 bytes src/assets/icons/apple-touch-icon-120x120.png | Bin 2629 -> 0 bytes src/assets/icons/apple-touch-icon-152x152.png | Bin 3304 -> 0 bytes src/assets/icons/apple-touch-icon-180x180.png | Bin 3846 -> 0 bytes src/assets/icons/apple-touch-icon-60x60.png | Bin 1699 -> 0 bytes src/assets/icons/apple-touch-icon-76x76.png | Bin 1993 -> 0 bytes src/assets/icons/apple-touch-icon.png | Bin 3846 -> 0 bytes src/assets/icons/favicon-16x16.png | Bin 694 -> 0 bytes src/assets/icons/favicon-32x32.png | Bin 1371 -> 0 bytes src/assets/icons/mstile-150x150.png | Bin 3656 -> 0 bytes src/assets/icons/safari-pinned-tab.svg | 1 - src/assets/images/logo-header.png | Bin 4109 -> 0 bytes src/assets/images/logo.svg | 1 - src/environments/environment.prod.ts | 4 +- src/environments/environment.ts | 17 +- src/favicon.ico | Bin 5430 -> 0 bytes src/index.html | 55 +- src/main.ts | 14 +- src/polyfills.ts | 63 - src/styles.scss | 24 +- src/test.ts | 20 - tsconfig.app.json | 11 +- tsconfig.json | 44 +- tsconfig.spec.json | 13 +- tslint.json | 92 - yarn.lock | 8973 ------------ 157 files changed, 14681 insertions(+), 11571 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .travis.yml delete mode 100644 browserslist delete mode 100644 database.rules.json create mode 100644 e2e/cashback.spec.ts delete mode 100644 e2e/protractor.conf.js delete mode 100644 e2e/src/app.e2e-spec.ts delete mode 100644 e2e/src/app.po.ts delete mode 100644 e2e/tsconfig.json create mode 100644 eslint.config.js create mode 100644 package-lock.json create mode 100644 playwright.config.ts create mode 100644 public/assets/icons/android-chrome-144x144.png create mode 100644 public/assets/icons/android-chrome-192x192.png create mode 100644 public/assets/icons/android-chrome-256x256.png create mode 100644 public/assets/icons/android-chrome-512x512.png create mode 100644 public/assets/icons/apple-touch-icon-120x120.png create mode 100644 public/assets/icons/apple-touch-icon-152x152.png create mode 100644 public/assets/icons/apple-touch-icon-180x180.png create mode 100644 public/assets/icons/apple-touch-icon-60x60.png create mode 100644 public/assets/icons/apple-touch-icon-76x76.png create mode 100644 public/assets/icons/apple-touch-icon.png rename {src => public}/assets/icons/browserconfig.xml (100%) create mode 100644 public/assets/icons/favicon-16x16.png create mode 100644 public/assets/icons/favicon-32x32.png create mode 100644 public/assets/icons/mstile-150x150.png create mode 100644 public/assets/icons/safari-pinned-tab.svg rename {src => public}/assets/images/cog.svg (100%) create mode 100644 public/assets/images/logo.svg create mode 100644 public/favicon.ico rename src/manifest.json => public/manifest.webmanifest (58%) create mode 100644 scripts/generate-icons.py create mode 100644 src/app/account/account.component.html create mode 100644 src/app/account/account.component.scss create mode 100644 src/app/account/account.component.ts create mode 100644 src/app/account/account.routes.ts create mode 100644 src/app/app.config.ts delete mode 100644 src/app/app.module.ts delete mode 100644 src/app/core/core.module.ts create mode 100644 src/app/core/settings/settings-controls.component.html create mode 100644 src/app/core/settings/settings-controls.component.scss create mode 100644 src/app/core/settings/settings-controls.component.ts create mode 100644 src/app/dashboard/dashboard.component.html create mode 100644 src/app/dashboard/dashboard.component.scss create mode 100644 src/app/dashboard/dashboard.component.spec.ts create mode 100644 src/app/dashboard/dashboard.component.ts delete mode 100644 src/app/feeds/feed/feed.component.html delete mode 100644 src/app/feeds/feed/feed.component.scss delete mode 100644 src/app/feeds/feed/feed.component.ts delete mode 100644 src/app/feeds/item/item.component.html delete mode 100644 src/app/feeds/item/item.component.scss delete mode 100644 src/app/feeds/item/item.component.ts delete mode 100644 src/app/item-details/comment/comment.component.html delete mode 100644 src/app/item-details/comment/comment.component.scss delete mode 100644 src/app/item-details/comment/comment.component.ts delete mode 100644 src/app/item-details/item-details.component.html delete mode 100644 src/app/item-details/item-details.component.scss delete mode 100644 src/app/item-details/item-details.component.ts delete mode 100644 src/app/item-details/item-details.module.ts create mode 100644 src/app/rewards/rewards.component.html create mode 100644 src/app/rewards/rewards.component.scss create mode 100644 src/app/rewards/rewards.component.spec.ts create mode 100644 src/app/rewards/rewards.component.ts create mode 100644 src/app/rewards/rewards.routes.ts delete mode 100644 src/app/shared/components/shared-components.module.ts create mode 100644 src/app/shared/data/mock-cashback-data.ts create mode 100644 src/app/shared/models/card-account.ts delete mode 100644 src/app/shared/models/comment.ts delete mode 100644 src/app/shared/models/feed-type.type.ts delete mode 100644 src/app/shared/models/poll-result.ts create mode 100644 src/app/shared/models/reward.ts delete mode 100644 src/app/shared/models/story.ts create mode 100644 src/app/shared/models/transaction.ts delete mode 100644 src/app/shared/models/user.ts create mode 100644 src/app/shared/pipes/amount.pipe.ts delete mode 100644 src/app/shared/pipes/comment.pipe.ts create mode 100644 src/app/shared/pipes/percent-rate.pipe.ts delete mode 100644 src/app/shared/pipes/pipes.module.ts delete mode 100644 src/app/shared/scss/_media.scss delete mode 100644 src/app/shared/scss/_theme_variables.scss create mode 100644 src/app/shared/scss/_ui.scss create mode 100644 src/app/shared/scss/_variables.scss create mode 100644 src/app/shared/services/cashback-api.service.spec.ts create mode 100644 src/app/shared/services/cashback-api.service.ts delete mode 100644 src/app/shared/services/hackernews-api.service.ts create mode 100644 src/app/shared/util/load-state.ts create mode 100644 src/app/transactions/transaction-details/transaction-details.component.html create mode 100644 src/app/transactions/transaction-details/transaction-details.component.scss create mode 100644 src/app/transactions/transaction-details/transaction-details.component.ts create mode 100644 src/app/transactions/transactions.component.html create mode 100644 src/app/transactions/transactions.component.scss create mode 100644 src/app/transactions/transactions.component.spec.ts create mode 100644 src/app/transactions/transactions.component.ts create mode 100644 src/app/transactions/transactions.routes.ts delete mode 100644 src/app/user/user.component.html delete mode 100644 src/app/user/user.component.scss delete mode 100644 src/app/user/user.component.ts delete mode 100644 src/app/user/user.module.ts delete mode 100644 src/assets/icons/android-chrome-144x144.png delete mode 100644 src/assets/icons/android-chrome-192x192.png delete mode 100644 src/assets/icons/android-chrome-256x256.png delete mode 100644 src/assets/icons/android-chrome-512x512.png delete mode 100644 src/assets/icons/apple-touch-icon-120x120.png delete mode 100644 src/assets/icons/apple-touch-icon-152x152.png delete mode 100644 src/assets/icons/apple-touch-icon-180x180.png delete mode 100644 src/assets/icons/apple-touch-icon-60x60.png delete mode 100644 src/assets/icons/apple-touch-icon-76x76.png delete mode 100644 src/assets/icons/apple-touch-icon.png delete mode 100644 src/assets/icons/favicon-16x16.png delete mode 100644 src/assets/icons/favicon-32x32.png delete mode 100644 src/assets/icons/mstile-150x150.png delete mode 100644 src/assets/icons/safari-pinned-tab.svg delete mode 100644 src/assets/images/logo-header.png delete mode 100644 src/assets/images/logo.svg delete mode 100644 src/favicon.ico delete mode 100644 src/polyfills.ts delete mode 100644 src/test.ts delete mode 100644 tslint.json delete mode 100644 yarn.lock diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..b064e38c3 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,30 @@ +name: CI + +on: + push: + branches: [master] + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + - run: npm ci + - run: npm run lint + - run: npm run test:ci + - run: npm run build + - run: npm run e2e:install + - run: npm run e2e + env: + CI: true + - uses: actions/upload-artifact@v4 + if: failure() + with: + name: playwright-report + path: playwright-report + retention-days: 7 diff --git a/.gitignore b/.gitignore index f4f46a5fe..378aac045 100644 --- a/.gitignore +++ b/.gitignore @@ -4,16 +4,11 @@ /dist /tmp /out-tsc -# Only exists if Bazel was run -/bazel-out +/.angular/cache # dependencies /node_modules -# profiling files -chrome-profiler-events.json -speed-measure-plugin.json - # IDEs and editors /.idea .project @@ -41,6 +36,12 @@ yarn-error.log testem.log /typings +# e2e +/playwright-report +/test-results +/blob-report +/playwright/.cache + # System Files .DS_Store Thumbs.db diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ff155b5fa..000000000 --- a/.travis.yml +++ /dev/null @@ -1,23 +0,0 @@ -language: node_js -node_js: - - "6.9" - -branches: - only: - - master - -before_script: - - npm install -g firebase-tools - - npm install -g @angular/cli - -script: - - npm run build - -after_success: - - firebase use default - - firebase deploy --token $FIREBASE_TOKEN - -notifications: - email: - on_failure: change - on_success: change diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 840cf8244..f0d50b556 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,27 +1,27 @@ # Contributing Thank you for your interest in contributing! Please feel free to put up a PR for any issue or feature request. -Even if you have little to no experience with Angular, I'll be more than happy to help. :) ## Setup -1. Fork the repo -2. Clone your fork -3. Make a branch for your feature or bug fix -4. If you don't have Angular CLI installed: `npm install -g angular-cli@latest` -5. `ng init` -6. Type `n` for each file to not overwrite any file changes -7. Run `npm start` and open `localhost:4200` in a browser -8. Work your magic -9. Run `npm run build` or `npm run static-serve` to kick off a production build and make sure nothing is broken -10. To test service worker changes: - * `npm run build` to kick off a fresh build and update the `dist/` directory - * `npm run precache` to generate the service worker file - * `npm run static-serve` to load the application along with the service worker asset using [live-server](https://github.com/tapio/live-server) -11. Add yourself to the [contributor's list](https://github.com/hdjirdeh/angular2-hn#contributors) in the README! -12. Commit your changes and reference the issue you're addressing (for example: `git commit -am 'Commit message. Closes #5'`) -13. Push your branch to your fork -14. Create a pull request from your branch on your fork to `master` on this repo -15. Have your branch get merged in! :star2: +1. Fork the repo and clone your fork +2. Make a branch for your feature or bug fix +3. `npm install` +4. `npm start` and open `localhost:4200` in a browser +5. Work your magic +6. Before pushing, run: + - `npm run lint` + - `npm test` + - `npm run e2e` (first time: `npm run e2e:install`) + - `npm run build` +7. Commit your changes and reference the issue you're addressing (for example: `git commit -am 'Commit message. Closes #5'`) +8. Push your branch to your fork and open a pull request against `master` -If you experience a problem at any point, please don't hesitate to file an issue or send me a message! +## Notes + +- Feature views live under `src/app//` and are lazy loaded from `src/app/app.routes.ts`. +- All cashback data flows through `src/app/shared/services/cashback-api.service.ts`; keep new data access there. +- The 4% rate comes from `CASHBACK_RATE` in `src/app/shared/data/mock-cashback-data.ts` — never hard-code it elsewhere. +- Service worker changes are only active in production builds (`npm run build`, then serve `dist/vantage-cashback/browser`). + +If you experience a problem at any point, please don't hesitate to file an issue. diff --git a/README.md b/README.md index 67cef9e61..8f10546c6 100644 --- a/README.md +++ b/README.md @@ -1,102 +1,77 @@

- - Angular 2 HN - + Vantage 4% Cash Card

- A progressive Hacker News client built with Angular -

- -

- View App -

- -

- PRs Welcome - Build Status + A progressive web app for the Vantage 4% cash back card — balances, transactions and rewards.

--- -:zap: **Fast:** Service Worker App Shell + Dynamic Content model to achieve faster load times with and without a network. +:zap: **Fast:** Angular 20 standalone components with lazy-loaded feature routes and a service worker app shell. -:iphone: **Responsive:** Completely responsive UI that can be installed to your mobile home screen to provide a native feel. +:iphone: **Responsive:** Installable UI that works on phones and desktops. -:rocket: **Progressive:** [Lighthouse](https://github.com/GoogleChrome/lighthouse) score of 87/100. +:moneybag: **4% on everything:** every purchase earns a flat 4% back — the rate is applied in exactly one place and surfaced across the dashboard, transactions and rewards views. -

- -

+## Features -## Mobile Preview +| Route | What it shows | +| ---------------- | ------------------------------------------------------------------------------------ | +| `/dashboard` | 4% cash back headline, cash back earned, balances and recent transactions | +| `/transactions` | Every transaction with the 4% cash back it earned, filterable by spend category | +| `/transactions/:id` | A single transaction and how its cash back was calculated | +| `/rewards` | Cash back broken down by category, plus redeemed vs. available balances | +| `/account` | Card accounts, credit utilization and display preferences (themes, masking amounts) | -

- -

+## Stack -## Laptop Preview +- **Angular 20** — standalone components, signals, `input()`/`computed()`, lazy routes +- **HttpClient** — via `provideHttpClient(withFetch())` +- **`@angular/service-worker`** — PWA/offline support (`ngsw-config.json`) +- **ESLint** (`angular-eslint`) — replaced TSLint/codelyzer +- **Karma + Jasmine** — unit tests +- **Playwright** — end-to-end tests (replaced Protractor) +- **SCSS theme engine** — Default / Night / Black (AMOLED) -

- -

+## Data -## Offline Support +There is no cashback backend yet, so [`CashbackApiService`](src/app/shared/services/cashback-api.service.ts) serves +in-memory fixtures from [`mock-cashback-data.ts`](src/app/shared/data/mock-cashback-data.ts). Set +`environment.apiBaseUrl` to a real API origin and the same methods (`fetchCardAccounts()`, `fetchTransactions()`, +`fetchRewardsSummary()`, `fetchCashbackRate()`) issue `HttpClient` requests instead — no caller changes needed. -This app uses [Workbox](https://workboxjs.org/) to generate a service worker as part of the build step to load quickly and work offline. +Cash back is derived from the single `CASHBACK_RATE = 0.04` constant, so the ledger, the per-transaction amounts and +the rewards breakdown can never disagree. -## Manifest +## Development -With Chromium based browsers for Android (Chrome, Opera, etc...), Angular 2 HN includes a Web App Manifest that allows you to install to your homescreen. +```bash +npm install +npm start # dev server on http://localhost:4200 +npm run build # production build into dist/vantage-cashback +npm run lint # ESLint +npm test # Karma + Jasmine unit tests +npm run e2e:install && npm run e2e # Playwright end-to-end tests +``` -

- -

- -## Themes - -Built in theme engine! - -Current themes: -* Default -* Night -* Black (AMOLED) +Regenerate the PWA icons after changing the brand mark with `python3 scripts/generate-icons.py`. -More to come! +Service worker behaviour is only enabled in production builds; serve `dist/vantage-cashback/browser` with any static +server to exercise it. -## Areas of improvement - - - Realtime updating using the Firebase SDK (may need to add option to settings so service worker can still rely on REST endpoints) - - Server side rendering - -Feel free to send me feedback on [twitter](https://twitter.com/hdjirdeh) or [file an issue](https://github.com/hdjirdeh/angular2-hn/issues/new)! Feature requests are always welcome. - -## Build process - -Note: This project has been ejected (with AOT + production settings) in order to customize Webpack configurations. +## Themes - - Clone or download the repo - - `npm install` - - `npm start` to run the application with webpack-dev-server or `npm build` to kick off a fresh build and update the output directory (`dist/`) +Built-in theme engine with Default, Night and Black (AMOLED). Themes, font size, list spacing and amount masking are +managed by `SettingsService` and persisted to `localStorage`. -Note: Any Service Worker changes will not be reflected when you run the application locally in development. To test service worker changes: - - `npm build` - - `npm run precache` to generate the service worker file - - `npm run static-serve` to load the application along with the service worker asset using [live-server](https://github.com/tapio/live-server) +## Deployment -## Contributors +`npm run build` then `firebase deploy` — hosting serves `dist/vantage-cashback/browser` with SPA rewrites +(see [`firebase.json`](firebase.json)). CI runs lint, unit tests, e2e and a production build on every push and pull +request (see [`.github/workflows/ci.yml`](.github/workflows/ci.yml)). -A million thanks to some awesome people :) +## Credits -* [Ashwin Sureshkumar](https://github.com/ashwin-sureshkumar) -* [Mateusz](https://github.com/mateuszwitkowski) -* [Jordi Collell](https://github.com/jordic) -* [Ben Brooks](https://github.com/bbrks) -* [Zach Berger](https://github.com/zachberger) -* [blAck PR](https://github.com/blackpr) -* [Bram Borggreve](https://github.com/beeman) -* [Antonio Indrianjafy](https://github.com/Antogin) -* [Addy Osmani](https://github.com/addyosmani) -* [Majid Hajian](https://github.com/mhadaily) -* [Jeff Cross](https://github.com/jeffbcross) -* [Minko Gechev](https://github.com/mgechev) +This project began as [angular2-hn](https://github.com/hdjirdeh/angular2-hn), a Hacker News PWA by Houssein Djirdeh and +contributors, and was repurposed into a credit card cash back experience. diff --git a/angular.json b/angular.json index bae858c47..93903518b 100644 --- a/angular.json +++ b/angular.json @@ -1,9 +1,13 @@ { "$schema": "./node_modules/@angular/cli/lib/config/schema.json", "version": 1, + "cli": { + "packageManager": "npm", + "schematicCollections": ["angular-eslint"] + }, "newProjectRoot": "projects", "projects": { - "angular-hnpwa": { + "vantage-cashback": { "projectType": "application", "schematics": { "@schematics/angular:component": { @@ -15,24 +19,21 @@ "prefix": "app", "architect": { "build": { - "builder": "@angular-devkit/build-angular:browser", + "builder": "@angular/build:application", "options": { - "aot": true, - "outputPath": "dist/angular-hnpwa", + "outputPath": "dist/vantage-cashback", "index": "src/index.html", - "main": "src/main.ts", - "polyfills": "src/polyfills.ts", + "browser": "src/main.ts", + "polyfills": ["zone.js"], "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "scss", "assets": [ - "src/favicon.ico", - "src/assets", - "src/manifest.json", - "src/manifest.webmanifest" - ], - "styles": [ - "src/styles.scss" + { + "glob": "**/*", + "input": "public" + } ], - "scripts": [] + "styles": ["src/styles.scss"] }, "configurations": { "production": { @@ -42,93 +43,67 @@ "with": "src/environments/environment.prod.ts" } ], - "optimization": true, - "outputHashing": "all", - "sourceMap": true, - "extractCss": true, - "namedChunks": true, - "aot": true, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, "budgets": [ { "type": "initial", - "maximumWarning": "2mb", - "maximumError": "5mb" + "maximumWarning": "500kB", + "maximumError": "1MB" }, { "type": "anyComponentStyle", - "maximumWarning": "6kb" + "maximumWarning": "6kB", + "maximumError": "10kB" } ], - "serviceWorker": true, - "ngswConfigPath": "ngsw-config.json" + "outputHashing": "all", + "serviceWorker": "ngsw-config.json" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true } - } + }, + "defaultConfiguration": "production" }, "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "angular-hnpwa:build" - }, + "builder": "@angular/build:dev-server", "configurations": { "production": { - "browserTarget": "angular-hnpwa:build:production" + "buildTarget": "vantage-cashback:build:production" + }, + "development": { + "buildTarget": "vantage-cashback:build:development" } - } + }, + "defaultConfiguration": "development" }, "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "angular-hnpwa:build" - } + "builder": "@angular/build:extract-i18n" }, "test": { - "builder": "@angular-devkit/build-angular:karma", + "builder": "@angular/build:karma", "options": { - "main": "src/test.ts", - "polyfills": "src/polyfills.ts", + "polyfills": ["zone.js", "zone.js/testing"], "tsConfig": "tsconfig.spec.json", + "inlineStyleLanguage": "scss", "karmaConfig": "karma.conf.js", "assets": [ - "src/favicon.ico", - "src/assets", - "src/manifest.webmanifest" - ], - "styles": [ - "src/styles.scss" + { + "glob": "**/*", + "input": "public" + } ], - "scripts": [] + "styles": ["src/styles.scss"] } }, "lint": { - "builder": "@angular-devkit/build-angular:tslint", + "builder": "@angular-eslint/builder:lint", "options": { - "tsConfig": [ - "tsconfig.app.json", - "tsconfig.spec.json", - "e2e/tsconfig.json" - ], - "exclude": [ - "**/node_modules/**" - ] - } - }, - "e2e": { - "builder": "@angular-devkit/build-angular:protractor", - "options": { - "protractorConfig": "e2e/protractor.conf.js", - "devServerTarget": "angular-hnpwa:serve" - }, - "configurations": { - "production": { - "devServerTarget": "angular-hnpwa:serve:production" - } + "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"] } } } } - }, - "defaultProject": "angular-hnpwa" + } } diff --git a/browserslist b/browserslist deleted file mode 100644 index 80848532e..000000000 --- a/browserslist +++ /dev/null @@ -1,12 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -> 0.5% -last 2 versions -Firefox ESR -not dead -not IE 9-11 # For IE 9-11 support, remove 'not'. \ No newline at end of file diff --git a/database.rules.json b/database.rules.json deleted file mode 100644 index 8e33ddc1e..000000000 --- a/database.rules.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "rules": { - ".read": "auth != null", - ".write": "auth != null" - } -} diff --git a/e2e/cashback.spec.ts b/e2e/cashback.spec.ts new file mode 100644 index 000000000..1f3bf355e --- /dev/null +++ b/e2e/cashback.spec.ts @@ -0,0 +1,54 @@ +import { expect, test } from '@playwright/test'; + +test.describe('Vantage cashback app', () => { + test('dashboard headlines the 4% rate with balances and recent cashback', async ({ page }) => { + await page.goto('/'); + + await expect(page).toHaveURL(/\/dashboard$/); + await expect(page.getByTestId('cashback-rate')).toHaveText('4%'); + await expect(page.getByRole('heading', { name: /4% cash back on every purchase/i })).toBeVisible(); + await expect(page.getByTestId('total-cashback')).toHaveText(/^\$\d/); + await expect(page.getByTestId('current-balance')).toHaveText(/^\$\d/); + await expect(page.locator('.list-row').first()).toContainText('back'); + }); + + test('transactions list shows per-transaction cashback and filters by category', async ({ page }) => { + await page.goto('/transactions'); + + const rows = page.locator('.list-row'); + await expect(rows.first()).toContainText('4%'); + const totalRows = await rows.count(); + + await page.getByRole('button', { name: 'Dining' }).click(); + + await expect(rows).not.toHaveCount(totalRows); + await expect(page.getByTestId('filtered-cashback')).toHaveText(/^\$\d/); + }); + + test('transaction details explain the 4% calculation', async ({ page }) => { + await page.goto('/transactions'); + await page.locator('.list-row').first().click(); + + await expect(page).toHaveURL(/\/transactions\/txn-\d+$/); + await expect(page.getByRole('heading', { name: 'How this was calculated' })).toBeVisible(); + await expect(page.locator('.calculation')).toContainText('× 4% ='); + await expect(page.getByTestId('transaction-cashback')).toHaveText(/^\$\d/); + }); + + test('rewards page breaks cashback down by category', async ({ page }) => { + await page.goto('/rewards'); + + await expect(page.getByTestId('cashback-rate')).toHaveText('4%'); + await expect(page.getByTestId('category-row').first()).toContainText('of cash back'); + expect(await page.getByTestId('category-row').count()).toBeGreaterThan(1); + }); + + test('card page lists accounts and keeps the theme engine', async ({ page }) => { + await page.goto('/account'); + + await expect(page.getByRole('heading', { name: /Vantage 4% Cash Card/ }).first()).toBeVisible(); + await page.getByLabel('Night').check(); + + await expect(page.locator('div.night')).toBeVisible(); + }); +}); diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js deleted file mode 100644 index 73e4e6806..000000000 --- a/e2e/protractor.conf.js +++ /dev/null @@ -1,32 +0,0 @@ -// @ts-check -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const { SpecReporter } = require('jasmine-spec-reporter'); - -/** - * @type { import("protractor").Config } - */ -exports.config = { - allScriptsTimeout: 11000, - specs: [ - './src/**/*.e2e-spec.ts' - ], - capabilities: { - 'browserName': 'chrome' - }, - directConnect: true, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function() {} - }, - onPrepare() { - require('ts-node').register({ - project: require('path').join(__dirname, './tsconfig.json') - }); - jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); - } -}; \ No newline at end of file diff --git a/e2e/src/app.e2e-spec.ts b/e2e/src/app.e2e-spec.ts deleted file mode 100644 index 0897abab0..000000000 --- a/e2e/src/app.e2e-spec.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { AppPage } from './app.po'; -import { browser, logging } from 'protractor'; - -describe('workspace-project App', () => { - let page: AppPage; - - beforeEach(() => { - page = new AppPage(); - }); - - it('should display welcome message', () => { - page.navigateTo(); - expect(page.getTitleText()).toEqual('Welcome to angular-hnpwa!'); - }); - - afterEach(async () => { - // Assert that there are no errors emitted from the browser - const logs = await browser.manage().logs().get(logging.Type.BROWSER); - expect(logs).not.toContain(jasmine.objectContaining({ - level: logging.Level.SEVERE, - } as logging.Entry)); - }); -}); diff --git a/e2e/src/app.po.ts b/e2e/src/app.po.ts deleted file mode 100644 index 5776aa9eb..000000000 --- a/e2e/src/app.po.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { browser, by, element } from 'protractor'; - -export class AppPage { - navigateTo() { - return browser.get(browser.baseUrl) as Promise; - } - - getTitleText() { - return element(by.css('app-root h1')).getText() as Promise; - } -} diff --git a/e2e/tsconfig.json b/e2e/tsconfig.json deleted file mode 100644 index 39b800f78..000000000 --- a/e2e/tsconfig.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../tsconfig.json", - "compilerOptions": { - "outDir": "../out-tsc/e2e", - "module": "commonjs", - "target": "es5", - "types": [ - "jasmine", - "jasminewd2", - "node" - ] - } -} diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 000000000..8fedb6a7a --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,44 @@ +// @ts-check +const eslint = require("@eslint/js"); +const { defineConfig } = require("eslint/config"); +const tseslint = require("typescript-eslint"); +const angular = require("angular-eslint"); + +module.exports = defineConfig([ + { + files: ["**/*.ts"], + extends: [ + eslint.configs.recommended, + tseslint.configs.recommended, + tseslint.configs.stylistic, + angular.configs.tsRecommended, + ], + processor: angular.processInlineTemplates, + rules: { + "@angular-eslint/directive-selector": [ + "error", + { + type: "attribute", + prefix: "app", + style: "camelCase", + }, + ], + "@angular-eslint/component-selector": [ + "error", + { + type: "element", + prefix: "app", + style: "kebab-case", + }, + ], + }, + }, + { + files: ["**/*.html"], + extends: [ + angular.configs.templateRecommended, + angular.configs.templateAccessibility, + ], + rules: {}, + } +]); diff --git a/firebase.json b/firebase.json index 67d566789..fe6529f91 100644 --- a/firebase.json +++ b/firebase.json @@ -1,14 +1,22 @@ { - "database": { - "rules": "database.rules.json" - }, "hosting": { - "public": "dist", + "public": "dist/vantage-cashback/browser", + "ignore": ["firebase.json", "**/.*", "**/node_modules/**"], "rewrites": [ { "source": "**", "destination": "/index.html" } + ], + "headers": [ + { + "source": "/ngsw-worker.js", + "headers": [{ "key": "Cache-Control", "value": "no-cache" }] + }, + { + "source": "/ngsw.json", + "headers": [{ "key": "Cache-Control", "value": "no-cache" }] + } ] } } diff --git a/karma.conf.js b/karma.conf.js index f88489561..590eaee80 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,32 +1,34 @@ -// Karma configuration file, see link for more information -// https://karma-runner.github.io/1.0/config/configuration-file.html - +// Karma configuration. See https://karma-runner.github.io/6.4/config/configuration-file.html module.exports = function (config) { - config.set({ - basePath: '', - frameworks: ['jasmine', '@angular-devkit/build-angular'], - plugins: [ - require('karma-jasmine'), - require('karma-chrome-launcher'), - require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), - require('@angular-devkit/build-angular/plugins/karma') - ], - client: { - clearContext: false // leave Jasmine Spec Runner output visible in browser - }, - coverageIstanbulReporter: { - dir: require('path').join(__dirname, './coverage/angular-hnpwa'), - reports: ['html', 'lcovonly', 'text-summary'], - fixWebpackSourcePaths: true - }, - reporters: ['progress', 'kjhtml'], - port: 9876, - colors: true, - logLevel: config.LOG_INFO, - autoWatch: true, - browsers: ['Chrome'], - singleRun: false, - restartOnFileChange: true - }); + config.set({ + basePath: '', + frameworks: ['jasmine'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + ], + client: { + jasmine: {}, + clearContext: false, + }, + jasmineHtmlReporter: { + suppressAll: true, + }, + coverageReporter: { + dir: require('path').join(__dirname, './coverage/vantage-cashback'), + subdir: '.', + reporters: [{ type: 'html' }, { type: 'text-summary' }], + }, + reporters: ['progress', 'kjhtml'], + browsers: ['Chrome'], + customLaunchers: { + ChromeHeadlessNoSandbox: { + base: 'ChromeHeadless', + flags: ['--no-sandbox', '--disable-gpu', '--disable-dev-shm-usage'], + }, + }, + restartOnFileChange: true, + }); }; diff --git a/ngsw-config.json b/ngsw-config.json index 23720c348..69edd2878 100644 --- a/ngsw-config.json +++ b/ngsw-config.json @@ -8,20 +8,21 @@ "resources": { "files": [ "/favicon.ico", + "/index.csr.html", "/index.html", + "/manifest.webmanifest", "/*.css", - "/*.js", - "/manifest.webmanifest" + "/*.js" ] } - }, { + }, + { "name": "assets", "installMode": "lazy", "updateMode": "prefetch", "resources": { "files": [ - "/assets/**", - "/*.(eot|svg|cur|jpg|png|webp|gif|otf|ttf|woff|woff2|ani)" + "/**/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)" ] } } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..0ec9d6516 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,11977 @@ +{ + "name": "vantage-cashback-pwa", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vantage-cashback-pwa", + "version": "1.0.0", + "dependencies": { + "@angular/common": "^20.3.0", + "@angular/compiler": "^20.3.0", + "@angular/core": "^20.3.0", + "@angular/forms": "^20.3.0", + "@angular/platform-browser": "^20.3.0", + "@angular/router": "^20.3.0", + "@angular/service-worker": "^20.3.0", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.15.0" + }, + "devDependencies": { + "@angular/build": "^20.3.32", + "@angular/cli": "^20.3.32", + "@angular/compiler-cli": "^20.3.0", + "@playwright/test": "^1.49.1", + "@types/jasmine": "~5.1.0", + "angular-eslint": "21.0.1", + "eslint": "^9.39.1", + "jasmine-core": "~5.9.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "typescript": "~5.9.2", + "typescript-eslint": "8.46.4" + } + }, + "node_modules/@algolia/abtesting": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", + "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-abtesting": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", + "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", + "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", + "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", + "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", + "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", + "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", + "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/ingestion": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", + "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/monitoring": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", + "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", + "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", + "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-fetch": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", + "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", + "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.2003.32", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2003.32.tgz", + "integrity": "sha512-V5d531w97LENARKdYk5Km0F2rt8NPEL3rXUQk7+gbo9r/jgLWn9GU3VHQ30oBWXnU7Vu00Hdp/8yFeYgpWqSow==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.32", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/core": { + "version": "20.3.32", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-20.3.32.tgz", + "integrity": "sha512-pXipSsYP/XTEAljmwqgy1u3GR/ZzSMg1FERINekGT61Th1pGhzjs02rPgbyftqz2e5/tfQ6XgTP7xYzm3+S35Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^4.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/schematics": { + "version": "20.3.32", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-20.3.32.tgz", + "integrity": "sha512-UxWncmJTcYMDEaAKRi3QHU3qXivIcIOulFOKozW8svfs/A43Oq1GG4kvDZ+WVf/w2UWTmMaSlfFa4KIQciSIDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.32", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.17", + "ora": "8.2.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-eslint/builder": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-21.0.1.tgz", + "integrity": "sha512-6BqpmW0XvjTOs2YOHwzeZcQ32eL8vs8SCHjt1cQnq1+libOVDXky1eb/jRs7ouyA49UagLDoM34K1kjrYo8P3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": ">= 0.2100.0 < 0.2200.0", + "@angular-devkit/core": ">= 21.0.0 < 22.0.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/builder/node_modules/@angular-devkit/architect": { + "version": "0.2102.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.2102.19.tgz", + "integrity": "sha512-cj4tzUMiloLTg5rNf17E8MsvIxCWYoBiBsaj7ns6dgXqT9XCeG+J0TA2t1M+N9uuqfeLd22U/rYoCkADmcircQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "21.2.19", + "rxjs": "7.8.2" + }, + "bin": { + "architect": "bin/cli.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-eslint/builder/node_modules/@angular-devkit/core": { + "version": "21.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.19.tgz", + "integrity": "sha512-dtpJMQBz5nhkcIogPmXP/aT2Ak8m/wLRPOSTI/g4vSJSuGiI53PgtWq4/wfQga6E6wdM2XWsblAE89d8w5heQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/builder/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-eslint/builder/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-21.0.1.tgz", + "integrity": "sha512-Kb59SopkJ2sDgZSysL+ZqcfqM2cbK+gciAyHljkrCUsqo66eEq5KCZUU//RVoo4MHi+qL/dFy54JG/+A/35xcQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-21.0.1.tgz", + "integrity": "sha512-tSb5qgIwoMrX3Z17dSsHrNFWrgBWafxK7IQudU0RXxdzq6joq1qDrzHwLT3Jn+Y6ocn0jdavAefEGHAhomCjcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "21.0.1", + "@angular-eslint/utils": "21.0.1", + "ts-api-utils": "^2.1.0" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-21.0.1.tgz", + "integrity": "sha512-DF1WEMalbV1hNKxbu3nwK1yUa+E2FQpNz0KDORU65/vdCffeuftCetobrsAS7zDgJ6FO+Fsb+ZeCzNKEhhh1vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "21.0.1", + "@angular-eslint/utils": "21.0.1", + "aria-query": "5.3.2", + "axobject-query": "4.1.0" + }, + "peerDependencies": { + "@angular-eslint/template-parser": "21.0.1", + "@typescript-eslint/types": "^7.11.0 || ^8.0.0", + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/schematics": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-21.0.1.tgz", + "integrity": "sha512-IdtGdRPuJctHuiZ8v8SN3MqWiUa3cD9Q5jFvIRkAkjpHXXmTk5PYelSjUP8UX/zfUfFkxHXghasTmJd2+252OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": ">= 21.0.0 < 22.0.0", + "@angular-devkit/schematics": ">= 21.0.0 < 22.0.0", + "@angular-eslint/eslint-plugin": "21.0.1", + "@angular-eslint/eslint-plugin-template": "21.0.1", + "ignore": "7.0.5", + "semver": "7.7.3", + "strip-json-comments": "3.1.1" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/@angular-devkit/core": { + "version": "21.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.19.tgz", + "integrity": "sha512-dtpJMQBz5nhkcIogPmXP/aT2Ak8m/wLRPOSTI/g4vSJSuGiI53PgtWq4/wfQga6E6wdM2XWsblAE89d8w5heQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-eslint/schematics/node_modules/@angular-devkit/schematics": { + "version": "21.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.19.tgz", + "integrity": "sha512-AG3Fzh9wJCmKBfxUQOUWaEHMj5Gq2O+Msf1z52aDSxbVhs5/iSQcXGPv/DLdAXu7d4xmQhLouNe9Glaq2omDyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "21.2.19", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.21", + "ora": "9.3.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/ora": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz", + "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.3.1", + "string-width": "^8.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/stdin-discarder": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz", + "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-eslint/schematics/node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-eslint/template-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-21.0.1.tgz", + "integrity": "sha512-1KocmjmBP0qlKQGRhRGN0MGvLxf1q2KDWbvzn7ZGdQrIDLC/hFJ8YmnOWsPrM9RxiZi0o5BxCCu9D7KlbthxIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "21.0.1", + "eslint-scope": "^9.0.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular-eslint/utils": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-21.0.1.tgz", + "integrity": "sha512-tovWIDiEsfSAsPWH+/wL9Hfl/Hc+2j2IP+Z85I6uWTbynLVdyURx8gmJjKBUTSCmcyrgBnTbnnlr4DTM6/aFOg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-eslint/bundled-angular-compiler": "21.0.1" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*" + } + }, + "node_modules/@angular/build": { + "version": "20.3.32", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-20.3.32.tgz", + "integrity": "sha512-ph/qcT6C7RYriU5dxXfNrYBEvCwU4acxTNoxkdGQHYxM7iOKT0K1YO6v5JBNRZ1S4LOJhWmGaWzJ+sRei0iGsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "2.3.0", + "@angular-devkit/architect": "0.2003.32", + "@babel/core": "7.29.7", + "@babel/helper-annotate-as-pure": "7.27.3", + "@babel/helper-split-export-declaration": "7.24.7", + "@inquirer/confirm": "5.1.14", + "@vitejs/plugin-basic-ssl": "2.1.0", + "beasties": "0.3.5", + "browserslist": "^4.23.0", + "esbuild": "0.28.1", + "https-proxy-agent": "7.0.6", + "istanbul-lib-instrument": "6.0.3", + "jsonc-parser": "3.3.1", + "listr2": "9.0.1", + "magic-string": "0.30.17", + "mrmime": "2.0.1", + "parse5-html-rewriting-stream": "8.0.0", + "picomatch": "4.0.4", + "piscina": "5.2.0", + "rollup": "4.59.0", + "sass": "1.90.0", + "semver": "7.7.2", + "source-map-support": "0.5.21", + "tinyglobby": "0.2.14", + "vite": "7.3.6", + "watchpack": "2.4.4" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "lmdb": "3.4.2" + }, + "peerDependencies": { + "@angular/compiler": "^20.0.0", + "@angular/compiler-cli": "^20.0.0", + "@angular/core": "^20.0.0", + "@angular/localize": "^20.0.0", + "@angular/platform-browser": "^20.0.0", + "@angular/platform-server": "^20.0.0", + "@angular/service-worker": "^20.0.0", + "@angular/ssr": "^20.3.32", + "karma": "^6.4.0", + "less": "^4.2.0", + "ng-packagr": "^20.0.0", + "postcss": "^8.4.0", + "tailwindcss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "tslib": "^2.3.0", + "typescript": ">=5.8 <6.0", + "vitest": "^3.1.1" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + }, + "@angular/localize": { + "optional": true + }, + "@angular/platform-browser": { + "optional": true + }, + "@angular/platform-server": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "@angular/ssr": { + "optional": true + }, + "karma": { + "optional": true + }, + "less": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tailwindcss": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@angular/cli": { + "version": "20.3.32", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-20.3.32.tgz", + "integrity": "sha512-WIMbTrEJYVVz4Phs8nn6yK/bzCSt1dDlxtAEnS2melTWXKGF6WK/OqVaH0+Cox0SNagA81dvvSbGlFYCxncYfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/architect": "0.2003.32", + "@angular-devkit/core": "20.3.32", + "@angular-devkit/schematics": "20.3.32", + "@inquirer/prompts": "7.8.2", + "@listr2/prompt-adapter-inquirer": "3.0.1", + "@modelcontextprotocol/sdk": "1.26.0", + "@schematics/angular": "20.3.32", + "@yarnpkg/lockfile": "1.1.0", + "algoliasearch": "5.35.0", + "ini": "5.0.0", + "jsonc-parser": "3.3.1", + "listr2": "9.0.1", + "npm-package-arg": "13.0.0", + "pacote": "21.5.1", + "resolve": "1.22.10", + "semver": "7.7.2", + "yargs": "18.0.0", + "zod": "4.1.13" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "20.3.26", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-20.3.26.tgz", + "integrity": "sha512-35+aHaCmldFZ2qFiH83+cHcDXwUqSEuUR5DVApcd+Ku8PfIIGo8uMiD5++Qq7QIUTbZCD2glAiE9jLroGrf1Cw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/core": "20.3.26", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "20.3.26", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-20.3.26.tgz", + "integrity": "sha512-H4DVTBCiyM4dGytFi2C8sMGflxXzPnoQ6Ajfs4hJ/Dekg6ypfvW5Ze7BDh4TaMQvaX2joM5LhBYW5jTxBx66hA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@angular/compiler-cli": { + "version": "20.3.26", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-20.3.26.tgz", + "integrity": "sha512-3rHtC87ecldvaiFHwQEZ6Wx3QaZ/Q7b0Gb7XORDOjn/M+5CYZ4rQsvbxE5TUjwreg07oQ4Y2h8ADESXTJEUYOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "7.29.7", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^4.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^18.0.0" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/compiler": "20.3.26", + "typescript": ">=5.8 <6.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@angular/core": { + "version": "20.3.26", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.3.26.tgz", + "integrity": "sha512-v+YtZ9eQVDb6v3V1TbUUBHU63FEp8Hqqqb3UhM4MLAOm0chyyh9jah7FiHr3HbCKrV1f4long1coftFK/KThog==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/compiler": "20.3.26", + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0" + }, + "peerDependenciesMeta": { + "@angular/compiler": { + "optional": true + }, + "zone.js": { + "optional": true + } + } + }, + "node_modules/@angular/forms": { + "version": "20.3.26", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-20.3.26.tgz", + "integrity": "sha512-ia0YaPVjlG2oBFKCfaAgqQ0jGRrhGTAcrbZG3tVeFDpi7LQ6WdP3Syw2H+0D3GPyzpl/5UqU10Fum5Wr1br4QQ==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.3.26", + "@angular/core": "20.3.26", + "@angular/platform-browser": "20.3.26", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "20.3.26", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-20.3.26.tgz", + "integrity": "sha512-In4wUiLUUT9LqyV9Rjz78k/dsnKAwec4AtDmwZoX8/ZmeJOSH7g5X1gTM+hxTxmifmZkrapQjXR299IcfIkzrw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/animations": "20.3.26", + "@angular/common": "20.3.26", + "@angular/core": "20.3.26" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/router": { + "version": "20.3.26", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-20.3.26.tgz", + "integrity": "sha512-q0k0b5uuQx93Trk4qEMYe8LoPOozheRBIjze51q+LUTlLXWik4W0ughXLiTJL346KRudR/vB5ksfZP8b6WlQyA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/common": "20.3.26", + "@angular/core": "20.3.26", + "@angular/platform-browser": "20.3.26", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/service-worker": { + "version": "20.3.26", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-20.3.26.tgz", + "integrity": "sha512-Lham5sD4yc6lDUgxyRm3i7zo9fjla4HfQAo3uoU4cA4iJ9pRmtTxWPJUA4/YFOD+pCDT7ffV4X9VfGmwvThwyw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "bin": { + "ngsw-config": "ngsw-config.js" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/core": "20.3.26", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.5" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.17.tgz", + "integrity": "sha512-w+aeW/mkgM4PyRMOJCgi3fOrTm5Q8QY1OSfn2TO2iuDj3ezIHqejmuxbjfPrqUkgqRew1iqkyAn0tr0ZwHD9+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.3.0", + "minimatch": "^3.1.5", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.17.tgz", + "integrity": "sha512-w+aeW/mkgM4PyRMOJCgi3fOrTm5Q8QY1OSfn2TO2iuDj3ezIHqejmuxbjfPrqUkgqRew1iqkyAn0tr0ZwHD9+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@gar/promise-retry": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@gar/promise-retry/-/promise-retry-1.0.3.tgz", + "integrity": "sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@hono/node-server": { + "version": "1.19.17", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.17.tgz", + "integrity": "sha512-dSneS5qhiauZWGDCeK4o695Xd9nUNjviSZCMQrj10eetr8Uln1ucn6bbphOM6UynAMMtNIzZNSpL9vnASJwrPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.14.1" + }, + "peerDependencies": { + "hono": "^4" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@inquirer/ansi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@inquirer/ansi/-/ansi-1.0.2.tgz", + "integrity": "sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/checkbox": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.3.2.tgz", + "integrity": "sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.14", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.14.tgz", + "integrity": "sha512-5yR4IBfe0kXe59r1YCTG8WXkUbl7Z35HK87Sw+WUyGD8wNUx7JvY7laahzeytyE1oLn74bQnL7hstctQxisQ8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.15", + "@inquirer/type": "^3.0.8" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "10.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.3.2.tgz", + "integrity": "sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/editor": { + "version": "4.2.23", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.23.tgz", + "integrity": "sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/external-editor": "^1.0.3", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/expand": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.23.tgz", + "integrity": "sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.15.tgz", + "integrity": "sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/input": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.3.1.tgz", + "integrity": "sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/number": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.23.tgz", + "integrity": "sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/password": { + "version": "4.0.23", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.23.tgz", + "integrity": "sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/prompts": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.8.2.tgz", + "integrity": "sha512-nqhDw2ZcAUrKNPwhjinJny903bRhI0rQhiDz1LksjeRxqa36i3l75+4iXbOy0rlDpLJGxqtgoPavQjmmyS5UJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/checkbox": "^4.2.1", + "@inquirer/confirm": "^5.1.14", + "@inquirer/editor": "^4.2.17", + "@inquirer/expand": "^4.0.17", + "@inquirer/input": "^4.2.1", + "@inquirer/number": "^3.0.17", + "@inquirer/password": "^4.0.17", + "@inquirer/rawlist": "^4.1.5", + "@inquirer/search": "^3.1.0", + "@inquirer/select": "^4.3.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/rawlist": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.11.tgz", + "integrity": "sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/search": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.2.2.tgz", + "integrity": "sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.4.2.tgz", + "integrity": "sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^1.0.2", + "@inquirer/core": "^10.3.2", + "@inquirer/figures": "^1.0.15", + "@inquirer/type": "^3.0.10", + "yoctocolors-cjs": "^2.1.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.10.tgz", + "integrity": "sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@listr2/prompt-adapter-inquirer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@listr2/prompt-adapter-inquirer/-/prompt-adapter-inquirer-3.0.1.tgz", + "integrity": "sha512-3XFmGwm3u6ioREG+ynAQB7FoxfajgQnMhIu8wC5eo/Lsih4aKDg0VuIMGaOsYn7hJSJagSeaD4K8yfpkEoDEmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/type": "^3.0.7" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "@inquirer/prompts": ">= 3 < 8", + "listr2": "9.0.1" + } + }, + "node_modules/@lmdb/lmdb-darwin-arm64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-arm64/-/lmdb-darwin-arm64-3.4.2.tgz", + "integrity": "sha512-NK80WwDoODyPaSazKbzd3NEJ3ygePrkERilZshxBViBARNz21rmediktGHExoj9n5t9+ChlgLlxecdFKLCuCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-darwin-x64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-darwin-x64/-/lmdb-darwin-x64-3.4.2.tgz", + "integrity": "sha512-zevaowQNmrp3U7Fz1s9pls5aIgpKRsKb3dZWDINtLiozh3jZI9fBrI19lYYBxqdyiIyNdlyiidPnwPShj4aK+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm/-/lmdb-linux-arm-3.4.2.tgz", + "integrity": "sha512-OmHCULY17rkx/RoCoXlzU7LyR8xqrksgdYWwtYa14l/sseezZ8seKWXcogHcjulBddER5NnEFV4L/Jtr2nyxeg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-arm64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-arm64/-/lmdb-linux-arm64-3.4.2.tgz", + "integrity": "sha512-ZBEfbNZdkneebvZs98Lq30jMY8V9IJzckVeigGivV7nTHJc+89Ctomp1kAIWKlwIG0ovCDrFI448GzFPORANYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-linux-x64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-linux-x64/-/lmdb-linux-x64-3.4.2.tgz", + "integrity": "sha512-vL9nM17C77lohPYE4YaAQvfZCSVJSryE4fXdi8M7uWPBnU+9DJabgKVAeyDb84ZM2vcFseoBE4/AagVtJeRE7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@lmdb/lmdb-win32-arm64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-arm64/-/lmdb-win32-arm64-3.4.2.tgz", + "integrity": "sha512-SXWjdBfNDze4ZPeLtYIzsIeDJDJ/SdsA0pEXcUBayUIMO0FQBHfVZZyHXQjjHr4cvOAzANBgIiqaXRwfMhzmLw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@lmdb/lmdb-win32-x64": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/@lmdb/lmdb-win32-x64/-/lmdb-win32-x64-3.4.2.tgz", + "integrity": "sha512-IY+r3bxKW6Q6sIPiMC0L533DEfRJSXibjSI3Ft/w9Q8KQBNqEIvUFXt+09wV8S5BRk0a8uSF19YWxuRwEfI90g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@modelcontextprotocol/sdk": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.26.0.tgz", + "integrity": "sha512-Y5RmPncpiDtTXDbLKswIJzTqu2hyBKxTNsgKqKclDbhIgg1wgtf1fRuvxgTnRfcnxtvvgbIEcqUOzZrJ6iSReg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.19.9", + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "content-type": "^1.0.5", + "cors": "^2.8.5", + "cross-spawn": "^7.0.5", + "eventsource": "^3.0.2", + "eventsource-parser": "^3.0.0", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "hono": "^4.11.4", + "jose": "^6.1.3", + "json-schema-typed": "^8.0.2", + "pkce-challenge": "^5.0.0", + "raw-body": "^3.0.0", + "zod": "^3.25 || ^4.0", + "zod-to-json-schema": "^3.25.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cfworker/json-schema": "^4.1.1", + "zod": "^3.25 || ^4.0" + }, + "peerDependenciesMeta": { + "@cfworker/json-schema": { + "optional": true + }, + "zod": { + "optional": false + } + } + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.4.tgz", + "integrity": "sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.4.tgz", + "integrity": "sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.4.tgz", + "integrity": "sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.4.tgz", + "integrity": "sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.4.tgz", + "integrity": "sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.4.tgz", + "integrity": "sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@napi-rs/nice": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice/-/nice-1.1.1.tgz", + "integrity": "sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "optionalDependencies": { + "@napi-rs/nice-android-arm-eabi": "1.1.1", + "@napi-rs/nice-android-arm64": "1.1.1", + "@napi-rs/nice-darwin-arm64": "1.1.1", + "@napi-rs/nice-darwin-x64": "1.1.1", + "@napi-rs/nice-freebsd-x64": "1.1.1", + "@napi-rs/nice-linux-arm-gnueabihf": "1.1.1", + "@napi-rs/nice-linux-arm64-gnu": "1.1.1", + "@napi-rs/nice-linux-arm64-musl": "1.1.1", + "@napi-rs/nice-linux-ppc64-gnu": "1.1.1", + "@napi-rs/nice-linux-riscv64-gnu": "1.1.1", + "@napi-rs/nice-linux-s390x-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-gnu": "1.1.1", + "@napi-rs/nice-linux-x64-musl": "1.1.1", + "@napi-rs/nice-openharmony-arm64": "1.1.1", + "@napi-rs/nice-win32-arm64-msvc": "1.1.1", + "@napi-rs/nice-win32-ia32-msvc": "1.1.1", + "@napi-rs/nice-win32-x64-msvc": "1.1.1" + } + }, + "node_modules/@napi-rs/nice-android-arm-eabi": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm-eabi/-/nice-android-arm-eabi-1.1.1.tgz", + "integrity": "sha512-kjirL3N6TnRPv5iuHw36wnucNqXAO46dzK9oPb0wj076R5Xm8PfUVA9nAFB5ZNMmfJQJVKACAPd/Z2KYMppthw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-android-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-android-arm64/-/nice-android-arm64-1.1.1.tgz", + "integrity": "sha512-blG0i7dXgbInN5urONoUCNf+DUEAavRffrO7fZSeoRMJc5qD+BJeNcpr54msPF6qfDD6kzs9AQJogZvT2KD5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-arm64/-/nice-darwin-arm64-1.1.1.tgz", + "integrity": "sha512-s/E7w45NaLqTGuOjC2p96pct4jRfo61xb9bU1unM/MJ/RFkKlJyJDx7OJI/O0ll/hrfpqKopuAFDV8yo0hfT7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-darwin-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-darwin-x64/-/nice-darwin-x64-1.1.1.tgz", + "integrity": "sha512-dGoEBnVpsdcC+oHHmW1LRK5eiyzLwdgNQq3BmZIav+9/5WTZwBYX7r5ZkQC07Nxd3KHOCkgbHSh4wPkH1N1LiQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-freebsd-x64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-freebsd-x64/-/nice-freebsd-x64-1.1.1.tgz", + "integrity": "sha512-kHv4kEHAylMYmlNwcQcDtXjklYp4FCf0b05E+0h6nDHsZ+F0bDe04U/tXNOqrx5CmIAth4vwfkjjUmp4c4JktQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm-gnueabihf": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm-gnueabihf/-/nice-linux-arm-gnueabihf-1.1.1.tgz", + "integrity": "sha512-E1t7K0efyKXZDoZg1LzCOLxgolxV58HCkaEkEvIYQx12ht2pa8hoBo+4OB3qh7e+QiBlp1SRf+voWUZFxyhyqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-gnu/-/nice-linux-arm64-gnu-1.1.1.tgz", + "integrity": "sha512-CIKLA12DTIZlmTaaKhQP88R3Xao+gyJxNWEn04wZwC2wmRapNnxCUZkVwggInMJvtVElA+D4ZzOU5sX4jV+SmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-arm64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-arm64-musl/-/nice-linux-arm64-musl-1.1.1.tgz", + "integrity": "sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-ppc64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-ppc64-gnu/-/nice-linux-ppc64-gnu-1.1.1.tgz", + "integrity": "sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-riscv64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-riscv64-gnu/-/nice-linux-riscv64-gnu-1.1.1.tgz", + "integrity": "sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-s390x-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-s390x-gnu/-/nice-linux-s390x-gnu-1.1.1.tgz", + "integrity": "sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-gnu": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-gnu/-/nice-linux-x64-gnu-1.1.1.tgz", + "integrity": "sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-linux-x64-musl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-linux-x64-musl/-/nice-linux-x64-musl-1.1.1.tgz", + "integrity": "sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-openharmony-arm64": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-openharmony-arm64/-/nice-openharmony-arm64-1.1.1.tgz", + "integrity": "sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-arm64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-arm64-msvc/-/nice-win32-arm64-msvc-1.1.1.tgz", + "integrity": "sha512-uoTb4eAvM5B2aj/z8j+Nv8OttPf2m+HVx3UjA5jcFxASvNhQriyCQF1OB1lHL43ZhW+VwZlgvjmP5qF3+59atA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-ia32-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-ia32-msvc/-/nice-win32-ia32-msvc-1.1.1.tgz", + "integrity": "sha512-CNQqlQT9MwuCsg1Vd/oKXiuH+TcsSPJmlAFc5frFyX/KkOh0UpBLEj7aoY656d5UKZQMQFP7vJNa1DNUNORvug==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@napi-rs/nice-win32-x64-msvc": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@napi-rs/nice-win32-x64-msvc/-/nice-win32-x64-msvc-1.1.1.tgz", + "integrity": "sha512-vB+4G/jBQCAh0jelMTY3+kgFy00Hlx2f2/1zjMoH821IbplbWZOkLiTYXQkygNTzQJTq5cvwBDgn2ppHD+bglQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-4.0.2.tgz", + "integrity": "sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^11.2.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@npmcli/fs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-5.0.0.tgz", + "integrity": "sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/git": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-7.0.2.tgz", + "integrity": "sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "ini": "^6.0.0", + "lru-cache": "^11.2.1", + "npm-pick-manifest": "^11.0.1", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/git/node_modules/ini": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-6.0.0.tgz", + "integrity": "sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@npmcli/git/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-4.0.0.tgz", + "integrity": "sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^5.0.0", + "npm-normalize-package-bin": "^5.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-5.0.0.tgz", + "integrity": "sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-7.0.5.tgz", + "integrity": "sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^7.0.0", + "glob": "^13.0.0", + "hosted-git-info": "^9.0.0", + "json-parse-even-better-errors": "^5.0.0", + "proc-log": "^6.0.0", + "semver": "^7.5.3", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-9.0.1.tgz", + "integrity": "sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-4.0.0.tgz", + "integrity": "sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-10.0.4.tgz", + "integrity": "sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^5.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "node-gyp": "^12.1.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.6.0.tgz", + "integrity": "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.6.0", + "@parcel/watcher-darwin-arm64": "2.6.0", + "@parcel/watcher-darwin-x64": "2.6.0", + "@parcel/watcher-freebsd-x64": "2.6.0", + "@parcel/watcher-linux-arm-glibc": "2.6.0", + "@parcel/watcher-linux-arm-musl": "2.6.0", + "@parcel/watcher-linux-arm64-glibc": "2.6.0", + "@parcel/watcher-linux-arm64-musl": "2.6.0", + "@parcel/watcher-linux-x64-glibc": "2.6.0", + "@parcel/watcher-linux-x64-musl": "2.6.0", + "@parcel/watcher-win32-arm64": "2.6.0", + "@parcel/watcher-win32-x64": "2.6.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.6.0.tgz", + "integrity": "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.6.0.tgz", + "integrity": "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.6.0.tgz", + "integrity": "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.6.0.tgz", + "integrity": "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.6.0.tgz", + "integrity": "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.6.0.tgz", + "integrity": "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.6.0.tgz", + "integrity": "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.6.0.tgz", + "integrity": "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.6.0.tgz", + "integrity": "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.6.0.tgz", + "integrity": "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.6.0.tgz", + "integrity": "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.6.0.tgz", + "integrity": "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/@playwright/test": { + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.0.tgz", + "integrity": "sha512-9zOJ6ZQRAena31MpOH9VSzIz8Ou3YJ/wtY/eQm5T2uhfhG7/U3COrMS8xOtUrZrp9OgdmzEnIYODye3nY1VqzA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.62.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@schematics/angular": { + "version": "20.3.32", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-20.3.32.tgz", + "integrity": "sha512-asporFGNP/U4p/A6jHqRmC8zGBxsSbjA/17I0p1tIW4HLbDTwJ0Z1gTSGpkHGRGTeowPZZSCj7s0IWVoaBCjnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "20.3.32", + "@angular-devkit/schematics": "20.3.32", + "jsonc-parser": "3.3.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@sigstore/bundle": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-4.0.0.tgz", + "integrity": "sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sigstore/core": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-3.2.1.tgz", + "integrity": "sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.5.1.tgz", + "integrity": "sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-4.1.1.tgz", + "integrity": "sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@gar/promise-retry": "^1.0.2", + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.0", + "@sigstore/protobuf-specs": "^0.5.0", + "make-fetch-happen": "^15.0.4", + "proc-log": "^6.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sigstore/sign/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-4.0.2.tgz", + "integrity": "sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.5.0", + "tuf-js": "^4.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-3.1.1.tgz", + "integrity": "sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.1", + "@sigstore/protobuf-specs": "^0.5.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-4.1.0.tgz", + "integrity": "sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^10.1.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/@types/cors": { + "version": "2.8.19", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", + "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/jasmine": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-5.1.15.tgz", + "integrity": "sha512-ZAC8KjmV2MJxbNTrwXFN+HKeajpXQZp6KpPiR6Aa4XvaEnjP6qh23lL/Rqb7AYzlp3h/rcwDrQ7Gg7q28cQTQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "26.1.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz", + "integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.4.tgz", + "integrity": "sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/type-utils": "8.46.4", + "@typescript-eslint/utils": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.46.4", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/project-service": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.4.tgz", + "integrity": "sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.4", + "@typescript-eslint/types": "^8.46.4", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.4.tgz", + "integrity": "sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.4.tgz", + "integrity": "sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.4.tgz", + "integrity": "sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.4.tgz", + "integrity": "sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.4", + "@typescript-eslint/tsconfig-utils": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.4.tgz", + "integrity": "sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.4.tgz", + "integrity": "sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.3.tgz", + "integrity": "sha512-DRdx5neNsG/QXbniLFWi2YmC/68oeOOmKz6zOjVk6ZS1ZLXgLIKqVEc6hWsmkjBbgii0SwaBTcJ5XKj5gzY/4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.4.tgz", + "integrity": "sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/project-service": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.4.tgz", + "integrity": "sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.4", + "@typescript-eslint/types": "^8.46.4", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.4.tgz", + "integrity": "sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.4.tgz", + "integrity": "sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.4.tgz", + "integrity": "sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.4.tgz", + "integrity": "sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.4", + "@typescript-eslint/tsconfig-utils": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.4.tgz", + "integrity": "sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.3.tgz", + "integrity": "sha512-DRdx5neNsG/QXbniLFWi2YmC/68oeOOmKz6zOjVk6ZS1ZLXgLIKqVEc6hWsmkjBbgii0SwaBTcJ5XKj5gzY/4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", + "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.65.0", + "@typescript-eslint/types": "^8.65.0", + "debug": "^4.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", + "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", + "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.4.tgz", + "integrity": "sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/utils": "8.46.4", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/project-service": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.4.tgz", + "integrity": "sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.4", + "@typescript-eslint/types": "^8.46.4", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.4.tgz", + "integrity": "sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.4.tgz", + "integrity": "sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.4.tgz", + "integrity": "sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.4.tgz", + "integrity": "sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.4", + "@typescript-eslint/tsconfig-utils": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.4.tgz", + "integrity": "sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.4.tgz", + "integrity": "sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.3.tgz", + "integrity": "sha512-DRdx5neNsG/QXbniLFWi2YmC/68oeOOmKz6zOjVk6ZS1ZLXgLIKqVEc6hWsmkjBbgii0SwaBTcJ5XKj5gzY/4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", + "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", + "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.65.0", + "@typescript-eslint/tsconfig-utils": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/visitor-keys": "8.65.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", + "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.65.0", + "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/typescript-estree": "8.65.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.65.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", + "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.65.0", + "eslint-visitor-keys": "^5.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-2.1.0.tgz", + "integrity": "sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0" + } + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/accepts": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", + "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "5.35.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", + "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@algolia/abtesting": "1.1.0", + "@algolia/client-abtesting": "5.35.0", + "@algolia/client-analytics": "5.35.0", + "@algolia/client-common": "5.35.0", + "@algolia/client-insights": "5.35.0", + "@algolia/client-personalization": "5.35.0", + "@algolia/client-query-suggestions": "5.35.0", + "@algolia/client-search": "5.35.0", + "@algolia/ingestion": "1.35.0", + "@algolia/monitoring": "1.35.0", + "@algolia/recommend": "5.35.0", + "@algolia/requester-browser-xhr": "5.35.0", + "@algolia/requester-fetch": "5.35.0", + "@algolia/requester-node-http": "5.35.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/angular-eslint": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/angular-eslint/-/angular-eslint-21.0.1.tgz", + "integrity": "sha512-YZT5SAYXv3zxTcCwjuAJb7D8tOnRyF+a7Hrn4niLAihH+DowBocOAvhWyjCDKEULNGDszcKZukaDMzp2S18I5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": ">= 21.0.0 < 22.0.0", + "@angular-devkit/schematics": ">= 21.0.0 < 22.0.0", + "@angular-eslint/builder": "21.0.1", + "@angular-eslint/eslint-plugin": "21.0.1", + "@angular-eslint/eslint-plugin-template": "21.0.1", + "@angular-eslint/schematics": "21.0.1", + "@angular-eslint/template-parser": "21.0.1", + "@typescript-eslint/types": "^8.0.0", + "@typescript-eslint/utils": "^8.0.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": "*", + "typescript-eslint": "^8.0.0" + } + }, + "node_modules/angular-eslint/node_modules/@angular-devkit/core": { + "version": "21.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-21.2.19.tgz", + "integrity": "sha512-dtpJMQBz5nhkcIogPmXP/aT2Ak8m/wLRPOSTI/g4vSJSuGiI53PgtWq4/wfQga6E6wdM2XWsblAE89d8w5heQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "8.18.0", + "ajv-formats": "3.0.1", + "jsonc-parser": "3.3.1", + "picomatch": "4.0.4", + "rxjs": "7.8.2", + "source-map": "0.7.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^5.0.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/angular-eslint/node_modules/@angular-devkit/schematics": { + "version": "21.2.19", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-21.2.19.tgz", + "integrity": "sha512-AG3Fzh9wJCmKBfxUQOUWaEHMj5Gq2O+Msf1z52aDSxbVhs5/iSQcXGPv/DLdAXu7d4xmQhLouNe9Glaq2omDyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@angular-devkit/core": "21.2.19", + "jsonc-parser": "3.3.1", + "magic-string": "0.30.21", + "ora": "9.3.0", + "rxjs": "7.8.2" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/angular-eslint/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/angular-eslint/node_modules/chokidar": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", + "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "readdirp": "^5.0.0" + }, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/angular-eslint/node_modules/cli-spinners": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-3.4.0.tgz", + "integrity": "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/angular-eslint/node_modules/log-symbols": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz", + "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-unicode-supported": "^2.0.0", + "yoctocolors": "^2.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/angular-eslint/node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/angular-eslint/node_modules/ora": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-9.3.0.tgz", + "integrity": "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.6.2", + "cli-cursor": "^5.0.0", + "cli-spinners": "^3.2.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.1.0", + "log-symbols": "^7.0.1", + "stdin-discarder": "^0.3.1", + "string-width": "^8.1.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/angular-eslint/node_modules/readdirp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", + "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 20.19.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/angular-eslint/node_modules/stdin-discarder": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.3.2.tgz", + "integrity": "sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/angular-eslint/node_modules/string-width": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.7.tgz", + "integrity": "sha512-APw5YuIQAg6L9w4sHDI6j26DGFJI6RpYOhnkMPdC9lWbkKvsyPHzDsve1yd73lk21yz7Y09Kci8B2Pp9FonzWA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/beasties": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/beasties/-/beasties-0.3.5.tgz", + "integrity": "sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "css-select": "^6.0.0", + "css-what": "^7.0.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "htmlparser2": "^10.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-media-query-parser": "^0.2.3" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", + "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "^3.1.2", + "content-type": "^2.0.0", + "debug": "^4.4.3", + "http-errors": "^2.0.1", + "iconv-lite": "^0.7.2", + "on-finished": "^2.4.1", + "qs": "^6.15.2", + "raw-body": "^3.0.2", + "type-is": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/body-parser/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.8.tgz", + "integrity": "sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "20.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-20.0.4.tgz", + "integrity": "sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^5.0.0", + "fs-minipass": "^3.0.0", + "glob": "^13.0.0", + "lru-cache": "^11.1.0", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^7.0.2", + "ssri": "^13.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-2.2.0.tgz", + "integrity": "sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz", + "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/connect/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/connect/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } + }, + "node_modules/cors": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.6.tgz", + "integrity": "sha512-tJtZBBHA6vjIAaF6EnIaq6laBBP9aq/Y3ouVJjEfoHbRBcHBAHYcMh/w8LDrk2PvIMMq8gmopa5D4V8RmbrxGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-select": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-6.0.0.tgz", + "integrity": "sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^7.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "nth-check": "^2.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-7.0.0.tgz", + "integrity": "sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.398", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.398.tgz", + "integrity": "sha512-AsvhAxopJGh6museTDMIjn6JpDYOfgu4RLlygomt87MUwBUqTfd/1EiPtx10/LZE8xpTvkP2E9Gafq7lkLtodQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, + "license": "MIT" + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.6.9", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.9.tgz", + "integrity": "sha512-clKkw4C7nJ22mGgoVcCg6V/W/TxdNyIOTr89k2ONZu81qqkddPFDF0LXcbAwhzPD8DjkiRCjzuiO6Y+fkpD4vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "@types/ws": "^8.5.12", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.7.2", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.21.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.2.tgz", + "integrity": "sha512-kKvD1tO6BM+oK9HzCPpUdRb4vKFQY/FPTFmurMvh6LlN68VMrdj77w8yp51/kDbpkFOS9J8w5W6zIzgM2H8/hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "punycode": "^1.4.1", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.17.tgz", + "integrity": "sha512-w+aeW/mkgM4PyRMOJCgi3fOrTm5Q8QY1OSfn2TO2iuDj3ezIHqejmuxbjfPrqUkgqRew1iqkyAn0tr0ZwHD9+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eventsource": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", + "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventsource-parser": "^3.0.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/eventsource-parser": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.1.0.tgz", + "integrity": "sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/express": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express-rate-limit": { + "version": "8.6.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.6.1.tgz", + "integrity": "sha512-0D493aP61w0TJ2A0wy27riRsO7FMQ7FK+KUHOKCSfPvYo0R55aiC6emCVgFUeShH0fq0ICPVzNcgoS+BsbXQCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "ip-address": "^10.2.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/express-rate-limit" + }, + "peerDependencies": { + "express": ">= 4.11" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", + "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" + }, + "engines": { + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.3.tgz", + "integrity": "sha512-/zipXxyO6rGvuNGDiULY9MvEGSkb2gaG4GGH4ygMi0ZZzyMHdUZBmntJmx5x1G2VuPytCwGN4xsJP6cw+sK+vQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.17.tgz", + "integrity": "sha512-w+aeW/mkgM4PyRMOJCgi3fOrTm5Q8QY1OSfn2TO2iuDj3ezIHqejmuxbjfPrqUkgqRew1iqkyAn0tr0ZwHD9+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hono": { + "version": "4.12.32", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.32.tgz", + "integrity": "sha512-XcuyW9qE2kJn07PkecMOBd5Vq/hMy7mmGw+idz1yblbg9N17ijJODrvPkn7/dwL3Kulj8LcRJ69DLOWf91dRUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/hosted-git-info": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.3.tgz", + "integrity": "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^11.1.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/htmlparser2": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz", + "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==", + "dev": true, + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "entities": "^7.0.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz", + "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", + "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-8.0.0.tgz", + "integrity": "sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^10.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/immutable": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/ip-address": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.3.1.tgz", + "integrity": "sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jasmine-core": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.9.0.tgz", + "integrity": "sha512-OMUvF1iI6+gSRYOhMrH4QYothVLN9C3EJ6wm4g7zLJlnaTl8zbaPOr0bTw70l7QxkoM7sVFOWo83u9B2Fe2Zng==", + "dev": true, + "license": "MIT" + }, + "node_modules/jose": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.4.tgz", + "integrity": "sha512-N8acGzVsQy6M/fjFcxtysNc4Q379TcM5dM/qKkNtsHFji88yANnXTr7BLeP75iPnFwBfQzM/jg2BZ9+HZrHCZA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.0.tgz", + "integrity": "sha512-1td788aAnnZ5qs7V2QIRl1owjtYpbKt749Y3xauqQgwIIGF/xXWz1wMTEBx5O3LK3lXLVuqXPdPxj2BoFHaW9Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-5.0.0.tgz", + "integrity": "sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", + "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/karma": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.7.2", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.2.0.tgz", + "integrity": "sha512-rE9RkUPI7I9mAxByQWkGJFXfFD6lE4gC5nPuZdobf/QdTEJI6EU4yIay/cfU/xV4ZxlM5JiTv7zWYgA64NpS5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-coverage": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.1.tgz", + "integrity": "sha512-yj7hbequkQP2qOSb20GuNSIyE//PgJWHwC2IydLE6XRtsnaflv+/OSGNssPjobYUlhVVagy99TQpqUt3vAUG7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-coverage/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma-coverage/node_modules/brace-expansion": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.17.tgz", + "integrity": "sha512-w+aeW/mkgM4PyRMOJCgi3fOrTm5Q8QY1OSfn2TO2iuDj3ezIHqejmuxbjfPrqUkgqRew1iqkyAn0tr0ZwHD9+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/karma-coverage/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma-coverage/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/karma-coverage/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "jasmine-core": "^4.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "karma": "^6.0.0" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-2.1.0.tgz", + "integrity": "sha512-sPQE1+nlsn6Hwb5t+HHwyy0A1FNCVKuL1192b+XNauMYWThz2kweiBVW1DqloRpVvZIJkIoHVB7XRpK78n1xbQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "jasmine-core": "^4.0.0 || ^5.0.0", + "karma": "^6.0.0", + "karma-jasmine": "^5.0.0" + } + }, + "node_modules/karma-jasmine/node_modules/jasmine-core": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.1.tgz", + "integrity": "sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/body-parser": { + "version": "1.20.6", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.6.tgz", + "integrity": "sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.15.1", + "raw-body": "~2.5.3", + "type-is": "~1.6.18", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/karma/node_modules/brace-expansion": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.17.tgz", + "integrity": "sha512-w+aeW/mkgM4PyRMOJCgi3fOrTm5Q8QY1OSfn2TO2iuDj3ezIHqejmuxbjfPrqUkgqRew1iqkyAn0tr0ZwHD9+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/karma/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/karma/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/karma/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/karma/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/karma/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/karma/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true, + "license": "MIT" + }, + "node_modules/karma/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/karma/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/karma/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/karma/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/karma/node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/karma/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz", + "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/listr2": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.1.tgz", + "integrity": "sha512-SL0JY3DaxylDuo/MecFeiC+7pedM0zia33zl0vcjgwcq1q1FWWF1To9EIauPbl8GbMCU0R2e0uJ8bZunhYKD2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/lmdb": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/lmdb/-/lmdb-3.4.2.tgz", + "integrity": "sha512-nwVGUfTBUwJKXd6lRV8pFNfnrCC1+l49ESJRM19t/tFb/97QfJEixe5DYRvug5JO7DSFKoKaVy7oGMt5rVqZvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "msgpackr": "^1.11.2", + "node-addon-api": "^6.1.0", + "node-gyp-build-optional-packages": "5.2.2", + "ordered-binary": "^1.5.3", + "weak-lru-cache": "^1.2.2" + }, + "bin": { + "download-lmdb-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@lmdb/lmdb-darwin-arm64": "3.4.2", + "@lmdb/lmdb-darwin-x64": "3.4.2", + "@lmdb/lmdb-linux-arm": "3.4.2", + "@lmdb/lmdb-linux-arm64": "3.4.2", + "@lmdb/lmdb-linux-x64": "3.4.2", + "@lmdb/lmdb-win32-arm64": "3.4.2", + "@lmdb/lmdb-win32-x64": "3.4.2" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", + "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "is-unicode-supported": "^1.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-fetch-happen": { + "version": "15.0.6", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-15.0.6.tgz", + "integrity": "sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/agent": "^4.0.0", + "@npmcli/redact": "^4.0.0", + "cacache": "^20.0.1", + "http-cache-semantics": "^4.1.1", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^1.0.0", + "proc-log": "^6.0.0", + "ssri": "^13.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/make-fetch-happen/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.1.tgz", + "integrity": "sha512-yz3xRaG20c6/BOzvYoDaGtPmGscs7YivItZEEqe6GbwNfHuxu9YNmvnEkMzKldAGY4/80pRcQRZSEnhquk9XuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/merge-descriptors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "^1.54.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-5.0.2.tgz", + "integrity": "sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^2.0.0", + "minizlib": "^3.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + }, + "optionalDependencies": { + "iconv-lite": "^0.7.2" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.7.tgz", + "integrity": "sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-flush/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/minipass-sized": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-2.0.0.tgz", + "integrity": "sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/msgpackr": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.12.1.tgz", + "integrity": "sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==", + "dev": true, + "license": "MIT", + "optional": true, + "optionalDependencies": { + "msgpackr-extract": "^3.0.2" + } + }, + "node_modules/msgpackr-extract": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.4.tgz", + "integrity": "sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "node-gyp-build-optional-packages": "5.2.2" + }, + "bin": { + "download-msgpackr-prebuilds": "bin/download-prebuilds.js" + }, + "optionalDependencies": { + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.4", + "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.4" + } + }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-addon-api": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-gyp": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz", + "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp-build-optional-packages": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", + "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.1" + }, + "bin": { + "node-gyp-build-optional-packages": "bin.js", + "node-gyp-build-optional-packages-optional": "optional.js", + "node-gyp-build-optional-packages-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-5.0.0.tgz", + "integrity": "sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^5.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-install-checks": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-8.0.0.tgz", + "integrity": "sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-5.0.0.tgz", + "integrity": "sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-package-arg": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-13.0.0.tgz", + "integrity": "sha512-+t2etZAGcB7TbbLHfDwooV9ppB2LhhcT6A+L9cahsf9mEUAoQ6CktLEVvEnpD0N5CkX7zJqnPGaFtoQDy9EkHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^9.0.0", + "proc-log": "^5.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-packlist": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-10.0.4.tgz", + "integrity": "sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==", + "dev": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^8.0.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-packlist/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-11.0.3.tgz", + "integrity": "sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^8.0.0", + "npm-normalize-package-bin": "^5.0.0", + "npm-package-arg": "^13.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-19.1.1.tgz", + "integrity": "sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^4.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^15.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^5.0.0", + "minizlib": "^3.0.1", + "npm-package-arg": "^13.0.0", + "proc-log": "^6.0.0" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", + "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^5.0.0", + "cli-spinners": "^2.9.2", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^2.0.0", + "log-symbols": "^6.0.0", + "stdin-discarder": "^0.2.2", + "string-width": "^7.2.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ordered-binary": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ordered-binary/-/ordered-binary-1.6.1.tgz", + "integrity": "sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.6.tgz", + "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pacote": { + "version": "21.5.1", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-21.5.1.tgz", + "integrity": "sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@gar/promise-retry": "^1.0.0", + "@npmcli/git": "^7.0.0", + "@npmcli/installed-package-contents": "^4.0.0", + "@npmcli/package-json": "^7.0.0", + "@npmcli/promise-spawn": "^9.0.0", + "@npmcli/run-script": "^10.0.0", + "cacache": "^20.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^13.0.0", + "npm-packlist": "^10.0.1", + "npm-pick-manifest": "^11.0.1", + "npm-registry-fetch": "^19.0.0", + "proc-log": "^6.0.0", + "sigstore": "^4.0.0", + "ssri": "^13.0.0", + "tar": "^7.4.3" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/pacote/node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-8.0.0.tgz", + "integrity": "sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0", + "parse5": "^8.0.0", + "parse5-sax-parser": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-html-rewriting-stream/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-8.0.0.tgz", + "integrity": "sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse5": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/path-to-regexp": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/piscina": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-5.2.0.tgz", + "integrity": "sha512-DszUCKeVN/5G5QKo6jAVHL8fmKnkJvQ0ACiVgY7YGCq3TUB2oznAOayvZPIAdEThvhczkXR+qm3IHsNXpFCYfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.x" + }, + "optionalDependencies": { + "@napi-rs/nice": "^1.0.4" + } + }, + "node_modules/pkce-challenge": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", + "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16.20.0" + } + }, + "node_modules/playwright": { + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.0.tgz", + "integrity": "sha512-Z14dG305dgaLu6foB1TXQagFiW8JfSUIUaUuPaKQ6NtBPKF1P/qXcqfh6c6K/icPqdy37JmjbiBXf6JNg6Sylw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.62.0" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=20" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.62.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.0.tgz", + "integrity": "sha512-nsNRyq0r2zsG8AcRHWknc9QRA5XCueC7gWMrs+Gx2tlZn9hcl8zudfh00lhJPY1DE7NmZ6bDsT9g2yey8mXljA==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/postcss": { + "version": "8.5.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz", + "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/proc-log": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz", + "integrity": "sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.15.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", + "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "es-define-property": "^1.0.1", + "side-channel": "^1.1.1" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/range-parser": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", + "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/raw-body": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup/node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.90.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.90.0.tgz", + "integrity": "sha512-9GUyuksjw70uNpb1MTYWsH9MQHOHY6kwfnkafC24+7aOMZn9+rVMBxRbLvw756mrBFbIsFg6Xw9IkR2Fnn3k+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/serve-static": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sigstore": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-4.1.1.tgz", + "integrity": "sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^4.0.0", + "@sigstore/core": "^3.2.1", + "@sigstore/protobuf-specs": "^0.5.0", + "@sigstore/sign": "^4.1.1", + "@sigstore/tuf": "^4.0.2", + "@sigstore/verify": "^3.1.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.3.tgz", + "integrity": "sha512-2Dd78bqzzjE6KPkD5fHZmDAKRNe3J15q+YHDrIsy9WEkqttc7GY+kT9OBLSMaPbQaEd0x1BjcmtMtXkfpc+T5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.4.1", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.8", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.8.tgz", + "integrity": "sha512-6Oy52pbg+kvdCVvjcN+FnY7BvxZ7cIHNScbvztT/It5d0vbwoJoVZmF2gjJmnV0/4WlXRfG15zc45ySk9Ah8bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "~4.4.1", + "ws": "~8.21.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.7.tgz", + "integrity": "sha512-IH/iSeO9T6gz1KkFleGDWkG9N3dl4jXVYUtMhIqH10Md0ttMer8nUNWiP1DKuNrybD2xBrixLJdCC9J6ECoYkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.4.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socket.io/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/socks": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz", + "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^10.1.1", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.23", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz", + "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/ssri": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-13.0.1.tgz", + "integrity": "sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz", + "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.2.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tar": { + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/tar/node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tmp": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/ts-api-utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tuf-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-4.1.0.tgz", + "integrity": "sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "4.1.0", + "debug": "^4.4.3", + "make-fetch-happen": "^15.0.1" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-is": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", + "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", + "dev": true, + "license": "MIT", + "dependencies": { + "content-type": "^2.0.0", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/type-is/node_modules/content-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", + "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.4.tgz", + "integrity": "sha512-KALyxkpYV5Ix7UhvjTwJXZv76VWsHG+NjNlt/z+a17SOQSiOcBdUXdbJdyXi7RPxrBFECtFOiPwUJQusJuCqrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.46.4", + "@typescript-eslint/parser": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/utils": "8.46.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/project-service": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.4.tgz", + "integrity": "sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.4", + "@typescript-eslint/types": "^8.46.4", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.4.tgz", + "integrity": "sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.4.tgz", + "integrity": "sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/types": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.4.tgz", + "integrity": "sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.4.tgz", + "integrity": "sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.4", + "@typescript-eslint/tsconfig-utils": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/visitor-keys": "8.46.4", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/utils": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.4.tgz", + "integrity": "sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.4", + "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/typescript-estree": "8.46.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.4.tgz", + "integrity": "sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.4", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/typescript-eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/typescript-eslint/node_modules/brace-expansion": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.3.tgz", + "integrity": "sha512-DRdx5neNsG/QXbniLFWi2YmC/68oeOOmKz6zOjVk6ZS1ZLXgLIKqVEc6hWsmkjBbgii0SwaBTcJ5XKj5gzY/4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/typescript-eslint/node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/typescript-eslint/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.41", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.41.tgz", + "integrity": "sha512-O3oYyCMPYgNNHuO7Jjk3uacJWZF8loBgwrfd/5LE/HyZ3lUIOdniQ7DNXJcIgZbwioZxk0fLfI4EVnetdiX5jg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + }, + { + "type": "github", + "url": "https://github.com/sponsors/faisalman" + } + ], + "license": "MIT", + "bin": { + "ua-parser-js": "script/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.17" + } + }, + "node_modules/undici-types": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", + "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz", + "integrity": "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", + "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0 || ^0.28.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/vite/node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/weak-lru-cache": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/weak-lru-cache/-/weak-lru-cache-1.2.2.tgz", + "integrity": "sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.21.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", + "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz", + "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^9.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "string-width": "^7.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^22.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yargs-parser": { + "version": "22.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz", + "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=23" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.2.0.tgz", + "integrity": "sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz", + "integrity": "sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.13.tgz", + "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-to-json-schema": { + "version": "3.25.2", + "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.2.tgz", + "integrity": "sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==", + "dev": true, + "license": "ISC", + "peerDependencies": { + "zod": "^3.25.28 || ^4" + } + }, + "node_modules/zone.js": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", + "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", + "license": "MIT" + } + } +} diff --git a/package.json b/package.json index ae8aeb42d..0f385a163 100644 --- a/package.json +++ b/package.json @@ -1,52 +1,46 @@ { - "name": "angular-hnpwa", - "version": "0.0.0", + "name": "vantage-cashback-pwa", + "version": "1.0.0", "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build", + "watch": "ng build --watch --configuration development", "test": "ng test", + "test:ci": "ng test --watch=false --browsers=ChromeHeadlessNoSandbox", "lint": "ng lint", - "e2e": "ng e2e" + "e2e": "playwright test", + "e2e:install": "playwright install --with-deps chromium" }, "private": true, "dependencies": { - "@angular/animations": "~9.0.1", - "@angular/common": "~9.0.1", - "@angular/compiler": "~9.0.1", - "@angular/core": "~9.0.1", - "@angular/forms": "~9.0.1", - "@angular/platform-browser": "~9.0.1", - "@angular/platform-browser-dynamic": "~9.0.1", - "@angular/router": "~9.0.1", - "@angular/service-worker": "~9.0.1", - "node-fetch": "^2.6.0", - "rxjs": "~6.5.4", - "rxjs-compat": "^6.5.2", - "tslib": "^1.10.0", - "unfetch": "^4.1.0", - "zone.js": "~0.10.2" + "@angular/common": "^20.3.0", + "@angular/compiler": "^20.3.0", + "@angular/core": "^20.3.0", + "@angular/forms": "^20.3.0", + "@angular/platform-browser": "^20.3.0", + "@angular/router": "^20.3.0", + "@angular/service-worker": "^20.3.0", + "rxjs": "~7.8.0", + "tslib": "^2.3.0", + "zone.js": "~0.15.0" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.900.2", - "@angular/cli": "~9.0.2", - "@angular/compiler-cli": "~9.0.1", - "@angular/language-service": "~9.0.1", - "@types/jasmine": "~3.3.8", - "@types/jasminewd2": "~2.0.3", - "@types/node": "^12.11.1", - "codelyzer": "^5.1.2", - "jasmine-core": "~3.4.0", - "jasmine-spec-reporter": "~4.2.1", - "karma": "~4.1.0", - "karma-chrome-launcher": "~2.2.0", - "karma-coverage-istanbul-reporter": "~2.0.1", - "karma-jasmine": "~2.0.1", - "karma-jasmine-html-reporter": "^1.4.0", - "protractor": "~5.4.0", - "ts-node": "~7.0.0", - "tslint": "~5.15.0", - "typescript": "~3.7.5" + "@angular/build": "^20.3.32", + "@angular/cli": "^20.3.32", + "@angular/compiler-cli": "^20.3.0", + "@playwright/test": "^1.49.1", + "@types/jasmine": "~5.1.0", + "angular-eslint": "21.0.1", + "eslint": "^9.39.1", + "jasmine-core": "~5.9.0", + "karma": "~6.4.0", + "karma-chrome-launcher": "~3.2.0", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.1.0", + "karma-jasmine-html-reporter": "~2.1.0", + "typescript": "~5.9.2", + "typescript-eslint": "8.46.4" }, "prettier": { "trailingComma": "es5", diff --git a/playwright.config.ts b/playwright.config.ts new file mode 100644 index 000000000..447f4e868 --- /dev/null +++ b/playwright.config.ts @@ -0,0 +1,23 @@ +import { defineConfig, devices } from '@playwright/test'; + +const PORT = 4200; +const baseURL = `http://localhost:${PORT}`; + +export default defineConfig({ + testDir: './e2e', + fullyParallel: true, + forbidOnly: !!process.env['CI'], + retries: process.env['CI'] ? 2 : 0, + reporter: process.env['CI'] ? 'list' : 'html', + use: { + baseURL, + trace: 'on-first-retry', + }, + projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }], + webServer: { + command: `npm start -- --port ${PORT}`, + url: baseURL, + reuseExistingServer: !process.env['CI'], + timeout: 120_000, + }, +}); diff --git a/public/assets/icons/android-chrome-144x144.png b/public/assets/icons/android-chrome-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..615af177e407d30284ece48127de73a99f7c2f87 GIT binary patch literal 3766 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 literal 0 HcmV?d00001 diff --git a/public/assets/icons/android-chrome-192x192.png b/public/assets/icons/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..2552c60e705c231f86273331ddf4c2d73fcd9ec4 GIT binary patch literal 4904 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 bc}2z;Q`8(7ls9&*fB{}S)mAN0v3dU=Jb+2` literal 0 HcmV?d00001 diff --git a/public/assets/icons/android-chrome-256x256.png b/public/assets/icons/android-chrome-256x256.png new file mode 100644 index 0000000000000000000000000000000000000000..7ff256650699e023ddb134fb205d2980ef85dcf7 GIT binary patch literal 6900 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 Ky{?fl3;7pefddu* literal 0 HcmV?d00001 diff --git a/public/assets/icons/android-chrome-512x512.png b/public/assets/icons/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..92cfb8c8ed6f06755d55e1a06e3e2f725a6d3778 GIT binary patch literal 6938 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 literal 0 HcmV?d00001 diff --git a/public/assets/icons/apple-touch-icon-120x120.png b/public/assets/icons/apple-touch-icon-120x120.png new file mode 100644 index 0000000000000000000000000000000000000000..b59944781b707089b0c8e85909222d1b6cf541e7 GIT binary patch literal 3022 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 literal 0 HcmV?d00001 diff --git a/public/assets/icons/apple-touch-icon-152x152.png b/public/assets/icons/apple-touch-icon-152x152.png new file mode 100644 index 0000000000000000000000000000000000000000..b778ea35d8d1fdcc4499d13e61f4c3b7646fb9e9 GIT binary patch literal 3958 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 a;Z;W7l*%?Wf?jrKsPwdrwJJ4Sqy7h$o8qwm literal 0 HcmV?d00001 diff --git a/public/assets/icons/apple-touch-icon-60x60.png b/public/assets/icons/apple-touch-icon-60x60.png new file mode 100644 index 0000000000000000000000000000000000000000..eeeb1e6ac7ddc56a3a69ecda0797fec0ef3e2093 GIT binary patch literal 1614 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 a;Z;W7l*%?Wf?jrKsPwdrwJJ4Sqy7h$o8qwm literal 0 HcmV?d00001 diff --git a/src/assets/icons/browserconfig.xml b/public/assets/icons/browserconfig.xml similarity index 100% rename from src/assets/icons/browserconfig.xml rename to public/assets/icons/browserconfig.xml diff --git a/public/assets/icons/favicon-16x16.png b/public/assets/icons/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..c7fedfe5828a6b97e19b2dfd0e4babc7a1e73b14 GIT binary patch literal 485 zcmVpbn9|Dv-wBSuqr4j~nfa+&zDFB!tI{3*7$v37;NnQV^kA6_lZ7 zdF?9#hzQe1PqMtR%A>{SoSAI#r^vb4xlFGvwg6oNN9q#1b(}svz3sKb6Z`2*wV9i_ zz>Agl93dyQqY&Y{$Id<=kK)e+{0KpP|x0zo>1@A>E$pAi5N!C6Z>NN{}X zAzEiO1B!@DDsDAce?G^}=MNYT3;2EzfrtViSX<)y(Tf~j(=n-_)ChXQr&oM zqeX9Y&wJL>xwu_Or}P zHI)G-u>)~iSF(mvx32JYaDYVcrxPL>P?V&X;9&b^d_PvB{>jbc|&Ia52IbyG$PsUpz)k z$lEWU>(mRNy|s;|WD2cZ9aqn>f7KS+=PlsQo5vhmw}XMg5J%Q-EBhQr+9wozRj}4# zti`(WZ7NSyt!ex9r}vpZYc8QN%*$k1(z1YuJuk58=OS*bG!1HziZ7UbJi? zMyxts_Pt}UkmGiD7ngS)Ba=+g_5Kx)KfK}LyO(qxIE{=`&2<0@B>e=YvdX^+k*d;p z;0!Om^w6KrQL={NaD)>ZcJrwBHK`zhFFts2XW=LSRVC>Me9wKStGAmyD>hCTc&x2k zxU}}(v3Lytdsl9%jXmmpMc=?zQi)`w7$Zt3B3Nt4rZb$}w3pUwb9sD1F(^;3I`zaW zx0(p9(nUXh4RP(sUHbEb1VJKF4>I<@Kt#$#7v>wPgkE|Ei7`hp#MOW*f$x*b%xPS7 v%EcPj3GrQ^ic#B8fbnd~KT4+orU8BfT9dvAPt00000NkvXXu0mjfWQuvL literal 0 HcmV?d00001 diff --git a/public/assets/icons/mstile-150x150.png b/public/assets/icons/mstile-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..7bcc7fd6050c9b98388ceb2128e0abc37195a032 GIT binary patch literal 3886 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 + + diff --git a/src/assets/images/cog.svg b/public/assets/images/cog.svg similarity index 100% rename from src/assets/images/cog.svg rename to public/assets/images/cog.svg diff --git a/public/assets/images/logo.svg b/public/assets/images/logo.svg new file mode 100644 index 000000000..c47caf153 --- /dev/null +++ b/public/assets/images/logo.svg @@ -0,0 +1,7 @@ + + + + + + 4% + diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..653511c0d9f213d3a55f4b8f7ede25282215071a GIT binary patch literal 4445 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 Image.Image: + image = Image.new("RGBA", (BASE, BASE), BRAND_GREEN + (255,)) + draw = ImageDraw.Draw(image) + draw.rounded_rectangle((80, 152, 432, 376), radius=32, fill=CARD_WHITE) + draw.rectangle((80, 204, 432, 244), fill=STRIPE_GREEN) + draw.rounded_rectangle((124, 292, 228, 316), radius=12, fill=CHIP_GREY) + font = ImageFont.truetype(FONT_PATH, 76) + draw.text((336, 316), "4%", font=font, fill=BRAND_GREEN, anchor="mm") + return image + + +def main() -> None: + ICONS_DIR.mkdir(parents=True, exist_ok=True) + base = render_base() + + for size in (144, 192, 256, 512): + base.resize((size, size), Image.LANCZOS).save(ICONS_DIR / f"android-chrome-{size}x{size}.png") + + for size in (60, 76, 120, 152, 180): + base.resize((size, size), Image.LANCZOS).save(ICONS_DIR / f"apple-touch-icon-{size}x{size}.png") + base.resize((180, 180), Image.LANCZOS).save(ICONS_DIR / "apple-touch-icon.png") + + for size in (16, 32): + base.resize((size, size), Image.LANCZOS).save(ICONS_DIR / f"favicon-{size}x{size}.png") + base.resize((150, 150), Image.LANCZOS).save(ICONS_DIR / "mstile-150x150.png") + + favicon = ICONS_DIR.parent.parent / "favicon.ico" + base.resize((64, 64), Image.LANCZOS).save(favicon, sizes=[(16, 16), (32, 32), (48, 48), (64, 64)]) + + +if __name__ == "__main__": + main() diff --git a/src/app/account/account.component.html b/src/app/account/account.component.html new file mode 100644 index 000000000..676086b74 --- /dev/null +++ b/src/app/account/account.component.html @@ -0,0 +1,71 @@ +
+

Card & settings

+

Manage your cards and how this app displays your cash back.

+ + @if (errored()) { + + } @else if (loading()) { + + } @else { + @for (account of accounts(); track account.id) { +
+
+

{{ account.productName }}

+ {{ account.status | titlecase }} +
+
+ {{ account.cardholderName }} + •••• •••• •••• {{ account.last4 }} + {{ account.network | titlecase }} +
+ +
+ } @empty { +

No card accounts on file.

+ } + + @if (rate(); as rate) { +
+

Cash back program

+

+ {{ rate.rate | percentRate }} + {{ rate.description }} +

+

+ Effective {{ rate.effectiveFrom | date: 'longDate' }} · + {{ rate.annualCap ? 'Annual cap of ' + rate.annualCap : 'No annual cap' }} +

+
+ } + +
+

Display preferences

+ +
+ } +
diff --git a/src/app/account/account.component.scss b/src/app/account/account.component.scss new file mode 100644 index 000000000..43852971d --- /dev/null +++ b/src/app/account/account.component.scss @@ -0,0 +1,38 @@ +@use '../shared/scss/variables' as *; + +.card-face { + display: flex; + flex-direction: column; + gap: 10px; + padding: 20px; + margin-bottom: 20px; + border-radius: 10px; + color: #fff; + background: linear-gradient(135deg, #067647, #10231c); + max-width: 340px; + + .card-number { + font-size: 20px; + letter-spacing: 2px; + } + + .card-network { + text-transform: uppercase; + letter-spacing: 2px; + font-size: 12px; + opacity: 0.85; + } +} + +.account-stats { + margin-bottom: 0; + + .stat-label { + margin-bottom: 4px; + } +} + +.program-rate { + font-weight: 700; + margin-right: 6px; +} diff --git a/src/app/account/account.component.ts b/src/app/account/account.component.ts new file mode 100644 index 000000000..ebf4d1e71 --- /dev/null +++ b/src/app/account/account.component.ts @@ -0,0 +1,45 @@ +import { DatePipe, TitleCasePipe } from '@angular/common'; +import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core'; + +import { SettingsControlsComponent } from '../core/settings/settings-controls.component'; +import { ErrorMessageComponent } from '../shared/components/error-message/error-message.component'; +import { LoaderComponent } from '../shared/components/loader/loader.component'; +import { AmountPipe } from '../shared/pipes/amount.pipe'; +import { PercentRatePipe } from '../shared/pipes/percent-rate.pipe'; +import { CashbackApiService } from '../shared/services/cashback-api.service'; +import { SettingsService } from '../shared/services/settings.service'; +import { hasError, isLoading, loadedValue, toLoadState } from '../shared/util/load-state'; + +@Component({ + selector: 'app-account', + imports: [ + DatePipe, + TitleCasePipe, + AmountPipe, + PercentRatePipe, + LoaderComponent, + ErrorMessageComponent, + SettingsControlsComponent, + ], + templateUrl: './account.component.html', + styleUrl: './account.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class AccountComponent { + private readonly api = inject(CashbackApiService); + private readonly settingsService = inject(SettingsService); + + readonly maskAmounts = this.settingsService.maskAmounts; + + private readonly accountsState = toLoadState(this.api.fetchCardAccounts()); + private readonly rateState = toLoadState(this.api.fetchCashbackRate()); + + readonly loading = computed(() => isLoading(this.accountsState(), this.rateState())); + readonly errored = computed(() => hasError(this.accountsState(), this.rateState())); + readonly accounts = computed(() => loadedValue(this.accountsState()) ?? []); + readonly rate = computed(() => loadedValue(this.rateState())); + + utilization(currentBalance: number, creditLimit: number): string { + return creditLimit ? `${Math.round((currentBalance / creditLimit) * 100)}%` : '—'; + } +} diff --git a/src/app/account/account.routes.ts b/src/app/account/account.routes.ts new file mode 100644 index 000000000..292d74383 --- /dev/null +++ b/src/app/account/account.routes.ts @@ -0,0 +1,9 @@ +import { Routes } from '@angular/router'; + +export const ACCOUNT_ROUTES: Routes = [ + { + path: '', + title: 'Card & settings · Vantage 4% Cash Card', + loadComponent: () => import('./account.component').then((m) => m.AccountComponent), + }, +]; diff --git a/src/app/app.component.html b/src/app/app.component.html index e60bb4612..0ac3bb7ca 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,8 +1,10 @@ -
-
-
- - - -
+
+
+
+ +
+ +
+ +
diff --git a/src/app/app.component.scss b/src/app/app.component.scss index c0b93891e..597ba05bb 100644 --- a/src/app/app.component.scss +++ b/src/app/app.component.scss @@ -1,24 +1,24 @@ -@import "./shared/scss/media"; -@import "./shared/scss/theme_variables"; +@use './shared/scss/variables' as *; .body-cover { - width: 100%; - z-index: 0; - position: fixed; - height: 100%; + width: 100%; + z-index: 0; + position: fixed; + height: 100%; } .wrapper { - position: relative; - width: 85%; - min-height: 80px; - margin: 0 auto; - font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif; - font-size: 15px; - height: 100%; - line-height: 1.3; + position: relative; + width: 85%; + min-height: 80px; + margin: 0 auto; + font-family: + 'HelveticaNeue-Light', 'Helvetica Neue Light', 'Helvetica Neue', Helvetica, Arial, 'Lucida Grande', sans-serif; + font-size: 15px; + height: 100%; + line-height: 1.3; - @media #{$mobile-only} { - width: 100%; - } + @media #{$mobile-only} { + width: 100%; + } } diff --git a/src/app/app.component.ts b/src/app/app.component.ts index dba13510e..fa5787e8b 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,31 +1,18 @@ -import { Component } from '@angular/core'; -import { Router, NavigationEnd } from '@angular/router'; +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; +import { FooterComponent } from './core/footer/footer.component'; +import { HeaderComponent } from './core/header/header.component'; import { SettingsService } from './shared/services/settings.service'; -import { Settings } from './shared/models/settings'; - -declare let ga: Function; @Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] + selector: 'app-root', + imports: [RouterOutlet, HeaderComponent, FooterComponent], + templateUrl: './app.component.html', + styleUrl: './app.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, }) - export class AppComponent { - settings: Settings; - theme: string; - - constructor( - private _settingsService: SettingsService, - public router: Router - ) { - this.settings = this._settingsService.settings; - this.router.events.subscribe(event => { - if (event instanceof NavigationEnd) { - ga('set', 'page', event.urlAfterRedirects); - ga('send', 'pageview'); - } - }); - } + private readonly settingsService = inject(SettingsService); + readonly theme = this.settingsService.theme; } diff --git a/src/app/app.config.ts b/src/app/app.config.ts new file mode 100644 index 000000000..509bedef9 --- /dev/null +++ b/src/app/app.config.ts @@ -0,0 +1,28 @@ +import { provideHttpClient, withFetch } from '@angular/common/http'; +import { + ApplicationConfig, + isDevMode, + provideBrowserGlobalErrorListeners, + provideZoneChangeDetection, +} from '@angular/core'; +import { provideRouter, withComponentInputBinding, withInMemoryScrolling } from '@angular/router'; +import { provideServiceWorker } from '@angular/service-worker'; + +import { routes } from './app.routes'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideBrowserGlobalErrorListeners(), + provideZoneChangeDetection({ eventCoalescing: true }), + provideHttpClient(withFetch()), + provideRouter( + routes, + withComponentInputBinding(), + withInMemoryScrolling({ scrollPositionRestoration: 'top' }) + ), + provideServiceWorker('ngsw-worker.js', { + enabled: !isDevMode(), + registrationStrategy: 'registerWhenStable:30000', + }), + ], +}; diff --git a/src/app/app.module.ts b/src/app/app.module.ts deleted file mode 100644 index 5753df619..000000000 --- a/src/app/app.module.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { BrowserModule } from '@angular/platform-browser'; -import { NgModule } from '@angular/core'; - -import { routing } from './app.routes'; - -import { AppComponent } from './app.component'; -import { CoreModule } from './core/core.module'; -import { FeedComponent } from './feeds/feed/feed.component'; -import { ItemComponent } from './feeds/item/item.component'; -import { SharedComponentsModule } from './shared/components/shared-components.module'; -import { PipesModule } from './shared/pipes/pipes.module'; -import { ServiceWorkerModule } from '@angular/service-worker'; -import { environment } from '../environments/environment'; -import { HackerNewsAPIService } from './shared/services/hackernews-api.service'; -import { SettingsService } from './shared/services/settings.service'; - -@NgModule({ - declarations: [AppComponent, FeedComponent, ItemComponent], - imports: [ - BrowserModule, - routing, - CoreModule, - SharedComponentsModule, - PipesModule, - ServiceWorkerModule.register('ngsw-worker.js', { - enabled: environment.production, - }), - ], - providers: [HackerNewsAPIService, SettingsService], - bootstrap: [AppComponent], -}) -export class AppModule {} diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index 01df4707b..5cb87e28c 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -1,43 +1,23 @@ -import { Routes, RouterModule } from '@angular/router'; +import { Routes } from '@angular/router'; -import { FeedComponent } from './feeds/feed/feed.component'; - -const feedRoutes = [{ - path: ':page', - component: FeedComponent -}]; - -const routes: Routes = [ - {path: '', redirectTo: 'news/1', pathMatch: 'full'}, - { - path: 'news', - children: feedRoutes, - data: {feedType: 'news'} - }, - { - path: 'newest', - children: feedRoutes, - data: {feedType: 'newest'} - }, - { - path: 'show', - children: feedRoutes, - data: {feedType: 'show'} - }, - { - path: 'ask', - children: feedRoutes, - data: {feedType: 'ask'} - }, - { - path: 'jobs', - children: feedRoutes, - data: {feedType: 'jobs'} - }, - {path: 'item', loadChildren: () => import('./item-details/item-details.module').then(m => m.ItemDetailsModule)}, - {path: 'user', loadChildren: () => import('./user/user.module').then(m => m.UserModule)} +export const routes: Routes = [ + { path: '', pathMatch: 'full', redirectTo: 'dashboard' }, + { + path: 'dashboard', + title: 'Dashboard · Vantage 4% Cash Card', + loadComponent: () => import('./dashboard/dashboard.component').then((m) => m.DashboardComponent), + }, + { + path: 'transactions', + loadChildren: () => import('./transactions/transactions.routes').then((m) => m.TRANSACTIONS_ROUTES), + }, + { + path: 'rewards', + loadChildren: () => import('./rewards/rewards.routes').then((m) => m.REWARDS_ROUTES), + }, + { + path: 'account', + loadChildren: () => import('./account/account.routes').then((m) => m.ACCOUNT_ROUTES), + }, + { path: '**', redirectTo: 'dashboard' }, ]; - - -// - Updated Export -export const routing = RouterModule.forRoot(routes); diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts deleted file mode 100644 index cd00a0c21..000000000 --- a/src/app/core/core.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { RouterModule } from '@angular/router'; -import { SettingsComponent } from './settings/settings.component'; -import { HeaderComponent } from './header/header.component'; -import { FooterComponent } from './footer/footer.component'; - -@NgModule({ - imports: [CommonModule, RouterModule], - declarations: [HeaderComponent, FooterComponent, SettingsComponent], - exports: [HeaderComponent, FooterComponent] -}) -export class CoreModule { } diff --git a/src/app/core/footer/footer.component.html b/src/app/core/footer/footer.component.html index 68d0861e2..66373adac 100644 --- a/src/app/core/footer/footer.component.html +++ b/src/app/core/footer/footer.component.html @@ -1,3 +1,9 @@ +

+ Vantage 4% Cash Card — cash back is credited as a statement credit. + See how your 4% is calculated +

+

+ © {{ year }} Vantage Card. Demo experience with sample data; rates and balances are illustrative. +

+
diff --git a/src/app/core/footer/footer.component.scss b/src/app/core/footer/footer.component.scss index 8adac775d..e34cc2003 100644 --- a/src/app/core/footer/footer.component.scss +++ b/src/app/core/footer/footer.component.scss @@ -1,23 +1,30 @@ -@import "../../shared/scss/media"; -@import "../../shared/scss/theme_variables"; +@use '../../shared/scss/variables' as *; #footer { - position: relative; - padding: 10px; - height: 60px; - letter-spacing: 0.7px; - text-align: center; + position: relative; + padding: 16px 10px; + letter-spacing: 0.4px; + text-align: center; + font-size: 13px; - a { - font-weight: bold; - text-decoration: none; + p { + margin: 4px 0; + } + + a { + font-weight: bold; + text-decoration: none; - &:hover { - text-decoration: underline; + &:hover { + text-decoration: underline; + } } - } - @media #{$mobile-only} { - display: none; - } + .fine-print { + font-size: 11px; + } + + @media #{$mobile-only} { + display: none; + } } diff --git a/src/app/core/footer/footer.component.ts b/src/app/core/footer/footer.component.ts index da17d8242..a268a37ad 100644 --- a/src/app/core/footer/footer.component.ts +++ b/src/app/core/footer/footer.component.ts @@ -1,15 +1,13 @@ -import { Component, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; +import { RouterLink } from '@angular/router'; @Component({ - selector: 'app-footer', - templateUrl: './footer.component.html', - styleUrls: ['./footer.component.scss'] + selector: 'app-footer', + imports: [RouterLink], + templateUrl: './footer.component.html', + styleUrl: './footer.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, }) -export class FooterComponent implements OnInit { - - constructor() { } - - ngOnInit() { - } - +export class FooterComponent { + readonly year = new Date().getFullYear(); } diff --git a/src/app/core/header/header.component.html b/src/app/core/header/header.component.html index 8e01f33ee..0506abde3 100644 --- a/src/app/core/header/header.component.html +++ b/src/app/core/header/header.component.html @@ -1,25 +1,28 @@
+ @if (settings().showSettings) { + + } + diff --git a/src/app/core/header/header.component.scss b/src/app/core/header/header.component.scss index 75a262e76..276d29188 100644 --- a/src/app/core/header/header.component.scss +++ b/src/app/core/header/header.component.scss @@ -1,149 +1,119 @@ -@import "../../shared/scss/media"; -@import "../../shared/scss/theme_variables"; +@use '../../shared/scss/variables' as *; #header { - color: #fff; - padding: 6px 0; - line-height: 18px; - vertical-align: middle; - position: relative; - z-index: 1; - width: 100%; - - @media #{$mobile-only} { - height: 50px; - position: fixed; - top: 0; - } - - a { - display: inline; - } -} + color: #fff; + padding: 10px 20px; + display: flex; + align-items: center; + gap: 14px; + position: relative; + z-index: 1; + width: 100%; + box-sizing: border-box; -.home-link { - width: 50px; - height: 66px; + @media #{$mobile-only} { + height: 50px; + position: fixed; + top: 0; + padding: 6px 10px; + } } -.logo-inner { - width: 32px; - position: absolute; - left: 17px; - top: 18px; - z-index: -1; - height: 32px; - border-radius: 50%; - - @media #{$mobile-only} { - left: 16px; - top: 12px; - } +.home-link { + display: flex; + align-items: center; } .logo { - width: 50px; - padding: 3px 8px 0; + width: 40px; + display: block; - @media #{$mobile-only} { - width: 45px; - padding: 0 0 0 10px; - } + @media #{$mobile-only} { + width: 34px; + } } -h1 { - font-weight: normal; - display: inline-block; - vertical-align:middle; - margin: 0; - font-size: 16px; - - a { - color: #fff; - text-decoration: none; - } +.header-text { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; } -.name { - margin-right: 30px; - margin-bottom: 2px; - - @media #{$mobile-only} { - display: none; - } -} +.brand { + font-size: 18px; + font-weight: 600; + letter-spacing: 1px; -.header-text { - position: absolute; - width: inherit; - height: 20px; - left: 10px; - top: 27px; - z-index: -1; - - @media #{$mobile-only} { - top: 22px; - } + @media #{$mobile-only} { + font-size: 16px; + } } -.left { - position: absolute; - left: 60px; - font-size: 16px; +.rate-pill { + padding: 2px 10px; + border-radius: 999px; + background: rgba(255, 255, 255, 0.18); + font-size: 12px; + text-transform: uppercase; + letter-spacing: 1px; - @media #{$mobile-only} { - width: 100%; - left: 0; - } + @media #{$mobile-only} { + display: none; + } } .header-nav { - display: inline-block; - margin-left: 20px; - - @media #{$mobile-only} { - margin-left: 60px; - } + display: inline-block; + + a { + color: hsla(0, 0%, 100%, 0.9) !important; + text-decoration: none; + margin: 0 5px; + letter-spacing: 1.4px; + font-size: 14px; + + &:hover { + color: #fff !important; + } + } - a { - color: hsla(0,0%,100%,.9); - text-decoration: none; - margin: 0 5px; - letter-spacing: 1.8px; + .active { + color: #fff !important; + font-weight: 600; + } - &:hover { - color: #fff; + .divider { + opacity: 0.5; } - } - .active { - color: #fff; - } + @media #{$mobile-only} { + font-size: 13px; + + .divider { + display: none; + } + } } .info { - position: absolute; - top: 0; - right: 20px; - height: 100%; - - @media #{$mobile-only} { - right: 10px; - } - - img { - opacity: 0.8; - width: 25px; - margin-top: 21.5px; + margin-left: auto; +} + +.settings-button { + background: none; + border: 0; + padding: 0; + cursor: pointer; display: block; - &:hover { - opacity: 1; - cursor: pointer; - } + img { + opacity: 0.8; + width: 24px; + display: block; - @media #{$mobile-only} { - margin-top: 15px; + &:hover { + opacity: 1; + } } - } } diff --git a/src/app/core/header/header.component.ts b/src/app/core/header/header.component.ts index 4c5181358..a404a5367 100644 --- a/src/app/core/header/header.component.ts +++ b/src/app/core/header/header.component.ts @@ -1,28 +1,25 @@ -import { Component, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; +import { RouterLink, RouterLinkActive } from '@angular/router'; import { SettingsService } from '../../shared/services/settings.service'; -import { Settings } from '../../shared/models/settings'; +import { SettingsComponent } from '../settings/settings.component'; @Component({ - selector: 'app-header', - templateUrl: './header.component.html', - styleUrls: ['./header.component.scss'] + selector: 'app-header', + imports: [RouterLink, RouterLinkActive, SettingsComponent], + templateUrl: './header.component.html', + styleUrl: './header.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, }) -export class HeaderComponent implements OnInit { - settings: Settings; +export class HeaderComponent { + private readonly settingsService = inject(SettingsService); + readonly settings = this.settingsService.settings; - constructor(private _settingsService: SettingsService) { - this.settings = this._settingsService.settings; - } + toggleSettings(): void { + this.settingsService.toggleSettings(); + } - ngOnInit() { - } - - toggleSettings() { - this._settingsService.toggleSettings(); - } - - scrollTop() { - window.scrollTo(0, 0); - } + scrollTop(): void { + window.scrollTo(0, 0); + } } diff --git a/src/app/core/settings/settings-controls.component.html b/src/app/core/settings/settings-controls.component.html new file mode 100644 index 000000000..181ead14d --- /dev/null +++ b/src/app/core/settings/settings-controls.component.html @@ -0,0 +1,57 @@ +
+
+

Privacy

+ +
+
+
+

Select a theme

+ @for (theme of themes; track theme.value) { +
+ +
+ } +
+
+

Display

+
+ +
+
+ +
+
+
+
diff --git a/src/app/core/settings/settings-controls.component.scss b/src/app/core/settings/settings-controls.component.scss new file mode 100644 index 000000000..5c1193bc9 --- /dev/null +++ b/src/app/core/settings/settings-controls.component.scss @@ -0,0 +1,38 @@ +@use '../../shared/scss/variables' as *; + +.content { + letter-spacing: 1px; + overflow: auto; + + h2 { + padding-top: 10px; + font-size: 16px; + } + + label { + cursor: pointer; + } + + input[type='number'] { + width: 72px; + height: 24px; + border-radius: 5px; + padding: 2px 6px; + margin-left: 8px; + } +} + +.field { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + max-width: 280px; + margin-bottom: 10px; +} + +.control-section { + margin-bottom: 15px; + padding-bottom: 15px; + border-bottom: 1px solid rgba(128, 128, 128, 0.4); +} diff --git a/src/app/core/settings/settings-controls.component.ts b/src/app/core/settings/settings-controls.component.ts new file mode 100644 index 000000000..baca27317 --- /dev/null +++ b/src/app/core/settings/settings-controls.component.ts @@ -0,0 +1,37 @@ +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; + +import { Theme } from '../../shared/models/settings'; +import { SettingsService } from '../../shared/services/settings.service'; + +/** Preference controls shared by the settings overlay and the card account page. */ +@Component({ + selector: 'app-settings-controls', + templateUrl: './settings-controls.component.html', + styleUrl: './settings-controls.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class SettingsControlsComponent { + private readonly settingsService = inject(SettingsService); + readonly settings = this.settingsService.settings; + readonly themes: { value: Theme; label: string }[] = [ + { value: 'default', label: 'Default' }, + { value: 'night', label: 'Night' }, + { value: 'amoledblack', label: 'Black (AMOLED)' }, + ]; + + toggleMaskAmounts(): void { + this.settingsService.toggleMaskAmounts(); + } + + selectTheme(theme: Theme): void { + this.settingsService.setTheme(theme); + } + + changeTitleFont(value: string): void { + this.settingsService.setFont(value); + } + + changeSpacing(value: string): void { + this.settingsService.setSpacing(value); + } +} diff --git a/src/app/core/settings/settings.component.html b/src/app/core/settings/settings.component.html index 0156eca53..a59cd81f8 100644 --- a/src/app/core/settings/settings.component.html +++ b/src/app/core/settings/settings.component.html @@ -1,83 +1,8 @@
- diff --git a/src/app/core/settings/settings.component.scss b/src/app/core/settings/settings.component.scss index 689da6584..2b0ddc090 100644 --- a/src/app/core/settings/settings.component.scss +++ b/src/app/core/settings/settings.component.scss @@ -1,5 +1,4 @@ -@import "../../shared/scss/media"; -@import "../../shared/scss/theme_variables"; +@use '../../shared/scss/variables' as *; .overlay { position: fixed; @@ -37,36 +36,23 @@ top: 12px; right: 20px; font-size: 30px; + line-height: 1; font-weight: bold; - text-decoration: none; + background: none; + border: 0; + padding: 0; color: rgba(255,255,255,0.8); &:hover { color: #fff; cursor: pointer; } } - .content { - max-height: 30%; + app-settings-controls { + display: block; color: #fff; - letter-spacing: 1px; - overflow: auto; - } - input[type=number] { - display: block; - width: 80%; - height: 20px; - margin-bottom: 15px; - border-radius: 5px; - padding: 2px; } } -.control-section { - margin-bottom: 15px; - padding-bottom: 15px; - border-bottom: 1px solid white; -} - @media screen and (max-width: 700px) { .box, .popup { width: 70%; diff --git a/src/app/core/settings/settings.component.ts b/src/app/core/settings/settings.component.ts index a26f89d99..177ade287 100644 --- a/src/app/core/settings/settings.component.ts +++ b/src/app/core/settings/settings.component.ts @@ -1,40 +1,19 @@ -import { Component, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; import { SettingsService } from '../../shared/services/settings.service'; -import { Settings } from '../../shared/models/settings'; +import { SettingsControlsComponent } from './settings-controls.component'; @Component({ - selector: 'app-settings', - templateUrl: './settings.component.html', - styleUrls: ['./settings.component.scss'] + selector: 'app-settings', + imports: [SettingsControlsComponent], + templateUrl: './settings.component.html', + styleUrl: './settings.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, }) -export class SettingsComponent implements OnInit { - settings: Settings; +export class SettingsComponent { + private readonly settingsService = inject(SettingsService); - constructor(private _settingsService: SettingsService) { - this.settings = this._settingsService.settings; - } - - ngOnInit() { - } - - closeSettings() { - this._settingsService.toggleSettings(); - } - - toggleOpenLinksInNewTab() { - this._settingsService.toggleOpenLinksInNewTab(); - } - - selectTheme(theme) { - this._settingsService.setTheme(theme); - } - - changeTitleFont(val){ - this._settingsService.setFont(val); - } - - changeSpacing(val){ - this._settingsService.setSpacing(val); - } + closeSettings(): void { + this.settingsService.closeSettings(); + } } diff --git a/src/app/dashboard/dashboard.component.html b/src/app/dashboard/dashboard.component.html new file mode 100644 index 000000000..0041baa83 --- /dev/null +++ b/src/app/dashboard/dashboard.component.html @@ -0,0 +1,108 @@ +
+ @if (errored()) { + + } @else if (loading()) { + + } @else { + @if (cashbackRate(); as rate) { +
+
{{ rate.rate | percentRate }}
+
+

{{ rate.headline }}

+

{{ rate.description }}

+

+ Effective {{ rate.effectiveFrom | date: 'longDate' }} · + {{ rate.annualCap ? 'Capped at ' + rate.annualCap : 'No annual cap' }} · + View rewards breakdown +

+
+
+ } + +
+
+ Cash back earned + {{ + rewards()?.totalCashbackEarned | amount: maskAmounts() + }} + {{ rewards()?.periodLabel }} +
+
+ Available to redeem + {{ rewards()?.cashbackAvailable | amount: maskAmounts() }} + {{ rewards()?.cashbackRedeemed | amount: maskAmounts() }} already redeemed +
+
+ Current balance + {{ + totalBalance() | amount: maskAmounts() + }} + Across {{ primaryAccount() ? 'all cards' : 'no cards' }} +
+
+ Available credit + {{ availableCredit() | amount: maskAmounts() }} + @if (primaryAccount(); as account) { + Payment due {{ account.paymentDueDate | date: 'mediumDate' }} + } +
+
+ + + + @if (primaryAccount(); as account) { +
+
+

{{ account.productName }}

+ Manage card +
+
+
+ Card + •••• {{ account.last4 }} +
+
+ Statement balance + {{ account.statementBalance | amount: maskAmounts() }} +
+
+ Credit limit + {{ account.creditLimit | amount: maskAmounts() }} +
+
+ Status + {{ account.status | titlecase }} +
+
+
+ } + } +
diff --git a/src/app/dashboard/dashboard.component.scss b/src/app/dashboard/dashboard.component.scss new file mode 100644 index 000000000..23f61f6b4 --- /dev/null +++ b/src/app/dashboard/dashboard.component.scss @@ -0,0 +1,14 @@ +@use '../shared/scss/variables' as *; + +.hero-meta { + margin-top: 12px !important; + font-size: 13px; +} + +.card-summary { + margin-bottom: 0; + + .stat-label { + margin-bottom: 4px; + } +} diff --git a/src/app/dashboard/dashboard.component.spec.ts b/src/app/dashboard/dashboard.component.spec.ts new file mode 100644 index 000000000..cd11d910e --- /dev/null +++ b/src/app/dashboard/dashboard.component.spec.ts @@ -0,0 +1,41 @@ +import { provideHttpClient } from '@angular/common/http'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { provideRouter } from '@angular/router'; + +import { DashboardComponent } from './dashboard.component'; + +describe('DashboardComponent', () => { + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DashboardComponent], + providers: [provideHttpClient(), provideRouter([])], + }).compileComponents(); + + fixture = TestBed.createComponent(DashboardComponent); + fixture.detectChanges(); + await fixture.whenStable(); + fixture.detectChanges(); + }); + + function text(selector: string): string { + return fixture.nativeElement.querySelector(selector)?.textContent?.trim() ?? ''; + } + + it('headlines the 4% cashback rate', () => { + expect(text('[data-testid="cashback-rate"]')).toBe('4%'); + }); + + it('shows total cashback earned and the current balance', () => { + expect(text('[data-testid="total-cashback"]')).toMatch(/^\$\d/); + expect(text('[data-testid="current-balance"]')).toMatch(/^\$\d/); + }); + + it('lists recent transactions with the cashback they earned', () => { + const rows: HTMLElement[] = Array.from(fixture.nativeElement.querySelectorAll('.list-row')); + + expect(rows.length).toBe(5); + expect(rows[0].textContent).toContain('back'); + }); +}); diff --git a/src/app/dashboard/dashboard.component.ts b/src/app/dashboard/dashboard.component.ts new file mode 100644 index 000000000..e8cfd93ac --- /dev/null +++ b/src/app/dashboard/dashboard.component.ts @@ -0,0 +1,62 @@ +import { DatePipe, TitleCasePipe } from '@angular/common'; +import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core'; +import { RouterLink } from '@angular/router'; + +import { ErrorMessageComponent } from '../shared/components/error-message/error-message.component'; +import { LoaderComponent } from '../shared/components/loader/loader.component'; +import { AmountPipe } from '../shared/pipes/amount.pipe'; +import { PercentRatePipe } from '../shared/pipes/percent-rate.pipe'; +import { CashbackApiService } from '../shared/services/cashback-api.service'; +import { SettingsService } from '../shared/services/settings.service'; +import { hasError, isLoading, loadedValue, toLoadState } from '../shared/util/load-state'; + +const RECENT_TRANSACTION_COUNT = 5; + +@Component({ + selector: 'app-dashboard', + imports: [ + RouterLink, + DatePipe, + TitleCasePipe, + AmountPipe, + PercentRatePipe, + LoaderComponent, + ErrorMessageComponent, + ], + templateUrl: './dashboard.component.html', + styleUrl: './dashboard.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class DashboardComponent { + private readonly api = inject(CashbackApiService); + private readonly settingsService = inject(SettingsService); + + readonly maskAmounts = this.settingsService.maskAmounts; + + private readonly rateState = toLoadState(this.api.fetchCashbackRate()); + private readonly accountsState = toLoadState(this.api.fetchCardAccounts()); + private readonly rewardsState = toLoadState(this.api.fetchRewardsSummary()); + private readonly transactionsState = toLoadState(this.api.fetchTransactions()); + + readonly loading = computed(() => + isLoading(this.rateState(), this.accountsState(), this.rewardsState(), this.transactionsState()) + ); + readonly errored = computed(() => + hasError(this.rateState(), this.accountsState(), this.rewardsState(), this.transactionsState()) + ); + + readonly cashbackRate = computed(() => loadedValue(this.rateState())); + readonly rewards = computed(() => loadedValue(this.rewardsState())); + private readonly accounts = computed(() => loadedValue(this.accountsState()) ?? []); + + readonly primaryAccount = computed(() => this.accounts()[0] ?? null); + readonly totalBalance = computed(() => this.accounts().reduce((sum, account) => sum + account.currentBalance, 0)); + readonly availableCredit = computed(() => + this.accounts().reduce((sum, account) => sum + account.availableCredit, 0) + ); + readonly recentTransactions = computed(() => + [...(loadedValue(this.transactionsState()) ?? [])] + .sort((a, b) => b.postedAt.localeCompare(a.postedAt)) + .slice(0, RECENT_TRANSACTION_COUNT) + ); +} diff --git a/src/app/feeds/feed/feed.component.html b/src/app/feeds/feed/feed.component.html deleted file mode 100644 index df9d45596..000000000 --- a/src/app/feeds/feed/feed.component.html +++ /dev/null @@ -1,24 +0,0 @@ -
- - - -
-

- These are jobs at startups that were funded by Y Combinator. - You can also get a job at a YC startup through Triplebyte. -

-
    -
  1. - -
  2. -
- -
-
diff --git a/src/app/feeds/feed/feed.component.scss b/src/app/feeds/feed/feed.component.scss deleted file mode 100644 index febcd8cdd..000000000 --- a/src/app/feeds/feed/feed.component.scss +++ /dev/null @@ -1,108 +0,0 @@ -@import "../../shared/scss/media"; -@import "../../shared/scss/theme_variables"; - -a { - text-decoration: none; - font-weight: bold; - - &:hover { - text-decoration: underline; - }; -} - -ol { - padding: 0 40px; - margin: 0; - - @media #{$mobile-only} { - box-sizing: border-box; - list-style: none; - padding: 0 10px; - } - - li { - position: relative; - -webkit-transition: background-color .2s ease; - transition: background-color .2s ease; - } -} - -.list-margin { - @media #{$mobile-only} { - margin-top: 55px; - } -} - -.main-content { - position: relative; - width: 100%; - min-height: 100vh; - -webkit-transition: opacity .2s ease; - transition: opacity .2s ease; - box-sizing: border-box; - padding: 8px 0; - z-index: 0; -} - -.post { - padding: 10px 0 10px 5px; - transition: background-color 0.2s ease; - border-bottom: 1px solid #CECECB; - - .itemNum { - color: #696969; - position: absolute; - width: 30px; - text-align: right; - left: 0; - top: 4px; - } -} - -.item-block { - display: block; -} - - -.nav { - padding: 10px 40px; - margin-top: 10px; - font-size: 17px; - - a { - @media #{$mobile-only} { - text-decoration: none; - } - } - - @media #{$mobile-only} { - margin: 20px 0; - text-align: center; - padding: 10px 80px; - height: 20px; - } - - .prev { - padding-right: 20px; - - @media #{$mobile-only} { - float: left; - padding-right: 0; - } - } - - .more { - @media #{$mobile-only} { - float: right; - } - } -} - -.job-header { - font-size: 15px; - padding: 0 40px 10px; - - @media #{$mobile-only} { - padding: 60px 15px 25px 15px; - } -} diff --git a/src/app/feeds/feed/feed.component.ts b/src/app/feeds/feed/feed.component.ts deleted file mode 100644 index 7550a0bb7..000000000 --- a/src/app/feeds/feed/feed.component.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { Observable } from 'rxjs'; -import { Subscription } from 'rxjs'; -import { ActivatedRoute } from '@angular/router'; - -import { HackerNewsAPIService } from '../../shared/services/hackernews-api.service'; -import { Story } from '../../shared/models/story'; - -@Component({ - selector: 'app-feed', - templateUrl: './feed.component.html', - styleUrls: ['./feed.component.scss'] -}) - -export class FeedComponent implements OnInit { - typeSub: Subscription; - pageSub: Subscription; - items: Story[]; - feedType: string; - pageNum: number; - listStart: number; - errorMessage = ''; - - constructor( - private _hackerNewsAPIService: HackerNewsAPIService, - private route: ActivatedRoute - ) { } - - ngOnInit() { - this.typeSub = this.route - .data - .subscribe(data => { - this.feedType = (data as any).feedType; - }); - - this.pageSub = this.route.params.subscribe(params => { - this.pageNum = params['page'] ? +params['page'] : 1; - this._hackerNewsAPIService.fetchFeed(this.feedType, this.pageNum) - .subscribe( - items => this.items = items, - error => this.errorMessage = 'Could not load ' + this.feedType + ' stories.', - () => { - this.listStart = ((this.pageNum - 1) * 30) + 1; - window.scrollTo(0, 0); - } - ); - }); - } -} diff --git a/src/app/feeds/item/item.component.html b/src/app/feeds/item/item.component.html deleted file mode 100644 index 1b1123196..000000000 --- a/src/app/feeds/item/item.component.html +++ /dev/null @@ -1,39 +0,0 @@ -
-

- - {{item.title}} - - ({{item.domain}}) -

-

- - {{item.title}} - -

-
-
- {{item.user}} - {{item.points}} ★ -
- -
-
- - {{item.points}} points by - {{item.user}} - - - {{ item.time_ago }} - | - - {{item.comments_count | comment }} - - - -
-
diff --git a/src/app/feeds/item/item.component.scss b/src/app/feeds/item/item.component.scss deleted file mode 100644 index 7f985c9c7..000000000 --- a/src/app/feeds/item/item.component.scss +++ /dev/null @@ -1,68 +0,0 @@ -@import "../../shared/scss/media"; -@import "../../shared/scss/theme_variables"; - -p { - margin: 2px 0; - - @media #{$mobile-only} { - margin-bottom: 5px; - margin-top: 0; - } - } - - a { - cursor: pointer; - text-decoration: none; - } - - .title { - font-size: 16px; - font-family: Verdana, Geneva, sans-serif; - } - - .subtext-laptop { - font-size: 12px; - font-weight: bold; - letter-spacing: 0.5px; - - a { - &:hover { - text-decoration: underline; - }; - } - @media #{$mobile-only} { - display: none; - } - } - - .subtext-palm { - font-size: 13px; - font-weight: bold; - letter-spacing: 0.5px; - - a { - &:hover { - text-decoration: underline; - }; - } - - .details { - margin-top: 5px; - - .right { - float: right; - } - } - @media #{$laptop-only} { - display: none; - } - } - - .domain { - color: #696969; - letter-spacing: 0.5px; - } - - .item-details { - padding: 10px; - } diff --git a/src/app/feeds/item/item.component.ts b/src/app/feeds/item/item.component.ts deleted file mode 100644 index 8a1bd9789..000000000 --- a/src/app/feeds/item/item.component.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Component, Input, OnInit } from '@angular/core'; -import { Story } from '../../shared/models/story'; - -import { SettingsService } from '../../shared/services/settings.service'; -import { Settings } from '../../shared/models/settings'; - -@Component({ - selector: 'item', - templateUrl: './item.component.html', - styleUrls: ['./item.component.scss'] -}) -export class ItemComponent implements OnInit { - @Input() item: Story; - settings: Settings; - - constructor(private _settingsService: SettingsService) { - this.settings = this._settingsService.settings; - } - - ngOnInit() {} - - get hasUrl(): boolean { - return this.item.url.indexOf('http') === 0; - } - -} diff --git a/src/app/item-details/comment/comment.component.html b/src/app/item-details/comment/comment.component.html deleted file mode 100644 index 6137a8cd2..000000000 --- a/src/app/item-details/comment/comment.component.html +++ /dev/null @@ -1,22 +0,0 @@ -
-
- [{{collapse ? '+' : '-'}}] - {{comment.user}} - {{comment.time_ago}} -
-
-
-

-
    -
  • - -
  • -
-
-
-
-
-
- [deleted] | Comment Deleted -
-
\ No newline at end of file diff --git a/src/app/item-details/comment/comment.component.scss b/src/app/item-details/comment/comment.component.scss deleted file mode 100644 index 83992b13c..000000000 --- a/src/app/item-details/comment/comment.component.scss +++ /dev/null @@ -1,85 +0,0 @@ -@import "../../shared/scss/media"; -@import "../../shared/scss/theme_variables"; - -:host >>> { - a { - font-weight: bold; - text-decoration: none; - &:hover { - text-decoration: underline; - } - } -} - -.meta { - font-size: 13px; - color: #696969; - font-weight: bold; - letter-spacing: 0.5px; - margin-bottom: 8px; - a { - text-decoration: none; - - &:hover { - text-decoration: underline; - } - } - .time { - padding-left: 5px; - } -} - -@media #{$mobile-only} { - .meta { - font-size: 14px; - margin-bottom: 10px; - .time { - padding: 0; - float: right; - } - } -} - -.meta-collapse { - margin-bottom: 20px; -} - -.deleted-meta { - font-size: 12px; - font-weight: bold; - letter-spacing: 0.5px; - margin: 30px 0; - a { - text-decoration: none; - } -} - -.collapse { - font-size: 13px; - letter-spacing: 2px; - cursor: pointer; -} - -.comment-tree { - margin-left: 24px; -} - -@media #{$tablet-only} { - .comment-tree { - margin-left: 8px; - } -} - -.comment-text { - font-size: 15px; - margin-top: 0; - margin-bottom: 20px; - word-wrap: break-word; - line-height: 1.5em; -} - -.subtree { - margin-left: 0; - padding: 0; - list-style-type: none; -} diff --git a/src/app/item-details/comment/comment.component.ts b/src/app/item-details/comment/comment.component.ts deleted file mode 100644 index c6b4da56c..000000000 --- a/src/app/item-details/comment/comment.component.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Component, Input, OnInit } from '@angular/core'; - -import { Comment } from '../../shared/models/comment'; - -@Component({ - selector: 'app-comment', - templateUrl: './comment.component.html', - styleUrls: ['./comment.component.scss'] -}) -export class CommentComponent implements OnInit { - @Input() comment: Comment; - collapse: boolean; - - constructor() {} - - ngOnInit() { - this.collapse = false; - } -} diff --git a/src/app/item-details/item-details.component.html b/src/app/item-details/item-details.component.html deleted file mode 100644 index 0bf73ae0f..000000000 --- a/src/app/item-details/item-details.component.html +++ /dev/null @@ -1,59 +0,0 @@ -
- - - -
- -
-

- - {{item.title}} - - ({{item.domain}}) -

-

- - {{item.title}} - -

-
- - {{item.points}} points by - {{item.user}} - - - {{item.time_ago}} - | - - {{item.comments_count | comment }} - - - -
-
-
-
-
-
{{pollResult.points}} points
-
-
-
-

-
    -
  • - -
  • -
-
-
diff --git a/src/app/item-details/item-details.component.scss b/src/app/item-details/item-details.component.scss deleted file mode 100644 index adde0bd7c..000000000 --- a/src/app/item-details/item-details.component.scss +++ /dev/null @@ -1,151 +0,0 @@ -@import "../shared/scss/media"; -@import "../shared/scss/theme_variables"; - -.main-content { - position: relative; - width: 100%; - min-height: 100vh; - -webkit-transition: opacity .2s ease; - transition: opacity .2s ease; - box-sizing: border-box; - padding: 8px 0; - z-index: 0; -} - -.item { - box-sizing: border-box; - padding: 10px 40px 0 40px; - z-index: 0; -} - -@media #{$tablet-only} { - .item { - padding: 10px 20px 0 40px; - } -} - -@media #{$mobile-only} { - .item { - box-sizing: border-box; - padding: 110px 15px 0 15px; - } -} - -.head-margin { - margin-bottom: 15px; -} - -p { - margin: 2px 0; -} - -.subject { - word-wrap: break-word; - margin-top: 20px; -} - -a { - cursor: pointer; - text-decoration: none; -} - -@media #{$mobile-only} { - .laptop { - display: none; - } -} - -@media #{$laptop-only} { - .mobile { - display: none; - } -} - -.title { - font-size: 16px; - font-family: Verdana, Geneva, sans-serif; -} - -.title-block { - text-align: center; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - margin: 0 75px; -} - -@media #{$mobile-only} { - .title { - font-size: 15px; - } - .back-button { - position: absolute; - top: 52%; - width: 0.6rem; - height: 0.6rem; - background: transparent; - box-shadow: 0 0 0 lightgray; - transition: all 200ms ease; - left: 4%; - transform: translate3d(0, -50%, 0) rotate(-135deg); - } -} - -.subtext { - font-size: 12px; - font-weight: bold; - letter-spacing: 0.5px; -} - -.domain { - letter-spacing: 0.5px; -} - -.subtext a { - &:hover { - text-decoration: underline; - } -} - -.item-details { - padding: 10px; -} - -.item-header { - padding-bottom: 10px; -} - -@media #{$mobile-only} { - .item-header { - padding: 10px 0 10px 0; - position: fixed; - width: 100%; - left: 0; - top: 62px; - } -} - -.pollResults { - margin-bottom: 1em; -} - -.pollContent { - * { - padding-bottom: 0; - margin-bottom: -1em; - margin-top: 1em; - } - .pollBar { - height: 10px; - margin-bottom: 1em; - } -} - -ul { - list-style-type: none; - padding: 10px 0; -} - -li { - display: list-item; -} diff --git a/src/app/item-details/item-details.component.ts b/src/app/item-details/item-details.component.ts deleted file mode 100644 index 88e6199f1..000000000 --- a/src/app/item-details/item-details.component.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Location } from '@angular/common'; -import { Subscription } from 'rxjs/Subscription'; - -import { HackerNewsAPIService } from '../shared/services/hackernews-api.service'; -import { SettingsService } from '../shared/services/settings.service'; - -import { Story } from '../shared/models/story'; -import { Settings } from '../shared/models/settings'; - -@Component({ - selector: 'app-item-details', - templateUrl: './item-details.component.html', - styleUrls: ['./item-details.component.scss'] -}) -export class ItemDetailsComponent implements OnInit { - sub: Subscription; - item: Story; - errorMessage = ''; - settings: Settings; - - constructor( - private _hackerNewsAPIService: HackerNewsAPIService, - private _settingsService: SettingsService, - private route: ActivatedRoute, - private _location: Location - ) { - this.settings = this._settingsService.settings; - } - - ngOnInit() { - this.sub = this.route.params.subscribe(params => { - let itemID = +params['id']; - this._hackerNewsAPIService.fetchItemContent(itemID).subscribe(item => { - this.item = item; - }, error => this.errorMessage = 'Could not load item comments.'); - }); - window.scrollTo(0, 0); - } - - goBack() { - this._location.back(); - } - - get hasUrl(): boolean { - return this.item.url.indexOf('http') === 0; - } - -} diff --git a/src/app/item-details/item-details.module.ts b/src/app/item-details/item-details.module.ts deleted file mode 100644 index 31c982939..000000000 --- a/src/app/item-details/item-details.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { RouterModule, Routes } from '@angular/router'; -import { ItemDetailsComponent } from './item-details.component'; -import { CommentComponent } from './comment/comment.component'; -import { SharedComponentsModule } from '../shared/components/shared-components.module'; -import { PipesModule } from '../shared/pipes/pipes.module'; - - -const routes: Routes = [ - { - path: ':id', - component: ItemDetailsComponent - } -] - -@NgModule({ - imports: [ SharedComponentsModule, CommonModule, RouterModule, PipesModule, RouterModule.forChild(routes) ], - declarations: [ ItemDetailsComponent, CommentComponent ], - exports: [ ItemDetailsComponent, RouterModule] -}) -export class ItemDetailsModule {} diff --git a/src/app/rewards/rewards.component.html b/src/app/rewards/rewards.component.html new file mode 100644 index 000000000..1b85a2e0d --- /dev/null +++ b/src/app/rewards/rewards.component.html @@ -0,0 +1,67 @@ +
+

Rewards

+

Where your cash back came from.

+ + @if (errored()) { + + } @else if (loading()) { + + } @else if (summary(); as summary) { +
+
{{ summary.rate | percentRate }}
+
+

{{ rate()?.headline }}

+

{{ rate()?.description }}

+
+
+ +
+
+ Cash back earned + {{ + summary.totalCashbackEarned | amount: maskAmounts() + }} + {{ summary.periodLabel }} +
+
+ Total spend + {{ summary.totalSpend | amount: maskAmounts() }} +
+
+ Redeemed + {{ summary.cashbackRedeemed | amount: maskAmounts() }} +
+
+ Available to redeem + {{ summary.cashbackAvailable | amount: maskAmounts() }} +
+
+ +
+
+

Cash back by category

+ View transactions +
+ @for (category of summary.categories; track category.category) { +
+
+ {{ category.label }} + + {{ category.cashbackEarned | amount: maskAmounts() }} + {{ category.share | percent: '1.0-0' }} of cash back + +
+
+
+
+ {{ category.spend | amount: maskAmounts() }} spent at + {{ summary.rate | percentRate }} +
+ } @empty { +

No cash back earned yet.

+ } +
+ } +
diff --git a/src/app/rewards/rewards.component.scss b/src/app/rewards/rewards.component.scss new file mode 100644 index 000000000..6e8e5a49b --- /dev/null +++ b/src/app/rewards/rewards.component.scss @@ -0,0 +1,26 @@ +@use '../shared/scss/variables' as *; + +.category-row { + padding: 12px 0; + + + .category-row { + border-top: 1px solid rgba(128, 128, 128, 0.2); + } +} + +.category-head { + display: flex; + align-items: baseline; + justify-content: space-between; + gap: 16px; + margin-bottom: 8px; + + .list-amounts { + display: flex; + flex-direction: column; + } +} + +.bar-track { + margin-bottom: 6px; +} diff --git a/src/app/rewards/rewards.component.spec.ts b/src/app/rewards/rewards.component.spec.ts new file mode 100644 index 000000000..f3f090a23 --- /dev/null +++ b/src/app/rewards/rewards.component.spec.ts @@ -0,0 +1,38 @@ +import { provideHttpClient } from '@angular/common/http'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { provideRouter } from '@angular/router'; + +import { RewardsComponent } from './rewards.component'; + +describe('RewardsComponent', () => { + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [RewardsComponent], + providers: [provideHttpClient(), provideRouter([])], + }).compileComponents(); + + fixture = TestBed.createComponent(RewardsComponent); + fixture.detectChanges(); + await fixture.whenStable(); + fixture.detectChanges(); + }); + + it('breaks cashback down by spend category', () => { + const rows: HTMLElement[] = Array.from( + fixture.nativeElement.querySelectorAll('[data-testid="category-row"]') + ); + + expect(rows.length).toBeGreaterThan(1); + expect(rows[0].textContent).toContain('4%'); + }); + + it('shows the 4% rate and total cashback earned', () => { + const rate = fixture.nativeElement.querySelector('[data-testid="cashback-rate"]'); + const total = fixture.nativeElement.querySelector('[data-testid="total-cashback"]'); + + expect(rate.textContent.trim()).toBe('4%'); + expect(total.textContent.trim()).toMatch(/^\$\d/); + }); +}); diff --git a/src/app/rewards/rewards.component.ts b/src/app/rewards/rewards.component.ts new file mode 100644 index 000000000..29bf0a146 --- /dev/null +++ b/src/app/rewards/rewards.component.ts @@ -0,0 +1,43 @@ +import { PercentPipe } from '@angular/common'; +import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core'; +import { RouterLink } from '@angular/router'; + +import { ErrorMessageComponent } from '../shared/components/error-message/error-message.component'; +import { LoaderComponent } from '../shared/components/loader/loader.component'; +import { AmountPipe } from '../shared/pipes/amount.pipe'; +import { PercentRatePipe } from '../shared/pipes/percent-rate.pipe'; +import { CashbackApiService } from '../shared/services/cashback-api.service'; +import { SettingsService } from '../shared/services/settings.service'; +import { hasError, isLoading, loadedValue, toLoadState } from '../shared/util/load-state'; + +@Component({ + selector: 'app-rewards', + imports: [RouterLink, PercentPipe, AmountPipe, PercentRatePipe, LoaderComponent, ErrorMessageComponent], + templateUrl: './rewards.component.html', + styleUrl: './rewards.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class RewardsComponent { + private readonly api = inject(CashbackApiService); + private readonly settingsService = inject(SettingsService); + + readonly maskAmounts = this.settingsService.maskAmounts; + + private readonly summaryState = toLoadState(this.api.fetchRewardsSummary()); + private readonly rateState = toLoadState(this.api.fetchCashbackRate()); + + readonly loading = computed(() => isLoading(this.summaryState(), this.rateState())); + readonly errored = computed(() => hasError(this.summaryState(), this.rateState())); + readonly summary = computed(() => loadedValue(this.summaryState())); + readonly rate = computed(() => loadedValue(this.rateState())); + + /** Widest category bar fills the track so smaller categories stay readable. */ + readonly maxCategoryCashback = computed(() => + Math.max(...(this.summary()?.categories.map((category) => category.cashbackEarned) ?? [0]), 0) + ); + + barWidth(cashbackEarned: number): string { + const max = this.maxCategoryCashback(); + return max ? `${(cashbackEarned / max) * 100}%` : '0%'; + } +} diff --git a/src/app/rewards/rewards.routes.ts b/src/app/rewards/rewards.routes.ts new file mode 100644 index 000000000..4d04e48d8 --- /dev/null +++ b/src/app/rewards/rewards.routes.ts @@ -0,0 +1,9 @@ +import { Routes } from '@angular/router'; + +export const REWARDS_ROUTES: Routes = [ + { + path: '', + title: 'Rewards · Vantage 4% Cash Card', + loadComponent: () => import('./rewards.component').then((m) => m.RewardsComponent), + }, +]; diff --git a/src/app/shared/components/error-message/error-message.component.html b/src/app/shared/components/error-message/error-message.component.html index 3c8f9fb65..30ca191c2 100644 --- a/src/app/shared/components/error-message/error-message.component.html +++ b/src/app/shared/components/error-message/error-message.component.html @@ -1,12 +1,8 @@ -
-
-
-
-
-
-
-
-
-

{{ message }}

-

If you are offline viewing, you'll need to visit this page with a network connection first before it can work offline.

+ diff --git a/src/app/shared/components/error-message/error-message.component.scss b/src/app/shared/components/error-message/error-message.component.scss index eb5cc01e8..750aabc59 100644 --- a/src/app/shared/components/error-message/error-message.component.scss +++ b/src/app/shared/components/error-message/error-message.component.scss @@ -1,115 +1,32 @@ -@import "../../scss/media"; -@import "../../scss/theme_variables"; +@use '../../scss/variables' as *; .error-section { - height: 300px; - margin: 200px; - - @media #{$mobile-only} { - height: 0; - display: block; - position: relative; - margin: 30vh 0; - } - - p { + max-width: 480px; + margin: 80px auto; text-align: center; padding: 0 25px; - &.strong { - margin-top: 25px; - font-weight: bold; + @media #{$mobile-only} { + margin: 30vh 0; } - } - - .skull { - width: $skull-size; - height: $skull-size; - position: relative; - top: 0; - left: 0; - right: 0; - bottom: 0; - margin: auto; - .head { - width: 100%; - height: 75%; - border-radius: 15% / 20%; - position: absolute; - top: 0; - left: 0; - &:before, &:after { - content: ""; - position: absolute; - border-radius: 50%; - width: 20%; - height: 30%; - bottom: 10%; - } - &:before { - left: 10%; - } - &:after { - right: 10%; - } - .crack { - width: 10%; - height: 10%; - position: absolute; - top: 0; - right: 25%; - transform: skew(-15deg); - - &:before { - content: ""; - position: absolute; - top: 100%; - left: $skull-size / 15; - border-right: $skull-size / 20 solid transparent; - border-left: $skull-size / 40 solid transparent; + p { + &.strong { + margin-top: 25px; + font-weight: bold; + font-size: 18px; } - } } - .mouth { - width: 40%; - height: 25%; - position: absolute; - top: 75%; - left: 30%; - border-radius: 0 0 $skull-size / 10 $skull-size / 10; - &:before { - content: ""; - position: absolute; - width: 15%; - height: 50%; - border-radius: 50% / 30%; - left: 42.5%; - top: -25%; - } - .teeth { - position: absolute; - bottom: 0; - left: 45%; - width: 10%; - height: 50%; - margin-bottom: -5%; - border-radius: 50% / 20%; +} - &:before, &:after { - content: ""; - position: absolute; - width: 100%; - height: 100%; - border-radius: 50% / 20%; - } - &:before { - left: -250%; - } - &:after { - right: -250%; - } - } - } - } +.error-badge { + width: 64px; + height: 64px; + line-height: 64px; + margin: 0 auto; + border-radius: 50%; + font-size: 32px; + font-weight: bold; + color: #fff; + background: #c0392b; } diff --git a/src/app/shared/components/error-message/error-message.component.ts b/src/app/shared/components/error-message/error-message.component.ts index cbd1219f3..d71feb2f5 100644 --- a/src/app/shared/components/error-message/error-message.component.ts +++ b/src/app/shared/components/error-message/error-message.component.ts @@ -1,16 +1,11 @@ -import { Component, Input, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component, input } from '@angular/core'; @Component({ - selector: 'app-error-message', - templateUrl: './error-message.component.html', - styleUrls: ['./error-message.component.scss'] + selector: 'app-error-message', + templateUrl: './error-message.component.html', + styleUrl: './error-message.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, }) -export class ErrorMessageComponent implements OnInit { - @Input() message: string; - - constructor() { } - - ngOnInit() { - } - +export class ErrorMessageComponent { + readonly message = input('Something went wrong.'); } diff --git a/src/app/shared/components/loader/loader.component.html b/src/app/shared/components/loader/loader.component.html index 0db7fc435..bd5ab519c 100644 --- a/src/app/shared/components/loader/loader.component.html +++ b/src/app/shared/components/loader/loader.component.html @@ -1,5 +1,3 @@ -
-
- Loading... -
+
+
Loading…
diff --git a/src/app/shared/components/loader/loader.component.scss b/src/app/shared/components/loader/loader.component.scss index 625d0fe8b..0364070d8 100644 --- a/src/app/shared/components/loader/loader.component.scss +++ b/src/app/shared/components/loader/loader.component.scss @@ -1,5 +1,4 @@ -@import "../../scss/media"; -@import "../../scss/theme_variables"; +@use '../../scss/variables' as *; .loader { -webkit-animation: load1 1s infinite ease-in-out; diff --git a/src/app/shared/components/loader/loader.component.ts b/src/app/shared/components/loader/loader.component.ts index b1c2ed7c0..67bc8132b 100644 --- a/src/app/shared/components/loader/loader.component.ts +++ b/src/app/shared/components/loader/loader.component.ts @@ -1,15 +1,9 @@ -import { Component, OnInit } from '@angular/core'; +import { ChangeDetectionStrategy, Component } from '@angular/core'; @Component({ - selector: 'app-loader', - templateUrl: './loader.component.html', - styleUrls: ['./loader.component.scss'] + selector: 'app-loader', + templateUrl: './loader.component.html', + styleUrl: './loader.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, }) -export class LoaderComponent implements OnInit { - - constructor() { } - - ngOnInit() { - } - -} +export class LoaderComponent {} diff --git a/src/app/shared/components/shared-components.module.ts b/src/app/shared/components/shared-components.module.ts deleted file mode 100644 index 97577eef8..000000000 --- a/src/app/shared/components/shared-components.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { LoaderComponent } from './loader/loader.component'; -import { ErrorMessageComponent } from './error-message/error-message.component'; - -@NgModule({ - imports: [CommonModule], - declarations: [ LoaderComponent, ErrorMessageComponent ], - exports: [ LoaderComponent, ErrorMessageComponent ] -}) -export class SharedComponentsModule {} diff --git a/src/app/shared/data/mock-cashback-data.ts b/src/app/shared/data/mock-cashback-data.ts new file mode 100644 index 000000000..109039ed2 --- /dev/null +++ b/src/app/shared/data/mock-cashback-data.ts @@ -0,0 +1,89 @@ +import { CardAccount } from '../models/card-account'; +import { CashbackRate } from '../models/reward'; +import { SpendCategory, Transaction } from '../models/transaction'; + +/** Flat cashback rate of the Vantage program: 4% on every purchase. */ +export const CASHBACK_RATE = 0.04; + +export const MOCK_CASHBACK_RATE: CashbackRate = { + rate: CASHBACK_RATE, + headline: '4% cash back on every purchase', + description: + 'Every eligible purchase earns a flat 4% back — no categories to activate, no rotating bonuses, no minimum spend.', + effectiveFrom: '2026-01-01', + annualCap: null, +}; + +export const MOCK_CARD_ACCOUNTS: CardAccount[] = [ + { + id: 'acct-4021', + productName: 'Vantage 4% Cash Card', + cardholderName: 'Alex Morgan', + last4: '4021', + network: 'visa', + currency: 'USD', + currentBalance: 1284.55, + statementBalance: 962.18, + creditLimit: 12000, + availableCredit: 10715.45, + paymentDueDate: '2026-08-14', + status: 'active', + }, + { + id: 'acct-8890', + productName: 'Vantage 4% Cash Card — Household', + cardholderName: 'Jordan Morgan', + last4: '8890', + network: 'visa', + currency: 'USD', + currentBalance: 318.4, + statementBalance: 210.0, + creditLimit: 4000, + availableCredit: 3681.6, + paymentDueDate: '2026-08-14', + status: 'active', + }, +]; + +interface MockSpend { + id: string; + accountId: string; + merchant: string; + category: SpendCategory; + postedAt: string; + amount: number; + pending?: boolean; +} + +/** Raw spend rows; cashback is derived so the 4% rate is applied in exactly one place. */ +const MOCK_SPEND: MockSpend[] = [ + { id: 'txn-1042', accountId: 'acct-4021', merchant: 'Blue Bottle Coffee', category: 'dining', postedAt: '2026-07-28T14:12:00Z', amount: 18.75, pending: true }, + { id: 'txn-1041', accountId: 'acct-4021', merchant: 'Whole Foods Market', category: 'groceries', postedAt: '2026-07-27T18:04:00Z', amount: 143.28 }, + { id: 'txn-1040', accountId: 'acct-8890', merchant: 'Shell', category: 'fuel', postedAt: '2026-07-27T08:47:00Z', amount: 62.1 }, + { id: 'txn-1039', accountId: 'acct-4021', merchant: 'Delta Air Lines', category: 'travel', postedAt: '2026-07-25T21:30:00Z', amount: 486.4 }, + { id: 'txn-1038', accountId: 'acct-4021', merchant: 'Netflix', category: 'streaming', postedAt: '2026-07-24T06:00:00Z', amount: 22.99 }, + { id: 'txn-1037', accountId: 'acct-8890', merchant: 'Target', category: 'shopping', postedAt: '2026-07-23T16:22:00Z', amount: 208.63 }, + { id: 'txn-1036', accountId: 'acct-4021', merchant: 'Sweetgreen', category: 'dining', postedAt: '2026-07-22T12:41:00Z', amount: 16.4 }, + { id: 'txn-1035', accountId: 'acct-4021', merchant: 'Trader Joe’s', category: 'groceries', postedAt: '2026-07-21T19:05:00Z', amount: 87.92 }, + { id: 'txn-1034', accountId: 'acct-4021', merchant: 'Marriott Bonvoy', category: 'travel', postedAt: '2026-07-19T23:11:00Z', amount: 312.0 }, + { id: 'txn-1033', accountId: 'acct-8890', merchant: 'Spotify', category: 'streaming', postedAt: '2026-07-18T06:00:00Z', amount: 11.99 }, + { id: 'txn-1032', accountId: 'acct-4021', merchant: 'Costco Gas', category: 'fuel', postedAt: '2026-07-17T09:38:00Z', amount: 54.72 }, + { id: 'txn-1031', accountId: 'acct-4021', merchant: 'Apple Store', category: 'shopping', postedAt: '2026-07-15T15:00:00Z', amount: 399.0 }, + { id: 'txn-1030', accountId: 'acct-4021', merchant: 'City Parking Authority', category: 'other', postedAt: '2026-07-14T17:26:00Z', amount: 24.0 }, + { id: 'txn-1029', accountId: 'acct-8890', merchant: 'Chipotle', category: 'dining', postedAt: '2026-07-12T13:09:00Z', amount: 31.18 }, +]; + +/** Rounds to whole cents so displayed cashback always adds up. */ +export function calculateCashback(amount: number, rate: number = CASHBACK_RATE): number { + return Math.round(amount * rate * 100) / 100; +} + +export const MOCK_TRANSACTIONS: Transaction[] = MOCK_SPEND.map((spend) => ({ + ...spend, + pending: spend.pending ?? false, + cashbackRate: CASHBACK_RATE, + cashbackEarned: calculateCashback(spend.amount), +})); + +/** Cashback already redeemed as a statement credit this year. */ +export const MOCK_CASHBACK_REDEEMED = 45.0; diff --git a/src/app/shared/models/card-account.ts b/src/app/shared/models/card-account.ts new file mode 100644 index 000000000..997b0889a --- /dev/null +++ b/src/app/shared/models/card-account.ts @@ -0,0 +1,18 @@ +export type CardAccountStatus = 'active' | 'frozen' | 'closed'; + +export interface CardAccount { + id: string; + productName: string; + cardholderName: string; + /** Last four digits of the card number — the full PAN never leaves the backend. */ + last4: string; + network: 'visa' | 'mastercard' | 'amex' | 'discover'; + currency: string; + currentBalance: number; + statementBalance: number; + creditLimit: number; + availableCredit: number; + /** ISO-8601 date of the next payment due date. */ + paymentDueDate: string; + status: CardAccountStatus; +} diff --git a/src/app/shared/models/comment.ts b/src/app/shared/models/comment.ts deleted file mode 100644 index afc289a2d..000000000 --- a/src/app/shared/models/comment.ts +++ /dev/null @@ -1,10 +0,0 @@ -export class Comment { - id: number; - level: number; - user: string; - time: number; - time_ago: string; - content: string; - deleted: boolean; - comments: Comment[]; -} diff --git a/src/app/shared/models/feed-type.type.ts b/src/app/shared/models/feed-type.type.ts deleted file mode 100644 index 5d3c15ba1..000000000 --- a/src/app/shared/models/feed-type.type.ts +++ /dev/null @@ -1 +0,0 @@ -export type FeedType = 'poll' | 'story' | 'job'; diff --git a/src/app/shared/models/poll-result.ts b/src/app/shared/models/poll-result.ts deleted file mode 100644 index bd8977d46..000000000 --- a/src/app/shared/models/poll-result.ts +++ /dev/null @@ -1,4 +0,0 @@ -export class PollResult { - points: number; - content: string; -} diff --git a/src/app/shared/models/reward.ts b/src/app/shared/models/reward.ts new file mode 100644 index 000000000..31ac0d90e --- /dev/null +++ b/src/app/shared/models/reward.ts @@ -0,0 +1,31 @@ +import { SpendCategory } from './transaction'; + +export interface CashbackRate { + /** Cashback rate as a fraction, e.g. 0.04 for the flat 4% program. */ + rate: number; + headline: string; + description: string; + /** ISO-8601 date the rate became effective. */ + effectiveFrom: string; + /** Annual cap on cashback earnings, or null when uncapped. */ + annualCap: number | null; +} + +export interface CategoryReward { + category: SpendCategory; + label: string; + spend: number; + cashbackEarned: number; + /** Share of total cashback earned, as a fraction between 0 and 1. */ + share: number; +} + +export interface RewardsSummary { + rate: number; + periodLabel: string; + totalSpend: number; + totalCashbackEarned: number; + cashbackRedeemed: number; + cashbackAvailable: number; + categories: CategoryReward[]; +} diff --git a/src/app/shared/models/settings.ts b/src/app/shared/models/settings.ts index 8a0f3ea15..2a20fdb15 100644 --- a/src/app/shared/models/settings.ts +++ b/src/app/shared/models/settings.ts @@ -1,7 +1,10 @@ +export type Theme = 'default' | 'night' | 'amoledblack'; + export interface Settings { - showSettings: boolean; - openLinkInNewTab: boolean; - theme: string; - titleFontSize: string; - listSpacing: string; + showSettings: boolean; + /** Masks balances and cashback amounts so the screen is safe to show in public. */ + maskAmounts: boolean; + theme: Theme; + titleFontSize: string; + listSpacing: string; } diff --git a/src/app/shared/models/story.ts b/src/app/shared/models/story.ts deleted file mode 100644 index dab22e181..000000000 --- a/src/app/shared/models/story.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Comment } from './comment'; -import { FeedType } from './feed-type.type'; -import { PollResult } from './poll-result'; - -export class Story { - id: number; - title: string; - points: number; - user: string; - time: number; - time_ago: number; - type: FeedType; - url: string; - domain: string; - comments: Comment[]; - comments_count: number; - poll: PollResult[]; - poll_votes_count: number; - deleted: boolean; - dead: boolean; -} diff --git a/src/app/shared/models/transaction.ts b/src/app/shared/models/transaction.ts new file mode 100644 index 000000000..d3c7a73e6 --- /dev/null +++ b/src/app/shared/models/transaction.ts @@ -0,0 +1,27 @@ +export type SpendCategory = 'dining' | 'groceries' | 'travel' | 'fuel' | 'streaming' | 'shopping' | 'other'; + +export const SPEND_CATEGORY_LABELS: Record = { + dining: 'Dining', + groceries: 'Groceries', + travel: 'Travel', + fuel: 'Fuel', + streaming: 'Streaming', + shopping: 'Shopping', + other: 'Everything else', +}; + +export interface Transaction { + id: string; + accountId: string; + merchant: string; + category: SpendCategory; + /** ISO-8601 timestamp of when the transaction posted. */ + postedAt: string; + /** Amount spent, in the account currency. */ + amount: number; + /** Cashback rate applied to this transaction, expressed as a fraction (0.04 = 4%). */ + cashbackRate: number; + /** Cashback credited for this transaction. */ + cashbackEarned: number; + pending: boolean; +} diff --git a/src/app/shared/models/user.ts b/src/app/shared/models/user.ts deleted file mode 100644 index 33f0a7aa9..000000000 --- a/src/app/shared/models/user.ts +++ /dev/null @@ -1,8 +0,0 @@ -export class User { - id: string; - crated_time: number; - created: string; - karma: number; - avg: number; - about: string; -} diff --git a/src/app/shared/pipes/amount.pipe.ts b/src/app/shared/pipes/amount.pipe.ts new file mode 100644 index 000000000..3aeac1f0b --- /dev/null +++ b/src/app/shared/pipes/amount.pipe.ts @@ -0,0 +1,18 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +/** + * Formats a monetary amount, replacing it with dots when the user has masked amounts. + * `masked` is passed in explicitly so the pipe stays pure. + */ +@Pipe({ name: 'amount' }) +export class AmountPipe implements PipeTransform { + transform(value: number | null | undefined, masked = false, currency = 'USD'): string { + if (value === null || value === undefined) { + return '—'; + } + if (masked) { + return '••••'; + } + return new Intl.NumberFormat('en-US', { style: 'currency', currency }).format(value); + } +} diff --git a/src/app/shared/pipes/comment.pipe.ts b/src/app/shared/pipes/comment.pipe.ts deleted file mode 100644 index 42c91e4ec..000000000 --- a/src/app/shared/pipes/comment.pipe.ts +++ /dev/null @@ -1,15 +0,0 @@ -import {Pipe, PipeTransform} from '@angular/core'; - -@Pipe({ - name: 'comment', - pure: true -}) -export class CommentPipe implements PipeTransform { - transform(comment: number): string { - if (comment > 0) { - let st = comment === 1 ? 'comment' : 'comments'; - return `${comment} ${st}`; - } - return 'discuss'; - } -} diff --git a/src/app/shared/pipes/percent-rate.pipe.ts b/src/app/shared/pipes/percent-rate.pipe.ts new file mode 100644 index 000000000..330f72f10 --- /dev/null +++ b/src/app/shared/pipes/percent-rate.pipe.ts @@ -0,0 +1,12 @@ +import { Pipe, PipeTransform } from '@angular/core'; + +/** Renders a rate fraction as a percentage, e.g. 0.04 -> "4%". */ +@Pipe({ name: 'percentRate' }) +export class PercentRatePipe implements PipeTransform { + transform(rate: number | null | undefined, maximumFractionDigits = 2): string { + if (rate === null || rate === undefined) { + return '—'; + } + return new Intl.NumberFormat('en-US', { style: 'percent', maximumFractionDigits }).format(rate); + } +} diff --git a/src/app/shared/pipes/pipes.module.ts b/src/app/shared/pipes/pipes.module.ts deleted file mode 100644 index 0720c237a..000000000 --- a/src/app/shared/pipes/pipes.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommentPipe } from './comment.pipe'; - -@NgModule({ - declarations: [CommentPipe], - exports: [CommentPipe] -}) -export class PipesModule {} diff --git a/src/app/shared/scss/_media.scss b/src/app/shared/scss/_media.scss deleted file mode 100644 index b04b71a92..000000000 --- a/src/app/shared/scss/_media.scss +++ /dev/null @@ -1,3 +0,0 @@ -$mobile-only: "only screen and (max-width : 768px)"; -$laptop-only: "only screen and (min-width : 769px)"; -$tablet-only: "only screen and (max-width : 1024px)"; diff --git a/src/app/shared/scss/_theme_variables.scss b/src/app/shared/scss/_theme_variables.scss deleted file mode 100644 index 41dae5eea..000000000 --- a/src/app/shared/scss/_theme_variables.scss +++ /dev/null @@ -1,37 +0,0 @@ -$skull-size: 200px; - -// ------------------------------------------------------------------------------------------- -// Theme Engine -// ------------------------------------------------------------------------------------------- - -// Day theme colors -$theme-day-body-background-color: #fff; -$theme-day-wrapper-background-color: #f5f5f5; -$theme-day-wrapper-mobile-background-color: #fff; -$theme-day-text-color: #000; -$theme-day-subtext-color: #696969; -$theme-day-secondary-color: #b92b27; -$theme-day-header-background-color: $theme-day-secondary-color; -$theme-day-logo-inner: #fff; - -// Day theme extras -$theme-day-border: 2px solid #b92b27; - -// Night theme colors -$theme-night-body-background-color: #37474F; -$theme-night-wrapper-background-color: #263238; -$theme-night-wrapper-mobile-background-color: $theme-night-wrapper-background-color; -$theme-night-text-color: rgba(255, 255, 255, 0.7); -$theme-night-subtext-color: #999; -$theme-night-secondary-color: #00c0ff; -$theme-night-header-background-color: #263238; -$theme-night-logo-inner: $theme-night-header-background-color; - -// Night theme extras -$theme-night-border: 2px solid #00c0ff; - -// Black theme colors -$theme-amoledblack-body-background-color: #000; -$theme-amoledblack-text-color: rgba(255, 255, 255, 0.75); -$theme-amoledblack-subtext-color: rgba(255, 255, 255, 0.5); -$theme-amoledblack-secondary-color: rgba(255, 255, 255, 0.6); diff --git a/src/app/shared/scss/_themes.scss b/src/app/shared/scss/_themes.scss index 231ed7cf9..271719759 100644 --- a/src/app/shared/scss/_themes.scss +++ b/src/app/shared/scss/_themes.scss @@ -1,5 +1,4 @@ -@import "./media"; -@import "./theme_variables"; +@use './variables' as *; /* ---------------------------------- @@ -8,234 +7,173 @@ ---------------------------------- */ @mixin theme( - $name, - $body-background-color, - $wrapper-background-color, - $wrapper-mobile-background-color, - $wrapper-color, - $item-a-color, - $item-a-visited-color, - $header-background-color, - $subtext-color, - $secondary-link-color, - $logo-inner-color, - $border + $name, + $body-background-color, + $wrapper-background-color, + $wrapper-mobile-background-color, + $panel-background-color, + $wrapper-color, + $header-background-color, + $subtext-color, + $secondary-link-color, + $logo-inner-color, + $hero-background, + $border ) { - .#{$name} { - .body-cover { - background: $body-background-color; + .#{$name} { + background: $body-background-color; + min-height: 100vh; - @media #{$mobile-only} { - background: $wrapper-mobile-background-color; - } - } - - .wrapper { - background: $wrapper-background-color; - color: $wrapper-color; - - @media #{$mobile-only} { - background: $wrapper-mobile-background-color; - } - - a { - color: $item-a-color; - - &:visited { - color: $item-a-visited-color; - } - } - - #header { - background: $header-background-color; - border-bottom: $border; - } - - .logo-inner { - background: $logo-inner-color; - } - - .nav { - a { - color: $secondary-link-color; - - @media #{$mobile-only} { - color: $secondary-link-color; - } - } - } + .body-cover { + background: $body-background-color; - #footer { - border-top: $border; - - a { - color: $secondary-link-color; - } - } - - .subtext, .subtext-palm, .subtext-laptop, .domain, .meta, .deleted-meta{ - color: $subtext-color; - - a { - color: $secondary-link-color; + @media #{$mobile-only} { + background: $wrapper-mobile-background-color; + } } - } - .popup { - background: $header-background-color; - } + .wrapper { + background: $wrapper-background-color; + color: $wrapper-color; - .item-header { - border-bottom: $border; - - @media #{$mobile-only} { - background: $wrapper-mobile-background-color; - } - } - - .pollContent { - .pollBar { - background: $secondary-link-color; - } - } + @media #{$mobile-only} { + background: $wrapper-mobile-background-color; + } - .loader { - color: $secondary-link-color; - background: $secondary-link-color; + a { + color: $secondary-link-color; + } - &:before, &:after { - background: $secondary-link-color; - } - } + #header { + background: $header-background-color; + border-bottom: $border; + } - .job-header { - @media #{$mobile-only} { - border-bottom: $border; - } - } + .logo-inner { + background: $logo-inner-color; + } - .back-button { - @media #{$mobile-only} { - border-top: .3rem solid $secondary-link-color; - border-right: .3rem solid $secondary-link-color; - } - } + #footer { + border-top: $border; - .error-section { - .skull { - .head { - background-color: $secondary-link-color; + a { + color: $secondary-link-color; + } + } - &:before, &:after { - background-color: $wrapper-background-color; + .muted, + .stat-label, + .meta, + .fine-print { + color: $subtext-color; + } - @media #{$mobile-only} { - background-color: $wrapper-mobile-background-color; - } + .panel, + .stat, + .popup { + background: $panel-background-color; } - .crack { - background-color: $wrapper-background-color; + .panel, + .stat { + border: 1px solid rgba(128, 128, 128, 0.25); + } - @media #{$mobile-only} { - background-color: $wrapper-mobile-background-color; - } + .panel-header { + border-bottom: 1px solid rgba(128, 128, 128, 0.25); + } - &:before { - border-top: $skull-size / 8 solid $wrapper-background-color; + .list-row + .list-row { + border-top: 1px solid rgba(128, 128, 128, 0.2); + } - @media #{$mobile-only} { - border-top: $skull-size / 8 solid $wrapper-mobile-background-color; - } - } + .rate-hero { + background: $hero-background; } - } - .mouth { - background-color: $secondary-link-color; + .accent, + .cashback-amount { + color: $secondary-link-color; + } - &:before { - background-color: $wrapper-background-color; + .bar-track { + background: rgba(128, 128, 128, 0.25); + } - @media #{$mobile-only} { - background-color: $wrapper-mobile-background-color; - } + .bar-fill { + background: $secondary-link-color; } - } - .teeth { - background-color: $wrapper-background-color; + .chip { + border: 1px solid $secondary-link-color; + color: $secondary-link-color; + } - @media #{$mobile-only} { - background-color: $wrapper-mobile-background-color; + .chip.selected { + background: $secondary-link-color; + color: $body-background-color; } - &:before, &:after { - background-color: $wrapper-background-color; + .loader { + color: $secondary-link-color; + background: $secondary-link-color; - @media #{$mobile-only} { - background-color: $wrapper-mobile-background-color; - } + &:before, + &:after { + background: $secondary-link-color; + } } - } - } - } - .main-details { - .name { - color: $secondary-link-color; - } - .right { - color: $secondary-link-color; + .back-button { + color: $secondary-link-color; + } } - } } - } } @include theme( - default, - $theme-day-body-background-color, - $theme-day-wrapper-background-color, - $theme-day-wrapper-mobile-background-color, - $theme-day-text-color, - $theme-day-text-color, - $theme-day-subtext-color, - $theme-day-header-background-color, - $theme-day-subtext-color, - $theme-day-secondary-color, - $theme-day-logo-inner, - $theme-day-border + default, + $theme-day-body-background-color, + $theme-day-wrapper-background-color, + $theme-day-wrapper-mobile-background-color, + $theme-day-panel-background-color, + $theme-day-text-color, + $theme-day-header-background-color, + $theme-day-subtext-color, + $theme-day-secondary-color, + $theme-day-logo-inner, + $theme-day-hero-background, + $theme-day-border ); @include theme( - night, - $theme-night-body-background-color, - $theme-night-wrapper-background-color, - $theme-night-wrapper-mobile-background-color, - $theme-night-text-color, - $theme-night-text-color, - $theme-night-subtext-color, - $theme-night-header-background-color, - $theme-night-subtext-color, - $theme-night-secondary-color, - $theme-night-logo-inner, - $theme-night-border + night, + $theme-night-body-background-color, + $theme-night-wrapper-background-color, + $theme-night-wrapper-mobile-background-color, + $theme-night-panel-background-color, + $theme-night-text-color, + $theme-night-header-background-color, + $theme-night-subtext-color, + $theme-night-secondary-color, + $theme-night-logo-inner, + $theme-night-hero-background, + $theme-night-border ); @include theme( - amoledblack, - $theme-amoledblack-body-background-color, - $theme-amoledblack-body-background-color, - $theme-amoledblack-body-background-color, - $theme-amoledblack-text-color, - $theme-amoledblack-text-color, - darken($theme-amoledblack-text-color, 33%), - $theme-amoledblack-body-background-color, - $theme-amoledblack-subtext-color, - $theme-amoledblack-secondary-color, - $theme-amoledblack-body-background-color, - $theme-amoledblack-secondary-color + amoledblack, + $theme-amoledblack-body-background-color, + $theme-amoledblack-body-background-color, + $theme-amoledblack-body-background-color, + $theme-amoledblack-panel-background-color, + $theme-amoledblack-text-color, + $theme-amoledblack-body-background-color, + $theme-amoledblack-subtext-color, + $theme-amoledblack-secondary-color, + $theme-amoledblack-body-background-color, + $theme-amoledblack-hero-background, + 1px solid rgba(255, 255, 255, 0.2) ); /* ---------------------------------- diff --git a/src/app/shared/scss/_ui.scss b/src/app/shared/scss/_ui.scss new file mode 100644 index 000000000..0a188d21d --- /dev/null +++ b/src/app/shared/scss/_ui.scss @@ -0,0 +1,190 @@ +@use './variables' as *; + +/* Layout and surface primitives shared by every cashback feature. */ + +.page { + padding: 24px 24px 48px; + + @media #{$mobile-only} { + padding: 70px 14px 24px; + } +} + +.page-title { + font-size: 22px; + font-weight: 600; + margin: 0 0 4px; +} + +.page-subtitle { + margin: 0 0 20px; + font-size: 14px; +} + +.panel { + border-radius: 10px; + padding: 20px; + margin-bottom: 20px; +} + +.panel-header { + display: flex; + align-items: baseline; + justify-content: space-between; + padding-bottom: 12px; + margin-bottom: 12px; + + h2 { + font-size: 16px; + margin: 0; + font-weight: 600; + } +} + +.rate-hero { + border-radius: 10px; + padding: 28px; + margin-bottom: 20px; + color: #fff; + display: flex; + align-items: center; + gap: 28px; + + @media #{$mobile-only} { + flex-direction: column; + text-align: center; + gap: 16px; + } + + a { + color: #fff !important; + text-decoration: underline; + } +} + +.rate-badge { + font-size: 64px; + font-weight: 700; + line-height: 1; + letter-spacing: -2px; +} + +.rate-copy { + h1 { + margin: 0 0 8px; + font-size: 24px; + font-weight: 600; + } + + p { + margin: 0; + opacity: 0.9; + max-width: 52ch; + } +} + +.stat-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); + gap: 16px; + margin-bottom: 20px; +} + +.stat { + border-radius: 10px; + padding: 18px; +} + +.stat-label { + display: block; + font-size: 12px; + text-transform: uppercase; + letter-spacing: 1px; + margin-bottom: 8px; +} + +.stat-value { + font-size: 26px; + font-weight: 600; +} + +.stat-note { + display: block; + font-size: 12px; + margin-top: 6px; +} + +.list-row { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + padding: 12px 0; + text-decoration: none; +} + +.list-main { + min-width: 0; +} + +.list-title { + font-weight: 600; + display: block; +} + +.meta { + font-size: 12px; +} + +.list-amounts { + text-align: right; + white-space: nowrap; +} + +.cashback-amount { + font-weight: 600; +} + +.bar-track { + height: 8px; + border-radius: 4px; + overflow: hidden; +} + +.bar-fill { + height: 100%; + border-radius: 4px; +} + +.chip { + display: inline-block; + padding: 4px 12px; + border-radius: 999px; + font-size: 13px; + margin: 0 8px 8px 0; + background: none; + cursor: pointer; +} + +.pill { + display: inline-block; + padding: 2px 8px; + border-radius: 999px; + font-size: 11px; + text-transform: uppercase; + letter-spacing: 1px; + background: rgba(128, 128, 128, 0.2); +} + +.actions { + display: flex; + gap: 16px; + flex-wrap: wrap; +} + +.back-button { + display: inline-block; + margin-bottom: 12px; + text-decoration: none; + font-size: 14px; +} diff --git a/src/app/shared/scss/_variables.scss b/src/app/shared/scss/_variables.scss new file mode 100644 index 000000000..e9099f2df --- /dev/null +++ b/src/app/shared/scss/_variables.scss @@ -0,0 +1,47 @@ +$mobile-only: 'only screen and (max-width : 768px)'; +$laptop-only: 'only screen and (min-width : 769px)'; +$tablet-only: 'only screen and (max-width : 1024px)'; + +// ------------------------------------------------------------------------------------------- +// Theme Engine +// ------------------------------------------------------------------------------------------- + +// Day theme colors +$theme-day-body-background-color: #fff; +$theme-day-wrapper-background-color: #f5f7f6; +$theme-day-wrapper-mobile-background-color: #fff; +$theme-day-panel-background-color: #fff; +$theme-day-text-color: #10231c; +$theme-day-subtext-color: #5f7169; +$theme-day-secondary-color: #067647; +$theme-day-header-background-color: $theme-day-secondary-color; +$theme-day-logo-inner: #fff; +$theme-day-accent-color: #0f9d58; + +// Day theme extras +$theme-day-border: 2px solid #067647; +$theme-day-hero-background: linear-gradient(135deg, #067647, #0f9d58); + +// Night theme colors +$theme-night-body-background-color: #16211d; +$theme-night-wrapper-background-color: #1c2b25; +$theme-night-wrapper-mobile-background-color: $theme-night-wrapper-background-color; +$theme-night-panel-background-color: #223730; +$theme-night-text-color: rgba(255, 255, 255, 0.87); +$theme-night-subtext-color: #9bb0a7; +$theme-night-secondary-color: #3ddc97; +$theme-night-header-background-color: #14201b; +$theme-night-logo-inner: $theme-night-header-background-color; +$theme-night-accent-color: #3ddc97; + +// Night theme extras +$theme-night-border: 2px solid #3ddc97; +$theme-night-hero-background: linear-gradient(135deg, #0a4d33, #0f7a52); + +// Black theme colors +$theme-amoledblack-body-background-color: #000; +$theme-amoledblack-panel-background-color: #0b0b0b; +$theme-amoledblack-text-color: rgba(255, 255, 255, 0.75); +$theme-amoledblack-subtext-color: rgba(255, 255, 255, 0.5); +$theme-amoledblack-secondary-color: #4ade80; +$theme-amoledblack-hero-background: linear-gradient(135deg, #04331f, #0a5c3c); diff --git a/src/app/shared/services/cashback-api.service.spec.ts b/src/app/shared/services/cashback-api.service.spec.ts new file mode 100644 index 000000000..f9d66113e --- /dev/null +++ b/src/app/shared/services/cashback-api.service.spec.ts @@ -0,0 +1,102 @@ +import { provideHttpClient } from '@angular/common/http'; +import { TestBed } from '@angular/core/testing'; +import { firstValueFrom } from 'rxjs'; + +import { CASHBACK_RATE, calculateCashback } from '../data/mock-cashback-data'; +import { CashbackApiService, summarizeRewards } from './cashback-api.service'; + +describe('CashbackApiService', () => { + let service: CashbackApiService; + + beforeEach(() => { + TestBed.configureTestingModule({ providers: [provideHttpClient()] }); + service = TestBed.inject(CashbackApiService); + }); + + it('publishes the flat 4% cashback rate', async () => { + const rate = await firstValueFrom(service.fetchCashbackRate()); + + expect(rate.rate).toBe(0.04); + expect(rate.headline).toContain('4%'); + }); + + it('applies 4% cashback to every transaction', async () => { + const transactions = await firstValueFrom(service.fetchTransactions()); + + expect(transactions.length).toBeGreaterThan(0); + for (const transaction of transactions) { + expect(transaction.cashbackRate).toBe(CASHBACK_RATE); + expect(transaction.cashbackEarned).toBe(calculateCashback(transaction.amount)); + } + }); + + it('looks up a single transaction by id', async () => { + const transactions = await firstValueFrom(service.fetchTransactions()); + const expected = transactions[0]; + + const transaction = await firstValueFrom(service.fetchTransaction(expected.id)); + + expect(transaction).toEqual(expected); + }); + + it('returns card accounts with balances that fit their credit limit', async () => { + const accounts = await firstValueFrom(service.fetchCardAccounts()); + + expect(accounts.length).toBeGreaterThan(0); + for (const account of accounts) { + expect(account.currentBalance + account.availableCredit).toBeCloseTo(account.creditLimit, 2); + } + }); + + it('summarizes rewards from the transaction ledger', async () => { + const [transactions, summary] = await Promise.all([ + firstValueFrom(service.fetchTransactions()), + firstValueFrom(service.fetchRewardsSummary()), + ]); + + const expectedSpend = transactions.reduce((sum, transaction) => sum + transaction.amount, 0); + + expect(summary.rate).toBe(0.04); + expect(summary.totalSpend).toBeCloseTo(expectedSpend, 2); + expect(summary.totalCashbackEarned).toBeCloseTo(expectedSpend * 0.04, 1); + expect(summary.cashbackAvailable).toBeCloseTo(summary.totalCashbackEarned - summary.cashbackRedeemed, 2); + }); +}); + +describe('summarizeRewards', () => { + it('groups cashback by category and computes each share', () => { + const summary = summarizeRewards( + [ + { + id: 'a', + accountId: 'acct', + merchant: 'Cafe', + category: 'dining', + postedAt: '2026-07-01T00:00:00Z', + amount: 100, + cashbackRate: 0.04, + cashbackEarned: 4, + pending: false, + }, + { + id: 'b', + accountId: 'acct', + merchant: 'Grocer', + category: 'groceries', + postedAt: '2026-07-02T00:00:00Z', + amount: 300, + cashbackRate: 0.04, + cashbackEarned: 12, + pending: false, + }, + ], + 0 + ); + + expect(summary.totalSpend).toBe(400); + expect(summary.totalCashbackEarned).toBe(16); + expect(summary.cashbackAvailable).toBe(16); + expect(summary.categories.map((category) => category.category)).toEqual(['groceries', 'dining']); + expect(summary.categories[0].share).toBeCloseTo(0.75, 5); + }); +}); diff --git a/src/app/shared/services/cashback-api.service.ts b/src/app/shared/services/cashback-api.service.ts new file mode 100644 index 000000000..ef5cf60c0 --- /dev/null +++ b/src/app/shared/services/cashback-api.service.ts @@ -0,0 +1,113 @@ +import { HttpClient } from '@angular/common/http'; +import { inject, Injectable } from '@angular/core'; +import { Observable, of } from 'rxjs'; +import { delay, map } from 'rxjs/operators'; + +import { environment } from '../../../environments/environment'; +import { + CASHBACK_RATE, + MOCK_CARD_ACCOUNTS, + MOCK_CASHBACK_RATE, + MOCK_CASHBACK_REDEEMED, + MOCK_TRANSACTIONS, +} from '../data/mock-cashback-data'; +import { CardAccount } from '../models/card-account'; +import { CashbackRate, CategoryReward, RewardsSummary } from '../models/reward'; +import { SPEND_CATEGORY_LABELS, SpendCategory, Transaction } from '../models/transaction'; + +/** + * Single entry point for cashback data. + * + * There is no cashback backend yet, so every endpoint falls back to in-memory fixtures. + * Point `environment.apiBaseUrl` at a real service and the same methods issue HttpClient + * requests instead — no caller changes required. + */ +@Injectable({ providedIn: 'root' }) +export class CashbackApiService { + private readonly http = inject(HttpClient); + private readonly baseUrl = environment.apiBaseUrl; + /** Latency applied to mocked responses so loading states stay exercised. */ + private readonly mockLatencyMs = 150; + + fetchCashbackRate(): Observable { + return this.request('/cashback-rate', MOCK_CASHBACK_RATE); + } + + fetchCardAccounts(): Observable { + return this.request('/card-accounts', MOCK_CARD_ACCOUNTS); + } + + fetchCardAccount(accountId: string): Observable { + return this.fetchCardAccounts().pipe(map((accounts) => accounts.find((account) => account.id === accountId))); + } + + fetchTransactions(): Observable { + return this.request('/transactions', MOCK_TRANSACTIONS); + } + + fetchTransaction(transactionId: string): Observable { + return this.fetchTransactions().pipe( + map((transactions) => transactions.find((transaction) => transaction.id === transactionId)) + ); + } + + fetchRewardsSummary(): Observable { + if (this.baseUrl) { + return this.http.get(`${this.baseUrl}/rewards-summary`); + } + return this.fetchTransactions().pipe(map((transactions) => summarizeRewards(transactions))); + } + + private request(path: string, mock: T): Observable { + if (this.baseUrl) { + return this.http.get(`${this.baseUrl}${path}`); + } + return of(mock).pipe(delay(this.mockLatencyMs)); + } +} + +/** Derives the rewards breakdown from transactions so the mock stays consistent with the ledger. */ +export function summarizeRewards( + transactions: Transaction[], + redeemed: number = MOCK_CASHBACK_REDEEMED +): RewardsSummary { + const totalSpend = round(transactions.reduce((sum, transaction) => sum + transaction.amount, 0)); + const totalCashbackEarned = round( + transactions.reduce((sum, transaction) => sum + transaction.cashbackEarned, 0) + ); + + const byCategory = new Map(); + for (const transaction of transactions) { + const entry = byCategory.get(transaction.category) ?? { + category: transaction.category, + label: SPEND_CATEGORY_LABELS[transaction.category], + spend: 0, + cashbackEarned: 0, + share: 0, + }; + entry.spend = round(entry.spend + transaction.amount); + entry.cashbackEarned = round(entry.cashbackEarned + transaction.cashbackEarned); + byCategory.set(transaction.category, entry); + } + + const categories = [...byCategory.values()] + .map((entry) => ({ + ...entry, + share: totalCashbackEarned ? entry.cashbackEarned / totalCashbackEarned : 0, + })) + .sort((a, b) => b.cashbackEarned - a.cashbackEarned); + + return { + rate: CASHBACK_RATE, + periodLabel: 'Year to date', + totalSpend, + totalCashbackEarned, + cashbackRedeemed: redeemed, + cashbackAvailable: round(totalCashbackEarned - redeemed), + categories, + }; +} + +function round(value: number): number { + return Math.round(value * 100) / 100; +} diff --git a/src/app/shared/services/hackernews-api.service.ts b/src/app/shared/services/hackernews-api.service.ts deleted file mode 100644 index e5c565364..000000000 --- a/src/app/shared/services/hackernews-api.service.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Observable } from 'rxjs/Observable'; -import fetch from 'unfetch'; -import {map } from 'rxjs/operators'; - -import { Story } from '../models/story'; -import { User } from '../models/user'; -import { PollResult } from '../models/poll-result'; - -// wrap fetch in observable so we can keep it chill -@Injectable() -export class HackerNewsAPIService { - baseUrl: string; - - constructor() { - this.baseUrl = 'https://node-hnapi.herokuapp.com'; - } - - fetchFeed(feedType: string, page: number): Observable { - return lazyFetch(`${this.baseUrl}/${feedType}?page=${page}`); - } - - fetchItemContent(id: number): Observable { - return lazyFetch(`${this.baseUrl}/item/${id}`).pipe(map((story: Story) => { - if (story.type === 'poll') { - let numberOfPollOptions = story.poll.length; - story.poll_votes_count = 0; - for (let i = 1; i <= numberOfPollOptions; i++) { - this.fetchPollContent(story.id + i).subscribe(pollResults => { - story.poll[i - 1] = pollResults; - story.poll_votes_count += pollResults.points; - }); - } - } - return story; - })); - } - - fetchPollContent(id: number): Observable { - return lazyFetch(`${this.baseUrl}/item/${id}`); - } - - fetchUser(id: string): Observable { - return lazyFetch(`${this.baseUrl}/user/${id}`); - } -} - -function lazyFetch(url, options?) { - return new Observable(fetchObserver => { - let cancelToken = false; - fetch(url, options) - .then(res => { - if (!cancelToken) { - return res.json() - .then(data => { - fetchObserver.next(data); - fetchObserver.complete(); - }); - } - }).catch(err => fetchObserver.error(err)); - return () => { - cancelToken = true; - }; - }); -} - diff --git a/src/app/shared/services/settings.service.ts b/src/app/shared/services/settings.service.ts index 0ad7ade52..e72a73abe 100644 --- a/src/app/shared/services/settings.service.ts +++ b/src/app/shared/services/settings.service.ts @@ -1,89 +1,70 @@ -import { Injectable } from '@angular/core'; +import { computed, DestroyRef, inject, Injectable, signal } from '@angular/core'; -import { Settings } from '../models/settings'; +import { Settings, Theme } from '../models/settings'; -@Injectable({ - providedIn: 'root' -}) +const STORAGE_KEYS = { + theme: 'theme', + maskAmounts: 'maskAmounts', + titleFontSize: 'titleFontSize', + listSpacing: 'listSpacing', +} as const; + +@Injectable({ providedIn: 'root' }) export class SettingsService { - settings: Settings = { - showSettings : false, - openLinkInNewTab: localStorage.getItem("openLinkInNewTab") ? JSON.parse(localStorage.getItem("openLinkInNewTab")) : false, - theme: 'default', - titleFontSize: localStorage.getItem("titleFontSize") ? localStorage.getItem("titleFontSize") : '16', - listSpacing: localStorage.getItem("listSpacing") ? localStorage.getItem("listSpacing") : '0', - }; + private readonly state = signal({ + showSettings: false, + maskAmounts: localStorage.getItem(STORAGE_KEYS.maskAmounts) === 'true', + theme: (localStorage.getItem(STORAGE_KEYS.theme) as Theme | null) ?? 'default', + titleFontSize: localStorage.getItem(STORAGE_KEYS.titleFontSize) ?? '16', + listSpacing: localStorage.getItem(STORAGE_KEYS.listSpacing) ?? '0', + }); - darkColorSchemeMedia = window.matchMedia('(prefers-color-scheme: dark)'); - - constructor() { - this.subscribeToSystemPreferredColorScheme(); - this.initTheme(); - } - - ngOnDestroy() { - this.unSubscribeToSystemPrefferedColorScheme(); - } + readonly settings = this.state.asReadonly(); + readonly theme = computed(() => this.state().theme); + readonly maskAmounts = computed(() => this.state().maskAmounts); + readonly titleFontSize = computed(() => `${this.state().titleFontSize}px`); + readonly rowPadding = computed(() => `calc(12px + ${this.state().listSpacing}px)`); - handleSystemPreferredColorSchemeChange(event: MediaQueryListEvent) { - let theme; - if (event.matches) { - theme = 'night'; - } else { - theme = 'default'; - } - this.setTheme(theme); - } - - subscribeToSystemPreferredColorScheme() { - this.darkColorSchemeMedia.addEventListener( - 'change', - this.handleSystemPreferredColorSchemeChange.bind(this) - ); - } + private readonly darkColorSchemeMedia = window.matchMedia('(prefers-color-scheme: dark)'); + private readonly onColorSchemeChange = (event: MediaQueryListEvent) => + this.setTheme(event.matches ? 'night' : 'default'); + + constructor() { + this.darkColorSchemeMedia.addEventListener('change', this.onColorSchemeChange); + inject(DestroyRef).onDestroy(() => + this.darkColorSchemeMedia.removeEventListener('change', this.onColorSchemeChange) + ); - initTheme() { - const savedTheme = localStorage.getItem("theme"); - if (savedTheme) { - this.settings.theme = savedTheme; - } else { - this.darkColorSchemeMedia.dispatchEvent( - new MediaQueryListEvent('change', { - media: this.darkColorSchemeMedia.media, - matches: this.darkColorSchemeMedia.matches - }) - ); + if (!localStorage.getItem(STORAGE_KEYS.theme) && this.darkColorSchemeMedia.matches) { + this.setTheme('night'); + } } - } - unSubscribeToSystemPrefferedColorScheme() { - this.darkColorSchemeMedia.removeEventListener( - 'change', - this.handleSystemPreferredColorSchemeChange.bind(this) - ); - } + toggleSettings(): void { + this.state.update((settings) => ({ ...settings, showSettings: !settings.showSettings })); + } - toggleSettings() { - this.settings.showSettings = !this.settings.showSettings; - } + closeSettings(): void { + this.state.update((settings) => ({ ...settings, showSettings: false })); + } - toggleOpenLinksInNewTab() { - this.settings.openLinkInNewTab = !this.settings.openLinkInNewTab; - localStorage.setItem("openLinkInNewTab", JSON.stringify(this.settings.openLinkInNewTab)); - } + toggleMaskAmounts(): void { + this.state.update((settings) => ({ ...settings, maskAmounts: !settings.maskAmounts })); + localStorage.setItem(STORAGE_KEYS.maskAmounts, String(this.state().maskAmounts)); + } - setTheme(theme) { - this.settings.theme = theme; - localStorage.setItem("theme", this.settings.theme); - } + setTheme(theme: Theme): void { + this.state.update((settings) => ({ ...settings, theme })); + localStorage.setItem(STORAGE_KEYS.theme, theme); + } - setFont(fontSize){ - this.settings.titleFontSize = fontSize; - localStorage.setItem("titleFontSize", this.settings.titleFontSize); - } + setFont(fontSize: string): void { + this.state.update((settings) => ({ ...settings, titleFontSize: fontSize })); + localStorage.setItem(STORAGE_KEYS.titleFontSize, fontSize); + } - setSpacing(listSpace){ - this.settings.listSpacing = listSpace; - localStorage.setItem("listSpacing", this.settings.listSpacing); - } + setSpacing(listSpacing: string): void { + this.state.update((settings) => ({ ...settings, listSpacing })); + localStorage.setItem(STORAGE_KEYS.listSpacing, listSpacing); + } } diff --git a/src/app/shared/util/load-state.ts b/src/app/shared/util/load-state.ts new file mode 100644 index 000000000..2efd5a92e --- /dev/null +++ b/src/app/shared/util/load-state.ts @@ -0,0 +1,31 @@ +import { Signal } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { catchError, map, Observable, of } from 'rxjs'; + +export type LoadState = + | { status: 'loading' } + | { status: 'loaded'; value: T } + | { status: 'error'; error: unknown }; + +/** Turns a data observable into a signal that also carries loading and error states. */ +export function toLoadState(source: Observable): Signal> { + return toSignal, LoadState>( + source.pipe( + map((value) => ({ status: 'loaded', value }) as LoadState), + catchError((error: unknown) => of({ status: 'error', error } as LoadState)) + ), + { initialValue: { status: 'loading' } } + ); +} + +export function loadedValue(state: LoadState): T | null { + return state.status === 'loaded' ? state.value : null; +} + +export function isLoading(...states: LoadState[]): boolean { + return states.some((state) => state.status === 'loading'); +} + +export function hasError(...states: LoadState[]): boolean { + return states.some((state) => state.status === 'error'); +} diff --git a/src/app/transactions/transaction-details/transaction-details.component.html b/src/app/transactions/transaction-details/transaction-details.component.html new file mode 100644 index 000000000..a5d94a335 --- /dev/null +++ b/src/app/transactions/transaction-details/transaction-details.component.html @@ -0,0 +1,48 @@ +
+ ‹ Back to transactions + + @if (errored()) { + + } @else if (loading()) { + + } @else if (notFound()) { + + } @else if (transaction(); as transaction) { +

{{ transaction.merchant }}

+

+ {{ transaction.postedAt | date: 'medium' }} · {{ categoryLabel(transaction.category) }} + @if (transaction.pending) { + Pending + } +

+ +
+
+ Amount + {{ transaction.amount | amount: maskAmounts() }} +
+
+ Cash back rate + {{ transaction.cashbackRate | percentRate }} +
+
+ Cash back earned + {{ + transaction.cashbackEarned | amount: maskAmounts() + }} +
+
+ +
+

How this was calculated

+

+ {{ transaction.amount | amount: maskAmounts() }} × {{ transaction.cashbackRate | percentRate }} = + {{ transaction.cashbackEarned | amount: maskAmounts() }} +

+

+ Cash back posts as a statement credit once the transaction clears. Refunds reverse the cash back earned + on the original purchase. +

+
+ } +
diff --git a/src/app/transactions/transaction-details/transaction-details.component.scss b/src/app/transactions/transaction-details/transaction-details.component.scss new file mode 100644 index 000000000..06a1dede5 --- /dev/null +++ b/src/app/transactions/transaction-details/transaction-details.component.scss @@ -0,0 +1,6 @@ +@use '../../shared/scss/variables' as *; + +.calculation { + font-size: 20px; + margin: 0 0 12px; +} diff --git a/src/app/transactions/transaction-details/transaction-details.component.ts b/src/app/transactions/transaction-details/transaction-details.component.ts new file mode 100644 index 000000000..677002715 --- /dev/null +++ b/src/app/transactions/transaction-details/transaction-details.component.ts @@ -0,0 +1,44 @@ +import { DatePipe } from '@angular/common'; +import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { switchMap } from 'rxjs/operators'; +import { toObservable } from '@angular/core/rxjs-interop'; + +import { ErrorMessageComponent } from '../../shared/components/error-message/error-message.component'; +import { LoaderComponent } from '../../shared/components/loader/loader.component'; +import { SPEND_CATEGORY_LABELS, SpendCategory } from '../../shared/models/transaction'; +import { AmountPipe } from '../../shared/pipes/amount.pipe'; +import { PercentRatePipe } from '../../shared/pipes/percent-rate.pipe'; +import { CashbackApiService } from '../../shared/services/cashback-api.service'; +import { SettingsService } from '../../shared/services/settings.service'; +import { hasError, isLoading, loadedValue, toLoadState } from '../../shared/util/load-state'; + +@Component({ + selector: 'app-transaction-details', + imports: [RouterLink, DatePipe, AmountPipe, PercentRatePipe, LoaderComponent, ErrorMessageComponent], + templateUrl: './transaction-details.component.html', + styleUrl: './transaction-details.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class TransactionDetailsComponent { + private readonly api = inject(CashbackApiService); + private readonly settingsService = inject(SettingsService); + + /** Bound from the `:id` route parameter via `withComponentInputBinding()`. */ + readonly id = input.required(); + + readonly maskAmounts = this.settingsService.maskAmounts; + + private readonly transactionState = toLoadState( + toObservable(this.id).pipe(switchMap((id) => this.api.fetchTransaction(id))) + ); + + readonly loading = computed(() => isLoading(this.transactionState())); + readonly errored = computed(() => hasError(this.transactionState())); + readonly transaction = computed(() => loadedValue(this.transactionState()) ?? null); + readonly notFound = computed(() => this.transactionState().status === 'loaded' && !this.transaction()); + + categoryLabel(category: SpendCategory): string { + return SPEND_CATEGORY_LABELS[category]; + } +} diff --git a/src/app/transactions/transactions.component.html b/src/app/transactions/transactions.component.html new file mode 100644 index 000000000..862cb8aae --- /dev/null +++ b/src/app/transactions/transactions.component.html @@ -0,0 +1,69 @@ +
+

Transactions

+

+ Every purchase earns {{ cashbackRate() | percentRate }} cash back, credited when the transaction posts. +

+ + @if (errored()) { + + } @else if (loading()) { + + } @else { +
+
+ Spend shown + {{ totalSpend() | amount: maskAmounts() }} +
+
+ Cash back shown + {{ + totalCashback() | amount: maskAmounts() + }} + {{ cashbackRate() | percentRate }} of spend +
+
+ +
+ @for (filter of filters(); track filter.value) { + + } +
+ + + } +
diff --git a/src/app/transactions/transactions.component.scss b/src/app/transactions/transactions.component.scss new file mode 100644 index 000000000..8c089de3f --- /dev/null +++ b/src/app/transactions/transactions.component.scss @@ -0,0 +1,5 @@ +@use '../shared/scss/variables' as *; + +.filters { + margin-bottom: 12px; +} diff --git a/src/app/transactions/transactions.component.spec.ts b/src/app/transactions/transactions.component.spec.ts new file mode 100644 index 000000000..3c71cfe31 --- /dev/null +++ b/src/app/transactions/transactions.component.spec.ts @@ -0,0 +1,42 @@ +import { provideHttpClient } from '@angular/common/http'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { provideRouter } from '@angular/router'; + +import { TransactionsComponent } from './transactions.component'; + +describe('TransactionsComponent', () => { + let fixture: ComponentFixture; + let component: TransactionsComponent; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [TransactionsComponent], + providers: [provideHttpClient(), provideRouter([])], + }).compileComponents(); + + fixture = TestBed.createComponent(TransactionsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + await fixture.whenStable(); + fixture.detectChanges(); + }); + + it('shows every transaction with its 4% cashback', () => { + const rows: HTMLElement[] = Array.from(fixture.nativeElement.querySelectorAll('.list-row')); + + expect(rows.length).toBe(component.visibleTransactions().length); + expect(rows[0].textContent).toContain('4%'); + expect(component.totalCashback()).toBeCloseTo(component.totalSpend() * 0.04, 1); + }); + + it('filters the list and its totals by category', () => { + component.selectCategory('dining'); + fixture.detectChanges(); + + const rows: HTMLElement[] = Array.from(fixture.nativeElement.querySelectorAll('.list-row')); + + expect(rows.length).toBe(component.visibleTransactions().length); + expect(component.visibleTransactions().every((transaction) => transaction.category === 'dining')).toBeTrue(); + expect(component.totalCashback()).toBeCloseTo(component.totalSpend() * 0.04, 1); + }); +}); diff --git a/src/app/transactions/transactions.component.ts b/src/app/transactions/transactions.component.ts new file mode 100644 index 000000000..d819eadb1 --- /dev/null +++ b/src/app/transactions/transactions.component.ts @@ -0,0 +1,73 @@ +import { DatePipe } from '@angular/common'; +import { ChangeDetectionStrategy, Component, computed, inject, signal } from '@angular/core'; +import { RouterLink } from '@angular/router'; + +import { ErrorMessageComponent } from '../shared/components/error-message/error-message.component'; +import { LoaderComponent } from '../shared/components/loader/loader.component'; +import { SPEND_CATEGORY_LABELS, SpendCategory } from '../shared/models/transaction'; +import { AmountPipe } from '../shared/pipes/amount.pipe'; +import { PercentRatePipe } from '../shared/pipes/percent-rate.pipe'; +import { CashbackApiService } from '../shared/services/cashback-api.service'; +import { SettingsService } from '../shared/services/settings.service'; +import { hasError, isLoading, loadedValue, toLoadState } from '../shared/util/load-state'; + +type CategoryFilter = SpendCategory | 'all'; + +@Component({ + selector: 'app-transactions', + imports: [RouterLink, DatePipe, AmountPipe, PercentRatePipe, LoaderComponent, ErrorMessageComponent], + templateUrl: './transactions.component.html', + styleUrl: './transactions.component.scss', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class TransactionsComponent { + private readonly api = inject(CashbackApiService); + private readonly settingsService = inject(SettingsService); + + readonly maskAmounts = this.settingsService.maskAmounts; + readonly rowPadding = this.settingsService.rowPadding; + readonly titleFontSize = this.settingsService.titleFontSize; + + private readonly transactionsState = toLoadState(this.api.fetchTransactions()); + private readonly rateState = toLoadState(this.api.fetchCashbackRate()); + + readonly loading = computed(() => isLoading(this.transactionsState(), this.rateState())); + readonly errored = computed(() => hasError(this.transactionsState(), this.rateState())); + readonly cashbackRate = computed(() => loadedValue(this.rateState())?.rate ?? null); + + readonly selectedCategory = signal('all'); + + private readonly transactions = computed(() => + [...(loadedValue(this.transactionsState()) ?? [])].sort((a, b) => b.postedAt.localeCompare(a.postedAt)) + ); + + readonly filters = computed<{ value: CategoryFilter; label: string }[]>(() => { + const categories = [...new Set(this.transactions().map((transaction) => transaction.category))]; + return [ + { value: 'all' as const, label: 'All' }, + ...categories.map((category) => ({ value: category, label: SPEND_CATEGORY_LABELS[category] })), + ]; + }); + + readonly visibleTransactions = computed(() => { + const category = this.selectedCategory(); + return category === 'all' + ? this.transactions() + : this.transactions().filter((transaction) => transaction.category === category); + }); + + readonly totalSpend = computed(() => + this.visibleTransactions().reduce((sum, transaction) => sum + transaction.amount, 0) + ); + readonly totalCashback = computed(() => + this.visibleTransactions().reduce((sum, transaction) => sum + transaction.cashbackEarned, 0) + ); + + selectCategory(category: CategoryFilter): void { + this.selectedCategory.set(category); + } + + categoryLabel(category: SpendCategory): string { + return SPEND_CATEGORY_LABELS[category]; + } +} diff --git a/src/app/transactions/transactions.routes.ts b/src/app/transactions/transactions.routes.ts new file mode 100644 index 000000000..a5794cfe7 --- /dev/null +++ b/src/app/transactions/transactions.routes.ts @@ -0,0 +1,15 @@ +import { Routes } from '@angular/router'; + +export const TRANSACTIONS_ROUTES: Routes = [ + { + path: '', + title: 'Transactions · Vantage 4% Cash Card', + loadComponent: () => import('./transactions.component').then((m) => m.TransactionsComponent), + }, + { + path: ':id', + title: 'Transaction · Vantage 4% Cash Card', + loadComponent: () => + import('./transaction-details/transaction-details.component').then((m) => m.TransactionDetailsComponent), + }, +]; diff --git a/src/app/user/user.component.html b/src/app/user/user.component.html deleted file mode 100644 index bd6f0493d..000000000 --- a/src/app/user/user.component.html +++ /dev/null @@ -1,19 +0,0 @@ - - - -
-
-

- - Profile: {{ user.id }} -

-
-
- {{ user.id }} - {{ user.karma }} ★ -

Created {{ user.created }}

-
-
-

-
-
diff --git a/src/app/user/user.component.scss b/src/app/user/user.component.scss deleted file mode 100644 index c5fc9af57..000000000 --- a/src/app/user/user.component.scss +++ /dev/null @@ -1,89 +0,0 @@ -@import "../shared/scss/media"; -@import "../shared/scss/theme_variables"; - -:host >>> pre { - white-space: pre-wrap; -} - -.profile { - padding: 30px; -} - -@media #{$mobile-only} { - .profile { - padding: 110px 15px 0 15px; - } - .title-block { - font-size: 15px; - text-align: center; - text-overflow: ellipsis; - white-space: nowrap; - overflow: hidden; - margin: 0 75px; - } - .back-button { - position: absolute; - top: 52%; - width: 0.6rem; - height: 0.6rem; - background: transparent; - box-shadow: 0 0 0 lightgray; - transition: all 200ms ease; - left: 4%; - transform: translate3d(0, -50%, 0) rotate(-135deg); - } - .item-header { - padding-bottom: 10px; - background-color: #fff; - padding: 10px 0 10px 0; - position: fixed; - width: 100%; - left: 0; - top: 62px; - height: 20px; - } -} - -@media #{$laptop-only} { - .mobile { - display: none; - } -} - -.main-details { - .name { - font-weight: bold; - font-size: 32px; - letter-spacing: 2px; - } - .age { - font-weight: bold; - color: #696969; - padding-bottom: 0; - } - .right { - float: right; - font-weight: bold; - font-size: 32px; - letter-spacing: 2px; - } -} - -@media #{$mobile-only} { - .main-details { - margin-top: 20px; - .name { - font-size: 18px; - } - } -} - -@media #{$mobile-only} { - .main-details .right { - font-size: 18px; - } -} - -.other-details { - word-wrap: break-word; -} diff --git a/src/app/user/user.component.ts b/src/app/user/user.component.ts deleted file mode 100644 index 28e90a4b0..000000000 --- a/src/app/user/user.component.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; -import { Location } from '@angular/common'; -import { Subscription } from 'rxjs/Subscription'; - -import { HackerNewsAPIService } from '../shared/services/hackernews-api.service'; -import { User } from '../shared/models/user'; - -@Component({ - selector: 'app-user', - templateUrl: './user.component.html', - styleUrls: ['./user.component.scss'] -}) -export class UserComponent implements OnInit { - sub: Subscription; - user: User; - errorMessage = ''; - - constructor( - private _hackerNewsAPIService: HackerNewsAPIService, - private route: ActivatedRoute, - private _location: Location - ) {} - - ngOnInit() { - this.sub = this.route.params.subscribe(params => { - let userID = params['id']; - this._hackerNewsAPIService.fetchUser(userID).subscribe(data => { - this.user = data; - }, error => this.errorMessage = 'Could not load user ' + userID + '.'); - }); - } - - goBack() { - this._location.back(); - } -} diff --git a/src/app/user/user.module.ts b/src/app/user/user.module.ts deleted file mode 100644 index 79615f52e..000000000 --- a/src/app/user/user.module.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { Routes, RouterModule } from '@angular/router'; -import { UserComponent } from './user.component'; -import { SharedComponentsModule } from '../shared/components/shared-components.module'; - - -const routes: Routes = [ - { - path: ':id', - component: UserComponent - } -] - - -@NgModule({ - imports: [CommonModule, SharedComponentsModule, RouterModule.forChild(routes)], - declarations: [UserComponent], - exports: [UserComponent, RouterModule] -}) -export class UserModule {} diff --git a/src/assets/icons/android-chrome-144x144.png b/src/assets/icons/android-chrome-144x144.png deleted file mode 100644 index 833fcf97ffa8be01d9efa488b6a927f62fb0ebf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 29992 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
mg~B#bqT^yv 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 diff --git a/src/assets/icons/android-chrome-512x512.png b/src/assets/icons/android-chrome-512x512.png deleted file mode 100644 index 5baddb33011b10828e9539a0a7b662993b8b3928..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30053 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 RoCydo9Zh|W3N>8l{{d*_(P;nx diff --git a/src/assets/icons/apple-touch-icon-120x120.png b/src/assets/icons/apple-touch-icon-120x120.png deleted file mode 100644 index e5b71708cef98a9cefe018f9bb7027b057e331ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2629 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 diff --git a/src/assets/icons/apple-touch-icon-152x152.png b/src/assets/icons/apple-touch-icon-152x152.png deleted file mode 100644 index cb316f56ac9ace3deee6195a062f82766609ab73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3304 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 m<(AieZ&O!Yb=6f@U4H>fl$@Z$Iq`M?0000g)gi z{{P0u{hXfuZgT!ZNdGD^|0yu>C@s?@DAOV*)+#OCOHSo@dhw&A`q9$<@bLfV=>E*j z{&95wO;Z0gJpU^))Fmm?Bq`M=E7>(T-ceNf=jZ?S_Wr1=**QJ&o1OK|&Hvln|GBvT ze}Vr?Q2#kV|0pihBq-M{G2?D=@~W%!o&VoUH>dI*D*BQMM>deWa@{B z`PGtpM_Ve@iij3AJDgPrY^&%+J9wN~oB>MC8|0yx+WlsMmF#o!>|Ns2|`SJUsgV!l3 z|NHg&po8<(*8leJ|L^AgXJG$nV&-OE{~jj)A}aHxng9O!_$e;=@bLdNGXF$B|35p| zD=ghVINLTd-8C!!DlPwdM*qpG|Ixeun~ndqlmBH->|sg$!lUU|Kl7D<{miuWd`H$K zB!vBh4|JKF-@8bHts_xCs z{{H{}=GE`j*7=Kh*C-_5KQr*#-2dv`=Uh+isHy6^z5o39@^w}JO+^3W&hopx|F4bh z#m4*7#PD`x@rZTmPc8MTr2nOj|Bi#+LO=i4wf|Es|3E9%Q#I>8D~$(U791;yvk% z6TQf>ux3X_$Hrq5K>h&@O-f{{dwOPQmU~%ZE|Hy^Uszn4n83^US2QH9C|Z1VZ75*z zyp%Ui1n1`07dO6)#h=i0PPEOfnQg1(1(4BfXx_iG5yQ|w(ZGiJ-d$aDCb%|>v&qrD z{R19j1~eo}Dy;8AXTZ|FWnmvZT0Ev=HZ-J=lhdtG`GW}z=|$5q5oPTxedt7<7Ja8@y|0qUriRIlW6Cx|@Gi zfq4G%KDtD=g>f`ZRZsfwt{uY(Pcsir*Td!55`E%Epds;5?LO-rnr)KX>gs!1c*Z#( zHxNzoWM$=K6V56(YW!u3M(+tE3`g!L!LD$(7fBB##I zXSR+1?r_#@64u)?Hk6>|iLpNa?#x^mI!};0RO%d`_~S8Te0wk@mI<8S4yVj6Bsg#&gY5Iq!k&~_hBW$Dz*f@zV)4PhOZvWOB+u;0eAI+X}kmW%fbdvmqlCA zWO6b;rS)vHplwGvDsDR(Qp%}ACiLC`t|R^jbe`0mbXsFUyViM(U&>39Pwm@vR9nd& z!0~xrcbO(s)`$RSX;;XtH#pRhb!ZlU?L{I;LJcT|Ef3ar>+bIE?(VK@b^H6>NujSV zKr+8!xXqr!_pi?C=WwR;yH;htaFJ$Df2nsPv^KCg)p7Sl2zDcMY8nkX{av?0XBg?w z1KbC#@#sv49^%OjUE}jZ(Y2$A3O%%s&TW3uO5Y$O6?)J+ZiMz8W~M<~J`Tq2gU-wn zY0zSJj{BekVytv%TLYfkBO#$i=nghIbnbAjXmw2*5lD;f72!%WaHPvdjee!PywO#p zbdB!XG#^oAdbf{ra)GM#mo7{G%w=P=uFOJXa^lfsZuX&bbYaBUqQBI*dc|LjQ@B7I zq6VeYp)GIqcaFvpV-bf+{zK5t3oW%!qQe_vH$i*E_=t!q(dUy03Us})uh}c6Lw60! zN0j9!51>Hz_~4swo%GFj&Kg@pg^v7;8lBe4lLGx_;`cu|Y1C+E{rD3dx@j6`^oQ|n zo%HhvCu3ZoLknJ=snMn{{4foAWNo7jzCk8x^pHMog7)r`PK!47Ow_prS{}_eS+i9IWTBfhM_SCB8!w?# z=FOLWJ%540&Qvdy7K;`y(a@unUQ5#uJ-UG&)1nKeFI$dUp!Xv%S;fb#Xwd?#Ts2Zc z=dE5N{f*+a<>+-}u^xnOydfP?m)~lDjvl>nB|`s0Z;}>k%F&ypUl(nerYJ`vAUYsw z>o$bI2Q>#Y+CDFZ72SS^NRPI3iXG_B3thZ(mxdATT?#;pANP;vhHf!)cM2oA-yRTp za6Gr|f%fhTU_uMp4n81sLyqW@g_0DCCUwooM*wtIu#O)Zk@JHAEky1&LC`)qD$EbP zcT64|I?0Ft<+t+WhbH@j3GH7p4_Y z#(?Mv_C7uAh~9qWFVg;47yw5%K59mwq$_F|dheWL_U3GMKyNx$W z0 zl4Dz1fY9W^R0N{K8^X{RF8(l5>ibKZDxm|`lJn!pk$Nz6> z@+A{5v|{)C7ErYIqg?Rzu!Q%<+|cSJr;34Sp=)YB7%gUh5Wx?fH}41#Z6FWS!R04& zM3eKQDzv6rw4(h6BOIN^6Rk0T$1wya9D5^kfmYgc95-qWXss|zq+Ss$Njt)KJ z*6rID?)*|fR)v%9+`fJLR{1MA@;Bz}RuV+Yf?Kzx7CWM=+tpn^vcb{hOC}05S^fH( z)Wu)z=z>o#lhv>Gm!H#4|Ni^$r^ne{WFhs3K=<-f@ZFz=;E@OG{&cUI3rWOWz9I{P z)+kBkj28>q*UW~-NhTI__S*xiL}NK#=m)gln$Cj0d#_3~mIbZO%(AecZPk8}ECX5_ zV?!+H@yQ|h^`Se!(T-m-$&FTc1deAy8=EESULQI&p9yX5)PJChj|t2(bk<*yb2Rz> zfT{cj`r7^!SyLT4bPqE+1ivPmIo5P<3cQO}_MCoh~{Dvr4aeVgIzEkWZ_r-DFpJXsdsIkU?e(+d&=c zi1wGvqyk(~0j{QY3WcC>-b-YHBibv;$cPsI-LO!eKfC4lGZ%a}n3>VNU!wi}r9&F? zL0A6MTw1N;Y+*FJfM}_4_le+D(5CQvbfc$8K zN9uUQnyFd;2>H>15E;F}$c(m(ZQ@7gE zMO2e4xup-^QR%QeXhGfh>hZfKIN4EcvL1busKPR!1+8!9D{#5K`m zJw7~kfU0)T9*sL3u--5u?wM~`H$3bgg1Msw!K>Tj>i{y0ZL%G`=hqf*`nY5v_MWVy2#ts92-_bddX4O(gbaUUjt898kDhk6V`3xY5I z`3L=JAI(WrVQREShz#X8|JX0KgP!^kHVs;s%z6H?pMN_#w(b*wU85EJ<{yVWl3RLn zaEJ~&MU(m0f#3Y&kl8j&y4c1}(1O-0^N9?b8F>3UsKGk}RMnxiWc~q$iG1vT-=SY+W9{ z6M@Uogv>JkS*hcG)>wx<|_pPqF>Z+@*y6URyztKh=2401d`Tzg`07*qo IM6N<$f*L6ZVE_OC diff --git a/src/assets/icons/apple-touch-icon-60x60.png b/src/assets/icons/apple-touch-icon-60x60.png deleted file mode 100644 index 7b588a9cdbf967c6d44a2a8c66de09e196be5bf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1699 zcmV;U23+}xP)DBoG5;to)hR6h{P_O=|Nk*I|4L8)K}FX#Isg9t)FLPUEj0f# zIsaZ_|NQ*_Qdj>qIsNhR)+{g6A|?Iz_tPIE{P6JqI6nU*EdKiX|MvF%?(YBc^4mj3 z-9C@$!blK;24|LExb+}+kGE8%Qz|Ni~#i-r2<=+q=7?W?T+ zPE-Ex>(?X+kdyyvV(OEX|L^bmDPH`>n6xVPyT&)cW%B{Z(7?EHc?UJ^uau|H8ZNsHxaML;XEM z|LW@dzrgtA<^TKp|0gZ~!NULa^!?}F|5!}ZASCl6DgJ72_0Q1p$H?xWq4Fs%{QLX< z>*4?T_W$?u|LpAHR8HJKI{(wp?Uj-KmYMy4gywg4|F5q5;M)Jh!~ctp?2?Z8?Cjxi zbMz%F|42;#M@0QnSO4+r;9FhSEiC^sIMpvQ|Ni>@OHkx(YyR2V<$i(MM@#;amDD9F z;(mebm6zvoY5$_7@~)=kW@7)js`I)@REJ=v#a~X z$Mwm|_Qt>eSX||1Vfo+S?2n57TwLL3YX9`>|Mm3$k&XYjs{f3T^SHMEx2gZ7pWIzv z+)q*eEHK_zTI6qS^T5FQ)z;M|D(r}U|F^3D@$mig^zf;w_|wk)Xl&IZC;y?O@0N@I zL^}7tvi+#4{_*hLQ&r$nP5F?F_|H{Gt&d~6`!206e|9NHMWoPcV zx#x9m_{hroadqjUr1-+M+BY%yy1V;iXz-qw_2A*uBq`Q4IQCIh|8{QpmYMuTOz*_S z|B8p}va|Wh%jlt^_v`EYW^3e+koDo=@`Z>Cysx$Z00U=9L_t(|UhURHxFbsdhT&?) z&Y^AFwlTDA+qP}nxVCNEwz0U$Io)08=}B_e^F2?N?;?MtIt{RH*EgwfYnbW($kfDy z5`A0FqKb>2dQ;_$nOQo99~n(kIg8d0d)j>({@&ymEAPmGDT<;gW7CLTZu!ua8*M=x z!$a)!ti#8Kx|nF^w4nw;LM-_9k50z=D@l8=gnfF8Q$qYWg+!|lr95*r2sdpCUkZC6wh$6 z9l_c)5O5Y)n;OO3c1H>MPSqgTScl;x1H^aU6U;LV}62=P<}T<@Q!zn3^}^(MV6iP@`S+{zJXt^ka`?% z8K)1vKKA}0n>EuXQ1_0G48U-42Zl{kaD4Z;d7b#m7|jMViK%#irJc+xV6Z8f#A~|) zyhe`1wJ}|IdSo7feX9xFTZiMy^7%hH@z~>IJ|S^?EP+=VFnk|axMv}7;xDq#lY>R{ zA@Bh`jy2t;%}8|)_RXcyharZy87-`pLGhD!4C)$8Gb?SGW+24yn34R4D&g0&0fAT9 z2^_Lt0Z&?dkib+0Akvoc3OFE*z-)IJt`YI&&Z9!`_-uSI-}eF8F$;=6%zsHWKfiqL zsnci7i_f0>61^D4VKRJS33??}Du!oNs<`M3nxZl?DD+CMPM6{4APLW`RSC^~-rQ9H zd>FuEh9zc+c)$x;UP3=SD3qJFOu{MtG8}Fbad_!dVz2s$g#rn$GC_s^N;t;w>s?ZB zT!W3LWydUk95DT0Z~4I-mUY^-nR2Xs+s(gN^*cab!E$#ny>w1GkY`FN>dCmkwEBUM z6<&)PKK;zf+zPX~pU(!0wS4upg;B&k;=kP7( diff --git a/src/assets/icons/apple-touch-icon-76x76.png b/src/assets/icons/apple-touch-icon-76x76.png deleted file mode 100644 index 22094f6e1c6c2118c487b17298069bc955f1d2e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1993 zcmV;)2R8VLP){{JmB)F&$c_4U&t zCD}Yc`}z6*GC1v)mi_SX-(Fz%&(Hnz^#3(G;Ad(7d3^u&_U@pf;ACg_*xCO?O8+b~ z|4B~TKtuod`2FVQIp#|2IAS>FU}=Nbaw&{?*j~ zJVM<{O#l7;{j9FmEH2kDGW{qo-X|*mCoTW_`uOPS`tkAoc6$G>u>L|w>zSMXEi(WA z{{AU2;3g{nGBe&uL)Q&#up=l0*<`0wxka&_^>$NwxY*e)&OdVJniSl=lv{gRaV%*6lC(D>2N;V?4( z!^Hn3EdJcv|5aPlAtdwB(*K{L|4K&xL_YprWB-Yb_R7oub9ejP-T&|8{-vn@@$cMH zROo?!{Z?H6j*0*C>*HKg*D^HyWN7b~jQsca{BU*u{QUhYG1Da}|CEXFyS)GE>-o>e z|I^CpjgS81+4kY$|GB&Jtflq2uJx*x+)hycb8zc^bN~AF|KQ>M=HLE)g4Zf4|NQ#Y zBPa39&HJ;p?0s$gxS`%8DgR7T)+Z>}DJSHDh5VM8{xmq>S6bRgO#L}O?YzAD_V(LU zSNmdS=9roJ^z`?|$M~qL=4xaAT3+sxhyL#7_`k6Bz`6O+%;r~G=Vn#^w65@}qT_3B z{Mp+4_V)iwJpXK8=xts9i+JjGW8OnK_p+MgRzv#o^58Q!|CpQTY+d4Sa?>9o=X-ePQ&!zl zRR2y(|Cp2i&&l(ml>aq2@Tsc*xVQhx#pI>eMd_)l z__@0O+soKEJo`{p^4Qt;k(2n;)&GQj|7mXjucG>fiTAItqm(Bd000DpNkl9j~N5gt0j19#YZ@%F02$P;o zWYoB5d{E?MG>7D|!Eq6pj3bYq_(uZ75*wpES>oLA7!u1(P*4($u{}o;OIFYZjj{70 zvC$4zV=1diEY!_vEVYxw?(v0IV#)v?5{qdOV5$s$X-91Ni3AurlSN`qQv{g*je>3; z!s~RROn^COlUQI5A5-Ld+IaH1pO>r6gM*ZOY_OWdG{Xegr(o=7yoP^;3jtpXv3x)^ zOCiKO3c_%sQjE!Ea|ul6MOj?3R)}?s!FExxNNH^RlLRKmYep;@#-{7B?%yg@K|Lly z`ujv8rI^Ab6KE_xfx=2AP127W{r=>lVo7P4SS%|mEvF~5^P#aBd62;1cR$Aasxp3` z`Da1pO*h|CE=s+%>JD2HLvyNWta=`asUDcQ#$S~&A3R)8`3P9B(00+tr(d8k=htY= zb+LJ@aLG07O&WV^DUB^%W*!5>%Tt+HjfTc*qx!&RFO;(|aXv?5Tpb%5W5mD`=42`1 zfPv*|X{@59q-2!=t8Z9a=EA^!ngAF@M$=g4y2i#02CT8F{stBnyOD+MYN9dF(9lq5 zz&39ITW_N=v@MH;1s$ca`c>Pv-)X?^+L5%OYA21k--`+2@kn3`?rUzI--DIzE=*!z z!D<#}pToc&>RpY^d$$0L?V)`;$)^Ug3jxeRqlFlp{LHh@LDlnzUsP1SbodYwy}b36S4G{} zO1x&RY-~mz`PlC2l3u%X6%`*leoTMoas8E;%-fZXMKnPI!+$8fqmbAMycyKiVyvS% z16OI=+uQH(G39!Wjj28OSX9e6+`Dt$Gq%kUV|dM|xF|jrXv52uS0EpguQr99G*VK< z2kSoMw^qlnh}$Rea!FFsMK;^gL*9#&_+A-t0?3pO*v?kDk#P zu*57=Sfrb!Z;tz&+f89Xi~XQQ7_$3(xhYH&bTZEZ3`qtbum`5IclqKh>>q~Y?&r<} zvvKFY`Suj-8$+@S-?ww1uekOfE^1*Pm@f8Gs|NHZuC?xG1vG;pyP99rpug3&{n}&_ zLz3W5dtgcG-|#mfz>wVe++_|}7I*o|GB=1ZeD2j8u%hgP7abrUL%K7UHfn%%X{xWz z(_&0%cLJZgHC#lUzrui-*mn!RiN6xyigZz`H{SOFWPc^+?9dBwc;5#Um;HBsTP^s{ bcfEfA%Vtu$eB;+100000NkvXXu0mjf%o|-k diff --git a/src/assets/icons/apple-touch-icon.png b/src/assets/icons/apple-touch-icon.png deleted file mode 100644 index 9b8d8d0da36f3f4834c8ebd2d1d7ba6ee36a82cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3846 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 IM6N<$f*L6ZVE_OC diff --git a/src/assets/icons/favicon-16x16.png b/src/assets/icons/favicon-16x16.png deleted file mode 100644 index 110da42ea2659e34108caa6a19b68ca009654a22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 694 zcmV;n0!jUeP)RN?y+s#PS*DBOuD=9t@&$~-tDP#ZoH87 zUauTs`1s4+nQfe#W?4sXu&FB)pN(4E-`eZsW4g|r`o^)&V!-?%&5u8B!|>#Br2k(? z?oP)0oima6KbPZ_yI!Qj(rSj{#()!t6mtQ_`?x#fFc&xp6%j^ZA>vd%0f={KR&IuZ2vtoCdLK$^jxyFhADTh*!Vus!MEAbxBV zv5pl=M>DF{I0Diej0)-L%IiPc#8{xc-w6$R4S}ObpaRvfnETtg@Jz9e}4!bEl>;& z59lNz`{zFZL@QBoG_V>FN`w~@_WZ*CvE-~T=}o0++*SHh%gt2}(b=_h?X cU**6ibIKnlOlX*}hyVZp07*qoM6N<$f?Tjl$p8QV diff --git a/src/assets/icons/favicon-32x32.png b/src/assets/icons/favicon-32x32.png deleted file mode 100644 index 903146b7bc7719f79899f7df2e6d81e95af34abf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1371 zcmV-h1*H0kP)^%FBIAX z5Xv8dAA;8+0Q>hmSYOG);g=DNQ>xfaFpktLIh|1>fOC^3{Si%D3s5V%B{YWZ5X)~t zAoT?UvjZ?hFm|5k7Qwi~B065IS1$ysSO1w60696o_cU((B@)vcBGkAX64hmY052mb z13`rd*8mKC%Yj3#+(xnKS^d^$44+?NAOhovSoQn|A?)A$0LwSuv#C-D zyIMD&V!!l2sX2ORg~20Yffj98Rn)vSt~70q%PhKBr!MSbNreDTW7v?O3BBg1#;i`K ze>!Or;4TDq?*jJhE+_AvU3j{CC!XxyQBKc~9YTrQ0e83=mTx(%K5*$x^@9MV(MfTv z1|)!KGl04C0iiS?u^c4&ej$>=!4ty96Tl`AfqqHu*jN->a^a2)X9wW&JWl-vB^CE<9;zcr<4Qd`}+YQf4~kA2++VuM~iupj|4@ zcXl4|zaYTH0R#T!Rq2kC>uU@!YZ`zu+?zDES^y;bs~S+Q6#LZr71g?dvpK--EhxKr znNmOi^i63X_v1#lc2xq{6zXY=W>orcAmB1)Q41j~% zfnnu6KmhmW&cgL}t$?CuRo?(lSmaDfN@M^OC1)j2F{%_`!(yOMCm>W$Fz_TL;^D+m zWIz;ZH7LqCgzIgZR0?3@iyzR`!~pO#Y!>RT1rIANLXv6{pAhFRaTOh|)lfse(D+Hw*v(zb)07=d;cPTrsPH z1If1>hO8vE*)Tl1SA|pY<9bbhC^AIM@`fnxzsr$~-o8a7wOUQ)cGLr^9LpbN)eSG! z8rS(m@@H=iAdpz?1pr8w73+R!uxq8ib6I3DzR3X@_0c^ zOx+y+9{G-zQ|4w&TMczipMPZ|0Gr?0uML*dvE#?@YddBb^;t?r1S!GW0zI^_HqCK002ovPDHLkV1m80er*5% diff --git a/src/assets/icons/mstile-150x150.png b/src/assets/icons/mstile-150x150.png deleted file mode 100644 index 63ed11d6b21007676dbb19175a474ec53d2665d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3656 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 \ No newline at end of file diff --git a/src/assets/images/logo-header.png b/src/assets/images/logo-header.png deleted file mode 100644 index 8e7a2bdc45678c29aaad257d63b12e9fd4f8c454..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4109 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 LNkvXXu0mjfOh?KC diff --git a/src/assets/images/logo.svg b/src/assets/images/logo.svg deleted file mode 100644 index f88f9e31d..000000000 --- a/src/assets/images/logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts index 3612073bc..7ddf90042 100644 --- a/src/environments/environment.prod.ts +++ b/src/environments/environment.prod.ts @@ -1,3 +1,5 @@ export const environment = { - production: true + production: true, + /** Set to the cashback API origin (e.g. 'https://api.example.com/v1') once it exists. */ + apiBaseUrl: '', }; diff --git a/src/environments/environment.ts b/src/environments/environment.ts index 7b4f817ad..fa77f4444 100644 --- a/src/environments/environment.ts +++ b/src/environments/environment.ts @@ -1,16 +1,5 @@ -// This file can be replaced during build by using the `fileReplacements` array. -// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. -// The list of file replacements can be found in `angular.json`. - export const environment = { - production: false + production: false, + /** Empty means the CashbackApiService serves in-memory fixtures instead of calling a backend. */ + apiBaseUrl: '', }; - -/* - * For easier debugging in development mode, you can import the following file - * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. - * - * This import should be commented out in production mode because it will have a negative impact - * on performance if an error is thrown. - */ -// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/src/favicon.ico b/src/favicon.ico deleted file mode 100644 index 8081c7ceaf2be08bf59010158c586170d9d2d517..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5430 zcmc(je{54#6vvCoAI3i*G5%$U7!sA3wtMZ$fH6V9C`=eXGJb@R1%(I_{vnZtpD{6n z5Pl{DmxzBDbrB>}`90e12m8T*36WoeDLA&SD_hw{H^wM!cl_RWcVA!I+x87ee975; z@4kD^=bYPn&pmG@(+JZ`rqQEKxW<}RzhW}I!|ulN=fmjVi@x{p$cC`)5$a!)X&U+blKNvN5tg=uLvuLnuqRM;Yc*swiexsoh#XPNu{9F#c`G zQLe{yWA(Y6(;>y|-efAy11k<09(@Oo1B2@0`PtZSkqK&${ zgEY}`W@t{%?9u5rF?}Y7OL{338l*JY#P!%MVQY@oqnItpZ}?s z!r?*kwuR{A@jg2Chlf0^{q*>8n5Ir~YWf*wmsh7B5&EpHfd5@xVaj&gqsdui^spyL zB|kUoblGoO7G(MuKTfa9?pGH0@QP^b#!lM1yHWLh*2iq#`C1TdrnO-d#?Oh@XV2HK zKA{`eo{--^K&MW66Lgsktfvn#cCAc*(}qsfhrvOjMGLE?`dHVipu1J3Kgr%g?cNa8 z)pkmC8DGH~fG+dlrp(5^-QBeEvkOvv#q7MBVLtm2oD^$lJZx--_=K&Ttd=-krx(Bb zcEoKJda@S!%%@`P-##$>*u%T*mh+QjV@)Qa=Mk1?#zLk+M4tIt%}wagT{5J%!tXAE;r{@=bb%nNVxvI+C+$t?!VJ@0d@HIyMJTI{vEw0Ul ze(ha!e&qANbTL1ZneNl45t=#Ot??C0MHjjgY8%*mGisN|S6%g3;Hlx#fMNcL<87MW zZ>6moo1YD?P!fJ#Jb(4)_cc50X5n0KoDYfdPoL^iV`k&o{LPyaoqMqk92wVM#_O0l z09$(A-D+gVIlq4TA&{1T@BsUH`Bm=r#l$Z51J-U&F32+hfUP-iLo=jg7Xmy+WLq6_tWv&`wDlz#`&)Jp~iQf zZP)tu>}pIIJKuw+$&t}GQuqMd%Z>0?t%&BM&Wo^4P^Y z)c6h^f2R>X8*}q|bblAF?@;%?2>$y+cMQbN{X$)^R>vtNq_5AB|0N5U*d^T?X9{xQnJYeU{ zoZL#obI;~Pp95f1`%X3D$Mh*4^?O?IT~7HqlWguezmg?Ybq|7>qQ(@pPHbE9V?f|( z+0xo!#m@Np9PljsyxBY-UA*{U*la#8Wz2sO|48_-5t8%_!n?S$zlGe+NA%?vmxjS- zHE5O3ZarU=X}$7>;Okp(UWXJxI%G_J-@IH;%5#Rt$(WUX?6*Ux!IRd$dLP6+SmPn= z8zjm4jGjN772R{FGkXwcNv8GBcZI#@Y2m{RNF_w8(Z%^A*!bS*!}s6sh*NnURytky humW;*g7R+&|Ledvc- - Angular 2 HN + Vantage — 4% Cash Back Card - + - - - - - - + + + + - - - - - - - + + + + + - - - + + - - + + @@ -43,20 +38,18 @@ - + - - - + -
- +
+