From f08506729537136d734e1fc789cacf0878a1dd7d Mon Sep 17 00:00:00 2001 From: WictorGirardi Date: Thu, 24 Sep 2026 16:01:37 -0300 Subject: [PATCH 1/8] Migrate Spring Boot example to Spring Boot 4, Keycloak 26 and Angular 22 --- .github/workflows/spring-boot-keycloak.yml | 32 + .../spring-boot-keycloak/.gitattributes | 3 + frameworks/spring-boot-keycloak/.gitignore | 4 - frameworks/spring-boot-keycloak/README.md | 142 +- .../angularclient/.browserslistrc | 17 - .../angularclient/.editorconfig | 2 +- .../angularclient/.gitignore | 28 +- .../spring-boot-keycloak/angularclient/.nvmrc | 1 + .../angularclient/.postcssrc.json | 5 + .../angularclient/.prettierignore | 1 + .../angularclient/.prettierrc | 14 + .../angularclient/README.md | 28 +- .../angularclient/angular.json | 100 +- .../angularclient/eslint.config.js | 40 + .../angularclient/package.json | 63 +- .../angularclient/pnpm-lock.yaml | 11689 +++++----------- .../angularclient/{src => public}/favicon.ico | Bin .../assets => public}/home-bg-mobile.webp | Bin .../{src/assets => public}/home-bg.webp | Bin .../assets => public}/logo_phase_slash.svg | 0 .../angularclient/src/app/api/api.ts | 34 + .../src/app/app-routing.module.ts | 22 - .../angularclient/src/app/app.component.html | 3 - .../angularclient/src/app/app.component.scss | 23 - .../angularclient/src/app/app.component.ts | 13 - .../angularclient/src/app/app.config.ts | 41 + .../angularclient/src/app/app.html | 31 + .../angularclient/src/app/app.module.ts | 80 - .../angularclient/src/app/app.routes.ts | 10 + .../angularclient/src/app/app.spec.ts | 36 + .../angularclient/src/app/app.ts | 11 + .../angularclient/src/app/auth/auth.config.ts | 11 + .../src/app/auth/auth.guard.spec.ts | 29 + .../angularclient/src/app/auth/auth.guard.ts | 12 + .../angularclient/src/app/auth/auth.ts | 45 + .../src/app/commons/auth.guard.ts | 26 - .../angularclient/src/app/commons/commons.ts | 7 - .../app/components/home/home.component.html | 74 - .../app/components/home/home.component.scss | 0 .../src/app/components/home/home.component.ts | 11 - .../src/app/components/home/home.module.ts | 11 - .../app/components/user/user.component.html | 16 - .../src/app/components/user/user.component.ts | 47 - .../src/app/components/user/user.module.ts | 10 - .../angularclient/src/app/home/home.html | 97 + .../angularclient/src/app/home/home.spec.ts | 95 + .../angularclient/src/app/home/home.ts | 23 + .../angularclient/src/app/layout/footer.ts | 35 + .../angularclient/src/app/layout/icons.ts | 88 + .../src/app/protected/protected.ts | 33 + .../src/app/service/auth.service.ts | 40 - .../src/app/service/local-storage.service.ts | 41 - .../angularclient/src/assets/.gitkeep | 0 .../src/environments/environment.prod.ts | 3 - .../src/environments/environment.ts | 17 +- .../angularclient/src/index.html | 4 +- .../angularclient/src/main.ts | 15 +- .../angularclient/src/polyfills.ts | 65 - .../angularclient/src/styles.css | 56 +- .../angularclient/src/styles.scss | 1 - .../angularclient/tailwind.config.js | 38 - .../angularclient/tsconfig.app.json | 11 +- .../angularclient/tsconfig.json | 36 +- .../angularclient/tsconfig.spec.json | 7 + .../angularclient/tslint.json | 152 - frameworks/spring-boot-keycloak/build.gradle | 27 +- .../spring-boot-keycloak/docker-compose.yml | 29 +- .../gradle/wrapper/gradle-wrapper.jar | Bin 43453 -> 47505 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- frameworks/spring-boot-keycloak/gradlew | 19 +- frameworks/spring-boot-keycloak/gradlew.bat | 38 +- .../keycloak/demo-realm-realm.json | 71 + .../spring-boot-keycloak/settings.gradle | 4 + .../SpringBootKeycloakApplication.java | 6 +- .../config/JwtClaimsConverter.java | 39 +- .../config/SecurityConfig.java | 51 +- .../web/TestController.java | 25 +- .../src/main/resources/application.yaml | 11 +- .../SpringBootKeycloakApplicationTests.java | 7 +- .../config/JwtClaimsConverterTests.java | 50 + .../web/TestControllerTests.java | 99 + 81 files changed, 4888 insertions(+), 9221 deletions(-) create mode 100644 .github/workflows/spring-boot-keycloak.yml create mode 100644 frameworks/spring-boot-keycloak/.gitattributes delete mode 100644 frameworks/spring-boot-keycloak/angularclient/.browserslistrc create mode 100644 frameworks/spring-boot-keycloak/angularclient/.nvmrc create mode 100644 frameworks/spring-boot-keycloak/angularclient/.postcssrc.json create mode 100644 frameworks/spring-boot-keycloak/angularclient/.prettierignore create mode 100644 frameworks/spring-boot-keycloak/angularclient/.prettierrc create mode 100644 frameworks/spring-boot-keycloak/angularclient/eslint.config.js rename frameworks/spring-boot-keycloak/angularclient/{src => public}/favicon.ico (100%) rename frameworks/spring-boot-keycloak/angularclient/{src/assets => public}/home-bg-mobile.webp (100%) rename frameworks/spring-boot-keycloak/angularclient/{src/assets => public}/home-bg.webp (100%) rename frameworks/spring-boot-keycloak/angularclient/{src/assets => public}/logo_phase_slash.svg (100%) create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/api/api.ts delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/app-routing.module.ts delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/app.component.html delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/app.component.scss delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/app.component.ts create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/app.config.ts create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/app.html delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/app.module.ts create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/app.routes.ts create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/app.spec.ts create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/app.ts create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.config.ts create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.guard.spec.ts create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.guard.ts create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.ts delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/commons/auth.guard.ts delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/commons/commons.ts delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.component.html delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.component.scss delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.component.ts delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.module.ts delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/components/user/user.component.html delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/components/user/user.component.ts delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/components/user/user.module.ts create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/home/home.html create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/home/home.spec.ts create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/home/home.ts create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/layout/footer.ts create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/layout/icons.ts create mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/protected/protected.ts delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/service/auth.service.ts delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/app/service/local-storage.service.ts delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/assets/.gitkeep delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/environments/environment.prod.ts delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/polyfills.ts delete mode 100644 frameworks/spring-boot-keycloak/angularclient/src/styles.scss delete mode 100644 frameworks/spring-boot-keycloak/angularclient/tailwind.config.js create mode 100644 frameworks/spring-boot-keycloak/angularclient/tsconfig.spec.json delete mode 100644 frameworks/spring-boot-keycloak/angularclient/tslint.json create mode 100644 frameworks/spring-boot-keycloak/keycloak/demo-realm-realm.json create mode 100644 frameworks/spring-boot-keycloak/src/test/java/com/example/springbootkeycloak/config/JwtClaimsConverterTests.java create mode 100644 frameworks/spring-boot-keycloak/src/test/java/com/example/springbootkeycloak/web/TestControllerTests.java diff --git a/.github/workflows/spring-boot-keycloak.yml b/.github/workflows/spring-boot-keycloak.yml new file mode 100644 index 0000000..679b019 --- /dev/null +++ b/.github/workflows/spring-boot-keycloak.yml @@ -0,0 +1,32 @@ +name: Spring Boot + Angular (Keycloak) + +on: + push: + branches: [main] + paths: + - "frameworks/spring-boot-keycloak/**" + - ".github/workflows/spring-boot-keycloak.yml" + pull_request: + branches: [main] + paths: + - "frameworks/spring-boot-keycloak/**" + - ".github/workflows/spring-boot-keycloak.yml" + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + api: + uses: ./.github/workflows/_gradle-ci.yml + with: + working-directory: frameworks/spring-boot-keycloak + + angularclient: + uses: ./.github/workflows/_node-ci.yml + with: + working-directory: frameworks/spring-boot-keycloak/angularclient diff --git a/frameworks/spring-boot-keycloak/.gitattributes b/frameworks/spring-boot-keycloak/.gitattributes new file mode 100644 index 0000000..8af972c --- /dev/null +++ b/frameworks/spring-boot-keycloak/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/frameworks/spring-boot-keycloak/.gitignore b/frameworks/spring-boot-keycloak/.gitignore index c2065bc..0c630bd 100644 --- a/frameworks/spring-boot-keycloak/.gitignore +++ b/frameworks/spring-boot-keycloak/.gitignore @@ -5,7 +5,6 @@ build/ !**/src/main/**/build/ !**/src/test/**/build/ -### STS ### .apt_generated .classpath .factorypath @@ -17,7 +16,6 @@ bin/ !**/src/main/**/bin/ !**/src/test/**/bin/ -### IntelliJ IDEA ### .idea *.iws *.iml @@ -26,12 +24,10 @@ out/ !**/src/main/**/out/ !**/src/test/**/out/ -### NetBeans ### /nbproject/private/ /nbbuild/ /dist/ /nbdist/ /.nb-gradle/ -### VS Code ### .vscode/ diff --git a/frameworks/spring-boot-keycloak/README.md b/frameworks/spring-boot-keycloak/README.md index 4d8fa73..b57304d 100644 --- a/frameworks/spring-boot-keycloak/README.md +++ b/frameworks/spring-boot-keycloak/README.md @@ -1,39 +1,133 @@ -# SpringBoot Keycloak SPA application +# Phase Two Spring Boot example: resource server + Angular client -This project was generated with [Spring Initializr](https://start.spring.io/). +A Spring Boot API secured with Keycloak, and an Angular single-page app that logs users in and calls it with their access token. Follow along with the tutorial [Securing an Angular and Spring Boot Application with Keycloak](https://phasetwo.io/blog/secure-spring-boot/). -Follow along with the [tutorial](https://phasetwo.io/blog/secure-spring-boot/) from Phase Two. +## How it works -# Get Started +```text + Angular client (localhost:4200) Keycloak (localhost:8888) + ┌──────────────────────────────┐ 1. log in ┌──────────────────────────┐ + │ angular-oauth2-oidc │ ───────────────▶ │ realm demo-realm │ + │ code flow + PKCE │ ◀─────────────── │ client demo-spa │ + └──────────────────────────────┘ access token └──────────────────────────┘ + │ ▲ + │ 2. GET /api/test/user │ 3. signing keys + │ Authorization: Bearer │ + ▼ │ + ┌────────────────────────────────────────────────────────────────────────────┐ + │ Spring Boot API (localhost:8080): OAuth 2.0 resource server │ + └────────────────────────────────────────────────────────────────────────────┘ +``` -## Start Keycloak Server +1. The [Angular client](./angularclient) logs the user in with the authorization code flow and PKCE. Tokens stay in the browser's session storage and are refreshed before they expire. +2. It sends the access token as a bearer token, only on requests to the API. +3. The API validates the token (signature, issuer, expiry) with the realm's public keys, then maps the realm roles from the `realm_access.roles` claim to Spring Security roles: the Keycloak role `user` becomes `ROLE_user`. -To skip this section, use [Phase Two](https://phasetwo.io/dashboard/) to setup a free Keycloak hosted in the cloud. Instructions below assume using the local instance, but values can easily be changed to match the cloud instance. +| Endpoint | Who can call it | Response | +| ------------------------- | ------------------------------------------ | --------------------------------------------------------------------------- | +| `GET /api/test/anonymous` | everyone | `{"message":"Hello Anonymous"}` | +| `GET /api/test/user` | an access token with the realm role `user` | `{"message":"Hello Secured with user role.","user":""}` | -1. Start Keycloak server using `docker-compose up -d` -1. Go to `http://localhost:8888/auth` and login using username `admin` and password `admin` -1. Create a realm `demo-realm` -1. Create a public client `demo-spa` and add redirectUri `http://localhost:4200/*` and Web Origins `http://localhost:4200` -1. Create a realm role `user` -1. Create a `test` user and assign the `user` role to it. Add password credentials to the `test` user. +Without a token, `/api/test/user` answers `401 Unauthorized`; with a token that lacks the `user` role, `403 Forbidden`. Any other path is denied, except `/.well-known/oauth-protected-resource`, where Spring Security publishes the API's [OAuth 2.0 protected resource metadata](https://datatracker.ietf.org/doc/html/rfc9728). -## Start Angular Application +| File | What it does | +| ---------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------- | +| [`SecurityConfig.java`](./src/main/java/com/example/springbootkeycloak/config/SecurityConfig.java) | Stateless resource server, the paths that need a token, CORS for the Angular client | +| [`JwtClaimsConverter.java`](./src/main/java/com/example/springbootkeycloak/config/JwtClaimsConverter.java) | Realm roles to `ROLE_*` authorities, `preferred_username` as the user name | +| [`TestController.java`](./src/main/java/com/example/springbootkeycloak/web/TestController.java) | The two endpoints; `@PreAuthorize("hasRole('user')")` guards `/api/test/user` | +| [`application.yaml`](./src/main/resources/application.yaml) | Keycloak issuer and allowed CORS origins | +| [`keycloak/demo-realm-realm.json`](./keycloak/demo-realm-realm.json) | The realm Keycloak imports at startup | -1. Open another terminal. Go to `./angularclient` folder. Run `npm i` and start the Angular app using `npm run start`. -1. Open the browser to `http://localhost:4200/`. After login the `accessToken` should be present in the `localStorage` of the browser. View this by opening a Web console and typing `localStorage` to view its value. -1. Use access token to access secured endpoints: +## Requirements -## Start Spring Application +- Java 17 or newer to run Gradle. The build compiles with a Java 21 toolchain, which Gradle downloads if you do not have one. +- Node.js 24 and pnpm, for the Angular client. +- Docker with the Compose plugin. -1. Run `./gradlew bootRun` to start the SpringBoot application in a terminal. -1. Directly hit the Spring application's API interface. Pull the `accessToken` from `localStorage`. +## Run it +1. Start Keycloak on port 8888, from this folder: + + ```sh + docker compose up -d --wait + ``` + + Keycloak imports [`keycloak/demo-realm-realm.json`](./keycloak/demo-realm-realm.json) (the file name follows Keycloak's `-realm.json` export convention): + + | What | Value | + | ------------- | ------------------------------------------------------------------------------------------- | + | Issuer | `http://localhost:8888/auth/realms/demo-realm` | + | Admin console | , `admin` / `admin` | + | Users | `test` / `test` has the realm role `user`; `noaccess` / `noaccess` does not | + | Client | `demo-spa`: public, standard flow with PKCE (S256), redirect URIs `http://localhost:4200/*` | + + Nothing is persisted: `docker compose down` followed by `docker compose up -d --wait` gives you a fresh realm. + +2. Start the API on port 8080: + + ```sh + ./gradlew bootRun + ``` + +3. Start the Angular client on port 4200, in another terminal: + + ```sh + cd angularclient + pnpm install + pnpm start + ``` + +Open . Call both endpoints while logged out, then log in as `test` and call `/api/test/user` again. Log out, log in as `noaccess` and the same call returns `403 Forbidden`. The protected page (`/protected`) shows how an Angular route guard sends users to Keycloak before they can open a page. + +## Call the API with curl + +The public endpoint needs no token: + +```sh +curl http://localhost:8080/api/test/anonymous ``` -curl --location 'http://localhost:8080/api/test/anonymous' \ - --header 'Authorization: Bearer {{$access_token}}' -``` +The `user` endpoint needs an access token. The `demo-spa` client only allows the browser login flow, so take the token from the Angular client: log in, open the browser's developer console and run `sessionStorage.getItem('access_token')`. Then: + +```sh +ACCESS_TOKEN='paste the access token here' + +curl -i http://localhost:8080/api/test/user +curl -H "Authorization: Bearer $ACCESS_TOKEN" http://localhost:8080/api/test/user ``` -curl --location 'http://localhost:8080/api/test/user' \ - --header 'Authorization: Bearer {{$access_token}}' + +The first call returns `401`, the second `{"message":"Hello Secured with user role.","user":"test"}` (or `403` with the `noaccess` user's token). Access tokens expire after 5 minutes. + +## Configuration + +The API reads these settings from [`application.yaml`](./src/main/resources/application.yaml); the environment variables override them. + +| Property | Environment variable | Default | Description | +| ------------------------------------------------------ | ---------------------- | ---------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | +| `spring.security.oauth2.resourceserver.jwt.issuer-uri` | `KEYCLOAK_ISSUER_URI` | `http://localhost:8888/auth/realms/demo-realm` | URL of the Keycloak realm. On the first request the API reads the realm's signing keys from it. Tokens must have this exact `iss`. | +| `app.cors.allowed-origins` | `CORS_ALLOWED_ORIGINS` | `http://localhost:4200` | Comma-separated origins allowed to call the API from a browser | +| `server.port` | `SERVER_PORT` | `8080` | Port of the API | + +For example: `KEYCLOAK_ISSUER_URI=https://keycloak.example.com/auth/realms/myrealm ./gradlew bootRun`. + +The Angular client's settings (issuer, client ID and API URL) are in [`angularclient/src/environments/environment.ts`](./angularclient/src/environments/environment.ts). + +## Use your own Keycloak realm + +1. Create a realm role `user`. +2. Create an OpenID Connect client, for example `demo-spa`, with client authentication off and only the standard flow enabled. Set `http://localhost:4200/*` as valid redirect URI, and `+` as valid post logout redirect URI and as web origin. In the client's advanced settings, set the PKCE method to `S256`. +3. Create a user with a password, an email, a first name and a last name, and assign it the `user` role. +4. Point the API at the realm with `KEYCLOAK_ISSUER_URI`, and the Angular client with `issuer` and `clientId` in `environment.ts`. + +## Build and test + +```sh +./gradlew build ``` + +It compiles the API and runs its tests, none of which need Keycloak: + +- [`TestControllerTests`](./src/test/java/com/example/springbootkeycloak/web/TestControllerTests.java) calls the endpoints through the security filter chain: public endpoint, `401` without a token, `403` without the `user` role, `200` with it, CORS for the Angular client. +- [`JwtClaimsConverterTests`](./src/test/java/com/example/springbootkeycloak/config/JwtClaimsConverterTests.java) checks the role mapping. + +`./gradlew bootJar` builds `build/libs/spring-boot-keycloak-0.0.1-SNAPSHOT.jar`, which runs with `java -jar`. For the Angular client, see [its README](./angularclient/README.md). diff --git a/frameworks/spring-boot-keycloak/angularclient/.browserslistrc b/frameworks/spring-boot-keycloak/angularclient/.browserslistrc deleted file mode 100644 index 427441d..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/.browserslistrc +++ /dev/null @@ -1,17 +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 - -# For the full list of supported browsers by the Angular framework, please see: -# https://angular.io/guide/browser-support - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -last 1 Chrome version -last 1 Firefox version -last 2 Edge major versions -last 2 Safari major versions -last 2 iOS major versions -Firefox ESR -not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. diff --git a/frameworks/spring-boot-keycloak/angularclient/.editorconfig b/frameworks/spring-boot-keycloak/angularclient/.editorconfig index 59d9a3a..6391bdb 100644 --- a/frameworks/spring-boot-keycloak/angularclient/.editorconfig +++ b/frameworks/spring-boot-keycloak/angularclient/.editorconfig @@ -1,4 +1,3 @@ -# Editor configuration, see https://editorconfig.org root = true [*] @@ -10,6 +9,7 @@ trim_trailing_whitespace = true [*.ts] quote_type = single +ij_typescript_use_double_quotes = false [*.md] max_line_length = off diff --git a/frameworks/spring-boot-keycloak/angularclient/.gitignore b/frameworks/spring-boot-keycloak/angularclient/.gitignore index 86d943a..9b87308 100644 --- a/frameworks/spring-boot-keycloak/angularclient/.gitignore +++ b/frameworks/spring-boot-keycloak/angularclient/.gitignore @@ -1,46 +1,32 @@ -# See http://help.github.com/ignore-files/ for more about ignoring files. - -# compiled output /dist /tmp /out-tsc -# Only exists if Bazel was run /bazel-out -# dependencies /node_modules +npm-debug.log +yarn-error.log +pnpm-debug.log -# profiling files -chrome-profiler-events*.json -speed-measure-plugin*.json - -# IDEs and editors -/.idea +.idea/ .project .classpath .c9/ *.launch .settings/ *.sublime-workspace - -# IDE - VSCode .vscode/* -!.vscode/settings.json -!.vscode/tasks.json -!.vscode/launch.json !.vscode/extensions.json .history/* -# misc -/.sass-cache +/.angular/cache +.sass-cache/ /connect.lock /coverage /libpeerconnection.log -npm-debug.log -yarn-error.log testem.log /typings +__screenshots__/ -# System Files .DS_Store Thumbs.db diff --git a/frameworks/spring-boot-keycloak/angularclient/.nvmrc b/frameworks/spring-boot-keycloak/angularclient/.nvmrc new file mode 100644 index 0000000..a45fd52 --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/.nvmrc @@ -0,0 +1 @@ +24 diff --git a/frameworks/spring-boot-keycloak/angularclient/.postcssrc.json b/frameworks/spring-boot-keycloak/angularclient/.postcssrc.json new file mode 100644 index 0000000..e092dc7 --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/.postcssrc.json @@ -0,0 +1,5 @@ +{ + "plugins": { + "@tailwindcss/postcss": {} + } +} diff --git a/frameworks/spring-boot-keycloak/angularclient/.prettierignore b/frameworks/spring-boot-keycloak/angularclient/.prettierignore new file mode 100644 index 0000000..bd5535a --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/.prettierignore @@ -0,0 +1 @@ +pnpm-lock.yaml diff --git a/frameworks/spring-boot-keycloak/angularclient/.prettierrc b/frameworks/spring-boot-keycloak/angularclient/.prettierrc new file mode 100644 index 0000000..597beec --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/.prettierrc @@ -0,0 +1,14 @@ +{ + "printWidth": 100, + "singleQuote": true, + "plugins": ["prettier-plugin-tailwindcss"], + "tailwindStylesheet": "./src/styles.css", + "overrides": [ + { + "files": "*.html", + "options": { + "parser": "angular" + } + } + ] +} diff --git a/frameworks/spring-boot-keycloak/angularclient/README.md b/frameworks/spring-boot-keycloak/angularclient/README.md index ad02e07..a759b55 100644 --- a/frameworks/spring-boot-keycloak/angularclient/README.md +++ b/frameworks/spring-boot-keycloak/angularclient/README.md @@ -1,21 +1,21 @@ -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 11.2.4. +# Angular client -# NodeJS +The Angular single-page app of the [Spring Boot example](../README.md). It logs users in with Keycloak using the authorization code flow with PKCE, through [angular-oauth2-oidc](https://github.com/manfredsteyer/angular-oauth2-oidc), and calls the Spring Boot API with the access token. -This project runs using Node.js version v16 or newer. +- [`src/environments/environment.ts`](./src/environments/environment.ts): Keycloak issuer, client ID and API URL. +- [`src/app/app.config.ts`](./src/app/app.config.ts): configures angular-oauth2-oidc, sends the access token only to the API, and finishes the login when Keycloak redirects back. +- [`src/app/auth/auth.guard.ts`](./src/app/auth/auth.guard.ts): `authGuard` starts the login before opening a route that needs it (`/protected`). +- [`src/app/home/`](./src/app/home): login status, the Log in / Log out buttons, the API calls and the decoded tokens. -# npm package manager +Tokens are kept in session storage and refreshed before they expire. Logging out also ends the Keycloak session. -This project is build using npm package manager version 8.5.1 +## Run it -## Install dependencies +Start Keycloak and the API first, as described in the [example's README](../README.md). Then: -Run `npm install` to add all dependencies +```sh +pnpm install +pnpm start +``` -## Development server - -Run `npm run ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. - -## Build - -Run `npm run ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. +Open . `pnpm build`, `pnpm test`, `pnpm lint`, `pnpm typecheck` and `pnpm format` are also available. diff --git a/frameworks/spring-boot-keycloak/angularclient/angular.json b/frameworks/spring-boot-keycloak/angularclient/angular.json index 5decca7..c09d02e 100644 --- a/frameworks/spring-boot-keycloak/angularclient/angular.json +++ b/frameworks/spring-boot-keycloak/angularclient/angular.json @@ -1,103 +1,79 @@ { "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, "cli": { - "analytics": "9b9a48dd-005c-480e-89e3-118a7efa8e6f" + "packageManager": "pnpm", + "analytics": false, + "schematicCollections": ["angular-eslint"] }, - "version": 1, "newProjectRoot": "projects", "projects": { "angularclient": { "projectType": "application", - "schematics": { - "@schematics/angular:component": { - "style": "scss" - } - }, + "schematics": {}, "root": "", "sourceRoot": "src", "prefix": "app", "architect": { "build": { - "builder": "@angular-devkit/build-angular:browser", + "builder": "@angular/build:application", "options": { - "outputPath": "dist/angularclient", - "index": "src/index.html", - "main": "src/main.ts", - "polyfills": "src/polyfills.ts", + "browser": "src/main.ts", "tsConfig": "tsconfig.app.json", - "aot": true, - "assets": ["src/favicon.ico", "src/assets"], - "styles": ["src/styles.scss", "src/styles.css"], - "scripts": [] + "assets": [ + { + "glob": "**/*", + "input": "public" + } + ], + "styles": ["src/styles.css"] }, "configurations": { "production": { - "fileReplacements": [ - { - "replace": "src/environments/environment.ts", - "with": "src/environments/environment.prod.ts" - } - ], - "optimization": true, - "outputHashing": "all", - "sourceMap": false, - "namedChunks": false, - "extractLicenses": true, - "vendorChunk": false, - "buildOptimizer": true, "budgets": [ { "type": "initial", - "maximumWarning": "2mb", - "maximumError": "5mb" + "maximumWarning": "500kB", + "maximumError": "1MB" }, { "type": "anyComponentStyle", - "maximumWarning": "6kb", - "maximumError": "10kb" + "maximumWarning": "4kB", + "maximumError": "8kB" } - ] + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true } - } + }, + "defaultConfiguration": "production" }, "serve": { - "builder": "@angular-devkit/build-angular:dev-server", - "options": { - "browserTarget": "angularclient:build" - }, + "builder": "@angular/build:dev-server", "configurations": { "production": { - "browserTarget": "angularclient:build:production" + "buildTarget": "angularclient:build:production" + }, + "development": { + "buildTarget": "angularclient:build:development" } - } - }, - "extract-i18n": { - "builder": "@angular-devkit/build-angular:extract-i18n", - "options": { - "browserTarget": "angularclient:build" - } + }, + "defaultConfiguration": "development" }, "test": { - "builder": "@angular-devkit/build-angular:karma", - "options": { - "main": "src/test.ts", - "polyfills": "src/polyfills.ts", - "tsConfig": "tsconfig.spec.json", - "karmaConfig": "karma.conf.js", - "assets": ["src/favicon.ico", "src/assets"], - "styles": ["src/styles.scss"], - "scripts": [] - } + "builder": "@angular/build:unit-test" }, "lint": { - "builder": "@angular-devkit/build-angular:tslint", + "builder": "@angular-eslint/builder:lint", "options": { - "tsConfig": ["tsconfig.app.json"], - "exclude": ["**/node_modules/**"] + "lintFilePatterns": ["src/**/*.ts", "src/**/*.html"] } } } } - }, - "defaultProject": "angularclient" + } } diff --git a/frameworks/spring-boot-keycloak/angularclient/eslint.config.js b/frameworks/spring-boot-keycloak/angularclient/eslint.config.js new file mode 100644 index 0000000..fd9260f --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/eslint.config.js @@ -0,0 +1,40 @@ +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/frameworks/spring-boot-keycloak/angularclient/package.json b/frameworks/spring-boot-keycloak/angularclient/package.json index 726f6fa..804aa7d 100644 --- a/frameworks/spring-boot-keycloak/angularclient/package.json +++ b/frameworks/spring-boot-keycloak/angularclient/package.json @@ -1,41 +1,48 @@ { - "name": "angularclient", + "name": "phasetwo-spring-boot-angularclient-example", "version": "0.0.0", + "private": true, + "packageManager": "pnpm@10.34.5", + "engines": { + "node": "24.x" + }, "scripts": { "ng": "ng", "start": "ng serve", "build": "ng build", - "lint": "ng lint" + "typecheck": "tsc -p tsconfig.app.json --noEmit && tsc -p tsconfig.spec.json --noEmit", + "lint": "ng lint", + "format": "prettier --write .", + "test": "ng test" }, - "private": true, "dependencies": { - "@angular/animations": "^21.1.1", - "@angular/common": "^21.1.1", - "@angular/compiler": "^21.1.1", - "@angular/core": "^21.1.1", - "@angular/forms": "^21.1.1", - "@angular/platform-browser": "^21.1.1", - "@angular/platform-browser-dynamic": "^21.1.1", - "@angular/router": "^21.1.1", - "angular-oauth2-oidc": "^10.0.3", + "@angular/common": "^22.2.0", + "@angular/compiler": "^22.2.0", + "@angular/core": "^22.2.0", + "@angular/forms": "^22.2.0", + "@angular/platform-browser": "^22.2.0", + "@angular/router": "^22.2.0", + "angular-oauth2-oidc": "^22.0.2", "jwt-decode": "^4.0.0", - "ng": "^0.0.0", - "rxjs": "~6.6.7", - "serve": "^14.2.5", - "tslib": "^2.8.1", - "zone.js": "~0.11.8" + "rxjs": "~7.8.0", + "tslib": "^2.3.0" }, "devDependencies": { - "@angular-devkit/build-angular": "^21.1.1", - "@angular/cli": "^21.1.1", - "@angular/compiler-cli": "^21.1.1", - "@types/node": "^12.20.55", - "autoprefixer": "^10.4.23", - "codelyzer": "^6.0.2", - "postcss": "^8.5.6", - "tailwindcss": "^2.2.19", - "ts-node": "~8.3.0", - "tslint": "~6.1.3", - "typescript": "~4.1.6" + "@angular-eslint/builder": "22.5.0", + "@angular/build": "^22.2.0", + "@angular/cli": "^22.2.0", + "@angular/compiler-cli": "^22.2.0", + "@eslint/js": "^10.0.1", + "@tailwindcss/postcss": "^4.1.12", + "angular-eslint": "22.5.0", + "eslint": "^10.9.1", + "jsdom": "^30.0.0", + "postcss": "^8.5.3", + "prettier": "^3.8.1", + "prettier-plugin-tailwindcss": "^0.8.1", + "tailwindcss": "^4.1.12", + "typescript": "~6.0.2", + "typescript-eslint": "8.69.0", + "vitest": "^5.0.0" } } diff --git a/frameworks/spring-boot-keycloak/angularclient/pnpm-lock.yaml b/frameworks/spring-boot-keycloak/angularclient/pnpm-lock.yaml index e1e6259..67a6a32 100644 --- a/frameworks/spring-boot-keycloak/angularclient/pnpm-lock.yaml +++ b/frameworks/spring-boot-keycloak/angularclient/pnpm-lock.yaml @@ -8,249 +8,177 @@ importers: .: dependencies: - '@angular/animations': - specifier: ^21.1.1 - version: 21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)) '@angular/common': - specifier: ^21.1.1 - version: 21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7) + specifier: ^22.2.0 + version: 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) '@angular/compiler': - specifier: ^21.1.1 - version: 21.1.1 + specifier: ^22.2.0 + version: 22.2.0 '@angular/core': - specifier: ^21.1.1 - version: 21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8) + specifier: ^22.2.0 + version: 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) '@angular/forms': - specifier: ^21.1.1 - version: 21.1.1(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(@angular/platform-browser@21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(rxjs@6.6.7) + specifier: ^22.2.0 + version: 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': - specifier: ^21.1.1 - version: 21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)) - '@angular/platform-browser-dynamic': - specifier: ^21.1.1 - version: 21.1.1(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/compiler@21.1.1)(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(@angular/platform-browser@21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))) + specifier: ^22.2.0 + version: 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) '@angular/router': - specifier: ^21.1.1 - version: 21.1.1(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(@angular/platform-browser@21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(rxjs@6.6.7) + specifier: ^22.2.0 + version: 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2) angular-oauth2-oidc: - specifier: ^10.0.3 - version: 10.0.3(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)) + specifier: ^22.0.2 + version: 22.0.2(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) jwt-decode: specifier: ^4.0.0 version: 4.0.0 - ng: - specifier: ^0.0.0 - version: 0.0.0 rxjs: - specifier: ~6.6.7 - version: 6.6.7 - serve: - specifier: ^14.2.5 - version: 14.2.5 + specifier: ~7.8.0 + version: 7.8.2 tslib: - specifier: ^2.8.1 + specifier: ^2.3.0 version: 2.8.1 - zone.js: - specifier: ~0.11.8 - version: 0.11.8 devDependencies: - '@angular-devkit/build-angular': - specifier: ^21.1.1 - version: 21.1.1(@angular/compiler-cli@21.1.1(@angular/compiler@21.1.1)(typescript@4.1.6))(@angular/compiler@21.1.1)(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(@angular/platform-browser@21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@types/node@12.20.55)(chokidar@5.0.0)(jiti@2.6.1)(stylus@0.54.8)(tailwindcss@2.2.19(autoprefixer@10.4.23(postcss@8.5.6))(postcss@8.5.6)(ts-node@8.3.0(typescript@4.1.6)))(typescript@4.1.6) + '@angular-eslint/builder': + specifier: 22.5.0 + version: 22.5.0(chokidar@5.0.0)(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@angular/build': + specifier: ^22.2.0 + version: 22.2.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/compiler@22.2.0)(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(jiti@2.7.0)(postcss@8.5.28)(tailwindcss@4.3.3)(tslib@2.8.1)(typescript@6.0.3)(vitest@5.0.1(jsdom@30.1.1)(vite@8.3.0(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1))) '@angular/cli': - specifier: ^21.1.1 - version: 21.1.1(@types/node@12.20.55)(chokidar@5.0.0)(hono@4.11.5) + specifier: ^22.2.0 + version: 22.2.0(chokidar@5.0.0) '@angular/compiler-cli': - specifier: ^21.1.1 - version: 21.1.1(@angular/compiler@21.1.1)(typescript@4.1.6) - '@types/node': - specifier: ^12.20.55 - version: 12.20.55 - autoprefixer: - specifier: ^10.4.23 - version: 10.4.23(postcss@8.5.6) - codelyzer: - specifier: ^6.0.2 - version: 6.0.2(@angular/compiler@21.1.1)(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(tslint@6.1.3(typescript@4.1.6)) + specifier: ^22.2.0 + version: 22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3) + '@eslint/js': + specifier: ^10.0.1 + version: 10.0.1(eslint@10.11.0(jiti@2.7.0)) + '@tailwindcss/postcss': + specifier: ^4.1.12 + version: 4.3.3 + angular-eslint: + specifier: 22.5.0 + version: 22.5.0(chokidar@5.0.0)(eslint@10.11.0(jiti@2.7.0))(typescript-eslint@8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(typescript@6.0.3) + eslint: + specifier: ^10.9.1 + version: 10.11.0(jiti@2.7.0) + jsdom: + specifier: ^30.0.0 + version: 30.1.1 postcss: - specifier: ^8.5.6 - version: 8.5.6 + specifier: ^8.5.3 + version: 8.5.28 + prettier: + specifier: ^3.8.1 + version: 3.9.9 + prettier-plugin-tailwindcss: + specifier: ^0.8.1 + version: 0.8.1(prettier@3.9.9) tailwindcss: - specifier: ^2.2.19 - version: 2.2.19(autoprefixer@10.4.23(postcss@8.5.6))(postcss@8.5.6)(ts-node@8.3.0(typescript@4.1.6)) - ts-node: - specifier: ~8.3.0 - version: 8.3.0(typescript@4.1.6) - tslint: - specifier: ~6.1.3 - version: 6.1.3(typescript@4.1.6) + specifier: ^4.1.12 + version: 4.3.3 typescript: - specifier: ~4.1.6 - version: 4.1.6 + specifier: ~6.0.2 + version: 6.0.3 + typescript-eslint: + specifier: 8.69.0 + version: 8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + vitest: + specifier: ^5.0.0 + version: 5.0.1(jsdom@30.1.1)(vite@8.3.0(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1)) packages: - '@algolia/abtesting@1.12.2': - resolution: {integrity: sha512-oWknd6wpfNrmRcH0vzed3UPX0i17o4kYLM5OMITyMVM2xLgaRbIafoxL0e8mcrNNb0iORCJA0evnNDKRYth5WQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-abtesting@5.46.2': - resolution: {integrity: sha512-oRSUHbylGIuxrlzdPA8FPJuwrLLRavOhAmFGgdAvMcX47XsyM+IOGa9tc7/K5SPvBqn4nhppOCEz7BrzOPWc4A==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-analytics@5.46.2': - resolution: {integrity: sha512-EPBN2Oruw0maWOF4OgGPfioTvd+gmiNwx0HmD9IgmlS+l75DatcBkKOPNJN+0z3wBQWUO5oq602ATxIfmTQ8bA==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-common@5.46.2': - resolution: {integrity: sha512-Hj8gswSJNKZ0oyd0wWissqyasm+wTz1oIsv5ZmLarzOZAp3vFEda8bpDQ8PUhO+DfkbiLyVnAxsPe4cGzWtqkg==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-insights@5.46.2': - resolution: {integrity: sha512-6dBZko2jt8FmQcHCbmNLB0kCV079Mx/DJcySTL3wirgDBUH7xhY1pOuUTLMiGkqM5D8moVZTvTdRKZUJRkrwBA==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-personalization@5.46.2': - resolution: {integrity: sha512-1waE2Uqh/PHNeDXGn/PM/WrmYOBiUGSVxAWqiJIj73jqPqvfzZgzdakHscIVaDl6Cp+j5dwjsZ5LCgaUr6DtmA==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-query-suggestions@5.46.2': - resolution: {integrity: sha512-EgOzTZkyDcNL6DV0V/24+oBJ+hKo0wNgyrOX/mePBM9bc9huHxIY2352sXmoZ648JXXY2x//V1kropF/Spx83w==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-search@5.46.2': - resolution: {integrity: sha512-ZsOJqu4HOG5BlvIFnMU0YKjQ9ZI6r3C31dg2jk5kMWPSdhJpYL9xa5hEe7aieE+707dXeMI4ej3diy6mXdZpgA==} - engines: {node: '>= 14.0.0'} - - '@algolia/ingestion@1.46.2': - resolution: {integrity: sha512-1Uw2OslTWiOFDtt83y0bGiErJYy5MizadV0nHnOoHFWMoDqWW0kQoMFI65pXqRSkVvit5zjXSLik2xMiyQJDWQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/monitoring@1.46.2': - resolution: {integrity: sha512-xk9f+DPtNcddWN6E7n1hyNNsATBCHIqAvVGG2EAGHJc4AFYL18uM/kMTiOKXE/LKDPyy1JhIerrh9oYb7RBrgw==} - engines: {node: '>= 14.0.0'} - - '@algolia/recommend@5.46.2': - resolution: {integrity: sha512-NApbTPj9LxGzNw4dYnZmj2BoXiAc8NmbbH6qBNzQgXklGklt/xldTvu+FACN6ltFsTzoNU6j2mWNlHQTKGC5+Q==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-browser-xhr@5.46.2': - resolution: {integrity: sha512-ekotpCwpSp033DIIrsTpYlGUCF6momkgupRV/FA3m62SreTSZUKjgK6VTNyG7TtYfq9YFm/pnh65bATP/ZWJEg==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-fetch@5.46.2': - resolution: {integrity: sha512-gKE+ZFi/6y7saTr34wS0SqYFDcjHW4Wminv8PDZEi0/mE99+hSrbKgJWxo2ztb5eqGirQTgIh1AMVacGGWM1iw==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-node-http@5.46.2': - resolution: {integrity: sha512-ciPihkletp7ttweJ8Zt+GukSVLp2ANJHU+9ttiSxsJZThXc4Y2yJ8HGVWesW5jN1zrsZsezN71KrMx/iZsOYpg==} - engines: {node: '>= 14.0.0'} + '@alloc/quick-lru@5.3.0': + resolution: {integrity: sha512-U4+70Pc5ZS9osnCBCE5Jha/ciHM+Yp+CNMNC/7HvYbNRk1Ldd+f7qO65W5qfhu/TCv+/ozljlXXe9Nj8419DMA==} + engines: {node: '>=10'} '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@angular-devkit/architect@0.2101.1': - resolution: {integrity: sha512-8x7hKcFs3hnpDaIj9fyzinh4X74oQaMxMsZzBf4dBL7EwokjPIf2fadQsZd8a5M+Ja4tIgTnXH9ySyaRFWGNXA==} - 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'} + '@angular-devkit/architect@0.2202.0': + resolution: {integrity: sha512-HxY8JxLd3WxFj45BtDUHZ9I6hO4KebTz32UQ4ZkPh0EMK/TZdspbSgwd2lo1jE6a90knRAQkAsnBTKwWvGSm3A==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular-devkit/build-angular@21.1.1': - resolution: {integrity: sha512-h882zE4NpfXQIzCKq6cXq4FBTd43rLCLX5RZL/sa38cFVNDp51HNn+rU9l4PeXQOKllq4CVmj9ePgVecyMpr2Q==} - 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'} + '@angular-devkit/core@22.2.0': + resolution: {integrity: sha512-dELBwXtJWUxFALdEVvdk8qK+XBa17EH5H9NZm+041/esjNi6SaZMusqBgr2PZKq7hD+O2jSCEHbey/hwkz2Awg==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: - '@angular/compiler-cli': ^21.0.0 - '@angular/core': ^21.0.0 - '@angular/localize': ^21.0.0 - '@angular/platform-browser': ^21.0.0 - '@angular/platform-server': ^21.0.0 - '@angular/service-worker': ^21.0.0 - '@angular/ssr': ^21.1.1 - '@web/test-runner': ^0.20.0 - browser-sync: ^3.0.2 - jest: ^30.2.0 - jest-environment-jsdom: ^30.2.0 - karma: ^6.3.0 - ng-packagr: ^21.0.0 - protractor: ^7.0.0 - tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 - typescript: '>=5.9 <6.0' + chokidar: ^5.0.0 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 - '@web/test-runner': - optional: true - browser-sync: - optional: true - jest: - optional: true - jest-environment-jsdom: - optional: true - karma: - optional: true - ng-packagr: - optional: true - protractor: - optional: true - tailwindcss: + chokidar: optional: true - '@angular-devkit/build-webpack@0.2101.1': - resolution: {integrity: sha512-gX5/4RT/1ZO6kyo6bEi8uSxZ5oqdolsi87PchKRJfFir2m8u101qs3H07o4KFgG4YlnPUwyHET3ae5YVhS/0xg==} - 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'} + '@angular-devkit/schematics@22.2.0': + resolution: {integrity: sha512-yhp/LRzKHJOzo2gFm9+H5DKnsT9adi+ItO2pW0pW2B455sqZYE8RJaSku+TSlv+PvWSmbtFsPXNgSRLA6pSk8Q==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@angular-eslint/builder@22.5.0': + resolution: {integrity: sha512-bChGIHOApVk3eXaAfCOxxb54tToIttSzADEUpuBN6cs7Jp7OO96lNpMktv9IPvxfyVrhbriocwNy33jhpRSt0Q==} peerDependencies: - webpack: ^5.30.0 - webpack-dev-server: ^5.0.2 + eslint: ^9.0.0 || ^10.0.0 + typescript: '*' - '@angular-devkit/core@21.1.1': - resolution: {integrity: sha512-rCwfBUemyRoAfrO4c85b49lkPiD5WljWE+IK7vjUNIFFf4TXOS4tg4zxqopUDVE4zEjXORa5oHCEc5HCerjn1g==} - 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'} + '@angular-eslint/bundled-angular-compiler@22.5.0': + resolution: {integrity: sha512-AdvtopHjjenM02LqsgqQbpTWTbE2DqFS4ZJT8YxEIzUKUdLNwkGUgZn9WpKHBHGBvaiA3hj2BLWRCJs/vJmV3g==} + + '@angular-eslint/eslint-plugin-template@22.5.0': + resolution: {integrity: sha512-qHi292XBe5TIFpPjEKY+NtiFGEZLrYzD8GPVzBuIruaKQz1Y//eqPp3Ve/MYYBbwdj0gD8rPZRjDIXAcsRUMVg==} peerDependencies: - chokidar: ^5.0.0 - peerDependenciesMeta: - chokidar: - optional: true + '@angular-eslint/template-parser': 22.5.0 + '@typescript-eslint/types': ^8.0.0 + '@typescript-eslint/utils': ^8.0.0 + eslint: ^9.0.0 || ^10.0.0 + typescript: '*' + + '@angular-eslint/eslint-plugin@22.5.0': + resolution: {integrity: sha512-3MooyC+F156Aa0XmNLwNMeQFVmSPhJYqPdX8FditvzSYuo5qANZTSbBABMU8XepvmxXcpPmEsj5sQUpbTdRl9Q==} + peerDependencies: + '@typescript-eslint/utils': ^8.0.0 + eslint: ^9.0.0 || ^10.0.0 + typescript: '*' - '@angular-devkit/schematics@21.1.1': - resolution: {integrity: sha512-3ptEOuALghEYEPVbhRa7g8a+YmvmHqHVNqF9XqCbG22nPGWkE58qfNNbXi3tF9iQxzKSGw5Iy5gYUvSvpsdcfw==} - 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'} + '@angular-eslint/schematics@22.5.0': + resolution: {integrity: sha512-4B7Bpph/H6vNI0Wfi3p4w4AKw6VJrTG9IGNbSx6NKbPzcwBSaFSuJUpIUxiuzlsaFy6csbRWU2E3UPyXjEfFew==} - '@angular/animations@21.1.1': - resolution: {integrity: sha512-OQRyNbFBCkuihdCegrpN/Np5YQ7uV9if48LAoXxT68tYhK3S/Qbyx2MzJpOMFEFNfpjXRg1BZr8hVcZVFnArpg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular-eslint/template-parser@22.5.0': + resolution: {integrity: sha512-p0C48htmzd1/Qum3TIQz3FZMWivbkm7x8z3Q6GY3CzNOIzVRKQU2MwZtpocXPkctJGjYnC5wJ58d8Ow4E5LVbA==} peerDependencies: - '@angular/core': 21.1.1 + eslint: ^9.0.0 || ^10.0.0 + typescript: '*' - '@angular/build@21.1.1': - resolution: {integrity: sha512-OqlfH7tkahw/lFT6ACU6mqt3AGgTxxT27JTqpzZOeGo1ferR9dq1O6/CT4GiNyr/Z1AMfs7rBWlQH68y1QZb2g==} - 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'} + '@angular-eslint/utils@22.5.0': + resolution: {integrity: sha512-i106BkmVnXM3ub5nsaXmAZNk1bnajzVOwrGrEVt9U0mX22zcVlunLMWC49z2dqGjl91Ppw0Xr5ed+QrKWm9Ldg==} peerDependencies: - '@angular/compiler': ^21.0.0 - '@angular/compiler-cli': ^21.0.0 - '@angular/core': ^21.0.0 - '@angular/localize': ^21.0.0 - '@angular/platform-browser': ^21.0.0 - '@angular/platform-server': ^21.0.0 - '@angular/service-worker': ^21.0.0 - '@angular/ssr': ^21.1.1 + '@typescript-eslint/utils': ^8.0.0 + eslint: ^9.0.0 || ^10.0.0 + typescript: '*' + + '@angular/build@22.2.0': + resolution: {integrity: sha512-9ABYN9zp4DqDfZxiqyIMEB5iec6xIuVys+BfVjOFkwd3tCnOK+DnRtU8OmI7R8BxUZwLzbPqFffZzvCVVfHP7Q==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + '@angular/compiler': ^22.0.0 + '@angular/compiler-cli': ^22.0.0 + '@angular/core': ^22.0.0 + '@angular/localize': ^22.0.0 + '@angular/platform-browser': ^22.0.0 + '@angular/platform-server': ^22.0.0 + '@angular/service-worker': ^22.0.0 + '@angular/ssr': ^22.2.0 + istanbul-lib-instrument: ^6.0.0 karma: ^6.4.0 less: ^4.2.0 - ng-packagr: ^21.0.0 + ng-packagr: ^22.0.0 postcss: ^8.4.0 + rollup: ^4.0.0 tailwindcss: ^2.0.0 || ^3.0.0 || ^4.0.0 tslib: ^2.3.0 - typescript: '>=5.9 <6.0' - vitest: ^4.0.8 + typescript: '>=6.0 <6.1' + vitest: ^4.0.8 || ^5.0.0 peerDependenciesMeta: '@angular/core': optional: true @@ -264,6 +192,8 @@ packages: optional: true '@angular/ssr': optional: true + istanbul-lib-instrument: + optional: true karma: optional: true less: @@ -272,43 +202,45 @@ packages: optional: true postcss: optional: true + rollup: + optional: true tailwindcss: optional: true vitest: optional: true - '@angular/cli@21.1.1': - resolution: {integrity: sha512-eXhHuYvruWHBn7lX3GuAyLq29+ELwPADOW8ShzZkWRPNlIDiFDsS5pXrxkM9ez+8f86kfDHh88Twevn4UBUqQg==} - 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'} + '@angular/cli@22.2.0': + resolution: {integrity: sha512-FW4RCNXaPpbBcS4w6fetTO6eRT0xySYGSdQ2DGREU30G1TBnpJdJ6TAvs8mTBPXNfFMQTyioR2ie7UkJljLJKg==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} hasBin: true - '@angular/common@21.1.1': - resolution: {integrity: sha512-Di2I6TooHdKun3SqRr45o4LbWJq/ZdwUt3fg0X3obPYaP/f6TrFQ4TMjcl03EfPufPtoQx6O+d32rcWVLhDxyw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/common@22.2.0': + resolution: {integrity: sha512-BUKkncKwnaEcF/qatBOpzSIx2NthFZLYlTcE7iHwwsw+XQrwB9hU8Ca/l5HqaTJiMg0D8MjI/SWHnD4LFtNN+w==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/core': 21.1.1 + '@angular/core': 22.2.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/compiler-cli@21.1.1': - resolution: {integrity: sha512-CCB8SZS0BzqLOdOaMpPpOW256msuatYCFDRTaT+awYIY1vQp/eLXzkMTD2uqyHraQy8cReeH/P6optRP9A077Q==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/compiler-cli@22.2.0': + resolution: {integrity: sha512-xDOvPlNv+RT7sE01wjuGFRMc5SDxWs3RZpGfO5NoI3a0jxM87UW49HmmgwQ6PaU0fya9mttNkHufhfOAbh0ZKQ==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} hasBin: true peerDependencies: - '@angular/compiler': 21.1.1 - typescript: '>=5.9 <6.0' + '@angular/compiler': 22.2.0 + typescript: '>=6.0 <6.1' peerDependenciesMeta: typescript: optional: true - '@angular/compiler@21.1.1': - resolution: {integrity: sha512-Urd3bh0zv0MQ//S7RRTanIkOMAZH/A7vSMXUDJ3aflplNs7JNbVqBwDNj8NoX1V+os+fd8JRJOReCc1EpH4ZKQ==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/compiler@22.2.0': + resolution: {integrity: sha512-bnqql/HfhnhDXoS7isNaXJAsbKYszcH+nFVWA6YhiAVZhqo3f+XoQb30qeqNtEOKuuC7SZfaAJ3jBkAvyC5CKg==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} - '@angular/core@21.1.1': - resolution: {integrity: sha512-KFRCEhsi02pY1EqJ5rnze4mzSaacqh14D8goDhtmARiUH0tefaHR+uKyu4bKSrWga2T/ExG0DJX52LhHRs2qSw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/core@22.2.0': + resolution: {integrity: sha512-VhAgJ4GCdGgAy9+zADpSyEM9gt4pKg6+cqNeK3RBNeF3M3B8y7AWfD/nYRdM3Xzi152Pu+ipgFFNHpupCLTsvQ==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/compiler': 21.1.1 + '@angular/compiler': 22.2.0 rxjs: ^6.5.3 || ^7.4.0 zone.js: ~0.15.0 || ~0.16.0 peerDependenciesMeta: @@ -317,881 +249,520 @@ packages: zone.js: optional: true - '@angular/forms@21.1.1': - resolution: {integrity: sha512-NBbJOynLOeMsPo03+3dfdxE0P7SB7SXRqoFJ7WP2sOgOIxODna/huo2blmRlnZAVPTn1iQEB9Q+UeyP5c4/1+w==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/forms@22.2.0': + resolution: {integrity: sha512-Nm8o1uBk31EuQGzsK5EunNBVFzTN9MuTYLSrmg1SCPTcava4qK3AzSpl1+Put+cZTTnGtEBIy45AFaxHR2oryg==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/common': 21.1.1 - '@angular/core': 21.1.1 - '@angular/platform-browser': 21.1.1 + '@angular/common': 22.2.0 + '@angular/core': 22.2.0 + '@angular/platform-browser': 22.2.0 rxjs: ^6.5.3 || ^7.4.0 - '@angular/platform-browser-dynamic@21.1.1': - resolution: {integrity: sha512-lawT3bdjXZVmVNXVoPS0UiB8Qxw5jEYXHx2m38JvHGv7/pl0Sgr+wa6f+/4pvTwu3VZb/8ohkVdFicPfrU21Jw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - peerDependencies: - '@angular/common': 21.1.1 - '@angular/compiler': 21.1.1 - '@angular/core': 21.1.1 - '@angular/platform-browser': 21.1.1 - - '@angular/platform-browser@21.1.1': - resolution: {integrity: sha512-d6liZjPz29GUZ6dhxytFL/W2nMsYwPpc/E/vZpr5yV+u+gI2VjbnLbl8SG+jjj0/Hyq7s4aGhEKsRrCJJMXgNw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/platform-browser@22.2.0': + resolution: {integrity: sha512-XMUOyn8WARk9NdFGO3uRgdC3hPrp+2xsSYNeSkaEZ4jI3Pc23f22e4GI8Vayl/UOmShHVn/i+NWfTWh3SEbbSw==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/animations': 21.1.1 - '@angular/common': 21.1.1 - '@angular/core': 21.1.1 + '@angular/animations': 22.2.0 + '@angular/common': 22.2.0 + '@angular/core': 22.2.0 peerDependenciesMeta: '@angular/animations': optional: true - '@angular/router@21.1.1': - resolution: {integrity: sha512-3ypbtH3KfzuVgebdEET9+bRwn1VzP//KI0tIqleCGi4rblP3WQ/HwIGa5Qhdcxmw/kbmABKLRXX2kRUvidKs/Q==} - engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} + '@angular/router@22.2.0': + resolution: {integrity: sha512-+pxHMwWWKg+ejS1vKa+tS91CDusCIK1MOSy6fVLc89McMOY/C8tsLrh1uJaMjklejsz+3XUhJgrLOvl3ISNz6w==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0} peerDependencies: - '@angular/common': 21.1.1 - '@angular/core': 21.1.1 - '@angular/platform-browser': 21.1.1 + '@angular/common': 22.2.0 + '@angular/core': 22.2.0 + '@angular/platform-browser': 22.2.0 rxjs: ^6.5.3 || ^7.4.0 - '@babel/code-frame@7.28.6': - resolution: {integrity: sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.28.6': - resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.28.5': - resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.28.5': - resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.28.6': - resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} - engines: {node: '>=6.9.0'} + '@asamuzakjp/css-color@7.0.1': + resolution: {integrity: sha512-C9duntabagkBZ1LebM7FKmphR4Q1pBclLxVbZETQV0akkFjV0ooFxo8FlvAQyKj9F6l8rEnmidgcTlpyxFYizg==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - '@babel/helper-annotate-as-pure@7.27.3': - resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} - engines: {node: '>=6.9.0'} + '@asamuzakjp/dom-selector@9.2.1': + resolution: {integrity: sha512-NT4s3yZLjovPpliRpTvdsdzyPjqRqiCZj9MxnarBihbaY5MbAG7DWAJcrLlhmC7xKTNCXsTELcqB8YsqpLnUFQ==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - '@babel/helper-compilation-targets@7.28.6': - resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} - engines: {node: '>=6.9.0'} + '@babel/code-frame@8.0.6': + resolution: {integrity: sha512-uMHhvmDmwFiLuiozaoRYTZHqMFuu3fem/X9JY78lohAuLoh8LSGGC8JqUzo2cVuBsBxkjMZNk56CE7ock8Xxkw==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-create-class-features-plugin@7.28.6': - resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/compat-data@8.0.5': + resolution: {integrity: sha512-YLsYoQMvL8l8WrGpN3Zj7O1wK5LEBN+cQtux7BcuHyxIXve724XG+zuJ1n3U1cUweRtTzQOA4IHbuQw3N34SZw==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-create-regexp-features-plugin@7.28.5': - resolution: {integrity: sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core@8.0.1': + resolution: {integrity: sha512-5FgxM4dLQpMJHSiVATk8foW263dVHQHBVpXYiimNECVWG01f4nFyEbQixeT6Mwvg7TayREJ2gpKl3o2RoMdnqw==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-define-polyfill-provider@0.6.5': - resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/core@8.0.5': + resolution: {integrity: sha512-2/oWkgTbBYoqioCWAE4XJobOrzwxTDa5/XjDP3tJ1BhDr/owcd9qnXBp4xc3/2G5X4bvXM04nrxbRJxFcXAxFQ==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} + '@babel/generator@8.0.6': + resolution: {integrity: sha512-/pcanjdRsonCexCuxgGD8fKnBLLzk2i9uM4kmcmGyyev2R5YDs+rafMYZ89RvaGY1mW8T7C5au0TyYaEeHBGng==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-member-expression-to-functions@7.28.5': - resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} - engines: {node: '>=6.9.0'} + '@babel/helper-compilation-targets@8.0.6': + resolution: {integrity: sha512-HTrtZ4+iA0+kzdbCgvdSk1U4pEl3BvpGnlUbualCGNbrVhhQvhgBzurTUmqpWyvyHbWYWaIfdx2mOlL9LJjsew==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-module-imports@7.28.6': - resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} - engines: {node: '>=6.9.0'} + '@babel/helper-globals@8.0.6': + resolution: {integrity: sha512-OdnA/N52LhzFpeUuVz5YGuSWjc7TPHiFmVYZbPlSgExocO2GwbxVpSni9MVs5wwW+wZ4kPuwBEBN9pIPDYz1mA==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-module-transforms@7.28.6': - resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helper-string-parser@8.0.6': + resolution: {integrity: sha512-+6HYEBnsDRZHJtUTAEfMQd0zMDqdFHS7C+5vAsEZqBUr3vEMWOWlHJ0Jz1gS8jJIlCvLsuA6ivmeoqzH936YcA==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-optimise-call-expression@7.27.1': - resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-identifier@8.0.6': + resolution: {integrity: sha512-HYx0YmuchRxRSpnjvcNffnPS8DCauKNmnumIuHG3jnQAVewRA7kfJGwF13ayEpSZs7s4R/oBH4eppuXcAQd5JQ==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-plugin-utils@7.28.6': - resolution: {integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==} - engines: {node: '>=6.9.0'} + '@babel/helper-validator-option@8.0.0': + resolution: {integrity: sha512-U4Dybxh4WESWHt5XhBeExi4DrY0/DNK1aHpQbsrQXCUbFHuMweT0TpLEWKvaraV2Y6fS+ZXunsZ8zIuZIgvF2Q==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-remap-async-to-generator@7.27.1': - resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/helpers@8.0.5': + resolution: {integrity: sha512-fQtPOXjYOYv85PIdwotp2TJGVYOycX0PQq+l844fFAxOULtBy8BVF35GyeueX0r4KvDthqPH5xAI1clQPk/2uA==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-replace-supers@7.28.6': - resolution: {integrity: sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@babel/parser@8.0.6': + resolution: {integrity: sha512-LpGDIYJAzc3Y3PT9x+FxBrGYu2PlWxLmyN7SwPTzaX0LSwEmFJBsRnPBqmaXF2r1v+Zhz6lNiEJ+7yKtM5+Ugg==} + engines: {node: ^22.18.0 || >=24.11.0} + hasBin: true - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} - engines: {node: '>=6.9.0'} + '@babel/template@8.0.0': + resolution: {integrity: sha512-eAD0QW/AlbamBbw0FeGiwasbCVPq5ncW0HNVyLP3B9czqLyh4gvw+5JTSNt6le9+ziAU7mqDZsKTHf3jTb4chQ==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-split-export-declaration@7.24.7': - resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} - engines: {node: '>=6.9.0'} + '@babel/traverse@8.0.6': + resolution: {integrity: sha512-ilYV+qLStGzSKLipJlETdvdtpK3rAuwfCmCoGKv15MU4EoeIuLkespSNoNLFGOPSciEHx9TLWtN5mv0fz5w5mQ==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} + '@babel/types@8.0.6': + resolution: {integrity: sha512-c+xgSWboV2pdwXP67BUWDVRHi2BO5Q3KwxyFVs7taVTY+fsK47/L51ZXQoV9rozHJDNHvJ4v4WEsI/IlxV2l2A==} + engines: {node: ^22.18.0 || >=24.11.0} - '@babel/helper-validator-identifier@7.28.5': - resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} - engines: {node: '>=6.9.0'} + '@bramus/specificity@2.4.2': + resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} + hasBin: true - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} + '@bufbuild/protobuf@2.15.0': + resolution: {integrity: sha512-DAheWUkVr/SJTWCc+lg9dhY0eN4SaWlf4+bG1KzHeXbnqt0AfB/NX0Z+VunGlM1ki1B4zVvye27MpKh/svySUA==} - '@babel/helper-wrap-function@7.28.6': - resolution: {integrity: sha512-z+PwLziMNBeSQJonizz2AGnndLsP2DeGHIxDAn+wdHOGuo4Fo1x1HBPPXeE9TAOPHNNWQKCSlA2VZyYyyibDnQ==} - engines: {node: '>=6.9.0'} + '@cacheable/memory@2.2.0': + resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} - '@babel/helpers@7.28.6': - resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} - engines: {node: '>=6.9.0'} + '@cacheable/utils@2.5.0': + resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} - '@babel/parser@7.28.6': - resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} - engines: {node: '>=6.0.0'} - hasBin: true + '@csstools/color-helpers@6.1.1': + resolution: {integrity: sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==} + engines: {node: '>=20.19.0'} - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5': - resolution: {integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==} - engines: {node: '>=6.9.0'} + '@csstools/css-calc@3.4.0': + resolution: {integrity: sha512-XQKj5B7QiZcHiegCOCAzcAOJdhGgWOHbbu62h5e5mkHnn8lWcfiJhllkqWmxu5zWR9jucPHuo1iTB56P033hcg==} + engines: {node: '>=20.19.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': - resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} - engines: {node: '>=6.9.0'} + '@csstools/css-color-parser@4.2.3': + resolution: {integrity: sha512-y4LpL+lmpuyKDiEFq2PnZUVFdAjsoB/qQJod79yLNokXyW7jewi+/WJ69EfItj8A2unWtxXnGjw6LYXgXu5ZjA==} + engines: {node: '>=20.19.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@csstools/css-parser-algorithms': ^4.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': - resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} - engines: {node: '>=6.9.0'} + '@csstools/css-parser-algorithms@4.0.0': + resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==} + engines: {node: '>=20.19.0'} peerDependencies: - '@babel/core': ^7.0.0 + '@csstools/css-tokenizer': ^4.0.0 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': - resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} - engines: {node: '>=6.9.0'} + '@csstools/css-syntax-patches-for-csstree@1.1.14': + resolution: {integrity: sha512-HpbVXyrofRXpHpgkNIjU/3EWR4WJvOkO3emNK/L6X/mTJU7bGUI3AkkpoTNXznQLp0KRjLHELTGeKI5dIkI9JQ==} peerDependencies: - '@babel/core': ^7.13.0 + css-tree: ^3.2.1 + peerDependenciesMeta: + css-tree: + optional: true - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6': - resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@csstools/css-tokenizer@4.0.1': + resolution: {integrity: sha512-bPlN9S9O1A0euCpEWE4qnvB5YDuyYVsUTrxSgmAM1Is0j4tICHoVyOVAXfWMP/kS9ZrjvyIXWV2PmomiAXXqOw==} + engines: {node: '>=20.19.0'} - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/aix-ppc64@0.28.2': + resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] - '@babel/plugin-syntax-import-assertions@7.28.6': - resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/android-arm64@0.28.2': + resolution: {integrity: sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] - '@babel/plugin-syntax-import-attributes@7.28.6': - resolution: {integrity: sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/android-arm@0.28.2': + resolution: {integrity: sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/android-x64@0.28.2': + resolution: {integrity: sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] - '@babel/plugin-transform-arrow-functions@7.27.1': - resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/darwin-arm64@0.28.2': + resolution: {integrity: sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] - '@babel/plugin-transform-async-generator-functions@7.28.0': - resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/darwin-x64@0.28.2': + resolution: {integrity: sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] - '@babel/plugin-transform-async-to-generator@7.27.1': - resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/freebsd-arm64@0.28.2': + resolution: {integrity: sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] - '@babel/plugin-transform-block-scoped-functions@7.27.1': - resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/freebsd-x64@0.28.2': + resolution: {integrity: sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] - '@babel/plugin-transform-block-scoping@7.28.6': - resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-arm64@0.28.2': + resolution: {integrity: sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] - '@babel/plugin-transform-class-properties@7.28.6': - resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-arm@0.28.2': + resolution: {integrity: sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] - '@babel/plugin-transform-class-static-block@7.28.6': - resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 + '@esbuild/linux-ia32@0.28.2': + resolution: {integrity: sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] - '@babel/plugin-transform-classes@7.28.6': - resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-loong64@0.28.2': + resolution: {integrity: sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] - '@babel/plugin-transform-computed-properties@7.28.6': - resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-mips64el@0.28.2': + resolution: {integrity: sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] - '@babel/plugin-transform-destructuring@7.28.5': - resolution: {integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-ppc64@0.28.2': + resolution: {integrity: sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] - '@babel/plugin-transform-dotall-regex@7.28.6': - resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-riscv64@0.28.2': + resolution: {integrity: sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] - '@babel/plugin-transform-duplicate-keys@7.27.1': - resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/linux-s390x@0.28.2': + resolution: {integrity: sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6': - resolution: {integrity: sha512-5suVoXjC14lUN6ZL9OLKIHCNVWCrqGqlmEp/ixdXjvgnEl/kauLvvMO/Xw9NyMc95Joj1AeLVPVMvibBgSoFlA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@esbuild/linux-x64@0.28.2': + resolution: {integrity: sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] - '@babel/plugin-transform-dynamic-import@7.27.1': - resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/netbsd-arm64@0.28.2': + resolution: {integrity: sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] - '@babel/plugin-transform-explicit-resource-management@7.28.6': - resolution: {integrity: sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/netbsd-x64@0.28.2': + resolution: {integrity: sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] - '@babel/plugin-transform-exponentiation-operator@7.28.6': - resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/openbsd-arm64@0.28.2': + resolution: {integrity: sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] - '@babel/plugin-transform-export-namespace-from@7.27.1': - resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/openbsd-x64@0.28.2': + resolution: {integrity: sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] - '@babel/plugin-transform-for-of@7.27.1': - resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/openharmony-arm64@0.28.2': + resolution: {integrity: sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] - '@babel/plugin-transform-function-name@7.27.1': - resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/sunos-x64@0.28.2': + resolution: {integrity: sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] - '@babel/plugin-transform-json-strings@7.28.6': - resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/win32-arm64@0.28.2': + resolution: {integrity: sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] - '@babel/plugin-transform-literals@7.27.1': - resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/win32-ia32@0.28.2': + resolution: {integrity: sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] - '@babel/plugin-transform-logical-assignment-operators@7.28.6': - resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@esbuild/win32-x64@0.28.2': + resolution: {integrity: sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] - '@babel/plugin-transform-member-expression-literals@7.27.1': - resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} - engines: {node: '>=6.9.0'} + '@eslint-community/eslint-utils@4.10.1': + resolution: {integrity: sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - '@babel/core': ^7.0.0-0 + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@babel/plugin-transform-modules-amd@7.27.1': - resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@babel/plugin-transform-modules-commonjs@7.28.6': - resolution: {integrity: sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@eslint/config-array@0.23.5': + resolution: {integrity: sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@babel/plugin-transform-modules-systemjs@7.28.5': - resolution: {integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@eslint/config-helpers@0.7.0': + resolution: {integrity: sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@babel/plugin-transform-modules-umd@7.27.1': - resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@eslint/core@1.2.1': + resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': - resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} - engines: {node: '>=6.9.0'} + '@eslint/js@10.0.1': + resolution: {integrity: sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: - '@babel/core': ^7.0.0 + eslint: ^10.0.0 + peerDependenciesMeta: + eslint: + optional: true - '@babel/plugin-transform-new-target@7.27.1': - resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + '@eslint/object-schema@3.0.5': + resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': - resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-numeric-separator@7.28.6': - resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-rest-spread@7.28.6': - resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-super@7.27.1': - resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-catch-binding@7.28.6': - resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-chaining@7.28.6': - resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-parameters@7.27.7': - resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-methods@7.28.6': - resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-property-in-object@7.28.6': - resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-property-literals@7.27.1': - resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regenerator@7.28.6': - resolution: {integrity: sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regexp-modifiers@7.28.6': - resolution: {integrity: sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-reserved-words@7.27.1': - resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-runtime@7.28.5': - resolution: {integrity: sha512-20NUVgOrinudkIBzQ2bNxP08YpKprUkRTiRSd2/Z5GOdPImJGkoN4Z7IQe1T5AdyKI1i5L6RBmluqdSzvaq9/w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-shorthand-properties@7.27.1': - resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-spread@7.28.6': - resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-sticky-regex@7.27.1': - resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-template-literals@7.27.1': - resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typeof-symbol@7.27.1': - resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-escapes@7.27.1': - resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-property-regex@7.28.6': - resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-regex@7.27.1': - resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-sets-regex@7.28.6': - resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 + '@eslint/plugin-kit@0.7.3': + resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@babel/preset-env@7.28.5': - resolution: {integrity: sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + '@exodus/bytes@1.16.0': + resolution: {integrity: sha512-IcpW84uEn3N7ETtNZMlxKhfl6Pec8rUNGOTBtWbK1FKhJxIFAptZyVrvVRVBimAJxJCgc3PxepxkdWWG4DVzfA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - - '@babel/runtime@7.28.4': - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.28.6': - resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.28.6': - resolution: {integrity: sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.6': - resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} - engines: {node: '>=6.9.0'} - - '@discoveryjs/json-ext@0.6.3': - resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} - engines: {node: '>=14.17.0'} - - '@emnapi/core@1.8.1': - resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} - - '@emnapi/runtime@1.8.1': - resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} - - '@emnapi/wasi-threads@1.1.0': - resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - - '@esbuild/aix-ppc64@0.27.2': - resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.27.2': - resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm@0.27.2': - resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-x64@0.27.2': - resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/darwin-arm64@0.27.2': - resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-x64@0.27.2': - resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.27.2': - resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-x64@0.27.2': - resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.27.2': - resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.27.2': - resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.27.2': - resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-loong64@0.27.2': - resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.27.2': - resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.27.2': - resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.27.2': - resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-s390x@0.27.2': - resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-x64@0.27.2': - resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/netbsd-arm64@0.27.2': - resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.27.2': - resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.27.2': - resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.27.2': - resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] + '@noble/hashes': ^1.8.0 || ^2.0.0 + peerDependenciesMeta: + '@noble/hashes': + optional: true - '@esbuild/openharmony-arm64@0.27.2': - resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] + '@harperfast/extended-iterable@1.0.3': + resolution: {integrity: sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==} - '@esbuild/sunos-x64@0.27.2': - resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} + engines: {node: '>=18.18.0'} - '@esbuild/win32-arm64@0.27.2': - resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} - '@esbuild/win32-ia32@0.27.2': - resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} + engines: {node: '>=18.18.0'} - '@esbuild/win32-x64@0.27.2': - resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} - '@hono/node-server@1.19.9': - resolution: {integrity: sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: ^4 + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} - '@inquirer/ansi@1.0.2': - resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} - engines: {node: '>=18'} + '@inquirer/ansi@2.0.8': + resolution: {integrity: sha512-WpQM+Ti6Z40EFwwt+uL2p4UabT+W179zHp6HhLVOzfbwnVn05IPO/eXIZXGNqcT1jbQ15SujNLzQ39k4QPPxBQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/checkbox@4.3.2': - resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} - engines: {node: '>=18'} + '@inquirer/checkbox@5.2.5': + resolution: {integrity: sha512-bRt8J8m+Fot9CXv+zNQGXUq2ET0MggR1fPz7v6edN6MFYmsbfGnMmkmWZJEegMKqrAC8ej/o1sqisHZXZJMAfQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/confirm@5.1.21': - resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} - engines: {node: '>=18'} + '@inquirer/confirm@6.3.2': + resolution: {integrity: sha512-Xvr/0HggjddPtGppuqVmxhTw+Hr8PvsZ/k0HmOEaAqQEt80OITNkFWnsdNmyT0/eM4Ab+iJLx2R8rctlEyfSVg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/core@10.3.2': - resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} - engines: {node: '>=18'} + '@inquirer/core@12.0.3': + resolution: {integrity: sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/editor@4.2.23': - resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} - engines: {node: '>=18'} + '@inquirer/editor@5.3.3': + resolution: {integrity: sha512-YsKkS2q63IiLtaDK/9nqzdComN97SDQrmKiyNggN+ceP4ty+Z6VwyTz3FpjeUWeW1Efss2xHFKCC9sx7hnrsxg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/expand@4.0.23': - resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} - engines: {node: '>=18'} + '@inquirer/expand@5.1.5': + resolution: {integrity: sha512-uHuXLmXW+TtIfT/9vSBotypAkqn1n34Ul+CLGPos/xANyO4Ff5xZzkYhbKR4NEcfVK4a9mHQOpwVZzluSHFRGw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/external-editor@1.0.3': - resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} - engines: {node: '>=18'} + '@inquirer/external-editor@3.0.5': + resolution: {integrity: sha512-f3QQJRIX5ZEneBHNUIuPjmbdzHnmRFJA8r2dkcb8q+OM5Uv5KtnuAttQumnrjcBVBM3mcTX1CkmtAkU58VRZxg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/figures@1.0.15': - resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} - engines: {node: '>=18'} + '@inquirer/figures@2.0.9': + resolution: {integrity: sha512-EAWgUTGQ/Umgga51dE3B2PUHbufuXarDfg86uVgoSgNHNNQnyFKcOrQLWVqYMghuSyHh8+2HUH0Js9cTC1WAdg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/input@4.3.1': - resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} - engines: {node: '>=18'} + '@inquirer/input@5.1.6': + resolution: {integrity: sha512-HtcJhB2QFVXbLuJ5S3syhNbTUVxYvwqV4VRBDkQceBloC9bmTViUoRFP5PbSaDZb3HzfPmpuU/gG4ybVBz4FHA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/number@3.0.23': - resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} - engines: {node: '>=18'} + '@inquirer/number@4.2.3': + resolution: {integrity: sha512-6Yuwh1NGSbu1Lo4N1EWjXs1jKRntLg/ZCwhmeorEHde90v1XxAozdbd4Iu30eOQLW+6h1hp2O9ujNfLSbTPJnA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/password@4.0.23': - resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} - engines: {node: '>=18'} + '@inquirer/password@5.2.2': + resolution: {integrity: sha512-W9zYdyzogK+6110mqwaSJWCBu2yA5Q/OfnGSjjZB1bNpHlmUozXxTl0+QOZBNeVd6Qo81/qT75gW05gLAtITxw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/prompts@7.10.1': - resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} - engines: {node: '>=18'} + '@inquirer/prompts@8.7.2': + resolution: {integrity: sha512-QoRB4wFIjgH5iOhSjoIKMkTvSHDuV+O3OITlIqAYO0oK5x364GJILXiMBvlPiE+klg7Xx9tq5XVqQHcGUDYYPA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/rawlist@4.1.11': - resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} - engines: {node: '>=18'} + '@inquirer/rawlist@5.3.5': + resolution: {integrity: sha512-1oHky1ONfCOwNrnkQGDE1oaSij/3fI6HFMSf2H/WsGO2lEyDX9My82iggITSy9ddSZ8yk8j9v41OI0fVoSIoaA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/search@3.2.2': - resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} - engines: {node: '>=18'} + '@inquirer/search@4.3.3': + resolution: {integrity: sha512-fyuIU1Nbpvwlikjg3gXwJFDI11+EFjqQ7P+iByfmivIKQ1vmaykNrD/vy5unHuUqUpsOsnvJ25//tPF7E/RBRA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/select@4.4.2': - resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} - engines: {node: '>=18'} + '@inquirer/select@5.2.5': + resolution: {integrity: sha512-9kc15hr8r/kI+3DO/xLog5nOzTz1jqsHXa6JBFzmQKhkoJ8Slda1I1L/uD8ZSZ9tF1yp79wwXe7mclvX1rqR2Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@inquirer/type@3.0.10': - resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} - engines: {node: '>=18'} + '@inquirer/type@4.1.1': + resolution: {integrity: sha512-yJoHYrMnxIsJZCY+0Vb66Dy3he3kL3e2wOBKhoSwWWAzZAY82emlxwgprCtp6yRixvNRNq9ztfRWQYPNr3Go7A==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' peerDependenciesMeta: '@types/node': optional: true - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} - engines: {node: 20 || >=22} - - '@isaacs/fs-minipass@4.0.1': - resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} - engines: {node: '>=18.0.0'} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.4.0-beta.0': + resolution: {integrity: sha512-JdGNkbE4GlNPYQhM0L95fBQr7ctLZJ276QXQLTad4t1oSdnnCI3fDq9DW3BqYAWv8Wc3+HS+4Gsii1oPMCfz1w==} + '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} @@ -1199,217 +770,98 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.11': - resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} - - '@jridgewell/sourcemap-codec@1.5.5': - resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/sourcemap-codec@1.6.0': + resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==} '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@jsonjoy.com/base64@1.1.2': - resolution: {integrity: sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/base64@17.65.0': - resolution: {integrity: sha512-Xrh7Fm/M0QAYpekSgmskdZYnFdSGnsxJ/tHaolA4bNwWdG9i65S8m83Meh7FOxyJyQAdo4d4J97NOomBLEfkDQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/buffers@1.2.1': - resolution: {integrity: sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/buffers@17.65.0': - resolution: {integrity: sha512-eBrIXd0/Ld3p9lpDDlMaMn6IEfWqtHMD+z61u0JrIiPzsV1r7m6xDZFRxJyvIFTEO+SWdYF9EiQbXZGd8BzPfA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/codegen@1.0.0': - resolution: {integrity: sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/codegen@17.65.0': - resolution: {integrity: sha512-7MXcRYe7n3BG+fo3jicvjB0+6ypl2Y/bQp79Sp7KeSiiCgLqw4Oled6chVv07/xLVTdo3qa1CD0VCCnPaw+RGA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-core@4.56.9': - resolution: {integrity: sha512-BUkXXWL3I7VZ34cpmP7WSttmP5o+z+lxi3teYMnEcUOKBu7DhCFxCesOevw+UATUewMHRMUtsmFYxOxgV7SQwg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-fsa@4.56.9': - resolution: {integrity: sha512-g15wwrvRRsy73p/b93XltxMkARyh3efxZNkrKbiocUNaPnHF+iDXQ1IlBwsTi5zxijdCYOsmVuyEdBX87tLqlw==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node-builtins@4.56.9': - resolution: {integrity: sha512-q9MEsySAwyhgy1GT1FKfnKJ1a8bJmzbQnMGQA94F663C/wycrSgRrM33byzTAwn6FBRzMfTvABANkYvkOeYGhw==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node-to-fsa@4.56.9': - resolution: {integrity: sha512-rOnn9FBLY+JWy0UDSXaYXY45j7FxfRJepRW5pZvNbdAzHYFZ0/M3OQ1+RfZsMYgWeMkaN9pGhOsIj/A7P9pAXA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node-utils@4.56.9': - resolution: {integrity: sha512-UMUirCu0jDPyJEsfllKX1SmK9E7ww2VltWiq2qBCy3ZcyHqDuHswPycrxLTwGrLJnGiHPW9f7LOniP7enl9jYQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-node@4.56.9': - resolution: {integrity: sha512-YiI2iqVMi/Ro9BcqWWLQBv939gje748pC4t376M/goQoLaM0sItsj0bBTiQr4eXyLsLdGw10n/F/kH5/snBe7g==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-print@4.56.9': - resolution: {integrity: sha512-Op6rXFnmhHHAClNvHFGx9zALHgZfyPdPBd0WIf/MBr4DEoShhAj0MZxg0jMO7foqleq2YSNNCNBMFGkmY43wAQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/fs-snapshot@4.56.9': - resolution: {integrity: sha512-nMxEvDku2bCdCCNLkjd9hjPyUng8mLIfok8yAQ0zHNbZqeE44K5CSXnT0o3TGzv/zWynM49rUlF95ZjlNazFAQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pack@1.21.0': - resolution: {integrity: sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pack@17.65.0': - resolution: {integrity: sha512-e0SG/6qUCnVhHa0rjDJHgnXnbsacooHVqQHxspjvlYQSkHm+66wkHw6Gql+3u/WxI/b1VsOdUi0M+fOtkgKGdQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pointer@1.0.2': - resolution: {integrity: sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/json-pointer@17.65.0': - resolution: {integrity: sha512-uhTe+XhlIZpWOxgPcnO+iSCDgKKBpwkDVTyYiXX9VayGV8HSFVJM67M6pUE71zdnXF1W0Da21AvnhlmdwYPpow==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/util@1.9.0': - resolution: {integrity: sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - '@jsonjoy.com/util@17.65.0': - resolution: {integrity: sha512-cWiEHZccQORf96q2y6zU3wDeIVPeidmGqd9cNKJRYoVHTV0S1eHPy5JTbHpMnGfDvtvujQwQozOqgO9ABu6h0w==} - engines: {node: '>=10.0'} + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} + engines: {node: '>= 18'} peerDependencies: - tslib: '2' + keyv: ^5.6.0 - '@leichtgewicht/ip-codec@2.0.5': - resolution: {integrity: sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==} + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} - '@listr2/prompt-adapter-inquirer@3.0.5': - resolution: {integrity: sha512-WELs+hj6xcilkloBXYf9XXK8tYEnKsgLj01Xl5ONUJpKjmT5hGVUzNUS5tooUxs7pGMrw+jFD/41WpqW4V3LDA==} - engines: {node: '>=20.0.0'} + '@listr2/prompt-adapter-inquirer@4.2.7': + resolution: {integrity: sha512-k180vxSv2KqmnDxoato6pCqEJsov4U5C0EVmldZkAdNeVBxY48A/LM6TCNPGIzDK/iZSfsZP0Mw+gbWc5hXLyA==} + engines: {node: '>=22.13.0'} peerDependencies: - '@inquirer/prompts': '>= 3 < 8' - listr2: 9.0.5 + '@inquirer/prompts': '>= 3 < 9' + listr2: 11.1.0 - '@lmdb/lmdb-darwin-arm64@3.4.4': - resolution: {integrity: sha512-XaKL705gDWd6XVls3ATDj13ZdML/LqSIxwgnYpG8xTzH2ifArx8fMMDdvqGE/Emd+W6R90W2fveZcJ0AyS8Y0w==} + '@lmdb/lmdb-darwin-arm64@3.5.6': + resolution: {integrity: sha512-mY5FG4TjPAkY4P0w+OhHaUka5mDh2TX2WKYIwuKzJ1zeW3VvRgxdam/lGJTquI+bthTx5CSHDW+BAQCnNAzkEA==} cpu: [arm64] os: [darwin] - '@lmdb/lmdb-darwin-x64@3.4.4': - resolution: {integrity: sha512-GPHGEVcwJlkD01GmIr7B4kvbIcUDS2+kBadVEd7lU4can1RZaZQLDDBJRrrNfS2Kavvl0VLI/cMv7UASAXGrww==} + '@lmdb/lmdb-darwin-x64@3.5.6': + resolution: {integrity: sha512-foa+pwitysO8k+xhs7psBFfTKnVgR69NlZRRTHaFVDqphh7AdGpLeyRzKw/ofatr/sN6TiHRRW6mmop0ZrrppQ==} cpu: [x64] os: [darwin] - '@lmdb/lmdb-linux-arm64@3.4.4': - resolution: {integrity: sha512-mALqr7DE42HsiwVTKpQWxacjHoJk+e9p00RWIJqTACh/hpucxp/0lK/XMh5XzWnU/TDCZLukq1+vNqnNumTP/Q==} + '@lmdb/lmdb-linux-arm64@3.5.6': + resolution: {integrity: sha512-HmiyFFdJa38s1heCMSooSPaBSFTHJ3C+ERPp28xAPlDX1YiALJVOgbry065nXd8Y7KISWjnw05zpG1RX8IfftA==} cpu: [arm64] os: [linux] - '@lmdb/lmdb-linux-arm@3.4.4': - resolution: {integrity: sha512-cmev5/dZr5ACKri9f6GU6lZCXTjMhV72xujlbOhFCgFXrt4W0TxGsmY8kA1BITvH60JBKE50cSxsiulybAbrrw==} + '@lmdb/lmdb-linux-arm@3.5.6': + resolution: {integrity: sha512-QR4YRyR5h5Z8eGXrNQjiyo2NNDfqi3tCc9dQG5Is1blCt+qWw1ZoBWhlWAr5d+jshkifMIJjVHzHGKbkKzF8Tw==} cpu: [arm] os: [linux] - '@lmdb/lmdb-linux-x64@3.4.4': - resolution: {integrity: sha512-QjLs8OcmCNcraAcLoZyFlo0atzBJniQLLwhtR+ymQqS5kLYpV5RqwriL87BW+ZiR9ZiGgZx3evrz5vnWPtJ1fQ==} + '@lmdb/lmdb-linux-x64@3.5.6': + resolution: {integrity: sha512-ADzCuCF2cTNiX9kDScqcz1fjnAkxPpQNneV3KFTdV3wWtVlI2sTGzySoMTgDpinkMMFj1NTJlxA6XR8fwc4hlA==} cpu: [x64] os: [linux] - '@lmdb/lmdb-win32-arm64@3.4.4': - resolution: {integrity: sha512-tr/pwHDlZ33forLGAr0tI04cRmP4SgF93yHbb+2zvZiDEyln5yMHhbKDySxY66aUOkhvBvTuHq9q/3YmTj6ZHQ==} + '@lmdb/lmdb-win32-arm64@3.5.6': + resolution: {integrity: sha512-J7A9aEQsQiv0TYtBGL7NDIPp2lOS8nnl+zm4sWZm1xlsTTaQ4PgD096Adzdrk27rw3UxCkDXdCUa4ax41oztBQ==} cpu: [arm64] os: [win32] - '@lmdb/lmdb-win32-x64@3.4.4': - resolution: {integrity: sha512-KRzfocJzB/mgoTCqnMawuLSKheHRVTqWfSmouIgYpFs6Hx4zvZSvsZKSCEb5gHmICy7qsx9l06jk3MFTtiFVAQ==} + '@lmdb/lmdb-win32-x64@3.5.6': + resolution: {integrity: sha512-1g7G0knRX2iV/voDu54yxrGqw5Dk0w2oIYb7dgJq8IkOi+m7wbD8Q3QpPFjh0C01G58S88dqGn03len6UPCXsg==} cpu: [x64] os: [win32] - '@modelcontextprotocol/sdk@1.25.2': - resolution: {integrity: sha512-LZFeo4F9M5qOhC/Uc1aQSrBHxMrvxett+9KLHt7OhcExtoiRN9DKgbZffMP/nxjutWDQpfMDfP3nkHI4X9ijww==} - engines: {node: '>=18'} - peerDependencies: - '@cfworker/json-schema': ^4.1.1 - zod: ^3.25 || ^4.0 - peerDependenciesMeta: - '@cfworker/json-schema': - optional: true + '@modelcontextprotocol/core@2.0.0': + resolution: {integrity: sha512-pJCEwGG7Lfr/+PQp9ZTwKXNeO5wzbfKL7H3MYpCorM4oFBoQrdjnBgEoqG+RjhsvS1FKrDbKux+M1HhlnGWqcA==} + engines: {node: '>=20'} - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + '@modelcontextprotocol/server@2.0.0': + resolution: {integrity: sha512-YhHWdHfpFMQfd0prsEnxKeS3Qz3ytIGmsS0sth4KDjnacIT7hxk6hXHkJ9KysxlkvTM+WZAtQbbcUhdoP4Hvtw==} + engines: {node: '>=20'} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + resolution: {integrity: sha512-LCkGo6JDfaBhgST7UpPWgNgLINpcpabaHfyz5OBx75nUYxBsaEPxjnyNjWpeb/xBup/682QnBfRBy2/LvPutZQ==} cpu: [arm64] os: [darwin] - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + resolution: {integrity: sha512-zExlW9zUJKZH/tOtVMttwjKa4Xm/3KcNjnE3dPN92uCktwavMxpgCA3MoJK/DOnTWsQgo224OaST27/mPNAf+w==} cpu: [x64] os: [darwin] - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + resolution: {integrity: sha512-dgX0P/9wGPJeHFBG+ZmhgE6bmtMt7NP5CRBGyyktpopdk/mW4POnrpQsSLtKI1dwpc+pPLuXHDh6vvskyQE/sw==} cpu: [arm64] os: [linux] - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + resolution: {integrity: sha512-Tg3yX65f5GbtXLkrYEHE5oibZG9epyYWas7FogTTEJeDEF9JlXJzKgXaNhT3UXlTOeA+AfZpYZYZ0uPj7Cfquw==} cpu: [arm] os: [linux] - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + resolution: {integrity: sha512-8TNXMEjJc3QEy7R/x1INhgiU+XakDAFUzBhaz7+Rbrs8NH5UQeHQxxmzsSBJGyV6I1jW79undiQm8tOI+D+8FQ==} cpu: [x64] os: [linux] - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + resolution: {integrity: sha512-CmCXPQrkbwExx3j946/PtHWHbYJiCRBRDl4BlkRQcJB/YOwQxJRTpoo7aTsortjgoJ1x7opzTSxn7C+ASSLVjQ==} cpu: [x64] os: [win32] @@ -1454,42 +906,49 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@napi-rs/nice-linux-arm64-musl@1.1.1': resolution: {integrity: sha512-+2Rzdb3nTIYZ0YJF43qf2twhqOCkiSrHx2Pg6DJaCPYhhaxbLcdlV8hCRMHghQ+EtZQWGNcS2xF4KxBhSGeutg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@napi-rs/nice-linux-ppc64-gnu@1.1.1': resolution: {integrity: sha512-4FS8oc0GeHpwvv4tKciKkw3Y4jKsL7FRhaOeiPei0X9T4Jd619wHNe4xCLmN2EMgZoeGg+Q7GY7BsvwKpL22Tg==} engines: {node: '>= 10'} cpu: [ppc64] os: [linux] + libc: [glibc] '@napi-rs/nice-linux-riscv64-gnu@1.1.1': resolution: {integrity: sha512-HU0nw9uD4FO/oGCCk409tCi5IzIZpH2agE6nN4fqpwVlCn5BOq0MS1dXGjXaG17JaAvrlpV5ZeyZwSon10XOXw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] + libc: [glibc] '@napi-rs/nice-linux-s390x-gnu@1.1.1': resolution: {integrity: sha512-2YqKJWWl24EwrX0DzCQgPLKQBxYDdBxOHot1KWEq7aY2uYeX+Uvtv4I8xFVVygJDgf6/92h9N3Y43WPx8+PAgQ==} engines: {node: '>= 10'} cpu: [s390x] os: [linux] + libc: [glibc] '@napi-rs/nice-linux-x64-gnu@1.1.1': resolution: {integrity: sha512-/gaNz3R92t+dcrfCw/96pDopcmec7oCcAQ3l/M+Zxr82KT4DljD37CpgrnXV+pJC263JkW572pdbP3hP+KjcIg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@napi-rs/nice-linux-x64-musl@1.1.1': resolution: {integrity: sha512-xScCGnyj/oppsNPMnevsBe3pvNaoK7FGvMjT35riz9YdhB2WtTG47ZlbxtOLpjeO9SqqQ2J2igCmz6IJOD5JYw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@napi-rs/nice-openharmony-arm64@1.1.1': resolution: {integrity: sha512-6uJPRVwVCLDeoOaNyeiW0gp2kFIM4r7PL2MczdZQHkFi9gVlgm+Vn+V6nTWRcu856mJ2WjYJiumEajfSm7arPQ==} @@ -1519,586 +978,564 @@ packages: resolution: {integrity: sha512-xJIPs+bYuc9ASBl+cvGsKbGrJmS6fAKaSZCnT0lhahT5rhA2VVy9/EcIgd2JhtEuFOJNx7UHNn/qiTPTY4nrQw==} engines: {node: '>= 10'} - '@napi-rs/wasm-runtime@1.1.1': - resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@oxc-parser/binding-android-arm-eabi@0.150.0': + resolution: {integrity: sha512-oQef2Zu4Prz1KLKznz3HqZzU9uVoA5PMoDZuuLmqms7hKmKSAPzlaMnLllJq3t+rgKmfJJ2siPrpZfFrW06btw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] - '@ngtools/webpack@21.1.1': - resolution: {integrity: sha512-8ySRsb1xgr+7XQmZ2LJ+AhFe1IZKW93wfL6OMpZtcWU4FzxWa/NhlfSNBQI5kuyPEVDDAxJ4RI5IoQyvcOmNLg==} - 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: - '@angular/compiler-cli': ^21.0.0 - typescript: '>=5.9 <6.0' - webpack: ^5.54.0 + '@oxc-parser/binding-android-arm64@0.150.0': + resolution: {integrity: sha512-B6ofpoFiAUwIZ0MJ2IgHPvZK8FAtL4qzSZRwOkAKIfxEobE1mQC8nDdiFZj7pUaJiVUVCsfkMsBJKedzO8rZvA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + '@oxc-parser/binding-darwin-arm64@0.150.0': + resolution: {integrity: sha512-J+9IHKzx/bSz1JetOfD4zKXSK9sOm4/a7+0qomJODcTL6JsRXGeV/ZdkAPSIDydfFmWzYCraMlQEosSZEyBYkQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + '@oxc-parser/binding-darwin-x64@0.150.0': + resolution: {integrity: sha512-v6IPfcAcSYrBWXV5Tce1DmxDMXLhEYpIIWiRFPJopgCVscZdLaV4MRQOUxvL3usQlw+yrwYOjBFB9IwBx+jUiQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + '@oxc-parser/binding-freebsd-x64@0.150.0': + resolution: {integrity: sha512-AoR/4jD02HET0KO0yNT4nbTE+XJUxiO9jB1X/ycEjUE3WrIJ3IjV/Vf+gskhWLcqqeXfvNnkDtBR7epllAm88A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] - '@npmcli/agent@4.0.0': - resolution: {integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA==} - engines: {node: ^20.17.0 || >=22.9.0} + '@oxc-parser/binding-linux-arm-gnueabihf@0.150.0': + resolution: {integrity: sha512-A/hycCFjLUrCmLoL5O/vBp40ohlaXO1Ta3v5hqYZxicYFs129wZmgZJggcW4mYGYbZebQLhup+N8JjeQl8qwyw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] - '@npmcli/fs@5.0.0': - resolution: {integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==} - engines: {node: ^20.17.0 || >=22.9.0} + '@oxc-parser/binding-linux-arm-musleabihf@0.150.0': + resolution: {integrity: sha512-pbqahg1Pkz7J4RKmXm30s/iQu99hv64ayXCu8P4p75HcEH5azOdR4eGqiB6lFGkFR3mMpzaYsSKLkS8oJbjmeQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] - '@npmcli/git@7.0.1': - resolution: {integrity: sha512-+XTFxK2jJF/EJJ5SoAzXk3qwIDfvFc5/g+bD274LZ7uY7LE8sTfG6Z8rOanPl2ZEvZWqNvmEdtXC25cE54VcoA==} - engines: {node: ^20.17.0 || >=22.9.0} + '@oxc-parser/binding-linux-arm64-gnu@0.150.0': + resolution: {integrity: sha512-HV11aRbBQGwqv8bEo+K/6qr88uB4fEe1mhXncMhlVCrj+WpBSraxrUzHaPVmeQRU6x6x8v/3DuCbbo93rpp+fw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] - '@npmcli/installed-package-contents@4.0.0': - resolution: {integrity: sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==} - engines: {node: ^20.17.0 || >=22.9.0} - hasBin: true + '@oxc-parser/binding-linux-arm64-musl@0.150.0': + resolution: {integrity: sha512-k6pVkJqALwtEuP4zukVhGRhdIy4+ofChUIUUsAHHyqDZlNsknmel3JjbggrJiWGaes6h/dIcWmEXsKW4SmK9oQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] - '@npmcli/node-gyp@5.0.0': - resolution: {integrity: sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==} - engines: {node: ^20.17.0 || >=22.9.0} + '@oxc-parser/binding-linux-ppc64-gnu@0.150.0': + resolution: {integrity: sha512-tEFg39mw/rHO5n8GK2DR4ZMFfsPQZtnQIPbsIpjoQRomJc/2tRfsCSmCT6gNit+NZGoeJG5aH9ATDH5bf0WnoQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] - '@npmcli/package-json@7.0.4': - resolution: {integrity: sha512-0wInJG3j/K40OJt/33ax47WfWMzZTm6OQxB9cDhTt5huCP2a9g2GnlsxmfN+PulItNPIpPrZ+kfwwUil7eHcZQ==} - engines: {node: ^20.17.0 || >=22.9.0} + '@oxc-parser/binding-linux-riscv64-gnu@0.150.0': + resolution: {integrity: sha512-0JO7IFkoek6HqV589Menx3hJySNXi6quRhO4tq2P7kpEHKEXoDATnoPVUpn5B7gDH2KLkdo751N0uIrGJFCTCw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] - '@npmcli/promise-spawn@9.0.1': - resolution: {integrity: sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==} - engines: {node: ^20.17.0 || >=22.9.0} + '@oxc-parser/binding-linux-riscv64-musl@0.150.0': + resolution: {integrity: sha512-7XPzREnyAS5wHU9aB+49Uaqgoo1gVCklHc3DRlc3fJy2tXD/eAJFN1QFz/crj+Ulup5P1+axNREF+/RGaB/IRA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] - '@npmcli/redact@4.0.0': - resolution: {integrity: sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==} - engines: {node: ^20.17.0 || >=22.9.0} + '@oxc-parser/binding-linux-s390x-gnu@0.150.0': + resolution: {integrity: sha512-7n7ZxcbRWDFaTdyj8M8p0O9OfzoMKm8O6syBAIgcSutbOALq0Bb9G52Me+XH0anMLZV+NgXc726gqgG2q39vcQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] - '@npmcli/run-script@10.0.3': - resolution: {integrity: sha512-ER2N6itRkzWbbtVmZ9WKaWxVlKlOeBFF1/7xx+KA5J1xKa4JjUwBdb6tDpk0v1qA+d+VDwHI9qmLcXSWcmi+Rw==} - engines: {node: ^20.17.0 || >=22.9.0} + '@oxc-parser/binding-linux-x64-gnu@0.150.0': + resolution: {integrity: sha512-Vx0GSA9ZCRTUiczoEQnIIyXkMvtEY8uc6IiwLQtMe5ci2sXPqjrry0Ek5fsPP1k2kCzkML3ow9UOOEgnEDi7Bw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxc-parser/binding-linux-x64-musl@0.150.0': + resolution: {integrity: sha512-ii4/9m3viDLssMnfXU7/Pni/3nYplApuGayceX4qsVGaqqQJCx3tHIH9M/HWIeSty5i8LjS21zPYT6lVIkwLxw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxc-parser/binding-openharmony-arm64@0.150.0': + resolution: {integrity: sha512-ZtoxX5rez36ZWkwtiEhjkCPnlTPoQ2I7lIL0IYZ1yjxMYohbvoOjBmUIZzrf9W/HouONq0omIfTeCWEY+R380w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxc-parser/binding-win32-arm64-msvc@0.150.0': + resolution: {integrity: sha512-VqeRb5JX/bKYBrff7TUDvJyKY0914UzuCkuXIGxJS4FUmvMNfqkCbc7Sq90iMz9DlmAtlggwaBYQ9eg3h3ltiw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-ia32-msvc@0.150.0': + resolution: {integrity: sha512-EPqJfeZ4Pgg2BJSsCV8GozxV0FDltRzpVtGVa1r2noJu1iu+opOw3gtBWXwIo9odCT/MdFfyHxdy0/CRqs3OqA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.150.0': + resolution: {integrity: sha512-n5YMzbqwPQqozbkrexi0lNZrUz5cnPHalYpFWe6Dau7AmKIWNo+y24IwzDuZEQtEdUHuKhXmMMih/MPjOI+CMw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] - '@oxc-project/types@0.106.0': - resolution: {integrity: sha512-QdsH3rZq480VnOHSHgPYOhjL8O8LBdcnSjM408BpPCCUc0JYYZPG9Gafl9i3OcGk/7137o+gweb4cCv3WAUykg==} + '@oxc-project/types@0.149.0': + resolution: {integrity: sha512-Efcc+iF0j3Bf67YjEqIqWXbX5XddXoK/Mw4K1/JuXwRCZ8N16VR7iT23nlCc9XrveFVh/E5Rqs2StT0V8v9LdA==} - '@parcel/watcher-android-arm64@2.5.4': - resolution: {integrity: sha512-hoh0vx4v+b3BNI7Cjoy2/B0ARqcwVNrzN/n7DLq9ZB4I3lrsvhrkCViJyfTj/Qi5xM9YFiH4AmHGK6pgH1ss7g==} + '@oxc-project/types@0.150.0': + resolution: {integrity: sha512-rDS5/31E9HfPl/CIzGrn0DOlvBbXFseQ5URJ9sYMfstbKLD/c6Gm9vmRzRGDdAXyOIL4zmO37lc9RIwYqVruZw==} + + '@parcel/watcher-android-arm64@2.6.0': + resolution: {integrity: sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [android] - '@parcel/watcher-darwin-arm64@2.5.4': - resolution: {integrity: sha512-kphKy377pZiWpAOyTgQYPE5/XEKVMaj6VUjKT5VkNyUJlr2qZAn8gIc7CPzx+kbhvqHDT9d7EqdOqRXT6vk0zw==} + '@parcel/watcher-darwin-arm64@2.6.0': + resolution: {integrity: sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [darwin] - '@parcel/watcher-darwin-x64@2.5.4': - resolution: {integrity: sha512-UKaQFhCtNJW1A9YyVz3Ju7ydf6QgrpNQfRZ35wNKUhTQ3dxJ/3MULXN5JN/0Z80V/KUBDGa3RZaKq1EQT2a2gg==} + '@parcel/watcher-darwin-x64@2.6.0': + resolution: {integrity: sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [darwin] - '@parcel/watcher-freebsd-x64@2.5.4': - resolution: {integrity: sha512-Dib0Wv3Ow/m2/ttvLdeI2DBXloO7t3Z0oCp4bAb2aqyqOjKPPGrg10pMJJAQ7tt8P4V2rwYwywkDhUia/FgS+Q==} + '@parcel/watcher-freebsd-x64@2.6.0': + resolution: {integrity: sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [freebsd] - '@parcel/watcher-linux-arm-glibc@2.5.4': - resolution: {integrity: sha512-I5Vb769pdf7Q7Sf4KNy8Pogl/URRCKu9ImMmnVKYayhynuyGYMzuI4UOWnegQNa2sGpsPSbzDsqbHNMyeyPCgw==} + '@parcel/watcher-linux-arm-glibc@2.6.0': + resolution: {integrity: sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [glibc] - '@parcel/watcher-linux-arm-musl@2.5.4': - resolution: {integrity: sha512-kGO8RPvVrcAotV4QcWh8kZuHr9bXi9a3bSZw7kFarYR0+fGliU7hd/zevhjw8fnvIKG3J9EO5G6sXNGCSNMYPQ==} + '@parcel/watcher-linux-arm-musl@2.6.0': + resolution: {integrity: sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw==} engines: {node: '>= 10.0.0'} cpu: [arm] os: [linux] + libc: [musl] - '@parcel/watcher-linux-arm64-glibc@2.5.4': - resolution: {integrity: sha512-KU75aooXhqGFY2W5/p8DYYHt4hrjHZod8AhcGAmhzPn/etTa+lYCDB2b1sJy3sWJ8ahFVTdy+EbqSBvMx3iFlw==} + '@parcel/watcher-linux-arm64-glibc@2.6.0': + resolution: {integrity: sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [glibc] - '@parcel/watcher-linux-arm64-musl@2.5.4': - resolution: {integrity: sha512-Qx8uNiIekVutnzbVdrgSanM+cbpDD3boB1f8vMtnuG5Zau4/bdDbXyKwIn0ToqFhIuob73bcxV9NwRm04/hzHQ==} + '@parcel/watcher-linux-arm64-musl@2.6.0': + resolution: {integrity: sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [linux] + libc: [musl] - '@parcel/watcher-linux-x64-glibc@2.5.4': - resolution: {integrity: sha512-UYBQvhYmgAv61LNUn24qGQdjtycFBKSK3EXr72DbJqX9aaLbtCOO8+1SkKhD/GNiJ97ExgcHBrukcYhVjrnogA==} + '@parcel/watcher-linux-x64-glibc@2.6.0': + resolution: {integrity: sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [glibc] - '@parcel/watcher-linux-x64-musl@2.5.4': - resolution: {integrity: sha512-YoRWCVgxv8akZrMhdyVi6/TyoeeMkQ0PGGOf2E4omODrvd1wxniXP+DBynKoHryStks7l+fDAMUBRzqNHrVOpg==} + '@parcel/watcher-linux-x64-musl@2.6.0': + resolution: {integrity: sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [linux] + libc: [musl] - '@parcel/watcher-win32-arm64@2.5.4': - resolution: {integrity: sha512-iby+D/YNXWkiQNYcIhg8P5hSjzXEHaQrk2SLrWOUD7VeC4Ohu0WQvmV+HDJokZVJ2UjJ4AGXW3bx7Lls9Ln4TQ==} + '@parcel/watcher-win32-arm64@2.6.0': + resolution: {integrity: sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ==} engines: {node: '>= 10.0.0'} cpu: [arm64] os: [win32] - '@parcel/watcher-win32-ia32@2.5.4': - resolution: {integrity: sha512-vQN+KIReG0a2ZDpVv8cgddlf67J8hk1WfZMMP7sMeZmJRSmEax5xNDNWKdgqSe2brOKTQQAs3aCCUal2qBHAyg==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - - '@parcel/watcher-win32-x64@2.5.4': - resolution: {integrity: sha512-3A6efb6BOKwyw7yk9ro2vus2YTt2nvcd56AuzxdMiVOxL9umDyN5PKkKfZ/gZ9row41SjVmTVQNWQhaRRGpOKw==} + '@parcel/watcher-win32-x64@2.6.0': + resolution: {integrity: sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A==} engines: {node: '>= 10.0.0'} cpu: [x64] os: [win32] - '@parcel/watcher@2.5.4': - resolution: {integrity: sha512-WYa2tUVV5HiArWPB3ydlOc4R2ivq0IDrlqhMi3l7mVsFEXNcTfxYFPIHXHXIh/ca/y/V5N4E1zecyxdIBjYnkQ==} + '@parcel/watcher@2.6.0': + resolution: {integrity: sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w==} engines: {node: '>= 10.0.0'} - '@rolldown/binding-android-arm64@1.0.0-beta.58': - resolution: {integrity: sha512-mWj5eE4Qc8TbPdGGaaLvBb9XfDPvE1EmZkJQgiGKwchkWH4oAJcRAKMTw7ZHnb1L+t7Ah41sBkAecaIsuUgsug==} + '@rolldown/binding-android-arm-eabi@1.2.8': + resolution: {integrity: sha512-tN5aztYkKCte4i5SIrrz5yK/HMjEuCqCSCJa418jOV8tZ1cBY3YF2otxB1ktPxzsLA1BeTqwapK0bfjxNvHJVw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@rolldown/binding-android-arm64@1.2.8': + resolution: {integrity: sha512-dIYTWl9XprMUiQFoc55KUyk/oS8SKYH3zFl0LTR7RT0Xj4hgSVyuJcroH8JUu8RcpF8fTB6E0aOwCkZoYPcDSQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.58': - resolution: {integrity: sha512-wFxUymI/5R8bH8qZFYDfAxAN9CyISEIYke+95oZPiv6EWo88aa5rskjVcCpKA532R+klFmdqjbbaD56GNmTF4Q==} + '@rolldown/binding-darwin-arm64@1.2.8': + resolution: {integrity: sha512-PCSDQGXD2IyTEFrcgPyBM8jJuGmrbCMuoIOXdbEGVemruKACXoLQJrb+A45Z0L5t1RQkdfJprAYPkikbh7dzdA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.58': - resolution: {integrity: sha512-ybp3MkPj23VDV9PhtRwdU5qrGhlViWRV5BjKwO6epaSlUD5lW0WyY+roN3ZAzbma/9RrMTgZ/a/gtQq8YXOcqw==} + '@rolldown/binding-darwin-x64@1.2.8': + resolution: {integrity: sha512-Uk7lRsGhPFHVX/sAUC6D5H9Ol30dFHd6iquokll2th3LpdJ3F5CzQB+7DHn0Ri2mG+U7k2zXiPHDrwZenXhwSA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.58': - resolution: {integrity: sha512-Evxj3yh7FWvyklUYZa0qTVT9N2zX9TPDqGF056hl8hlCZ9/ndQ2xMv6uw9PD1VlLpukbsqL+/C6M0qwipL0QMg==} + '@rolldown/binding-freebsd-x64@1.2.8': + resolution: {integrity: sha512-DjszaTEVogPqA5bYzsEeqDCQxbcp2fexQwKcRspYji2yzR68fCf+e4fx6kBSRDwX5/brZaHw/hWS9+A/+/w9sQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.58': - resolution: {integrity: sha512-tYeXprDOrEgVHUbPXH6MPso4cM/c6RTkmJNICMQlYdki4hGMh92aj3yU6CKs+4X5gfG0yj5kVUw/L4M685SYag==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.8': + resolution: {integrity: sha512-zmwa7FTmdzB6aaEEuuls18H6Ap5JmJPSoPTuXixeJZV6tG40SyLkApQtz1g8ptZtiEKqj9OM0oNLPh1AgvE31Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.58': - resolution: {integrity: sha512-N78vmZzP6zG967Ohr+MasCjmKtis0geZ1SOVmxrA0/bklTQSzH5kHEjW5Qn+i1taFno6GEre1E40v0wuWsNOQw==} + '@rolldown/binding-linux-arm64-gnu@1.2.8': + resolution: {integrity: sha512-KdYQDPHwJVnbFwdTGMgxsI9SqblBlz6STGM+w1We/d5B8OWWidYH0MwkU/uA1wM5fIpO2MkOVxXrNzzuZhw9ew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [glibc] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.58': - resolution: {integrity: sha512-l+p4QVtG72C7wI2SIkNQw/KQtSjuYwS3rV6AKcWrRBF62ClsFUcif5vLaZIEbPrCXu5OFRXigXFJnxYsVVZqdQ==} + '@rolldown/binding-linux-arm64-musl@1.2.8': + resolution: {integrity: sha512-jFJTifHnNPY+yzOoNZQfSIysrVyXzEQPhPnOUjmD1bcQGHH6s7c8cViKWar8YplQImE5N9JRqMCLrM2CdxOrZA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.2.8': + resolution: {integrity: sha512-FhiOziBDWPBjbcmRzfLyIJnaP7AVMFXT7YCXPjXxj7wKU3vx24RjrCNN/zjvVa+N2vVoHJwCoUBvsrN/DG3zIA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.2.8': + resolution: {integrity: sha512-WnHfADMzOV2Y55wlx1hzzQnar/wDt/VdvWSD99r18Mz9ylNieIGOkRx3UV21h7m/eJvjySYJkO26VvGNFkwsIQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.58': - resolution: {integrity: sha512-urzJX0HrXxIh0FfxwWRjfPCMeInU9qsImLQxHBgLp5ivji1EEUnOfux8KxPPnRQthJyneBrN2LeqUix9DYrNaQ==} + '@rolldown/binding-linux-x64-gnu@1.2.8': + resolution: {integrity: sha512-H9tRr5ibfXFVLxbPOseVewewFpl28zcEdjRDt2FTUZU7odxP0gEv1ki4/kGmcGOh78oRwZuuQllGLZ9zTJp84g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [glibc] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.58': - resolution: {integrity: sha512-7ijfVK3GISnXIwq/1FZo+KyAUJjL3kWPJ7rViAL6MWeEBhEgRzJ0yEd9I8N9aut8Y8ab+EKFJyRNMWZuUBwQ0A==} + '@rolldown/binding-linux-x64-musl@1.2.8': + resolution: {integrity: sha512-UefiqfM3D6IVNlZ8tSGs9+Ejjud2T+oxO0IHADU45Y+lyEjD2dVFyZHbkfX0LUb5Zugo/oIv1eCO/KVYhgYJYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] + libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.58': - resolution: {integrity: sha512-/m7sKZCS+cUULbzyJTIlv8JbjNohxbpAOA6cM+lgWgqVzPee3U6jpwydrib328JFN/gF9A99IZEnuGYqEDJdww==} + '@rolldown/binding-openharmony-arm64@1.2.8': + resolution: {integrity: sha512-637Ke4kWSy6rp9cxQ9gMOXlxPgIw/c1beASV4M//3+9I4uwBVOOl74G+e3zyU3u19U7RkRl/HuewixZ/Z6+Rjg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': - resolution: {integrity: sha512-6SZk7zMgv+y3wFFQ9qE5P9NnRHcRsptL1ypmudD26PDY+PvFCvfHRkJNfclWnvacVGxjowr7JOL3a9fd1wWhUw==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': - resolution: {integrity: sha512-sFqfYPnBZ6xBhMkadB7UD0yjEDRvs7ipR3nCggblN+N4ODCXY6qhg/bKL39+W+dgQybL7ErD4EGERVbW9DAWvg==} + '@rolldown/binding-win32-arm64-msvc@1.2.8': + resolution: {integrity: sha512-xWBkPOF1Q9k/Gv1nQXnVdLxKu74jXppuOM4Z3mnypVUJJJwLsMl7hNJGRAUJoG8A5MgOI1ACKM+wBFxSJzKy4A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.58': - resolution: {integrity: sha512-AnFWJdAqB8+IDPcGrATYs67Kik/6tnndNJV2jGRmwlbeNiQQ8GhRJU8ETRlINfII0pqi9k4WWLnb00p1QCxw/Q==} + '@rolldown/binding-win32-x64-msvc@1.2.8': + resolution: {integrity: sha512-uz2ZvfgXbxqNwijjjbxrnvALwpyODDcgc1T1N8N3rf/DXKQmaFwmB4LX4yyjggpwN2obdQLb2rgirX5ffCWYng==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rolldown/pluginutils@1.0.0-beta.58': - resolution: {integrity: sha512-qWhDs6yFGR5xDfdrwiSa3CWGIHxD597uGE/A9xGqytBjANvh4rLCTTkq7szhMV4+Ygh+PMS90KVJ8xWG/TkX4w==} + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} - '@rollup/rollup-android-arm-eabi@4.55.3': - resolution: {integrity: sha512-qyX8+93kK/7R5BEXPC2PjUt0+fS/VO2BVHjEHyIEWiYn88rcRBHmdLgoJjktBltgAf+NY7RfCGB1SoyKS/p9kg==} - cpu: [arm] - os: [android] + '@schematics/angular@22.2.0': + resolution: {integrity: sha512-IOD+T+S5LyVVuLAtLq/5k+WxnT9UpJecyDPvIT+AWug+mZJkd+HKVVHryenNJBaW29tIxNfoDuVFPEsZ4UKcNw==} + engines: {node: ^22.22.3 || ^24.15.0 || >=26.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + + '@standard-schema/spec@1.1.0': + resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} + + '@tailwindcss/node@4.3.3': + resolution: {integrity: sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==} - '@rollup/rollup-android-arm64@4.55.3': - resolution: {integrity: sha512-6sHrL42bjt5dHQzJ12Q4vMKfN+kUnZ0atHHnv4V0Wd9JMTk7FDzSY35+7qbz3ypQYMBPANbpGK7JpnWNnhGt8g==} + '@tailwindcss/oxide-android-arm64@4.3.3': + resolution: {integrity: sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==} + engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.55.3': - resolution: {integrity: sha512-1ht2SpGIjEl2igJ9AbNpPIKzb1B5goXOcmtD0RFxnwNuMxqkR6AUaaErZz+4o+FKmzxcSNBOLrzsICZVNYa1Rw==} + '@tailwindcss/oxide-darwin-arm64@4.3.3': + resolution: {integrity: sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==} + engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.55.3': - resolution: {integrity: sha512-FYZ4iVunXxtT+CZqQoPVwPhH7549e/Gy7PIRRtq4t5f/vt54pX6eG9ebttRH6QSH7r/zxAFA4EZGlQ0h0FvXiA==} + '@tailwindcss/oxide-darwin-x64@4.3.3': + resolution: {integrity: sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==} + engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.55.3': - resolution: {integrity: sha512-M/mwDCJ4wLsIgyxv2Lj7Len+UMHd4zAXu4GQ2UaCdksStglWhP61U3uowkaYBQBhVoNpwx5Hputo8eSqM7K82Q==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.55.3': - resolution: {integrity: sha512-5jZT2c7jBCrMegKYTYTpni8mg8y3uY8gzeq2ndFOANwNuC/xJbVAoGKR9LhMDA0H3nIhvaqUoBEuJoICBudFrA==} + '@tailwindcss/oxide-freebsd-x64@4.3.3': + resolution: {integrity: sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==} + engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.55.3': - resolution: {integrity: sha512-YeGUhkN1oA+iSPzzhEjVPS29YbViOr8s4lSsFaZKLHswgqP911xx25fPOyE9+khmN6W4VeM0aevbDp4kkEoHiA==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.55.3': - resolution: {integrity: sha512-eo0iOIOvcAlWB3Z3eh8pVM8hZ0oVkK3AjEM9nSrkSug2l15qHzF3TOwT0747omI6+CJJvl7drwZepT+re6Fy/w==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + resolution: {integrity: sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==} + engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.55.3': - resolution: {integrity: sha512-DJay3ep76bKUDImmn//W5SvpjRN5LmK/ntWyeJs/dcnwiiHESd3N4uteK9FDLf0S0W8E6Y0sVRXpOCoQclQqNg==} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + resolution: {integrity: sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==} + engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.55.3': - resolution: {integrity: sha512-BKKWQkY2WgJ5MC/ayvIJTHjy0JUGb5efaHCUiG/39sSUvAYRBaO3+/EK0AZT1RF3pSj86O24GLLik9mAYu0IJg==} + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + resolution: {integrity: sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==} + engines: {node: '>= 20'} cpu: [arm64] os: [linux] + libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.55.3': - resolution: {integrity: sha512-Q9nVlWtKAG7ISW80OiZGxTr6rYtyDSkauHUtvkQI6TNOJjFvpj4gcH+KaJihqYInnAzEEUetPQubRwHef4exVg==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-loong64-musl@4.55.3': - resolution: {integrity: sha512-2H5LmhzrpC4fFRNwknzmmTvvyJPHwESoJgyReXeFoYYuIDfBhP29TEXOkCJE/KxHi27mj7wDUClNq78ue3QEBQ==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-ppc64-gnu@4.55.3': - resolution: {integrity: sha512-9S542V0ie9LCTznPYlvaeySwBeIEa7rDBgLHKZ5S9DBgcqdJYburabm8TqiqG6mrdTzfV5uttQRHcbKff9lWtA==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-ppc64-musl@4.55.3': - resolution: {integrity: sha512-ukxw+YH3XXpcezLgbJeasgxyTbdpnNAkrIlFGDl7t+pgCxZ89/6n1a+MxlY7CegU+nDgrgdqDelPRNQ/47zs0g==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.55.3': - resolution: {integrity: sha512-Iauw9UsTTvlF++FhghFJjqYxyXdggXsOqGpFBylaRopVpcbfyIIsNvkf9oGwfgIcf57z3m8+/oSYTo6HutBFNw==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.55.3': - resolution: {integrity: sha512-3OqKAHSEQXKdq9mQ4eajqUgNIK27VZPW3I26EP8miIzuKzCJ3aW3oEn2pzF+4/Hj/Moc0YDsOtBgT5bZ56/vcA==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.55.3': - resolution: {integrity: sha512-0CM8dSVzVIaqMcXIFej8zZrSFLnGrAE8qlNbbHfTw1EEPnFTg1U1ekI0JdzjPyzSfUsHWtodilQQG/RA55berA==} - cpu: [s390x] - os: [linux] - - '@rollup/rollup-linux-x64-gnu@4.55.3': - resolution: {integrity: sha512-+fgJE12FZMIgBaKIAGd45rxf+5ftcycANJRWk8Vz0NnMTM5rADPGuRFTYar+Mqs560xuART7XsX2lSACa1iOmQ==} + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + resolution: {integrity: sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==} + engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.55.3': - resolution: {integrity: sha512-tMD7NnbAolWPzQlJQJjVFh/fNH3K/KnA7K8gv2dJWCwwnaK6DFCYST1QXYWfu5V0cDwarWC8Sf/cfMHniNq21A==} + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + resolution: {integrity: sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==} + engines: {node: '>= 20'} cpu: [x64] os: [linux] + libc: [musl] - '@rollup/rollup-openbsd-x64@4.55.3': - resolution: {integrity: sha512-u5KsqxOxjEeIbn7bUK1MPM34jrnPwjeqgyin4/N6e/KzXKfpE9Mi0nCxcQjaM9lLmPcHmn/xx1yOjgTMtu1jWQ==} - cpu: [x64] - os: [openbsd] - - '@rollup/rollup-openharmony-arm64@4.55.3': - resolution: {integrity: sha512-vo54aXwjpTtsAnb3ca7Yxs9t2INZg7QdXN/7yaoG7nPGbOBXYXQY41Km+S1Ov26vzOAzLcAjmMdjyEqS1JkVhw==} - cpu: [arm64] - os: [openharmony] + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + resolution: {integrity: sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib - '@rollup/rollup-win32-arm64-msvc@4.55.3': - resolution: {integrity: sha512-HI+PIVZ+m+9AgpnY3pt6rinUdRYrGHvmVdsNQ4odNqQ/eRF78DVpMR7mOq7nW06QxpczibwBmeQzB68wJ+4W4A==} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + resolution: {integrity: sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.55.3': - resolution: {integrity: sha512-vRByotbdMo3Wdi+8oC2nVxtc3RkkFKrGaok+a62AT8lz/YBuQjaVYAS5Zcs3tPzW43Vsf9J0wehJbUY5xRSekA==} - cpu: [ia32] - os: [win32] - - '@rollup/rollup-win32-x64-gnu@4.55.3': - resolution: {integrity: sha512-POZHq7UeuzMJljC5NjKi8vKMFN6/5EOqcX1yGntNLp7rUTpBAXQ1hW8kWPFxYLv07QMcNM75xqVLGPWQq6TKFA==} - cpu: [x64] - os: [win32] - - '@rollup/rollup-win32-x64-msvc@4.55.3': - resolution: {integrity: sha512-aPFONczE4fUFKNXszdvnd2GqKEYQdV5oEsIbKPujJmWlCI9zEsv1Otig8RKK+X9bed9gFUN6LAeN4ZcNuu4zjg==} + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + resolution: {integrity: sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==} + engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@schematics/angular@21.1.1': - resolution: {integrity: sha512-WijqITteakpFOplx7IGHIdBOdTU04Ul4qweilY1CRK3KdzQRuAf31KiKUFrJiGW076cyokmAQmBoZcngh9rCNw==} - 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'} - - '@sigstore/bundle@4.0.0': - resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@sigstore/core@3.1.0': - resolution: {integrity: sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@sigstore/protobuf-specs@0.5.0': - resolution: {integrity: sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA==} - engines: {node: ^18.17.0 || >=20.5.0} - - '@sigstore/sign@4.1.0': - resolution: {integrity: sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@sigstore/tuf@4.0.1': - resolution: {integrity: sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@sigstore/verify@3.1.0': - resolution: {integrity: sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@standard-schema/spec@1.1.0': - resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - - '@tufjs/canonical-json@2.0.0': - resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} - engines: {node: ^16.14.0 || >=18.0.0} + '@tailwindcss/oxide@4.3.3': + resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==} + engines: {node: '>= 20'} - '@tufjs/models@4.1.0': - resolution: {integrity: sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==} - engines: {node: ^20.17.0 || >=22.9.0} - - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} - - '@types/body-parser@1.19.6': - resolution: {integrity: sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==} - - '@types/bonjour@3.5.13': - resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} + '@tailwindcss/postcss@4.3.3': + resolution: {integrity: sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==} - '@types/connect-history-api-fallback@1.5.4': - resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + '@types/esrecurse@4.3.1': + resolution: {integrity: sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==} - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/gensync@1.0.5': + resolution: {integrity: sha512-MbsRCT7mTikHwKZ0X+LVUTLRrZZRLipTuXEO9qOYO+zmjMVk81axyClMROf6uoPD9MRVu46bx8zoR0Ad9q3NAg==} - '@types/express-serve-static-core@4.19.8': - resolution: {integrity: sha512-02S5fmqeoKzVZCHPZid4b8JH2eM5HzQLZWN2FohQEy/0eXTq8VXZfSN6Pcr3F6N9R/vNrj7cpgbhjie6m/1tCA==} - - '@types/express@4.17.25': - resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} - - '@types/http-errors@2.0.5': - resolution: {integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==} - - '@types/http-proxy@1.17.17': - resolution: {integrity: sha512-ED6LB+Z1AVylNTu7hdzuBqOgMnvG/ld6wGCG8wFnAzKX5uyW2K3WD52v0gnLCTK/VLpXtKckgWuyScYK6cSPaw==} + '@types/jsesc@2.5.1': + resolution: {integrity: sha512-9VN+6yxLOPLOav+7PwjZbxiID2bVaeq0ED4qSQmdQTdjnXJSaCVKTR58t15oqH1H5t8Ng2ZX1SabJVoN9Q34bw==} '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/node-forge@1.3.14': - resolution: {integrity: sha512-mhVF2BnD4BO+jtOp7z1CdzaK4mbuK0LLQYAvdOLqHTavxFNq4zA1EmYkpnFjP8HOUzedfQkRnp0E2ulSAYSzAw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/parse-json@4.0.2': - resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} - - '@types/qs@6.14.0': - resolution: {integrity: sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/retry@0.12.2': - resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} - - '@types/send@0.17.6': - resolution: {integrity: sha512-Uqt8rPBE8SY0RK8JB1EzVOIZ32uqy8HwdxCnoCOsYrvnswqmFZ/k+9Ikidlk/ImhsdvBsloHbAlewb2IEBV/Og==} - - '@types/send@1.2.1': - resolution: {integrity: sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==} - - '@types/serve-index@1.9.4': - resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} - - '@types/serve-static@1.15.10': - resolution: {integrity: sha512-tRs1dB+g8Itk72rlSI2ZrW6vZg0YrLI81iQSTkMmOqnqCaNr/8Ek4VwWcN5vZgCYWbg/JJSGBlUaYGAOP73qBw==} - - '@types/sockjs@0.3.36': - resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} - - '@vitejs/plugin-basic-ssl@2.1.0': - resolution: {integrity: sha512-dOxxrhgyDIEUADhb/8OlV9JIqYLgos03YorAueTIeOUskLJSEsfwCByjbu98ctXitUN3znXKp0bYD/WHSudCeA==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + '@typescript-eslint/eslint-plugin@8.69.0': + resolution: {integrity: sha512-t5jQTKPIgVW1PE6dR6H6Qz5gm8zjMlX5/2gRaOGd9eO6V7J+tQc6iWKukEe7dY8u9HyYasQ0yfF0/FSSTEO2gA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - vite: ^6.0.0 || ^7.0.0 - - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + '@typescript-eslint/parser': ^8.69.0 + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + '@typescript-eslint/parser@8.69.0': + resolution: {integrity: sha512-l4b0DhWioGg6Gt2ebGlvfkFMOjRsauxtsnDRwUSRX1qHq3HdTfQHV8wW9zEXeciai6HfeaKOedQn2Zoofx3WBw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + '@typescript-eslint/project-service@8.69.0': + resolution: {integrity: sha512-yi4obFrHMmnsesWehHbkg9zMA7Jt8cXT+mKM08G999pH1yT6nqgsHx7MYm0uY1wAj8CqiBXYRJ7WAT0QdQHQXg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + '@typescript-eslint/project-service@8.70.1': + resolution: {integrity: sha512-62xOgboPfwc3/IgPSX/W6oQR3ZbF04194FPGUGH8HL8iLFHbt/456/8Ph1wLNUgVF+s94FlHoipBsz+v7+LMnA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + '@typescript-eslint/scope-manager@8.69.0': + resolution: {integrity: sha512-ewfspqWvSxKSOaplqAUNbaSFO0eB6w1EtQ+esfYFRm3614Ty4uNtExkcbgd6nWsXphbqKyf9ZYdbZdv2xEoWEQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + '@typescript-eslint/scope-manager@8.70.1': + resolution: {integrity: sha512-Pa0EeSeAusQc1WbjQMac+YfenewYTBu0KjgYvkUKwhXaHUKbFog23Dm/rp0DX/6tyYOQ3Xl1a+3EcFNZynGHCw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + '@typescript-eslint/tsconfig-utils@8.69.0': + resolution: {integrity: sha512-xNqK7YTDZsLniQMV/4rpFR8Z5JlqeRvVjuG1YgF/mdPVH84HSD19L8CczMA0qg2RfwEV231GHH3VnToJDo4MfQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + '@typescript-eslint/tsconfig-utils@8.70.1': + resolution: {integrity: sha512-jumze1fPI+sDOaM2TWGQdn39PDxTr7TZGeuyLkAbNyx2vtMT3uRnVKChN0hfht5V2TugphJzF6bYXvBcE09qqg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + '@typescript-eslint/type-utils@8.69.0': + resolution: {integrity: sha512-ZfoJAVg3JZndQEpEl9petVlxau3lRuElc4HRMuAlLCf8to04/iHz692RUSNmXKDjEuJmIL+KZ2/BsOcBc16dsA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + '@typescript-eslint/types@8.69.0': + resolution: {integrity: sha512-K3VrubUPhlo9VDBS6QdI8YB5j7ClpqLRdefcz6PFrhnwicehBweqQ9Evhl4l+FYz0HdDmMqIiSX0aldGRYtDCA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + '@typescript-eslint/types@8.70.1': + resolution: {integrity: sha512-Dm1ypdhhrGCTyyehxElhgJ6kgk8MVCv5qXdoOVqPr1uqk42jX8KjrZqhROvdShczA8qrDoYiOWn1ykWlx2k81Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@typescript-eslint/typescript-estree@8.69.0': + resolution: {integrity: sha512-AdFkgqck3Vudb/kWnxlyafU/4aBhHrbQ9locP2N4psXTy5mOBg0SHJumnLvx7r6g1gV4DKvUFwV2nJZBoqOD8w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' - '@yarnpkg/lockfile@1.1.0': - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + '@typescript-eslint/typescript-estree@8.70.1': + resolution: {integrity: sha512-TU8PwyGN0PQJUcE96mw8eCQ44SmxGdQlJmlWakHaHQ15eIuuvye5yNtmh/i6oS88jzXVQB71xdNkbkB/fMwL0g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.1.0' - '@zeit/schemas@2.36.0': - resolution: {integrity: sha512-7kjMwcChYEzMKjeex9ZFXkt1AyNov9R5HZtjBKVsmVpw7pa7ZtlCGvCBC2vnnXctaYN+aRI61HjIqeetZW5ROg==} + '@typescript-eslint/utils@8.69.0': + resolution: {integrity: sha512-tUbx60BBqQa31kXF5MCsOOLL5E/WzUuxIn7YpAvq+eaUlqvk8/NXnXMBNAdLCr0icjkzem7iUA5QqWHe/hJ1aw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - abbrev@4.0.0: - resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} - engines: {node: ^20.17.0 || >=22.9.0} + '@typescript-eslint/utils@8.70.1': + resolution: {integrity: sha512-Esgul8MsnKnRLdYU2Eb2cRV9bS5HJYtKj1ByJnOzzG2M58DGdSUQ1jUuILxipqcpB2h9WLrbD5GijIWUjX/Tqw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + '@typescript-eslint/visitor-keys@8.69.0': + resolution: {integrity: sha512-+rmdgPA+EXkNgKYvHvFfhrs35utXbwaC5PGpDquSXcoXQDKUA5UjV0LmTucG/4JXkM31BTu4TilHtrN8IVBe8w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - accepts@2.0.0: - resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} - engines: {node: '>= 0.6'} + '@typescript-eslint/visitor-keys@8.70.1': + resolution: {integrity: sha512-Vwj9lUIW5Xq3wQ9w6gv3R86g1hMK8f2zNOdGTAgeXUMMXFK78G9ruCjjqutHMNJc0+CH7LYRnHeUB9IT8wFmcw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - acorn-import-phases@1.0.4: - resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} - engines: {node: '>=10.13.0'} + '@vitejs/plugin-basic-ssl@2.3.0': + resolution: {integrity: sha512-bdyo8rB3NnQbikdMpHaML9Z1OZPBu6fFOBo+OtxsBlvMJtysWskmBcnbIDhUqgC8tcxNv/a+BcV5U+2nQMm1OQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} peerDependencies: - acorn: ^8.14.0 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-node@1.8.2: - resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} + '@vitest/mocker@5.0.1': + resolution: {integrity: sha512-6K1DoBNAPGvuOcSsGA4D6x+5zEEff/KmOOP3uetT2TrGpVfI+HRHRnJJfKi5ib/g1vx8IYHQD8s0pbJz8WQI7Q==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0 || ^8.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true - acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} + '@vitest/spy@5.0.1': + resolution: {integrity: sha512-rbto/mF/SGERxEgYOek7Xm6B9b+y+mVoo+f4b2LymYO8zM1b7uB5nHuhVMTP2hxdzgxvGiZYGxGIaMvL5y180Q==} - acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + acorn@8.18.0: + resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==} engines: {node: '>=0.4.0'} hasBin: true - adjust-sourcemap-loader@4.0.0: - resolution: {integrity: sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==} - engines: {node: '>=8.9'} - - agent-base@7.1.4: - resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} - engines: {node: '>= 14'} - - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true + agent-base@9.0.0: + resolution: {integrity: sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==} + engines: {node: '>= 20'} ajv-formats@3.0.1: resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} @@ -2108,275 +1545,101 @@ packages: ajv: optional: true - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - - ajv@8.17.1: - resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - algoliasearch@5.46.2: - resolution: {integrity: sha512-qqAXW9QvKf2tTyhpDA4qXv1IfBwD2eduSW6tUEBFIfCeE9gn9HQ9I5+MaKoenRuHrzk5sQoNh1/iof8mY7uD6Q==} - engines: {node: '>= 14.0.0'} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - angular-oauth2-oidc@10.0.3: - resolution: {integrity: sha512-9wC8I3e3cN6rMBOlo5JB2y3Fd2erp8pJ67t4vEVzyPbnRG6BJ4rreSOznSL9zw/2SjhC9kRV2OfFie29CUCzEg==} + angular-eslint@22.5.0: + resolution: {integrity: sha512-qDJVh/YLYiZ7k2qZCBGsmfO+qSiHcdyQp1UFdm3eHHc3YRNlW/Xvj1wp1oDKxuHSE//aqmbVFHlkcqdwJyymdg==} peerDependencies: - '@angular/common': '>=8.0.0' - '@angular/core': '>=8.0.0' + eslint: ^9.0.0 || ^10.0.0 + typescript: '*' + typescript-eslint: ^8.0.0 - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - - ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} + angular-oauth2-oidc@22.0.2: + resolution: {integrity: sha512-MDzmf0quLVnsCzVp/G7Pr6YTSMoMMo62u8QFqJzM3madQmWV5JI4dMppvuTPswH+4V2gx4zPXdCjnn8ikVZX+A==} + peerDependencies: + '@angular/common': '>=22.0.0' + '@angular/core': '>=22.0.0' - ansi-escapes@7.2.0: - resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} + ansi-escapes@7.3.0: + resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} engines: {node: '>=18'} - ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + ansi-regex@6.3.0: + resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} engines: {node: '>=12'} - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - ansi-styles@6.2.3: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - app-root-path@3.1.0: - resolution: {integrity: sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==} - engines: {node: '>= 6.0.0'} - - arch@2.2.0: - resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} - arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + axobject-query@4.1.0: + resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} + engines: {node: '>= 0.4'} - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + baseline-browser-mapping@2.11.26: + resolution: {integrity: sha512-GLQdD3y6UF8iVuMJl5fHgE4jdn/ua7n+toKfLgNlg3BqQtOZjpy68T8Tup8/wGWZCDlm7KMg7tPb4MPn7oN0TQ==} + engines: {node: '>=6.0.0'} + hasBin: true - aria-query@3.0.0: - resolution: {integrity: sha512-majUxHgLehQTeSA+hClx+DY09OVUqG3GtezWkF1krgLGNdlDu9l9V8DaqNMWbq4Eddc8wsyDA0hpDUtnYxQEXw==} + beasties@0.5.4: + resolution: {integrity: sha512-8/lOOjT+PElYCnaUbmhgd3Uad5R1VTQ4Wg0k4rK8bX04m5WEqHNmnlLy3Q/lJ7dk25XA+72gayzc/skTfKKpcA==} + engines: {node: '>=20.19.0'} - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + bidi-js@1.1.0: + resolution: {integrity: sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==} - ast-types-flow@0.0.7: - resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==} + boolbase@2.0.0: + resolution: {integrity: sha512-DkVaaQHymRhpYEYo9x1oo7Q7B0Y6KJUsjm3c9eTyFDby4MHLBTwZ6ZDWBel5zrYxj1WsZgC5oLpiz+93MluXeA==} + engines: {node: '>=20.19.0'} - atob@2.1.2: - resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==} - engines: {node: '>= 4.5.0'} - hasBin: true + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} + engines: {node: 20 || >=22} - autoprefixer@10.4.23: - resolution: {integrity: sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==} - engines: {node: ^10 || ^12 || >=14} + browserslist@4.29.1: + resolution: {integrity: sha512-AUdjuRyCNGUYtqpqfTmWyM4fXay8yIQhmLnvYe/THMGfT9B/34X7xQd3ifKxwyNPPpowVBjLb+64BN9Rn1mizw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - peerDependencies: - postcss: ^8.1.0 - - axobject-query@2.0.2: - resolution: {integrity: sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==} - babel-loader@10.0.0: - resolution: {integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==} - engines: {node: ^18.20.0 || ^20.10.0 || >=22.0.0} - peerDependencies: - '@babel/core': ^7.12.0 - webpack: '>=5.61.0' + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - babel-plugin-polyfill-corejs2@0.4.14: - resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + cacheable@2.5.0: + resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} - babel-plugin-polyfill-corejs3@0.13.0: - resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + caniuse-lite@1.0.30001812: + resolution: {integrity: sha512-qN+QNNBr93TCmFrmte0bBCjSDMuRvt78VlHT99qIGPszm4QsqCX8lnyWUFkHi8B7ZBAPq8SH+UqyXNy/odMdng==} - babel-plugin-polyfill-regenerator@0.6.5: - resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - baseline-browser-mapping@2.9.17: - resolution: {integrity: sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==} - hasBin: true + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} - batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - - beasties@0.3.5: - resolution: {integrity: sha512-NaWu+f4YrJxEttJSm16AzMIFtVldCvaJ68b1L098KpqXmxt9xOLtKoLkKxb8ekhOrLqEJAbvT6n6SEvB/sac7A==} - engines: {node: '>=14.0.0'} - - big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - body-parser@1.20.4: - resolution: {integrity: sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - body-parser@2.2.2: - resolution: {integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==} - engines: {node: '>=18'} - - bonjour-service@1.3.0: - resolution: {integrity: sha512-3YuAUiSkWykd+2Azjgyxei8OWf8thdn8AITIog2M4UICzoqfjlqr64WIjEXZllf/W6vK1goqleSR6brGomxQqA==} - - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - - boxen@7.0.0: - resolution: {integrity: sha512-j//dBVuyacJbvW+tvZ9HuH03fZ46QcaKvvhZickZqtB271DxJ7SNRSNxrV/dZX0085m7hISRZWbzWlJvx/rHSg==} - engines: {node: '>=14.16'} - - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - browserslist@4.28.1: - resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - builtin-modules@1.1.1: - resolution: {integrity: sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==} - engines: {node: '>=0.10.0'} - - bundle-name@4.1.0: - resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} - engines: {node: '>=18'} - - bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - cacache@20.0.3: - resolution: {integrity: sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw==} - engines: {node: ^20.17.0 || >=22.9.0} - - call-bind-apply-helpers@1.0.2: - resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} - engines: {node: '>= 0.4'} - - call-bound@1.0.4: - resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - - camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - - caniuse-lite@1.0.30001765: - resolution: {integrity: sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==} - - chalk-template@0.4.0: - resolution: {integrity: sha512-/ghrgmhfY8RaSdeo43hNXxpoHAtxdbskUHjPpfqUWGttFgycUhYPGx3YZBCnUCvOa7Doivn1IZec3DEGFoMgLg==} - engines: {node: '>=12'} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.0.1: - resolution: {integrity: sha512-Fo07WOYGqMfCWHOzSXOt2CxDbC6skS/jO9ynEcmpANMoPrD+W1r1K6Vx7iNm+AQmETU1Xr2t+n8nzkV9t6xh3w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - chardet@2.1.1: - resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - - chokidar@5.0.0: - resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} - engines: {node: '>= 20.19.0'} - - chownr@3.0.0: - resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} - engines: {node: '>=18'} - - chrome-trace-event@1.0.4: - resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} - engines: {node: '>=6.0'} - - cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} @@ -2386,93 +1649,20 @@ packages: resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} engines: {node: '>=18.20'} - cli-truncate@5.1.1: - resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==} - engines: {node: '>=20'} + cli-truncate@6.1.1: + resolution: {integrity: sha512-06p9vyLahLa4zkGcgsGxU6iEkSOiuI4fhCH6Emhe2lPAcoUv73n72DnODsnHA+5wwXGnV0n9M9/qOQJSjYhFhw==} + engines: {node: '>=22'} cli-width@4.1.0: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} - clipboardy@3.0.0: - resolution: {integrity: sha512-Su+uU5sr1jkUy1sGRpLKjKrvEOVXgSgiSInwa/qeID6aJ07yh+5NWc3h2QfjHjBnfX4LhtFcuAWKUsJ3r+fjbg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - cliui@9.0.1: resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} engines: {node: '>=20'} - clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - - codelyzer@6.0.2: - resolution: {integrity: sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g==} - peerDependencies: - '@angular/compiler': '>=2.3.1 <13.0.0 || ^12.0.0-next || ^12.1.0-next || ^12.2.0-next' - '@angular/core': '>=2.3.1 <13.0.0 || ^12.0.0-next || ^12.1.0-next || ^12.2.0-next' - tslint: ^5.0.0 || ^6.0.0 - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - - compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - - compression@1.8.1: - resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} - engines: {node: '>= 0.8.0'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} - - content-disposition@0.5.2: - resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} - engines: {node: '>= 0.6'} - - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-disposition@1.0.1: - resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} - engines: {node: '>=18'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + colorjs.io@0.7.1: + resolution: {integrity: sha512-LY7OHnJZxHwT5UlzNa9bbhHHDbzB6yE5+3MIPwJEQKRvSCt/T4G7epsj+9j2BExUIIfXFIJGsIXUKdfrK9Q5tA==} convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -2480,113 +1670,25 @@ packages: convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - cookie-signature@1.0.7: - resolution: {integrity: sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==} - - cookie-signature@1.2.2: - resolution: {integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==} - engines: {node: '>=6.6.0'} - - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - - copy-anything@2.0.6: - resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} - - copy-webpack-plugin@13.0.1: - resolution: {integrity: sha512-J+YV3WfhY6W/Xf9h+J1znYuqTye2xkBUIGyTPWuBAT27qajBa5mR4f8WBmfDY3YjRftT2kqZZiLi1qf0H+UOFw==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.1.0 - - core-js-compat@3.48.0: - resolution: {integrity: sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - cors@2.8.5: - resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} - engines: {node: '>= 0.10'} - - cosmiconfig@7.1.0: - resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} - engines: {node: '>=10'} - - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - css-color-names@0.0.4: - resolution: {integrity: sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==} - - css-loader@7.1.2: - resolution: {integrity: sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.27.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true - - css-parse@2.0.0: - resolution: {integrity: sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==} - - css-select@6.0.0: - resolution: {integrity: sha512-rZZVSLle8v0+EY8QAkDWrKhpgt6SA5OtHsgBnsj6ZaLb5dmDVOWUDtQitd9ydxxvEjhewNudS6eTVU7uOyzvXw==} - - css-selector-tokenizer@0.7.3: - resolution: {integrity: sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==} - - css-unit-converter@1.1.2: - resolution: {integrity: sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==} + css-select@7.0.0: + resolution: {integrity: sha512-snmjEVXy+1LnwXdxhYvTMj1d9tOh4HxkA1YmoayVBeeyR2C14Pum7fcxJIm4SswYspVy866eYNwlH6xC3/VH5g==} + engines: {node: '>=20.19.0'} - css-what@7.0.0: - resolution: {integrity: sha512-wD5oz5xibMOPHzy13CyGmogB3phdvcDaB5t0W/Nr5Z2O/agcB8YwOz6e2Lsp10pNDzBoDO9nVa3RGs/2BttpHQ==} - engines: {node: '>= 6'} + css-tree@3.2.1: + resolution: {integrity: sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - css@2.2.4: - resolution: {integrity: sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==} + css-what@8.0.0: + resolution: {integrity: sha512-DH0Bqq3DNp5tdOReuNyAA+Ev4Y2GS5FMbZpeTLP6C4CDi0h5nL0BmUPChXw3o/qbHLDWHl49sbNqQVY7bMSDdw==} + engines: {node: '>=20.19.0'} - cssauron@1.4.0: - resolution: {integrity: sha512-Ht70DcFBh+/ekjVrYS2PlDMdSQEl3OFNmjK6lcn49HptBgilXf/Zwg4uFh9Xn0pX3Q8YOkSjIFOfK2osvdqpBw==} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@3.1.0: - resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + data-urls@7.0.0: + resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} @@ -2597,169 +1699,59 @@ packages: supports-color: optional: true - decode-uri-component@0.2.2: - resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} - engines: {node: '>=0.10'} - - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - default-browser-id@5.0.1: - resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} - engines: {node: '>=18'} - - default-browser@5.4.0: - resolution: {integrity: sha512-XDuvSq38Hr1MdN47EDvYtx3U0MTqpCEn+F6ft8z2vYDzMrvQhVp0ui9oQdqW3MvK3vqUETglt1tVGgjLuJ5izg==} - engines: {node: '>=18'} - - define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} + decimal.js@10.6.0: + resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} - defined@1.0.1: - resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} - - depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} detect-libc@2.1.2: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - - detective@5.2.1: - resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} - engines: {node: '>=0.8.0'} - hasBin: true - - didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - - diff@4.0.4: - resolution: {integrity: sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==} - engines: {node: '>=0.3.1'} - - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dom-serializer@3.1.1: + resolution: {integrity: sha512-4MEa38/QexBob6gFNwu+EGdWvhJ1OKuNwdYY3Y3NyeWDQfnGeDYQUDfIRzWu5B5gsv03so2Uxd28YC6zrsx3Lw==} + engines: {node: '>=20.19.0'} - dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} - - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - - domutils@3.2.2: - resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} - - dunder-proto@1.0.1: - resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} - engines: {node: '>= 0.4'} + domelementtype@3.0.0: + resolution: {integrity: sha512-umCQid3jKbDmVjx8jGaW7uUykm4DEUeyV21hPxNMo2nV955DhUThwqyOIDtreepP31hl84X7G5U9ZfsWvIB3Pg==} + engines: {node: '>=20.19.0'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + domhandler@6.0.1: + resolution: {integrity: sha512-gYzvtM72ZtxQO0T048kd6HWSbbGCNOUwcnfQ01cqIJ4X2IYKFFHZ5mKvrQETcFXxsRObZulDaKmy//R7TPtsBg==} + engines: {node: '>=20.19.0'} - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + domutils@4.0.2: + resolution: {integrity: sha512-qI4JLRKnSzqFqr7hAlS5xQDusBCjKSEG4t4+7aNrIQMHBcsC2TGEhuyABJdYkgSewL57PNLYEiibY2iPKhKpaA==} + engines: {node: '>=20.19.0'} - electron-to-chromium@1.5.267: - resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + electron-to-chromium@1.5.438: + resolution: {integrity: sha512-AN9xMU1hJiT65LkCUPL1DZm5TCbOPb2Qsm5pYwFLEXp6/qj9SdT4yMiqs7Qqstwvkn1zF7l36SRGt+s6XcJ0FA==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - - encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} - - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + empathic@2.1.0: + resolution: {integrity: sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==} + engines: {node: '>=14'} - enhanced-resolve@5.18.4: - resolution: {integrity: sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==} + enhanced-resolve@5.25.1: + resolution: {integrity: sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==} engines: {node: '>=10.13.0'} - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - entities@6.0.1: - resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} - engines: {node: '>=0.12'} - - entities@7.0.1: - resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} - engines: {node: '>=0.12'} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + entities@8.1.0: + resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==} + engines: {node: '>=20.19.0'} environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} - err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} - - errno@0.1.8: - resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} - hasBin: true - - error-ex@1.3.4: - resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} - - es-define-property@1.0.1: - resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-module-lexer@2.0.0: - resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==} - - es-object-atoms@1.1.1: - resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} - engines: {node: '>= 0.4'} + es-module-lexer@2.3.2: + resolution: {integrity: sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==} - esbuild-wasm@0.27.2: - resolution: {integrity: sha512-eUTnl8eh+v8UZIZh4MrMOKDAc8Lm7+NqP3pyuTORGFY1s/o9WoiJgKnwXy+te2J3hX7iRbFSHEyig7GsPeeJyw==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.27.2: - resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + esbuild@0.28.2: + resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} hasBin: true @@ -2767,100 +1759,79 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + eslint-scope@9.1.2: + resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} + eslint-visitor-keys@5.0.1: + resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + eslint@10.11.0: + resolution: {integrity: sha512-P7a6UEEqb9G95MYAtqkmsTbVXIYyzIfl6NGOIJk162PaahFxFyeGcrlXYFSiagECg4sEm8IseJdZBKR3rx6MsQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true + + espree@11.2.0: + resolution: {integrity: sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - eventsource-parser@3.0.6: - resolution: {integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==} - engines: {node: '>=18.0.0'} - - eventsource@3.0.7: - resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} - engines: {node: '>=18.0.0'} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - exponential-backoff@3.1.3: - resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} - - express-rate-limit@7.5.1: - resolution: {integrity: sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==} - engines: {node: '>= 16'} - peerDependencies: - express: '>= 4.11' - - express@4.22.1: - resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} - engines: {node: '>= 0.10.0'} - - express@5.2.1: - resolution: {integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==} - engines: {node: '>= 18'} + expect-type@1.4.0: + resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} + engines: {node: '>=12.0.0'} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.3: - resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} - engines: {node: '>=8.6.0'} + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} - fastparse@1.1.2: - resolution: {integrity: sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==} + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fast-uri@3.1.8: + resolution: {integrity: sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==} - faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -2871,69 +1842,28 @@ packages: picomatch: optional: true - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - finalhandler@1.3.2: - resolution: {integrity: sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==} - engines: {node: '>= 0.8'} - - finalhandler@2.1.1: - resolution: {integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==} - engines: {node: '>= 18.0.0'} + file-entry-cache@11.1.5: + resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - follow-redirects@1.15.11: - resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fraction.js@5.3.4: - resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - - fresh@2.0.0: - resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} - engines: {node: '>= 0.8'} - - fs-extra@10.1.0: - resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} - engines: {node: '>=12'} + flat-cache@6.1.23: + resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} - fs-minipass@3.0.3: - resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + flatted@3.4.4: + resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + flru@1.0.2: + resolution: {integrity: sha512-kWyh8ADvHBFz6ua5xYOPnUroZTT/bwWfrCeL0Wj1dzG4/YOmOcfJ99W8dOVyyynJN35rZ9aCOtHChqQovV7yog==} + engines: {node: '>=6'} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -2942,380 +1872,128 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.4.0: - resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} + get-east-asian-width@1.7.0: + resolution: {integrity: sha512-XjH1AECxf0giL2V1aU8vKyRR2ppRUb5c0EvT7zuJTokQ74bNo52zOtghqdWIqrhUD79fo3x0WfKZdOqxF6LG1Q==} engines: {node: '>=18'} - get-intrinsic@1.3.0: - resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} - engines: {node: '>= 0.4'} - - get-proto@1.0.1: - resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} - engines: {node: '>= 0.4'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - glob-parent@6.0.2: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob-to-regex.js@1.2.0: - resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - glob@13.0.0: - resolution: {integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA==} - engines: {node: 20 || >=22} - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - gopd@1.2.0: - resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} - engines: {node: '>= 0.4'} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-symbols@1.1.0: - resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} - engines: {node: '>= 0.4'} + hashery@1.5.1: + resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} + engines: {node: '>=20'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} - hex-color-regex@1.1.0: - resolution: {integrity: sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==} + hookified@2.2.0: + resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} - hono@4.11.5: - resolution: {integrity: sha512-WemPi9/WfyMwZs+ZUXdiwcCh9Y+m7L+8vki9MzDw3jJ+W9Lc+12HGsd368Qc1vZi1xwW8BWMMsnK5efYKPdt4g==} - engines: {node: '>=16.9.0'} + hosted-git-info@10.1.1: + resolution: {integrity: sha512-DeOnSPAvOndYKfw075gt8yZzQ7S2hNztw34zBTfhIzLhmBTswIBg5/y+pqu/VD5cYWm5goAFTusDmUEmKZ0PEQ==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - hosted-git-info@9.0.2: - resolution: {integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==} - engines: {node: ^20.17.0 || >=22.9.0} + html-encoding-sniffer@7.0.0: + resolution: {integrity: sha512-UikN5yr7xsCDAq87Or5or0PAlD3HJJOKVzM05az588WnpDJ4Ux7a2A53Qi6gofGg2/EtvF/H4hCi/TXfCW4Y6w==} + engines: {node: ^22.13.0 || >=24.0.0} - hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} + htmlparser2@12.0.0: + resolution: {integrity: sha512-Tz7u1i95/g2x2jz81+x0FBVhBhY5aRTvD3tXXdFaljuNdzDLJ8UGNRrTcj2cgQvAg3iW/h77Fz15nLW0L0CrZw==} + engines: {node: '>=20.19.0'} - hsl-regex@1.0.0: - resolution: {integrity: sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==} + https-proxy-agent@9.1.0: + resolution: {integrity: sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==} + engines: {node: '>= 20'} - hsla-regex@1.0.0: - resolution: {integrity: sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} - html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} + ignore@5.3.2: + resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} + engines: {node: '>= 4'} - htmlparser2@10.1.0: - resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} + ignore@7.0.10: + resolution: {integrity: sha512-HpbUakT7xp5miBUywCHf36ZEuAJNklBJDDsGpUIjMzOSmM8ELSfA9Sa/QDPeNeqeoN31u+UTCkL4klCOVvRm4Q==} + engines: {node: '>= 4'} - http-cache-semantics@4.2.0: - resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} + ignore@7.0.8: + resolution: {integrity: sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q==} + engines: {node: '>= 4'} - http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + immutable@5.1.9: + resolution: {integrity: sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==} - http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} - http-errors@2.0.1: - resolution: {integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==} - engines: {node: '>= 0.8'} + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} - http-parser-js@0.5.10: - resolution: {integrity: sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==} + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - http-proxy-middleware@2.0.9: - resolution: {integrity: sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/express': ^4.17.13 - peerDependenciesMeta: - '@types/express': - optional: true - - http-proxy-middleware@3.0.5: - resolution: {integrity: sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - hyperdyperid@1.2.0: - resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} - engines: {node: '>=10.18'} - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.7.2: - resolution: {integrity: sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==} - engines: {node: '>=0.10.0'} - - icss-utils@5.1.0: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - ignore-walk@8.0.0: - resolution: {integrity: sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==} - engines: {node: ^20.17.0 || >=22.9.0} - - image-size@0.5.5: - resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} - engines: {node: '>=0.10.0'} - hasBin: true - - immutable@5.1.4: - resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} - - import-fresh@3.3.1: - resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflight@1.0.6: - resolution: {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. - - inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - ini@6.0.0: - resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} - engines: {node: ^20.17.0 || >=22.9.0} - - ip-address@10.1.0: - resolution: {integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==} - engines: {node: '>= 12'} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - ipaddr.js@2.3.0: - resolution: {integrity: sha512-Zv/pA+ciVFbCSBBjGfaKUya/CcGmUHzTydLMaTwrUUEM2DIEO3iZvueGxmacvmN50fGpGVKeTXpb2LcYQxeVdg==} - engines: {node: '>= 10'} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-arrayish@0.3.4: - resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-color-stop@1.1.0: - resolution: {integrity: sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==} - - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} - engines: {node: '>= 0.4'} - - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-fullwidth-code-point@5.1.0: - resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} - engines: {node: '>=18'} + is-fullwidth-code-point@5.1.0: + resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} + engines: {node: '>=18'} is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-in-ssh@1.0.0: - resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} - engines: {node: '>=20'} - - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - is-interactive@2.0.0: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} - is-network-error@1.3.0: - resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} - engines: {node: '>=16'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - - is-port-reachable@4.0.0: - resolution: {integrity: sha512-9UoipoxYmSk6Xy7QFgRv2HDyaysmgSG75TFQs6S+3pDM7ZhKTF/bskZV+0UlABHzKjNVhPjYCLfeZUEg1wXxig==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - is-promise@4.0.0: - resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} is-unicode-supported@2.1.0: resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} engines: {node: '>=18'} - is-what@3.14.1: - resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} - - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - - istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - - istanbul-lib-instrument@6.0.3: - resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} - engines: {node: '>=10'} - - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - - jiti@2.6.1: - resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + jiti@2.7.0: + resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true - jose@6.1.3: - resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + js-tokens@10.0.0: + resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.14.2: - resolution: {integrity: sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==} - hasBin: true - - js-yaml@4.1.1: - resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} - hasBin: true + jsdom@30.1.1: + resolution: {integrity: sha512-FahmoPK5vbPc+jxV1iErMHmAZypCZ942NHF4+qqaWAuvaKKTBZxawnmAtrbGWLU7MtlxfqIP0qw6aSI+aWGtLg==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} + peerDependencies: + canvas: ^3.2.3 + peerDependenciesMeta: + canvas: + optional: true jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} hasBin: true - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-parse-even-better-errors@5.0.0: - resolution: {integrity: sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==} - engines: {node: ^20.17.0 || >=22.9.0} + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - json-schema-typed@8.0.2: - resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} @@ -3325,314 +2003,234 @@ packages: jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - jsonfile@6.2.0: - resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - jwt-decode@4.0.0: resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==} engines: {node: '>=18'} - karma-source-map-support@1.4.0: - resolution: {integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} - launch-editor@2.12.0: - resolution: {integrity: sha512-giOHXoOtifjdHqUamwKq6c49GzBdLjvxrd2D+Q4V6uOHopJv7p9VJxikDsQ/CBXZbEITgUqSVHXLTG3VhPP1Dg==} + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} - less-loader@12.3.0: - resolution: {integrity: sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==} - engines: {node: '>= 18.12.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - less: ^3.5.0 || ^4.0.0 - webpack: ^5.0.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] - less@4.4.2: - resolution: {integrity: sha512-j1n1IuTX1VQjIy3tT7cyGbX7nvQOsFLoIqobZv4ttI5axP923gA44zUj6miiA6R5Aoms4sEGVIIcucXUbRI14g==} - engines: {node: '>=14'} - hasBin: true + lightningcss-android-arm64@1.33.0: + resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] - license-webpack-plugin@4.0.2: - resolution: {integrity: sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==} - peerDependencies: - webpack: '*' - peerDependenciesMeta: - webpack: - optional: true + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} + lightningcss-darwin-arm64@1.33.0: + resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] - listr2@9.0.5: - resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} - engines: {node: '>=20.0.0'} + lightningcss-darwin-x64@1.33.0: + resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] - lmdb@3.4.4: - resolution: {integrity: sha512-+Y2DqovevLkb6DrSQ6SXTYLEd6kvlRbhsxzgJrk7BUfOVA/mt21ak6pFDZDKxiAczHMWxrb02kXBTSTIA0O94A==} - hasBin: true + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] - loader-runner@4.3.1: - resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} - engines: {node: '>=6.11.5'} + lightningcss-freebsd-x64@1.33.0: + resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] - loader-utils@2.0.0: - resolution: {integrity: sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==} - engines: {node: '>=8.9.0'} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] - loader-utils@3.3.1: - resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==} - engines: {node: '>= 12.13.0'} + lightningcss-linux-arm-gnueabihf@1.33.0: + resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lightningcss-linux-arm64-gnu@1.33.0: + resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] - lodash.topath@4.5.2: - resolution: {integrity: sha512-1/W4dM+35DwvE/iEd1M9ekewOSTlpFekhw9mhAtrwjVqUr83/ilQiyAvmg4tVX7Unkcfl1KC+i9WdaT4B6aQcg==} + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + lightningcss-linux-arm64-musl@1.33.0: + resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] - log-symbols@7.0.1: - resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} - engines: {node: '>=18'} + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] - log-update@6.1.0: - resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} - engines: {node: '>=18'} + lightningcss-linux-x64-gnu@1.33.0: + resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] - lru-cache@11.2.4: - resolution: {integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg==} - engines: {node: 20 || >=22} + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lightningcss-linux-x64-musl@1.33.0: + resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] - magic-string@0.30.21: - resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] - make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} + lightningcss-win32-arm64-msvc@1.33.0: + resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] - make-fetch-happen@15.0.3: - resolution: {integrity: sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw==} - engines: {node: ^20.17.0 || >=22.9.0} + lightningcss-win32-x64-msvc@1.33.0: + resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] - math-intrinsics@1.1.0: - resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} - engines: {node: '>= 0.4'} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + lightningcss@1.33.0: + resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} + engines: {node: '>= 12.0.0'} - media-typer@1.1.0: - resolution: {integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==} - engines: {node: '>= 0.8'} + listr2@11.1.0: + resolution: {integrity: sha512-xsuczF6mWkEo/E80QHaEokQzKmTy7m80KcLRnkUt9wrcePres2w7dbQi5zOsWtDUg8Dac4gPFyu4EJ/IvKwTOg==} + engines: {node: '>=22.13.0'} - memfs@4.56.9: - resolution: {integrity: sha512-Fo+xSG0MhtaPyEi7B2AEj4omBen3kb5RCeFKaM/YVsxgO8vkcpX0tkheRIoCGqXw9oAnFQRe1oWuR1xq4oE17A==} - peerDependencies: - tslib: '2' + lmdb@3.5.6: + resolution: {integrity: sha512-j3uE8ReKNyUWDjhfEFSJqE/1DLtfTR5Z8yFzVHvBjAk37wNg7HdScjcv8ttPHRvrdgPQMPWxFFI0SsdBzI5lBw==} + hasBin: true - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} - merge-descriptors@2.0.0: - resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} engines: {node: '>=18'} - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - mime-db@1.33.0: - resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} - engines: {node: '>= 0.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + log-update@8.0.0: + resolution: {integrity: sha512-lddSgOt3bPASrylL54ZSpy8nBHns+vBVSoILlVOx+dei300pnLRN958rj/EdlVLKuWlSESU3qdnDZdAI7FXYGg==} + engines: {node: '>=22'} - mime-db@1.54.0: - resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} - engines: {node: '>= 0.6'} - - mime-types@2.1.18: - resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} - engines: {node: '>= 0.6'} + lru-cache@11.5.3: + resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==} + engines: {node: 20 || >=22} - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - mime-types@3.0.2: - resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} - engines: {node: '>=18'} + magic-string@1.4.1: + resolution: {integrity: sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==} - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true + magic-string@1.4.2: + resolution: {integrity: sha512-vG+rjFRj1PqdIBozIxAGMjPlOhaVe+GXpbttY/iSK7rGcJRMlwNJO7dcUwmUqkymsFLJiNGI06t4D7Fr7yRC9g==} - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + mdn-data@2.27.1: + resolution: {integrity: sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==} mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} - mini-css-extract-plugin@2.9.4: - resolution: {integrity: sha512-ZWYT7ln73Hptxqxk2DxPU9MmapXRhxkJD6tkSR04dnQxm8BGu2hzgKLugK5yySD97u/8yy7Ma7E76k9ZdvtjkQ==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimatch@10.1.1: - resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==} - engines: {node: 20 || >=22} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass-collect@2.0.1: - resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} - engines: {node: '>=16 || 14 >=14.17'} - - minipass-fetch@5.0.0: - resolution: {integrity: sha512-fiCdUALipqgPWrOVTz9fw0XhcazULXOSU6ie40DDbX1F49p1dBrSRBuswndTx1x3vEb/g0FT7vC4c4C2u/mh3A==} - engines: {node: ^20.17.0 || >=22.9.0} - - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - - minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - minizlib@3.1.0: - resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} - engines: {node: '>= 18'} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} - hasBin: true - - modern-normalize@1.1.0: - resolution: {integrity: sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==} - engines: {node: '>=6'} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} + engines: {node: 18 || 20 || >=22} mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - msgpackr-extract@3.0.3: - resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + msgpackr-extract@3.0.4: + resolution: {integrity: sha512-4kmO/MdyUIkLIvTPr8VHLil4AtoKIoniWPIEk5+CDy0xnWC84azhSFmuJ7PxZdsYtiP5kEeQsORAVIeMgxT+Hw==} hasBin: true - msgpackr@1.11.8: - resolution: {integrity: sha512-bC4UGzHhVvgDNS7kn9tV8fAucIYUBuGojcaLiz7v+P63Lmtm0Xeji8B/8tYKddALXxJLpwIeBmUN3u64C4YkRA==} - - multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true + msgpackr@1.12.1: + resolution: {integrity: sha512-4EUH9tQHnMmEgzW/MdAP0KIfa1T9AF+htl0ffe2n5vb2EKn9y2co8ccpgWko6S52Jy1PQZKwRnx5/KkYjtd9MQ==} - mute-stream@2.0.0: - resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} - engines: {node: ^18.17.0 || >=20.5.0} + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.19: + resolution: {integrity: sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - needle@3.3.1: - resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} - engines: {node: '>= 4.4.x'} - hasBin: true - - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - - negotiator@1.0.0: - resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} - engines: {node: '>= 0.6'} - - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - ng@0.0.0: - resolution: {integrity: sha512-HwR40IBJa1ZU+CIGyuy7vSCN3xFYlSRfw5eIwwKOdOMNNNIl8KhT6PXKmHuFEFYpfrbOMaCYtr4QOJ3gkkubcg==} + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} @@ -3640,1011 +2238,501 @@ packages: node-addon-api@7.1.1: resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - node-emoji@1.11.0: - resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} - - node-forge@1.3.3: - resolution: {integrity: sha512-rLvcdSyRCyouf6jcOIPe/BgwG/d7hKjzMKOas33/pHEr6gbq18IK9zV7DiPvzsz0oBJPme6qr6H6kGZuI9/DZg==} - engines: {node: '>= 6.13.0'} - node-gyp-build-optional-packages@5.2.2: resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} hasBin: true - node-gyp@12.1.0: - resolution: {integrity: sha512-W+RYA8jBnhSr2vrTtlPYPc1K+CSjGpVDRZxcqJcERZ8ND3A1ThWPHRwctTx3qC3oW99jt726jhdz3Y6ky87J4g==} - engines: {node: ^20.17.0 || >=22.9.0} - hasBin: true + node-releases@2.0.57: + resolution: {integrity: sha512-kQK9LGGFiHtrWiNhZtA7Qbw17AQz+dmsEKODRIVTXA9+e5MS/2gZEBhYJt13GrAz5/IOZKddH/0Z3TP/Zgo+yw==} + engines: {node: '>=18'} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + npm-package-arg@14.0.0: + resolution: {integrity: sha512-69XQh3k+dtGa1p+7RaR57IuG3rCko96xr/nUfN4yDYBXbTYICiWcOpsFKLN2GtGE9cyIljE+f1exnaYt9MvM+Q==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - nopt@9.0.0: - resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} - engines: {node: ^20.17.0 || >=22.9.0} - hasBin: true + nth-check@3.0.1: + resolution: {integrity: sha512-GX0gsdbGVCgnRgbeGaubfjpBXyYRWOOCVeYh08bSQvDZqxz5ndXs1OTfAt/h36G1xvI94YIspsI0sVFqAV9+RQ==} + engines: {node: '>=20.19.0'} - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + obug@2.2.1: + resolution: {integrity: sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==} + engines: {node: '>=12.20.0'} - npm-bundled@5.0.0: - resolution: {integrity: sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==} - engines: {node: ^20.17.0 || >=22.9.0} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} - npm-install-checks@8.0.0: - resolution: {integrity: sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==} - engines: {node: ^20.17.0 || >=22.9.0} + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} - npm-normalize-package-bin@5.0.0: - resolution: {integrity: sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==} - engines: {node: ^20.17.0 || >=22.9.0} + ora@9.4.1: + resolution: {integrity: sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==} + engines: {node: '>=20'} - npm-package-arg@13.0.2: - resolution: {integrity: sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==} - engines: {node: ^20.17.0 || >=22.9.0} + ordered-binary@1.6.2: + resolution: {integrity: sha512-BY+qgDArmYpvvmij141xbkB4Cw8RFLBQM5Zj4MODFb1SyXBRE/xO4Xj/QWbR7aUEBxbkjuNdsFVCL2TmbYrlNg==} - npm-packlist@10.0.3: - resolution: {integrity: sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg==} - engines: {node: ^20.17.0 || >=22.9.0} + oxc-parser@0.150.0: + resolution: {integrity: sha512-zwajKw1GUa57IOdafIS7/yOObGF2NihwIfZfs5yJTRprMSkiwhWOc/k+n8bwnUPbHr2/XsjfBO8KyTPaW3VpWg==} + engines: {node: ^20.19.0 || >=22.12.0} - npm-pick-manifest@11.0.3: - resolution: {integrity: sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==} - engines: {node: ^20.17.0 || >=22.9.0} - - npm-registry-fetch@19.1.1: - resolution: {integrity: sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==} - engines: {node: ^20.17.0 || >=22.9.0} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-hash@2.2.0: - resolution: {integrity: sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==} - engines: {node: '>= 6'} - - object-inspect@1.13.4: - resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} - engines: {node: '>= 0.4'} - - obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - on-headers@1.1.0: - resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} - - open@10.2.0: - resolution: {integrity: sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA==} - engines: {node: '>=18'} - - open@11.0.0: - resolution: {integrity: sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==} - engines: {node: '>=20'} - - ora@9.0.0: - resolution: {integrity: sha512-m0pg2zscbYgWbqRR6ABga5c3sZdEon7bSgjnlXC64kxtxLOyjRcbbUkLj7HFyy/FTD+P2xdBWu8snGhYI0jc4A==} - engines: {node: '>=20'} - - ordered-binary@1.6.1: - resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@7.0.4: - resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==} - engines: {node: '>=18'} - - p-retry@6.2.1: - resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} - engines: {node: '>=16.17'} - - pacote@21.0.4: - resolution: {integrity: sha512-RplP/pDW0NNNDh3pnaoIWYPvNenS7UqMbXyvMqJczosiFWTeGGwJC2NQBLqKf4rGLFfwCOnntw1aEp9Jiqm1MA==} - engines: {node: ^20.17.0 || >=22.9.0} - hasBin: true - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parse-node-version@1.0.1: - resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} - engines: {node: '>= 0.10'} - - parse5-html-rewriting-stream@8.0.0: - resolution: {integrity: sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==} + parse5-html-rewriting-stream@8.0.1: + resolution: {integrity: sha512-NaRku2aMpUN1Sh1Gyk1KWUh2A7EJx2c6qYzvwsPtqhoHoaURshdrceYK3LunVCm3WHhm6FS7Vcczbvdh3/UIVw==} parse5-sax-parser@8.0.0: resolution: {integrity: sha512-/dQ8UzHZwnrzs3EvDj6IkKrD/jIZyTlB+8XrHJvcjNgRdmWruNdN9i9RK/JtxakmlUdPwKubKPTCqvbTgzGhrw==} - parse5@8.0.0: - resolution: {integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + parse5@8.0.1: + resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==} path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@2.0.1: - resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==} - engines: {node: 20 || >=22} - - path-to-regexp@0.1.12: - resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} - - path-to-regexp@3.3.0: - resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} - - path-to-regexp@8.3.0: - resolution: {integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.7: + resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==} engines: {node: '>=12'} - pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} - - piscina@5.1.4: - resolution: {integrity: sha512-7uU4ZnKeQq22t9AsmHGD2w4OYQGonwFnTypDypaWi7Qr2EvQIFVtG8J5D/3bE7W123Wdc9+v4CZDu5hJXVCtBg==} + piscina@5.3.2: + resolution: {integrity: sha512-vv7l/mM7B9WgrhDaudIqv1x6v4LOBRYYmpWGdWushhpbCmVHp11sUB2v4hj1CAeTGXVxuZFz6xOU1RalAiPKfQ==} engines: {node: '>=20.x'} - pkce-challenge@5.0.1: - resolution: {integrity: sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==} - engines: {node: '>=16.20.0'} - - postcss-js@3.0.3: - resolution: {integrity: sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==} - engines: {node: '>=10.0'} + postcss-media-query-parser@0.2.3: + resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} - postcss-load-config@3.1.4: - resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} - engines: {node: '>= 10'} + postcss-safe-parser@7.1.0: + resolution: {integrity: sha512-1WzZxRLaAFwEh6Do+zyGpjWV3nGJNxxhuh7Ubu/q1ICImMgZJnLwhoaEpRbG4pJppp2Y1ncL9ffA2f+LhrefQg==} + engines: {node: '>=18.0'} peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' + postcss: ^8.4.31 + + postcss@8.5.28: + resolution: {integrity: sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==} + engines: {node: ^10 || ^12 || >=14} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-tailwindcss@0.8.1: + resolution: {integrity: sha512-iaFMYqDsE4ffdDkn5qup0j5f2aCEBFZrdrZnvu9QKTlWx/iGPeQ4HHu7b7fCPMxeo9nwQBiOAh2nSypdFYWJkw==} + engines: {node: '>=20.19'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-hermes': '*' + '@prettier/plugin-oxc': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-svelte: '*' peerDependenciesMeta: - postcss: + '@ianvs/prettier-plugin-sort-imports': optional: true - ts-node: + '@prettier/plugin-hermes': optional: true - - postcss-loader@8.2.0: - resolution: {integrity: sha512-tHX+RkpsXVcc7st4dSdDGliI+r4aAQDuv+v3vFYHixb6YgjreG5AG4SEB0kDK8u2s6htqEEpKlkhSBUTvWKYnA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - peerDependenciesMeta: - '@rspack/core': + '@prettier/plugin-oxc': optional: true - webpack: + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-svelte: optional: true - postcss-media-query-parser@0.2.3: - resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==} - - postcss-modules-extract-imports@3.1.0: - resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-local-by-default@4.2.0: - resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + prettier@3.9.9: + resolution: {integrity: sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==} + engines: {node: '>=14'} + hasBin: true - postcss-modules-scope@3.2.1: - resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 + proc-log@7.0.0: + resolution: {integrity: sha512-FYgfaA69XZ93zaXLoMNQ+ViDXGGBgR8aLh03txzcFhV+9xOXx7+8DLCULrKKpR9+GsH9ZfHm82aSUPpozX0Ztg==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - postcss-modules-values@4.0.0: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} + proxy-agent-negotiate@1.1.0: + resolution: {integrity: sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==} + engines: {node: '>= 20'} peerDependencies: - postcss: ^8.1.0 + kerberos: ^2.0.0 + peerDependenciesMeta: + kerberos: + optional: true - postcss-nested@5.0.6: - resolution: {integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} + qified@0.10.1: + resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} + engines: {node: '>=20'} - postcss-selector-parser@7.1.1: - resolution: {integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==} - engines: {node: '>=4'} + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} - postcss-value-parser@3.3.1: - resolution: {integrity: sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==} + reflect-metadata@0.2.2: + resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} - powershell-utils@0.1.0: - resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} - engines: {node: '>=20'} + rolldown@1.2.8: + resolution: {integrity: sha512-Z67nTmhZe7anqnM/EjI392w5i/ANUinjip7QYsOyN37oayduxt3ksdX0hf5OOamkAd53BiIHfbfSzfUmzKFQqQ==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true - pretty-hrtime@1.0.3: - resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} - engines: {node: '>= 0.8'} + rxjs@7.8.2: + resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - proc-log@6.1.0: - resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} - engines: {node: ^20.17.0 || >=22.9.0} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + sass-embedded-all-unknown@1.104.1: + resolution: {integrity: sha512-toyMCyUKkT6DsYlHuKZGjd8T6WltaW4TGX07F7HnF4tNJM5m/8VaVsd74zrq3QSPqGE9JjxIDK4NrNc/QY9pkA==} + cpu: ['!arm', '!arm64', '!riscv64', '!x64'] - promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} + sass-embedded-android-arm64@1.104.1: + resolution: {integrity: sha512-yW3BVW4YFpN2vu2cVQ+Pz5JrRTvoIz36aCdo+J/Mo1A9gEN8eVPV/AL7aeZ803YdKgIitd3qw3pY4wpmT6TXNg==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [android] - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + sass-embedded-android-arm@1.104.1: + resolution: {integrity: sha512-g/XPAJYAzSSQZFP4xCdGD0HLKB4mf24cJ/+5Nls8rMool3jNkBv9+AFO4EV0b+RxN8rLcEsMccH1CR64yIFYcQ==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [android] - prr@1.0.1: - resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + sass-embedded-android-riscv64@1.104.1: + resolution: {integrity: sha512-ZYY8oMKQS7Q/6FBoC8w3T16O3MucDe3xv8iKym41Nht5uvLCGGpm4fC4OF5nlv7wQkJv8oactYddGG3Wd0Rqkg==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [android] - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} + sass-embedded-android-x64@1.104.1: + resolution: {integrity: sha512-5WZKC4lSfjMIjzZdQUlYQUAV+UiatBhD8w28U7cYLLj4/dMgEPOBd4g3VMv0BwpgH2JOaycMS42dXq29W2bcDg==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [android] - purgecss@4.1.3: - resolution: {integrity: sha512-99cKy4s+VZoXnPxaoM23e5ABcP851nC2y2GROkkjS8eJaJtlciGavd7iYAw2V84WeBqggZ12l8ef44G99HmTaw==} - hasBin: true + sass-embedded-darwin-arm64@1.104.1: + resolution: {integrity: sha512-oatuHzn0NsEg0d9Dcze6CuWUPvuETtMxRK4cv0eRAg7p6R0vHnv5GZRyWG6gEy3nc/ha/L+GtTasWVU82f4jrQ==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [darwin] - qs@6.14.1: - resolution: {integrity: sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==} - engines: {node: '>=0.6'} + sass-embedded-darwin-x64@1.104.1: + resolution: {integrity: sha512-gql/5sHGzUTVwuHfM3QLCDeb6NYwen+LLj22gz81C2NKHF/4nUtDyh4N+fURWdT7J0/EhtMOd0+FLML3sGNP7g==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [darwin] - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + sass-embedded-linux-arm64@1.104.1: + resolution: {integrity: sha512-sVWUKXNTu8sP3X95Df0xo/t49Ce5IseTIMqXHxhFBKVmx7gf7kBWNLK0wH5ym+4khc+B5nNJPgq4IxpelG8tMQ==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + libc: glibc - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} + sass-embedded-linux-arm@1.104.1: + resolution: {integrity: sha512-WfmshPJOp9vUKxgp8wZ2ncaKBbyrlW9J51M2aUQHWECjMNxTULnGOHWSmD7FViXv4zwn1Co5FIFQUipW7RCxtA==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + libc: glibc - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + sass-embedded-linux-musl-arm64@1.104.1: + resolution: {integrity: sha512-H7b+LzZ/w8pwNExInM8HDHraqvxCMdUc5ZRGU/aSJJhZ9HjeRKBjF3GxaisVHnx7o18j1l4VQ5cLBL9tTmNzZw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [linux] + libc: musl - range-parser@1.2.0: - resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} - engines: {node: '>= 0.6'} + sass-embedded-linux-musl-arm@1.104.1: + resolution: {integrity: sha512-k0cQ/CxBzFVYiQEObg6CpF6CUglkdEhi/DZgZXQbwC27kbGGY+fatmIs/cFPJL2z1ulACwoAr86RQUFzYvw5eg==} + engines: {node: '>=14.0.0'} + cpu: [arm] + os: [linux] + libc: musl - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + sass-embedded-linux-musl-riscv64@1.104.1: + resolution: {integrity: sha512-9DYdn4wfrkidjxJVtEd2iCx8HKdZe+uF82GDmrYEZhgu4NjVE6a4fQyW7OLwzn3erZMHKBaObBOH1d37DnXI1A==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + libc: musl - raw-body@2.5.3: - resolution: {integrity: sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==} - engines: {node: '>= 0.8'} + sass-embedded-linux-musl-x64@1.104.1: + resolution: {integrity: sha512-5xz+nAr01b6yaRdrGVgE7lNvm1lGFjwNdUvnz+teidvHCbD5oTcbhrRVrnDoLHHvq5n3Jve9TzWaaHhezaEfHA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + libc: musl - raw-body@3.0.2: - resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} - engines: {node: '>= 0.10'} + sass-embedded-linux-riscv64@1.104.1: + resolution: {integrity: sha512-oWryPJWTXK5adtlz/FD7wd2kS4I0CEgp6mWLUVb4oMFURMLz9bA9fO87D7lc4SV++lds7T51PU1kykCbOvNHMg==} + engines: {node: '>=14.0.0'} + cpu: [riscv64] + os: [linux] + libc: glibc - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true + sass-embedded-linux-x64@1.104.1: + resolution: {integrity: sha512-j/sX/yKTx/wJKepC5/ISlR6kPeSuHKThf76D2za5i2VnbHg0MN19jQq3WMorowR3kRghqt6azs3awogG+e7IRA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [linux] + libc: glibc - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + sass-embedded-unknown-all@1.104.1: + resolution: {integrity: sha512-RaMsYZB5mRioL4qhoI7T5mmNb2OunakbPTJW2cuu3MeIULnGoxo7Wd5QKFxeQvF7sSQL57RuaQ+q9pH+/pQ9Fg==} + os: ['!android', '!darwin', '!linux', '!win32'] - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + sass-embedded-win32-arm64@1.104.1: + resolution: {integrity: sha512-fS6DL7lcnTPclqGLF4xRt8egZlFY9cU23d57ufbWqaUbCFu9JTu0+8qB4jMxfx1la6byi3GoSTfbnNOLfWv8sw==} + engines: {node: '>=14.0.0'} + cpu: [arm64] + os: [win32] - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + sass-embedded-win32-x64@1.104.1: + resolution: {integrity: sha512-/c4N2A93Ckms6DuRFVftKYISuI1tyC8gmlVJ8WaWFzgCBN/Swq2rARJIBUNeuxlmxjmYXfd3+2f/u887K63wbA==} + engines: {node: '>=14.0.0'} + cpu: [x64] + os: [win32] - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} + sass-embedded@1.104.1: + resolution: {integrity: sha512-7LxbtPJ1MWKVbhzOnGx1sHTkHTcHVJ9hbgVsU29p/8gY1VeXt19fcJFr5xsx2f6zfrrR3FeOcYMt0uYDLAxpgw==} + engines: {node: '>=20.19.0'} + hasBin: true - readdirp@5.0.0: - resolution: {integrity: sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==} - engines: {node: '>= 20.19.0'} + sass@1.104.1: + resolution: {integrity: sha512-yDA+1aIG3EHgN4V/BvuhCvu61FF6hEd4e+9DxikUm9U0CAGuvdIZ/UYy7qbOxjhbbWQraoyLlMuzdRGOSV5Bmw==} + engines: {node: '>=20.19.0'} + hasBin: true - reduce-css-calc@2.1.8: - resolution: {integrity: sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==} + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} - reflect-metadata@0.2.2: - resolution: {integrity: sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==} + semver@7.8.5: + resolution: {integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==} + engines: {node: '>=10'} + hasBin: true - regenerate-unicode-properties@10.2.2: - resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} - engines: {node: '>=4'} + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} - regex-parser@2.3.1: - resolution: {integrity: sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ==} + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - regexpu-core@6.4.0: - resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} - engines: {node: '>=4'} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} - registry-auth-token@3.3.2: - resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} + slice-ansi@9.0.1: + resolution: {integrity: sha512-aBY19bn/XA+hKOKX0qL7Z0UfdBsbQvc9hn993U8ALUjzxCvDcuZqLoRXjGJrUARWAlwMnsRVD9sw2AFNOYvalA==} + engines: {node: '>=22'} - registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} - regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - - regjsparser@0.13.0: - resolution: {integrity: sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==} - hasBin: true + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + source-map@0.8.0: + resolution: {integrity: sha512-d8EqvL+k/SOXCreS/SUzg2ciyHqBBLcN/yuRjFsbvVhHTE2pgei7oAhmPM7kWFbkX6OSMQfUq4KbkF3au9lhYQ==} + engines: {node: '>= 12'} - resolve-url-loader@5.0.0: - resolution: {integrity: sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==} - engines: {node: '>=12'} + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - resolve-url@0.2.1: - resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==} - deprecated: https://github.com/lydell/resolve-url#deprecated + std-env@4.2.0: + resolution: {integrity: sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==} - resolve@1.22.11: - resolution: {integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==} - engines: {node: '>= 0.4'} - hasBin: true + stdin-discarder@0.3.2: + resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} + engines: {node: '>=18'} - restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} - retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} + string-width@8.3.0: + resolution: {integrity: sha512-ZbmZM0JCihQN91dWnxoipT2KOEyHqEyfRXUyjuRhW8b/xnqPDoq4gWEVApTVa9db2wN8mmoikgFBbjh71+cGeQ==} + engines: {node: '>=20'} - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} + strip-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} - reusify@1.1.0: - resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} - rgb-regex@1.0.1: - resolution: {integrity: sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==} + sync-child-process@1.0.2: + resolution: {integrity: sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==} + engines: {node: '>=16.0.0'} - rgba-regex@1.0.0: - resolution: {integrity: sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==} + sync-message-port@1.2.0: + resolution: {integrity: sha512-gAQ9qrUN/UCypHtGFbbe7Rc/f9bzO88IwrG8TDo/aMKAApKyD6E3W4Cm0EfhfBb6Z6SKt59tTCTfD+n1xmAvMg==} + engines: {node: '>=16.0.0'} - rolldown@1.0.0-beta.58: - resolution: {integrity: sha512-v1FCjMZCan7f+xGAHBi+mqiE4MlH7I+SXEHSQSJoMOGNNB2UYtvMiejsq9YuUOiZjNeUeV/a21nSFbrUR+4ZCQ==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true + tailwindcss@4.3.3: + resolution: {integrity: sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==} - rollup@4.55.3: - resolution: {integrity: sha512-y9yUpfQvetAjiDLtNMf1hL9NXchIJgWt6zIKeoB+tCd3npX08Eqfzg60V9DhIGVMtQ0AlMkFw5xa+AQ37zxnAA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} - router@2.2.0: - resolution: {integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==} - engines: {node: '>= 18'} + tinybench@6.1.4: + resolution: {integrity: sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==} + engines: {node: '>=20.0.0'} - run-applescript@7.1.0: - resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + tinyexec@1.3.0: + resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} engines: {node: '>=18'} - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rxjs@6.6.7: - resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} - engines: {npm: '>=2.0.0'} - - rxjs@7.8.2: - resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} + engines: {node: '>=12.0.0'} - sass-loader@16.0.6: - resolution: {integrity: sha512-sglGzId5gmlfxNs4gK2U3h7HlVRfx278YK6Ono5lwzuvi1jxig80YiuHkaDBVsYIKFhx8wN7XSCI0M2IDS/3qA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 - sass: ^1.3.0 - sass-embedded: '*' - webpack: ^5.0.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - node-sass: - optional: true - sass: - optional: true - sass-embedded: - optional: true - webpack: - optional: true + tldts-core@7.4.15: + resolution: {integrity: sha512-ERuv0p98XgSzmlSLJr8vDNxX+uATGInlN97V3R+JpYWaSqn5IG3ewWgCwczk4bkOpgth/o8Nt5FOi4B4w0n/1A==} - sass@1.97.1: - resolution: {integrity: sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A==} - engines: {node: '>=14.0.0'} + tldts@7.4.15: + resolution: {integrity: sha512-SJVBeHOxDbNoq14CvpAoA2mLEWdbldGK8nR+yumpjY5nrlZxOflcA7p1Qj1gbTGmbu9DY9qLj/bENSWhBzjxRQ==} hasBin: true - sax@1.2.4: - resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + tough-cookie@6.0.2: + resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==} + engines: {node: '>=16'} - sax@1.4.4: - resolution: {integrity: sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==} - engines: {node: '>=11.0.0'} + tr46@6.0.0: + resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==} + engines: {node: '>=20'} - schema-utils@4.3.3: - resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} - engines: {node: '>= 10.13.0'} + ts-api-utils@2.5.0: + resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' - select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} - semver-dsl@1.0.1: - resolution: {integrity: sha512-e8BOaTo007E3dMuQQTnPdalbKTABKNS7UxoBIDnwOqRa+QwMrCPjynB8zAlPF6xlqUfdLPPLIJ13hJNmhtq8Ng==} + typescript-eslint@8.69.0: + resolution: {integrity: sha512-B3MltX0VqjUBNEe3b3sSuiRbfa6XrfHFtBiPamjT5AsW/dfq+y+bc0wyuS9DxAS1LyzCxRp2+rxzpLUvqM2BvA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.1.0' - semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} + engines: {node: '>=14.17'} hasBin: true - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true + undici@8.11.2: + resolution: {integrity: sha512-u4UB2/IrKdU6lFxumHmmo1a3fCQO5tzQllRorfoRS63txhrB7xTpSn1PftwC4qEHkOaqP95fCWW4lJzwErwzhQ==} + engines: {node: '>=22.19.0'} - semver@7.7.3: - resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} - engines: {node: '>=10'} + update-browserslist-db@1.3.3: + resolution: {integrity: sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==} hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' - send@0.19.2: - resolution: {integrity: sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==} - engines: {node: '>= 0.8.0'} + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - send@1.2.1: - resolution: {integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==} - engines: {node: '>= 18'} + validate-npm-package-name@8.0.0: + resolution: {integrity: sha512-SCv6OOV6Xj2/3cXy3dGmADluJTNcL3o7hZAglNPTe+WYuEuvxgJzxPrSDLZhF+CwyQOubqgecjMmTJGMVLWjYQ==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + varint@6.0.0: + resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} - serve-handler@6.1.6: - resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==} + verkit@0.3.2: + resolution: {integrity: sha512-zj/ob3UsvJGN0whEAKFp53REA5X66hvffVqoCtVQAakJKnKlH+/PcOfMoFwIG/o4rElqLv/ycAFlx8ZlXUorCg==} + engines: {node: '>=18.12.0'} - serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} - - serve-static@1.16.3: - resolution: {integrity: sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==} - engines: {node: '>= 0.8.0'} - - serve-static@2.2.1: - resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} - engines: {node: '>= 18'} - - serve@14.2.5: - resolution: {integrity: sha512-Qn/qMkzCcMFVPb60E/hQy+iRLpiU8PamOfOSYoAHmmF+fFFmpPpqa6Oci2iWYpTdOUM3VF+TINud7CfbQnsZbA==} - engines: {node: '>= 14'} - hasBin: true - - setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shell-quote@1.8.3: - resolution: {integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==} - engines: {node: '>= 0.4'} - - side-channel-list@1.0.0: - resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} - engines: {node: '>= 0.4'} - - side-channel-map@1.0.1: - resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} - engines: {node: '>= 0.4'} - - side-channel-weakmap@1.0.2: - resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} - engines: {node: '>= 0.4'} - - side-channel@1.1.0: - resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} - engines: {node: '>= 0.4'} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - sigstore@4.1.0: - resolution: {integrity: sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA==} - engines: {node: ^20.17.0 || >=22.9.0} - - simple-swizzle@0.2.4: - resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} - - slice-ansi@7.1.2: - resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} - engines: {node: '>=18'} - - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} - - socks-proxy-agent@8.0.5: - resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} - engines: {node: '>= 14'} - - socks@2.8.7: - resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map-loader@5.0.0: - resolution: {integrity: sha512-k2Dur7CbSLcAH73sBcIkV5xjPV4SzqO1NJ7+XaQl8if3VODDUj3FNchNGpqgJSKbvUfJuhVdv8K2Eu8/TNl2eA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.72.1 - - source-map-resolve@0.5.3: - resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} - deprecated: See https://github.com/lydell/source-map-resolve#deprecated - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map-url@0.4.1: - resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==} - deprecated: See https://github.com/lydell/source-map-url#deprecated - - source-map@0.5.7: - resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} - engines: {node: '>=0.10.0'} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - source-map@0.7.6: - resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} - engines: {node: '>= 12'} - - spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} - - spdx-exceptions@2.5.0: - resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} - - spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - - spdx-license-ids@3.0.22: - resolution: {integrity: sha512-4PRT4nh1EImPbt2jASOKHX7PB7I+e4IWNLvkKFDxNhJlfjbYlleYQh285Z/3mPTHSAK/AvdMmw5BNNuYH8ShgQ==} - - spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} - - spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - ssri@13.0.0: - resolution: {integrity: sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng==} - engines: {node: ^20.17.0 || >=22.9.0} - - statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - - statuses@2.0.2: - resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} - engines: {node: '>= 0.8'} - - stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - - string-width@8.1.0: - resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} - engines: {node: '>=20'} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} - engines: {node: '>=12'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - - stylus@0.54.8: - resolution: {integrity: sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==} - hasBin: true - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - tailwindcss@2.2.19: - resolution: {integrity: sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw==} - engines: {node: '>=12.13.0'} - hasBin: true - peerDependencies: - autoprefixer: ^10.0.2 - postcss: ^8.0.9 - - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} - engines: {node: '>=6'} - - tar@7.5.6: - resolution: {integrity: sha512-xqUeu2JAIJpXyvskvU3uvQW8PAmHrtXp2KDuMJwQqW8Sqq0CaZBAQ+dKS3RBXVhU4wC5NjAdKrmh84241gO9cA==} - engines: {node: '>=18'} - - terser-webpack-plugin@5.3.16: - resolution: {integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - - terser@5.44.1: - resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} - engines: {node: '>=10'} - hasBin: true - - thingies@2.5.0: - resolution: {integrity: sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw==} - engines: {node: '>=10.18'} - peerDependencies: - tslib: ^2 - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - - tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} - - tmp@0.2.5: - resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} - engines: {node: '>=14.14'} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - tree-dump@1.1.0: - resolution: {integrity: sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==} - engines: {node: '>=10.0'} - peerDependencies: - tslib: '2' - - tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} - hasBin: true - - ts-node@8.3.0: - resolution: {integrity: sha512-dyNS/RqyVTDcmNM4NIBAeDMpsAdaQ+ojdf0GOLqE6nwJOgzEkdRNzJywhDfwnuvB10oa6NLVG1rUJQCpRN7qoQ==} - engines: {node: '>=4.2.0'} - hasBin: true - peerDependencies: - typescript: '>=2.0' - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tslint@6.1.3: - resolution: {integrity: sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==} - engines: {node: '>=4.8.0'} - deprecated: TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information. - hasBin: true - peerDependencies: - typescript: '>=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev' - - tsutils@2.29.0: - resolution: {integrity: sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==} - peerDependencies: - typescript: '>=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev' - - tuf-js@4.1.0: - resolution: {integrity: sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==} - engines: {node: ^20.17.0 || >=22.9.0} - - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - - type-is@2.0.1: - resolution: {integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==} - engines: {node: '>= 0.6'} - - typed-assert@1.0.9: - resolution: {integrity: sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==} - - typescript@4.1.6: - resolution: {integrity: sha512-pxnwLxeb/Z5SP80JDRzVjh58KsM6jZHRAOtTpS7sXLS4ogXNKC9ANxHHZqLLeVHZN35jCtI4JdmLLbLiC1kBow==} - engines: {node: '>=4.2.0'} - hasBin: true - - undici@7.18.2: - resolution: {integrity: sha512-y+8YjDFzWdQlSE9N5nzKMT3g4a5UBX1HKowfdXh0uvAnTaqqwqB92Jt4UXBAeKekDs5IaDKyJFR4X1gYVCgXcw==} - engines: {node: '>=20.18.1'} - - unicode-canonical-property-names-ecmascript@2.0.1: - resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} - engines: {node: '>=4'} - - unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - - unicode-match-property-value-ecmascript@2.2.1: - resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} - engines: {node: '>=4'} - - unicode-property-aliases-ecmascript@2.2.0: - resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} - engines: {node: '>=4'} - - unique-filename@5.0.0: - resolution: {integrity: sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg==} - engines: {node: ^20.17.0 || >=22.9.0} - - unique-slug@6.0.0: - resolution: {integrity: sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw==} - engines: {node: ^20.17.0 || >=22.9.0} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - update-browserslist-db@1.2.3: - resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - update-check@1.5.4: - resolution: {integrity: sha512-5YHsflzHP4t1G+8WGPlvKbJEbAJGCgw+Em+dGR1KmBUbr1J36SJBqlHLjR7oob7sco5hWHGQVcr9B2poIVDDTQ==} - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - urix@0.1.0: - resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==} - deprecated: Please see https://github.com/lydell/urix#deprecated - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} - - validate-npm-package-name@7.0.2: - resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} - engines: {node: ^20.17.0 || >=22.9.0} - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - vite@7.3.0: - resolution: {integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==} + vite@8.3.0: + resolution: {integrity: sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.7.1 + esbuild: ^0.27.0 || ^0.28.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' @@ -4655,12 +2743,14 @@ packages: peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -4676,5281 +2766,2526 @@ packages: yaml: optional: true - watchpack@2.5.0: - resolution: {integrity: sha512-e6vZvY6xboSwLz2GD36c16+O/2Z6fKvIf4pOXptw2rY9MVwE/TXc6RGqxD3I3x0a28lwBY7DE+76uTPSsBrrCA==} - engines: {node: '>=10.13.0'} - - watchpack@2.5.1: - resolution: {integrity: sha512-Zn5uXdcFNIA1+1Ei5McRd+iRzfhENPCe7LeABkJtNulSxjma+l7ltNx55BWZkRlwRnpOgHqxnjyaDgJnNXnqzg==} - engines: {node: '>=10.13.0'} - - wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} - - weak-lru-cache@1.2.2: - resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} - - webpack-dev-middleware@7.4.5: - resolution: {integrity: sha512-uxQ6YqGdE4hgDKNf7hUiPXOdtkXvBJXrfEGYSx7P7LC8hnUYGK70X6xQXUvXeNyBDDcsiQXpG2m3G9vxowaEuA==} - engines: {node: '>= 18.12.0'} - peerDependencies: - webpack: ^5.0.0 - peerDependenciesMeta: - webpack: - optional: true - - webpack-dev-server@5.2.2: - resolution: {integrity: sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==} - engines: {node: '>= 18.12.0'} + vitest@5.0.1: + resolution: {integrity: sha512-iA95lQbKEkvrtTkdAgnWbXfbipWiiWe/hDl2P5tMi6WFwD76G0NxXAGp/M9EOcYupeGJRr6wppMc7CoA41TQjg==} + engines: {node: ^22.12.0 || ^24.0.0 || >=26.0.0} hasBin: true peerDependencies: - webpack: ^5.0.0 - webpack-cli: '*' + '@edge-runtime/vm': '*' + '@opentelemetry/api': ^1.9.0 + '@types/node': ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 5.0.1 + '@vitest/browser-preview': 5.0.1 + '@vitest/browser-webdriverio': ^5.0.0-beta.5 || >=5.0.0 + '@vitest/coverage-istanbul': 5.0.1 + '@vitest/coverage-v8': 5.0.1 + '@vitest/ui': 5.0.1 + happy-dom: '*' + jsdom: '*' + vite: ^6.4.0 || ^7.0.0 || ^8.0.0 peerDependenciesMeta: - webpack: + '@edge-runtime/vm': optional: true - webpack-cli: + '@opentelemetry/api': optional: true - - webpack-merge@6.0.1: - resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} - engines: {node: '>=18.0.0'} - - webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} - engines: {node: '>=10.13.0'} - - webpack-subresource-integrity@5.1.0: - resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} - engines: {node: '>= 12'} - peerDependencies: - html-webpack-plugin: '>= 5.0.0-beta.1 < 6' - webpack: ^5.12.0 - peerDependenciesMeta: - html-webpack-plugin: + '@types/node': optional: true - - webpack@5.104.1: - resolution: {integrity: sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: + '@vitest/browser-playwright': optional: true - - websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - - websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - which@6.0.0: - resolution: {integrity: sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg==} - engines: {node: ^20.17.0 || >=22.9.0} - hasBin: true - - widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} - - wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - - wrap-ansi@6.2.0: - resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} - engines: {node: '>=8'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} - engines: {node: '>=18'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@8.19.0: - resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: + '@vitest/browser-preview': optional: true - utf-8-validate: + '@vitest/browser-webdriverio': + optional: true + '@vitest/coverage-istanbul': + optional: true + '@vitest/coverage-v8': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: optional: true - wsl-utils@0.1.0: - resolution: {integrity: sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw==} - engines: {node: '>=18'} - - wsl-utils@0.3.1: - resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} - engines: {node: '>=20'} - - xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yallist@5.0.0: - resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} - engines: {node: '>=18'} - - yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - - yargs-parser@22.0.0: - resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} - - yargs@18.0.0: - resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} - - yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - yoctocolors-cjs@2.1.3: - resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} - engines: {node: '>=18'} - - yoctocolors@2.1.2: - resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} - engines: {node: '>=18'} - - zod-to-json-schema@3.25.1: - resolution: {integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==} - peerDependencies: - zod: ^3.25 || ^4 - - zod@4.3.5: - resolution: {integrity: sha512-k7Nwx6vuWx1IJ9Bjuf4Zt1PEllcwe7cls3VNzm4CQ1/hgtFUK2bRNG3rvnpPUhFjmqJKAKtjV576KnUkHocg/g==} - - zone.js@0.10.3: - resolution: {integrity: sha512-LXVLVEq0NNOqK/fLJo3d0kfzd4sxwn2/h67/02pjCjfKDxgx1i9QqpvtHD8CrBnSSwMw5+dy11O7FRX5mkO7Cg==} - - zone.js@0.11.8: - resolution: {integrity: sha512-82bctBg2hKcEJ21humWIkXRlLBBmrc3nN7DFh5LGGhcyycO2S7FN8NmdvlcKaGFDNVL4/9kFLmwmInTavdJERA==} - -snapshots: - - '@algolia/abtesting@1.12.2': - dependencies: - '@algolia/client-common': 5.46.2 - '@algolia/requester-browser-xhr': 5.46.2 - '@algolia/requester-fetch': 5.46.2 - '@algolia/requester-node-http': 5.46.2 - - '@algolia/client-abtesting@5.46.2': - dependencies: - '@algolia/client-common': 5.46.2 - '@algolia/requester-browser-xhr': 5.46.2 - '@algolia/requester-fetch': 5.46.2 - '@algolia/requester-node-http': 5.46.2 - - '@algolia/client-analytics@5.46.2': - dependencies: - '@algolia/client-common': 5.46.2 - '@algolia/requester-browser-xhr': 5.46.2 - '@algolia/requester-fetch': 5.46.2 - '@algolia/requester-node-http': 5.46.2 - - '@algolia/client-common@5.46.2': {} - - '@algolia/client-insights@5.46.2': - dependencies: - '@algolia/client-common': 5.46.2 - '@algolia/requester-browser-xhr': 5.46.2 - '@algolia/requester-fetch': 5.46.2 - '@algolia/requester-node-http': 5.46.2 - - '@algolia/client-personalization@5.46.2': - dependencies: - '@algolia/client-common': 5.46.2 - '@algolia/requester-browser-xhr': 5.46.2 - '@algolia/requester-fetch': 5.46.2 - '@algolia/requester-node-http': 5.46.2 - - '@algolia/client-query-suggestions@5.46.2': - dependencies: - '@algolia/client-common': 5.46.2 - '@algolia/requester-browser-xhr': 5.46.2 - '@algolia/requester-fetch': 5.46.2 - '@algolia/requester-node-http': 5.46.2 - - '@algolia/client-search@5.46.2': - dependencies: - '@algolia/client-common': 5.46.2 - '@algolia/requester-browser-xhr': 5.46.2 - '@algolia/requester-fetch': 5.46.2 - '@algolia/requester-node-http': 5.46.2 - - '@algolia/ingestion@1.46.2': - dependencies: - '@algolia/client-common': 5.46.2 - '@algolia/requester-browser-xhr': 5.46.2 - '@algolia/requester-fetch': 5.46.2 - '@algolia/requester-node-http': 5.46.2 - - '@algolia/monitoring@1.46.2': - dependencies: - '@algolia/client-common': 5.46.2 - '@algolia/requester-browser-xhr': 5.46.2 - '@algolia/requester-fetch': 5.46.2 - '@algolia/requester-node-http': 5.46.2 - - '@algolia/recommend@5.46.2': - dependencies: - '@algolia/client-common': 5.46.2 - '@algolia/requester-browser-xhr': 5.46.2 - '@algolia/requester-fetch': 5.46.2 - '@algolia/requester-node-http': 5.46.2 - - '@algolia/requester-browser-xhr@5.46.2': - dependencies: - '@algolia/client-common': 5.46.2 - - '@algolia/requester-fetch@5.46.2': - dependencies: - '@algolia/client-common': 5.46.2 - - '@algolia/requester-node-http@5.46.2': - dependencies: - '@algolia/client-common': 5.46.2 - - '@ampproject/remapping@2.3.0': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@angular-devkit/architect@0.2101.1(chokidar@5.0.0)': - dependencies: - '@angular-devkit/core': 21.1.1(chokidar@5.0.0) - rxjs: 7.8.2 - transitivePeerDependencies: - - chokidar - - '@angular-devkit/build-angular@21.1.1(@angular/compiler-cli@21.1.1(@angular/compiler@21.1.1)(typescript@4.1.6))(@angular/compiler@21.1.1)(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(@angular/platform-browser@21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@types/node@12.20.55)(chokidar@5.0.0)(jiti@2.6.1)(stylus@0.54.8)(tailwindcss@2.2.19(autoprefixer@10.4.23(postcss@8.5.6))(postcss@8.5.6)(ts-node@8.3.0(typescript@4.1.6)))(typescript@4.1.6)': - dependencies: - '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2101.1(chokidar@5.0.0) - '@angular-devkit/build-webpack': 0.2101.1(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.104.1))(webpack@5.104.1(esbuild@0.27.2)) - '@angular-devkit/core': 21.1.1(chokidar@5.0.0) - '@angular/build': 21.1.1(@angular/compiler-cli@21.1.1(@angular/compiler@21.1.1)(typescript@4.1.6))(@angular/compiler@21.1.1)(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(@angular/platform-browser@21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@types/node@12.20.55)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(stylus@0.54.8)(tailwindcss@2.2.19(autoprefixer@10.4.23(postcss@8.5.6))(postcss@8.5.6)(ts-node@8.3.0(typescript@4.1.6)))(terser@5.44.1)(tslib@2.8.1)(typescript@4.1.6) - '@angular/compiler-cli': 21.1.1(@angular/compiler@21.1.1)(typescript@4.1.6) - '@babel/core': 7.28.5 - '@babel/generator': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-runtime': 7.28.5(@babel/core@7.28.5) - '@babel/preset-env': 7.28.5(@babel/core@7.28.5) - '@babel/runtime': 7.28.4 - '@discoveryjs/json-ext': 0.6.3 - '@ngtools/webpack': 21.1.1(@angular/compiler-cli@21.1.1(@angular/compiler@21.1.1)(typescript@4.1.6))(typescript@4.1.6)(webpack@5.104.1(esbuild@0.27.2)) - ansi-colors: 4.1.3 - autoprefixer: 10.4.23(postcss@8.5.6) - babel-loader: 10.0.0(@babel/core@7.28.5)(webpack@5.104.1(esbuild@0.27.2)) - browserslist: 4.28.1 - copy-webpack-plugin: 13.0.1(webpack@5.104.1(esbuild@0.27.2)) - css-loader: 7.1.2(webpack@5.104.1(esbuild@0.27.2)) - esbuild-wasm: 0.27.2 - http-proxy-middleware: 3.0.5 - istanbul-lib-instrument: 6.0.3 - jsonc-parser: 3.3.1 - karma-source-map-support: 1.4.0 - less: 4.4.2 - less-loader: 12.3.0(less@4.4.2)(webpack@5.104.1(esbuild@0.27.2)) - license-webpack-plugin: 4.0.2(webpack@5.104.1(esbuild@0.27.2)) - loader-utils: 3.3.1 - mini-css-extract-plugin: 2.9.4(webpack@5.104.1(esbuild@0.27.2)) - open: 11.0.0 - ora: 9.0.0 - picomatch: 4.0.3 - piscina: 5.1.4 - postcss: 8.5.6 - postcss-loader: 8.2.0(postcss@8.5.6)(typescript@4.1.6)(webpack@5.104.1(esbuild@0.27.2)) - resolve-url-loader: 5.0.0 - rxjs: 7.8.2 - sass: 1.97.1 - sass-loader: 16.0.6(sass@1.97.1)(webpack@5.104.1(esbuild@0.27.2)) - semver: 7.7.3 - source-map-loader: 5.0.0(webpack@5.104.1(esbuild@0.27.2)) - source-map-support: 0.5.21 - terser: 5.44.1 - tinyglobby: 0.2.15 - tree-kill: 1.2.2 - tslib: 2.8.1 - typescript: 4.1.6 - webpack: 5.104.1(esbuild@0.27.2) - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.104.1) - webpack-dev-server: 5.2.2(tslib@2.8.1)(webpack@5.104.1) - webpack-merge: 6.0.1 - webpack-subresource-integrity: 5.1.0(webpack@5.104.1(esbuild@0.27.2)) - optionalDependencies: - '@angular/core': 21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8) - '@angular/platform-browser': 21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)) - esbuild: 0.27.2 - tailwindcss: 2.2.19(autoprefixer@10.4.23(postcss@8.5.6))(postcss@8.5.6)(ts-node@8.3.0(typescript@4.1.6)) - transitivePeerDependencies: - - '@angular/compiler' - - '@rspack/core' - - '@swc/core' - - '@types/node' - - bufferutil - - chokidar - - debug - - html-webpack-plugin - - jiti - - lightningcss - - node-sass - - sass-embedded - - stylus - - sugarss - - supports-color - - tsx - - uglify-js - - utf-8-validate - - vitest - - webpack-cli - - yaml - - '@angular-devkit/build-webpack@0.2101.1(chokidar@5.0.0)(webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.104.1))(webpack@5.104.1(esbuild@0.27.2))': - dependencies: - '@angular-devkit/architect': 0.2101.1(chokidar@5.0.0) - rxjs: 7.8.2 - webpack: 5.104.1(esbuild@0.27.2) - webpack-dev-server: 5.2.2(tslib@2.8.1)(webpack@5.104.1) - transitivePeerDependencies: - - chokidar - - '@angular-devkit/core@21.1.1(chokidar@5.0.0)': - dependencies: - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) - jsonc-parser: 3.3.1 - picomatch: 4.0.3 - rxjs: 7.8.2 - source-map: 0.7.6 - optionalDependencies: - chokidar: 5.0.0 - - '@angular-devkit/schematics@21.1.1(chokidar@5.0.0)': - dependencies: - '@angular-devkit/core': 21.1.1(chokidar@5.0.0) - jsonc-parser: 3.3.1 - magic-string: 0.30.21 - ora: 9.0.0 - rxjs: 7.8.2 - transitivePeerDependencies: - - chokidar - - '@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))': - dependencies: - '@angular/core': 21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8) - tslib: 2.8.1 - - '@angular/build@21.1.1(@angular/compiler-cli@21.1.1(@angular/compiler@21.1.1)(typescript@4.1.6))(@angular/compiler@21.1.1)(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(@angular/platform-browser@21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@types/node@12.20.55)(chokidar@5.0.0)(jiti@2.6.1)(less@4.4.2)(postcss@8.5.6)(stylus@0.54.8)(tailwindcss@2.2.19(autoprefixer@10.4.23(postcss@8.5.6))(postcss@8.5.6)(ts-node@8.3.0(typescript@4.1.6)))(terser@5.44.1)(tslib@2.8.1)(typescript@4.1.6)': - dependencies: - '@ampproject/remapping': 2.3.0 - '@angular-devkit/architect': 0.2101.1(chokidar@5.0.0) - '@angular/compiler': 21.1.1 - '@angular/compiler-cli': 21.1.1(@angular/compiler@21.1.1)(typescript@4.1.6) - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-split-export-declaration': 7.24.7 - '@inquirer/confirm': 5.1.21(@types/node@12.20.55) - '@vitejs/plugin-basic-ssl': 2.1.0(vite@7.3.0(@types/node@12.20.55)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(stylus@0.54.8)(terser@5.44.1)) - beasties: 0.3.5 - browserslist: 4.28.1 - esbuild: 0.27.2 - https-proxy-agent: 7.0.6 - istanbul-lib-instrument: 6.0.3 - jsonc-parser: 3.3.1 - listr2: 9.0.5 - magic-string: 0.30.21 - mrmime: 2.0.1 - parse5-html-rewriting-stream: 8.0.0 - picomatch: 4.0.3 - piscina: 5.1.4 - rolldown: 1.0.0-beta.58 - sass: 1.97.1 - semver: 7.7.3 - source-map-support: 0.5.21 - tinyglobby: 0.2.15 - tslib: 2.8.1 - typescript: 4.1.6 - undici: 7.18.2 - vite: 7.3.0(@types/node@12.20.55)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(stylus@0.54.8)(terser@5.44.1) - watchpack: 2.5.0 - optionalDependencies: - '@angular/core': 21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8) - '@angular/platform-browser': 21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)) - less: 4.4.2 - lmdb: 3.4.4 - postcss: 8.5.6 - tailwindcss: 2.2.19(autoprefixer@10.4.23(postcss@8.5.6))(postcss@8.5.6)(ts-node@8.3.0(typescript@4.1.6)) - transitivePeerDependencies: - - '@types/node' - - chokidar - - jiti - - lightningcss - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - '@angular/cli@21.1.1(@types/node@12.20.55)(chokidar@5.0.0)(hono@4.11.5)': - dependencies: - '@angular-devkit/architect': 0.2101.1(chokidar@5.0.0) - '@angular-devkit/core': 21.1.1(chokidar@5.0.0) - '@angular-devkit/schematics': 21.1.1(chokidar@5.0.0) - '@inquirer/prompts': 7.10.1(@types/node@12.20.55) - '@listr2/prompt-adapter-inquirer': 3.0.5(@inquirer/prompts@7.10.1(@types/node@12.20.55))(@types/node@12.20.55)(listr2@9.0.5) - '@modelcontextprotocol/sdk': 1.25.2(hono@4.11.5)(zod@4.3.5) - '@schematics/angular': 21.1.1(chokidar@5.0.0) - '@yarnpkg/lockfile': 1.1.0 - algoliasearch: 5.46.2 - ini: 6.0.0 - jsonc-parser: 3.3.1 - listr2: 9.0.5 - npm-package-arg: 13.0.2 - pacote: 21.0.4 - parse5-html-rewriting-stream: 8.0.0 - resolve: 1.22.11 - semver: 7.7.3 - yargs: 18.0.0 - zod: 4.3.5 - transitivePeerDependencies: - - '@cfworker/json-schema' - - '@types/node' - - chokidar - - hono - - supports-color - - '@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7)': - dependencies: - '@angular/core': 21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8) - rxjs: 6.6.7 - tslib: 2.8.1 - - '@angular/compiler-cli@21.1.1(@angular/compiler@21.1.1)(typescript@4.1.6)': - dependencies: - '@angular/compiler': 21.1.1 - '@babel/core': 7.28.5 - '@jridgewell/sourcemap-codec': 1.5.5 - chokidar: 5.0.0 - convert-source-map: 1.9.0 - reflect-metadata: 0.2.2 - semver: 7.7.3 - tslib: 2.8.1 - yargs: 18.0.0 - optionalDependencies: - typescript: 4.1.6 - transitivePeerDependencies: - - supports-color - - '@angular/compiler@21.1.1': - dependencies: - tslib: 2.8.1 - - '@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)': - dependencies: - rxjs: 6.6.7 - tslib: 2.8.1 - optionalDependencies: - '@angular/compiler': 21.1.1 - zone.js: 0.11.8 - - '@angular/forms@21.1.1(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(@angular/platform-browser@21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(rxjs@6.6.7)': - dependencies: - '@angular/common': 21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7) - '@angular/core': 21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8) - '@angular/platform-browser': 21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)) - '@standard-schema/spec': 1.1.0 - rxjs: 6.6.7 - tslib: 2.8.1 - - '@angular/platform-browser-dynamic@21.1.1(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/compiler@21.1.1)(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(@angular/platform-browser@21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))': - dependencies: - '@angular/common': 21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7) - '@angular/compiler': 21.1.1 - '@angular/core': 21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8) - '@angular/platform-browser': 21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)) - tslib: 2.8.1 - - '@angular/platform-browser@21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))': - dependencies: - '@angular/common': 21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7) - '@angular/core': 21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8) - tslib: 2.8.1 - optionalDependencies: - '@angular/animations': 21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)) - - '@angular/router@21.1.1(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(@angular/platform-browser@21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(rxjs@6.6.7)': - dependencies: - '@angular/common': 21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7) - '@angular/core': 21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8) - '@angular/platform-browser': 21.1.1(@angular/animations@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)))(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)) - rxjs: 6.6.7 - tslib: 2.8.1 - - '@babel/code-frame@7.28.6': - dependencies: - '@babel/helper-validator-identifier': 7.28.5 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.28.6': {} - - '@babel/core@7.28.5': - dependencies: - '@babel/code-frame': 7.28.6 - '@babel/generator': 7.28.6 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) - '@babel/helpers': 7.28.6 - '@babel/parser': 7.28.6 - '@babel/template': 7.28.6 - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.3 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.28.5': - dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/generator@7.28.6': - dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/helper-annotate-as-pure@7.27.3': - dependencies: - '@babel/types': 7.28.6 - - '@babel/helper-compilation-targets@7.28.6': - dependencies: - '@babel/compat-data': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.5) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.6 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - regexpu-core: 6.4.0 - semver: 6.3.1 - - '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - debug: 4.4.3 - lodash.debounce: 4.0.8 - resolve: 1.22.11 - transitivePeerDependencies: - - supports-color - - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-member-expression-to-functions@7.28.5': - dependencies: - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.28.6': - dependencies: - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-optimise-call-expression@7.27.1': - dependencies: - '@babel/types': 7.28.6 - - '@babel/helper-plugin-utils@7.28.6': {} - - '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-wrap-function': 7.28.6 - '@babel/traverse': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-replace-supers@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-member-expression-to-functions': 7.28.5 - '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/traverse': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - dependencies: - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/helper-split-export-declaration@7.24.7': - dependencies: - '@babel/types': 7.28.6 - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.28.5': {} - - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helper-wrap-function@7.28.6': - dependencies: - '@babel/template': 7.28.6 - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/helpers@7.28.6': - dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.28.6 - - '@babel/parser@7.28.6': - dependencies: - '@babel/types': 7.28.6 - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - - '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) - '@babel/traverse': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-classes@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.5) - '@babel/traverse': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/template': 7.28.6 - - '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/traverse': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-commonjs@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-transforms': 7.28.6(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) - '@babel/traverse': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-regenerator@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-runtime@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-module-imports': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-spread@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.5) - '@babel/helper-plugin-utils': 7.28.6 - - '@babel/preset-env@7.28.5(@babel/core@7.28.5)': - dependencies: - '@babel/compat-data': 7.28.6 - '@babel/core': 7.28.5 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5) - '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.5) - '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.5) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-explicit-resource-management': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-modules-systemjs': 7.28.5(@babel/core@7.28.5) - '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.5) - '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-regenerator': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.5) - '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.28.5) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.5) - babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5) - babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) - babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) - core-js-compat: 3.48.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5)': - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/types': 7.28.6 - esutils: 2.0.3 - - '@babel/runtime@7.28.4': {} - - '@babel/template@7.28.6': - dependencies: - '@babel/code-frame': 7.28.6 - '@babel/parser': 7.28.6 - '@babel/types': 7.28.6 - - '@babel/traverse@7.28.6': - dependencies: - '@babel/code-frame': 7.28.6 - '@babel/generator': 7.28.6 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.6 - '@babel/template': 7.28.6 - '@babel/types': 7.28.6 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.28.6': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - - '@discoveryjs/json-ext@0.6.3': {} - - '@emnapi/core@1.8.1': - dependencies: - '@emnapi/wasi-threads': 1.1.0 - tslib: 2.8.1 - optional: true - - '@emnapi/runtime@1.8.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@emnapi/wasi-threads@1.1.0': - dependencies: - tslib: 2.8.1 - optional: true - - '@esbuild/aix-ppc64@0.27.2': - optional: true - - '@esbuild/android-arm64@0.27.2': - optional: true - - '@esbuild/android-arm@0.27.2': - optional: true - - '@esbuild/android-x64@0.27.2': - optional: true - - '@esbuild/darwin-arm64@0.27.2': - optional: true - - '@esbuild/darwin-x64@0.27.2': - optional: true - - '@esbuild/freebsd-arm64@0.27.2': - optional: true - - '@esbuild/freebsd-x64@0.27.2': - optional: true - - '@esbuild/linux-arm64@0.27.2': - optional: true - - '@esbuild/linux-arm@0.27.2': - optional: true - - '@esbuild/linux-ia32@0.27.2': - optional: true - - '@esbuild/linux-loong64@0.27.2': - optional: true - - '@esbuild/linux-mips64el@0.27.2': - optional: true - - '@esbuild/linux-ppc64@0.27.2': - optional: true - - '@esbuild/linux-riscv64@0.27.2': - optional: true - - '@esbuild/linux-s390x@0.27.2': - optional: true - - '@esbuild/linux-x64@0.27.2': - optional: true - - '@esbuild/netbsd-arm64@0.27.2': - optional: true - - '@esbuild/netbsd-x64@0.27.2': - optional: true - - '@esbuild/openbsd-arm64@0.27.2': - optional: true - - '@esbuild/openbsd-x64@0.27.2': - optional: true - - '@esbuild/openharmony-arm64@0.27.2': - optional: true - - '@esbuild/sunos-x64@0.27.2': - optional: true - - '@esbuild/win32-arm64@0.27.2': - optional: true - - '@esbuild/win32-ia32@0.27.2': - optional: true - - '@esbuild/win32-x64@0.27.2': - optional: true - - '@hono/node-server@1.19.9(hono@4.11.5)': - dependencies: - hono: 4.11.5 - - '@inquirer/ansi@1.0.2': {} - - '@inquirer/checkbox@4.3.2(@types/node@12.20.55)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@12.20.55) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@12.20.55) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 12.20.55 - - '@inquirer/confirm@5.1.21(@types/node@12.20.55)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@12.20.55) - '@inquirer/type': 3.0.10(@types/node@12.20.55) - optionalDependencies: - '@types/node': 12.20.55 - - '@inquirer/core@10.3.2(@types/node@12.20.55)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@12.20.55) - 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 - optionalDependencies: - '@types/node': 12.20.55 - - '@inquirer/editor@4.2.23(@types/node@12.20.55)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@12.20.55) - '@inquirer/external-editor': 1.0.3(@types/node@12.20.55) - '@inquirer/type': 3.0.10(@types/node@12.20.55) - optionalDependencies: - '@types/node': 12.20.55 - - '@inquirer/expand@4.0.23(@types/node@12.20.55)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@12.20.55) - '@inquirer/type': 3.0.10(@types/node@12.20.55) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 12.20.55 - - '@inquirer/external-editor@1.0.3(@types/node@12.20.55)': - dependencies: - chardet: 2.1.1 - iconv-lite: 0.7.2 - optionalDependencies: - '@types/node': 12.20.55 - - '@inquirer/figures@1.0.15': {} - - '@inquirer/input@4.3.1(@types/node@12.20.55)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@12.20.55) - '@inquirer/type': 3.0.10(@types/node@12.20.55) - optionalDependencies: - '@types/node': 12.20.55 - - '@inquirer/number@3.0.23(@types/node@12.20.55)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@12.20.55) - '@inquirer/type': 3.0.10(@types/node@12.20.55) - optionalDependencies: - '@types/node': 12.20.55 - - '@inquirer/password@4.0.23(@types/node@12.20.55)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@12.20.55) - '@inquirer/type': 3.0.10(@types/node@12.20.55) - optionalDependencies: - '@types/node': 12.20.55 - - '@inquirer/prompts@7.10.1(@types/node@12.20.55)': - dependencies: - '@inquirer/checkbox': 4.3.2(@types/node@12.20.55) - '@inquirer/confirm': 5.1.21(@types/node@12.20.55) - '@inquirer/editor': 4.2.23(@types/node@12.20.55) - '@inquirer/expand': 4.0.23(@types/node@12.20.55) - '@inquirer/input': 4.3.1(@types/node@12.20.55) - '@inquirer/number': 3.0.23(@types/node@12.20.55) - '@inquirer/password': 4.0.23(@types/node@12.20.55) - '@inquirer/rawlist': 4.1.11(@types/node@12.20.55) - '@inquirer/search': 3.2.2(@types/node@12.20.55) - '@inquirer/select': 4.4.2(@types/node@12.20.55) - optionalDependencies: - '@types/node': 12.20.55 - - '@inquirer/rawlist@4.1.11(@types/node@12.20.55)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@12.20.55) - '@inquirer/type': 3.0.10(@types/node@12.20.55) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 12.20.55 - - '@inquirer/search@3.2.2(@types/node@12.20.55)': - dependencies: - '@inquirer/core': 10.3.2(@types/node@12.20.55) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@12.20.55) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 12.20.55 - - '@inquirer/select@4.4.2(@types/node@12.20.55)': - dependencies: - '@inquirer/ansi': 1.0.2 - '@inquirer/core': 10.3.2(@types/node@12.20.55) - '@inquirer/figures': 1.0.15 - '@inquirer/type': 3.0.10(@types/node@12.20.55) - yoctocolors-cjs: 2.1.3 - optionalDependencies: - '@types/node': 12.20.55 - - '@inquirer/type@3.0.10(@types/node@12.20.55)': - optionalDependencies: - '@types/node': 12.20.55 - - '@isaacs/balanced-match@4.0.1': {} - - '@isaacs/brace-expansion@5.0.0': - dependencies: - '@isaacs/balanced-match': 4.0.1 - - '@isaacs/fs-minipass@4.0.1': - dependencies: - minipass: 7.1.2 - - '@istanbuljs/schema@0.1.3': {} - - '@jridgewell/gen-mapping@0.3.13': - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/remapping@2.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/source-map@0.3.11': - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - - '@jridgewell/sourcemap-codec@1.5.5': {} - - '@jridgewell/trace-mapping@0.3.31': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@jsonjoy.com/base64@1.1.2(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/base64@17.65.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/buffers@1.2.1(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/buffers@17.65.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/codegen@1.0.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/codegen@17.65.0(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/fs-core@4.56.9(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-node-builtins': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.9(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-fsa@4.56.9(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-core': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.9(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-node-builtins@4.56.9(tslib@2.8.1)': - dependencies: - tslib: 2.8.1 - - '@jsonjoy.com/fs-node-to-fsa@4.56.9(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-fsa': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.9(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-node-utils@4.56.9(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-node-builtins': 4.56.9(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-node@4.56.9(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-core': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.56.9(tslib@2.8.1) - glob-to-regex.js: 1.2.0(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-print@4.56.9(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/fs-node-utils': 4.56.9(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/fs-snapshot@4.56.9(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/json-pack': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/json-pack@1.21.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/base64': 1.1.2(tslib@2.8.1) - '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) - '@jsonjoy.com/json-pointer': 1.0.2(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - hyperdyperid: 1.2.0 - thingies: 2.5.0(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/json-pack@17.65.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/base64': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/json-pointer': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) - hyperdyperid: 1.2.0 - thingies: 2.5.0(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/json-pointer@1.0.2(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/json-pointer@17.65.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/util': 17.65.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/util@1.9.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/buffers': 1.2.1(tslib@2.8.1) - '@jsonjoy.com/codegen': 1.0.0(tslib@2.8.1) - tslib: 2.8.1 - - '@jsonjoy.com/util@17.65.0(tslib@2.8.1)': - dependencies: - '@jsonjoy.com/buffers': 17.65.0(tslib@2.8.1) - '@jsonjoy.com/codegen': 17.65.0(tslib@2.8.1) - tslib: 2.8.1 - - '@leichtgewicht/ip-codec@2.0.5': {} - - '@listr2/prompt-adapter-inquirer@3.0.5(@inquirer/prompts@7.10.1(@types/node@12.20.55))(@types/node@12.20.55)(listr2@9.0.5)': - dependencies: - '@inquirer/prompts': 7.10.1(@types/node@12.20.55) - '@inquirer/type': 3.0.10(@types/node@12.20.55) - listr2: 9.0.5 - transitivePeerDependencies: - - '@types/node' - - '@lmdb/lmdb-darwin-arm64@3.4.4': - optional: true - - '@lmdb/lmdb-darwin-x64@3.4.4': - optional: true - - '@lmdb/lmdb-linux-arm64@3.4.4': - optional: true - - '@lmdb/lmdb-linux-arm@3.4.4': - optional: true - - '@lmdb/lmdb-linux-x64@3.4.4': - optional: true - - '@lmdb/lmdb-win32-arm64@3.4.4': - optional: true - - '@lmdb/lmdb-win32-x64@3.4.4': - optional: true - - '@modelcontextprotocol/sdk@1.25.2(hono@4.11.5)(zod@4.3.5)': - dependencies: - '@hono/node-server': 1.19.9(hono@4.11.5) - ajv: 8.17.1 - ajv-formats: 3.0.1(ajv@8.17.1) - content-type: 1.0.5 - cors: 2.8.5 - cross-spawn: 7.0.6 - eventsource: 3.0.7 - eventsource-parser: 3.0.6 - express: 5.2.1 - express-rate-limit: 7.5.1(express@5.2.1) - jose: 6.1.3 - json-schema-typed: 8.0.2 - pkce-challenge: 5.0.1 - raw-body: 3.0.2 - zod: 4.3.5 - zod-to-json-schema: 3.25.1(zod@4.3.5) - transitivePeerDependencies: - - hono - - supports-color - - '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': - optional: true - - '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': - optional: true - - '@napi-rs/nice-android-arm-eabi@1.1.1': - optional: true - - '@napi-rs/nice-android-arm64@1.1.1': - optional: true - - '@napi-rs/nice-darwin-arm64@1.1.1': - optional: true - - '@napi-rs/nice-darwin-x64@1.1.1': - optional: true - - '@napi-rs/nice-freebsd-x64@1.1.1': - optional: true - - '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': - optional: true - - '@napi-rs/nice-linux-arm64-gnu@1.1.1': - optional: true - - '@napi-rs/nice-linux-arm64-musl@1.1.1': - optional: true - - '@napi-rs/nice-linux-ppc64-gnu@1.1.1': - optional: true - - '@napi-rs/nice-linux-riscv64-gnu@1.1.1': - optional: true - - '@napi-rs/nice-linux-s390x-gnu@1.1.1': - optional: true - - '@napi-rs/nice-linux-x64-gnu@1.1.1': - optional: true - - '@napi-rs/nice-linux-x64-musl@1.1.1': - optional: true - - '@napi-rs/nice-openharmony-arm64@1.1.1': - optional: true - - '@napi-rs/nice-win32-arm64-msvc@1.1.1': - optional: true - - '@napi-rs/nice-win32-ia32-msvc@1.1.1': - optional: true - - '@napi-rs/nice-win32-x64-msvc@1.1.1': - optional: true - - '@napi-rs/nice@1.1.1': - 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 - optional: true - - '@napi-rs/wasm-runtime@1.1.1': - dependencies: - '@emnapi/core': 1.8.1 - '@emnapi/runtime': 1.8.1 - '@tybys/wasm-util': 0.10.1 - optional: true - - '@ngtools/webpack@21.1.1(@angular/compiler-cli@21.1.1(@angular/compiler@21.1.1)(typescript@4.1.6))(typescript@4.1.6)(webpack@5.104.1(esbuild@0.27.2))': - dependencies: - '@angular/compiler-cli': 21.1.1(@angular/compiler@21.1.1)(typescript@4.1.6) - typescript: 4.1.6 - webpack: 5.104.1(esbuild@0.27.2) - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 - - '@npmcli/agent@4.0.0': - dependencies: - agent-base: 7.1.4 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - lru-cache: 11.2.4 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - - '@npmcli/fs@5.0.0': - dependencies: - semver: 7.7.3 - - '@npmcli/git@7.0.1': - dependencies: - '@npmcli/promise-spawn': 9.0.1 - ini: 6.0.0 - lru-cache: 11.2.4 - npm-pick-manifest: 11.0.3 - proc-log: 6.1.0 - promise-retry: 2.0.1 - semver: 7.7.3 - which: 6.0.0 - - '@npmcli/installed-package-contents@4.0.0': - dependencies: - npm-bundled: 5.0.0 - npm-normalize-package-bin: 5.0.0 - - '@npmcli/node-gyp@5.0.0': {} - - '@npmcli/package-json@7.0.4': - dependencies: - '@npmcli/git': 7.0.1 - glob: 13.0.0 - hosted-git-info: 9.0.2 - json-parse-even-better-errors: 5.0.0 - proc-log: 6.1.0 - semver: 7.7.3 - validate-npm-package-license: 3.0.4 - - '@npmcli/promise-spawn@9.0.1': - dependencies: - which: 6.0.0 - - '@npmcli/redact@4.0.0': {} - - '@npmcli/run-script@10.0.3': - dependencies: - '@npmcli/node-gyp': 5.0.0 - '@npmcli/package-json': 7.0.4 - '@npmcli/promise-spawn': 9.0.1 - node-gyp: 12.1.0 - proc-log: 6.1.0 - which: 6.0.0 - transitivePeerDependencies: - - supports-color - - '@oxc-project/types@0.106.0': {} - - '@parcel/watcher-android-arm64@2.5.4': - optional: true - - '@parcel/watcher-darwin-arm64@2.5.4': - optional: true - - '@parcel/watcher-darwin-x64@2.5.4': - optional: true - - '@parcel/watcher-freebsd-x64@2.5.4': - optional: true - - '@parcel/watcher-linux-arm-glibc@2.5.4': - optional: true - - '@parcel/watcher-linux-arm-musl@2.5.4': - optional: true - - '@parcel/watcher-linux-arm64-glibc@2.5.4': - optional: true - - '@parcel/watcher-linux-arm64-musl@2.5.4': - optional: true - - '@parcel/watcher-linux-x64-glibc@2.5.4': - optional: true - - '@parcel/watcher-linux-x64-musl@2.5.4': - optional: true - - '@parcel/watcher-win32-arm64@2.5.4': - optional: true - - '@parcel/watcher-win32-ia32@2.5.4': - optional: true - - '@parcel/watcher-win32-x64@2.5.4': - optional: true - - '@parcel/watcher@2.5.4': - dependencies: - detect-libc: 2.1.2 - is-glob: 4.0.3 - node-addon-api: 7.1.1 - picomatch: 4.0.3 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.5.4 - '@parcel/watcher-darwin-arm64': 2.5.4 - '@parcel/watcher-darwin-x64': 2.5.4 - '@parcel/watcher-freebsd-x64': 2.5.4 - '@parcel/watcher-linux-arm-glibc': 2.5.4 - '@parcel/watcher-linux-arm-musl': 2.5.4 - '@parcel/watcher-linux-arm64-glibc': 2.5.4 - '@parcel/watcher-linux-arm64-musl': 2.5.4 - '@parcel/watcher-linux-x64-glibc': 2.5.4 - '@parcel/watcher-linux-x64-musl': 2.5.4 - '@parcel/watcher-win32-arm64': 2.5.4 - '@parcel/watcher-win32-ia32': 2.5.4 - '@parcel/watcher-win32-x64': 2.5.4 - optional: true - - '@rolldown/binding-android-arm64@1.0.0-beta.58': - optional: true - - '@rolldown/binding-darwin-arm64@1.0.0-beta.58': - optional: true - - '@rolldown/binding-darwin-x64@1.0.0-beta.58': - optional: true - - '@rolldown/binding-freebsd-x64@1.0.0-beta.58': - optional: true - - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.58': - optional: true - - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.58': - optional: true - - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.58': - optional: true - - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.58': - optional: true - - '@rolldown/binding-linux-x64-musl@1.0.0-beta.58': - optional: true - - '@rolldown/binding-openharmony-arm64@1.0.0-beta.58': - optional: true - - '@rolldown/binding-wasm32-wasi@1.0.0-beta.58': - dependencies: - '@napi-rs/wasm-runtime': 1.1.1 - optional: true - - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.58': - optional: true - - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.58': - optional: true - - '@rolldown/pluginutils@1.0.0-beta.58': {} - - '@rollup/rollup-android-arm-eabi@4.55.3': - optional: true - - '@rollup/rollup-android-arm64@4.55.3': - optional: true - - '@rollup/rollup-darwin-arm64@4.55.3': - optional: true - - '@rollup/rollup-darwin-x64@4.55.3': - optional: true - - '@rollup/rollup-freebsd-arm64@4.55.3': - optional: true - - '@rollup/rollup-freebsd-x64@4.55.3': - optional: true - - '@rollup/rollup-linux-arm-gnueabihf@4.55.3': - optional: true - - '@rollup/rollup-linux-arm-musleabihf@4.55.3': - optional: true - - '@rollup/rollup-linux-arm64-gnu@4.55.3': - optional: true - - '@rollup/rollup-linux-arm64-musl@4.55.3': - optional: true - - '@rollup/rollup-linux-loong64-gnu@4.55.3': - optional: true - - '@rollup/rollup-linux-loong64-musl@4.55.3': - optional: true - - '@rollup/rollup-linux-ppc64-gnu@4.55.3': - optional: true - - '@rollup/rollup-linux-ppc64-musl@4.55.3': - optional: true - - '@rollup/rollup-linux-riscv64-gnu@4.55.3': - optional: true - - '@rollup/rollup-linux-riscv64-musl@4.55.3': - optional: true - - '@rollup/rollup-linux-s390x-gnu@4.55.3': - optional: true - - '@rollup/rollup-linux-x64-gnu@4.55.3': - optional: true - - '@rollup/rollup-linux-x64-musl@4.55.3': - optional: true - - '@rollup/rollup-openbsd-x64@4.55.3': - optional: true - - '@rollup/rollup-openharmony-arm64@4.55.3': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.55.3': - optional: true - - '@rollup/rollup-win32-ia32-msvc@4.55.3': - optional: true - - '@rollup/rollup-win32-x64-gnu@4.55.3': - optional: true - - '@rollup/rollup-win32-x64-msvc@4.55.3': - optional: true - - '@schematics/angular@21.1.1(chokidar@5.0.0)': - dependencies: - '@angular-devkit/core': 21.1.1(chokidar@5.0.0) - '@angular-devkit/schematics': 21.1.1(chokidar@5.0.0) - jsonc-parser: 3.3.1 - transitivePeerDependencies: - - chokidar - - '@sigstore/bundle@4.0.0': - dependencies: - '@sigstore/protobuf-specs': 0.5.0 - - '@sigstore/core@3.1.0': {} - - '@sigstore/protobuf-specs@0.5.0': {} - - '@sigstore/sign@4.1.0': - dependencies: - '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.1.0 - '@sigstore/protobuf-specs': 0.5.0 - make-fetch-happen: 15.0.3 - proc-log: 6.1.0 - promise-retry: 2.0.1 - transitivePeerDependencies: - - supports-color - - '@sigstore/tuf@4.0.1': - dependencies: - '@sigstore/protobuf-specs': 0.5.0 - tuf-js: 4.1.0 - transitivePeerDependencies: - - supports-color - - '@sigstore/verify@3.1.0': - dependencies: - '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.1.0 - '@sigstore/protobuf-specs': 0.5.0 - - '@standard-schema/spec@1.1.0': {} - - '@tufjs/canonical-json@2.0.0': {} - - '@tufjs/models@4.1.0': - dependencies: - '@tufjs/canonical-json': 2.0.0 - minimatch: 10.1.1 - - '@tybys/wasm-util@0.10.1': - dependencies: - tslib: 2.8.1 - optional: true - - '@types/body-parser@1.19.6': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - - '@types/bonjour@3.5.13': - dependencies: - '@types/node': 12.20.55 - - '@types/connect-history-api-fallback@1.5.4': - dependencies: - '@types/express-serve-static-core': 4.19.8 - '@types/node': 12.20.55 - - '@types/connect@3.4.38': - dependencies: - '@types/node': 12.20.55 - - '@types/eslint-scope@3.7.7': - dependencies: - '@types/eslint': 9.6.1 - '@types/estree': 1.0.8 - - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - - '@types/estree@1.0.8': {} - - '@types/express-serve-static-core@4.19.8': - dependencies: - '@types/node': 12.20.55 - '@types/qs': 6.14.0 - '@types/range-parser': 1.2.7 - '@types/send': 1.2.1 - - '@types/express@4.17.25': - dependencies: - '@types/body-parser': 1.19.6 - '@types/express-serve-static-core': 4.19.8 - '@types/qs': 6.14.0 - '@types/serve-static': 1.15.10 - - '@types/http-errors@2.0.5': {} - - '@types/http-proxy@1.17.17': - dependencies: - '@types/node': 12.20.55 - - '@types/json-schema@7.0.15': {} - - '@types/mime@1.3.5': {} - - '@types/node-forge@1.3.14': - dependencies: - '@types/node': 12.20.55 - - '@types/node@12.20.55': {} - - '@types/parse-json@4.0.2': {} - - '@types/qs@6.14.0': {} - - '@types/range-parser@1.2.7': {} - - '@types/retry@0.12.2': {} - - '@types/send@0.17.6': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 12.20.55 - - '@types/send@1.2.1': - dependencies: - '@types/node': 12.20.55 - - '@types/serve-index@1.9.4': - dependencies: - '@types/express': 4.17.25 - - '@types/serve-static@1.15.10': - dependencies: - '@types/http-errors': 2.0.5 - '@types/node': 12.20.55 - '@types/send': 0.17.6 - - '@types/sockjs@0.3.36': - dependencies: - '@types/node': 12.20.55 - - '@types/ws@8.18.1': - dependencies: - '@types/node': 12.20.55 - - '@vitejs/plugin-basic-ssl@2.1.0(vite@7.3.0(@types/node@12.20.55)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(stylus@0.54.8)(terser@5.44.1))': - dependencies: - vite: 7.3.0(@types/node@12.20.55)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(stylus@0.54.8)(terser@5.44.1) - - '@webassemblyjs/ast@1.14.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - - '@webassemblyjs/helper-api-error@1.13.2': {} - - '@webassemblyjs/helper-buffer@1.14.1': {} - - '@webassemblyjs/helper-numbers@1.13.2': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - - '@webassemblyjs/helper-wasm-section@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 - - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 - - '@webassemblyjs/leb128@1.13.2': - dependencies: - '@xtuc/long': 4.2.2 - - '@webassemblyjs/utf8@1.13.2': {} - - '@webassemblyjs/wasm-edit@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 - - '@webassemblyjs/wasm-gen@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - - '@webassemblyjs/wasm-parser@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wast-printer@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 - - '@xtuc/ieee754@1.2.0': {} - - '@xtuc/long@4.2.2': {} - - '@yarnpkg/lockfile@1.1.0': {} - - '@zeit/schemas@2.36.0': {} - - abbrev@4.0.0: {} - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - accepts@2.0.0: - dependencies: - mime-types: 3.0.2 - negotiator: 1.0.0 - - acorn-import-phases@1.0.4(acorn@8.15.0): - dependencies: - acorn: 8.15.0 - - acorn-node@1.8.2: - dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 - xtend: 4.0.2 - - acorn-walk@7.2.0: {} - - acorn@7.4.1: {} - - acorn@8.15.0: {} - - adjust-sourcemap-loader@4.0.0: - dependencies: - loader-utils: 2.0.0 - regex-parser: 2.3.1 - - agent-base@7.1.4: {} - - ajv-formats@2.1.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv-formats@3.0.1(ajv@8.17.1): - optionalDependencies: - ajv: 8.17.1 - - ajv-keywords@5.1.0(ajv@8.17.1): - dependencies: - ajv: 8.17.1 - fast-deep-equal: 3.1.3 - - ajv@8.12.0: - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - - ajv@8.17.1: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - - algoliasearch@5.46.2: - dependencies: - '@algolia/abtesting': 1.12.2 - '@algolia/client-abtesting': 5.46.2 - '@algolia/client-analytics': 5.46.2 - '@algolia/client-common': 5.46.2 - '@algolia/client-insights': 5.46.2 - '@algolia/client-personalization': 5.46.2 - '@algolia/client-query-suggestions': 5.46.2 - '@algolia/client-search': 5.46.2 - '@algolia/ingestion': 1.46.2 - '@algolia/monitoring': 1.46.2 - '@algolia/recommend': 5.46.2 - '@algolia/requester-browser-xhr': 5.46.2 - '@algolia/requester-fetch': 5.46.2 - '@algolia/requester-node-http': 5.46.2 - - angular-oauth2-oidc@10.0.3(@angular/common@21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7))(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8)): - dependencies: - '@angular/common': 21.1.1(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(rxjs@6.6.7) - '@angular/core': 21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8) - tslib: 2.8.1 - - ansi-align@3.0.1: - dependencies: - string-width: 4.2.3 - - ansi-colors@4.1.3: {} - - ansi-escapes@7.2.0: - dependencies: - environment: 1.1.0 - - ansi-html-community@0.0.8: {} - - ansi-regex@5.0.1: {} - - ansi-regex@6.2.2: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.3: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - app-root-path@3.1.0: {} - - arch@2.2.0: {} - - arg@4.1.3: {} - - arg@5.0.2: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - aria-query@3.0.0: - dependencies: - ast-types-flow: 0.0.7 - commander: 2.20.3 - - array-flatten@1.1.1: {} - - ast-types-flow@0.0.7: {} - - atob@2.1.2: - optional: true - - autoprefixer@10.4.23(postcss@8.5.6): - dependencies: - browserslist: 4.28.1 - caniuse-lite: 1.0.30001765 - fraction.js: 5.3.4 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - - axobject-query@2.0.2: - dependencies: - ast-types-flow: 0.0.7 - - babel-loader@10.0.0(@babel/core@7.28.5)(webpack@5.104.1(esbuild@0.27.2)): - dependencies: - '@babel/core': 7.28.5 - find-up: 5.0.0 - webpack: 5.104.1(esbuild@0.27.2) - - babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): - dependencies: - '@babel/compat-data': 7.28.6 - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.5): - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - core-js-compat: 3.48.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5): - dependencies: - '@babel/core': 7.28.5 - '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.5) - transitivePeerDependencies: - - supports-color - - balanced-match@1.0.2: {} - - baseline-browser-mapping@2.9.17: {} - - batch@0.6.1: {} - - beasties@0.3.5: - dependencies: - css-select: 6.0.0 - css-what: 7.0.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - htmlparser2: 10.1.0 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-media-query-parser: 0.2.3 - - big.js@5.2.2: {} - - binary-extensions@2.3.0: {} - - body-parser@1.20.4: - 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.14.1 - raw-body: 2.5.3 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - body-parser@2.2.2: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 4.4.3 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - on-finished: 2.4.1 - qs: 6.14.1 - raw-body: 3.0.2 - type-is: 2.0.1 - transitivePeerDependencies: - - supports-color - - bonjour-service@1.3.0: - dependencies: - fast-deep-equal: 3.1.3 - multicast-dns: 7.2.5 - - boolbase@1.0.0: {} - - boxen@7.0.0: - dependencies: - ansi-align: 3.0.1 - camelcase: 7.0.1 - chalk: 5.0.1 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 - - brace-expansion@1.1.12: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - browserslist@4.28.1: - dependencies: - baseline-browser-mapping: 2.9.17 - caniuse-lite: 1.0.30001765 - electron-to-chromium: 1.5.267 - node-releases: 2.0.27 - update-browserslist-db: 1.2.3(browserslist@4.28.1) - - buffer-from@1.1.2: {} - - builtin-modules@1.1.1: {} - - bundle-name@4.1.0: - dependencies: - run-applescript: 7.1.0 - - bytes@3.0.0: {} - - bytes@3.1.2: {} - - cacache@20.0.3: - dependencies: - '@npmcli/fs': 5.0.0 - fs-minipass: 3.0.3 - glob: 13.0.0 - lru-cache: 11.2.4 - minipass: 7.1.2 - minipass-collect: 2.0.1 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - p-map: 7.0.4 - ssri: 13.0.0 - unique-filename: 5.0.0 - - call-bind-apply-helpers@1.0.2: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - - call-bound@1.0.4: - dependencies: - call-bind-apply-helpers: 1.0.2 - get-intrinsic: 1.3.0 - - callsites@3.1.0: {} - - camelcase-css@2.0.1: {} - - camelcase@7.0.1: {} - - caniuse-lite@1.0.30001765: {} - - chalk-template@0.4.0: - dependencies: - chalk: 4.1.2 - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.0.1: {} - - chalk@5.6.2: {} - - chardet@2.1.1: {} - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - - chokidar@5.0.0: - dependencies: - readdirp: 5.0.0 - - chownr@3.0.0: {} - - chrome-trace-event@1.0.4: {} - - cli-boxes@3.0.0: {} - - cli-cursor@5.0.0: - dependencies: - restore-cursor: 5.1.0 - - cli-spinners@3.4.0: {} - - cli-truncate@5.1.1: - dependencies: - slice-ansi: 7.1.2 - string-width: 8.1.0 - - cli-width@4.1.0: {} - - clipboardy@3.0.0: - dependencies: - arch: 2.2.0 - execa: 5.1.1 - is-wsl: 2.2.0 - - cliui@9.0.1: - dependencies: - string-width: 7.2.0 - strip-ansi: 7.1.2 - wrap-ansi: 9.0.2 - - clone-deep@4.0.1: - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - - codelyzer@6.0.2(@angular/compiler@21.1.1)(@angular/core@21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8))(tslint@6.1.3(typescript@4.1.6)): - dependencies: - '@angular/compiler': 21.1.1 - '@angular/core': 21.1.1(@angular/compiler@21.1.1)(rxjs@6.6.7)(zone.js@0.11.8) - app-root-path: 3.1.0 - aria-query: 3.0.0 - axobject-query: 2.0.2 - css-selector-tokenizer: 0.7.3 - cssauron: 1.4.0 - damerau-levenshtein: 1.0.8 - rxjs: 6.6.7 - semver-dsl: 1.0.1 - source-map: 0.5.7 - sprintf-js: 1.1.3 - tslib: 1.14.1 - tslint: 6.1.3(typescript@4.1.6) - zone.js: 0.10.3 - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.4 - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - - colorette@2.0.20: {} - - commander@2.20.3: {} - - commander@8.3.0: {} - - compressible@2.0.18: - dependencies: - mime-db: 1.54.0 - - compression@1.8.1: - dependencies: - bytes: 3.1.2 - compressible: 2.0.18 - debug: 2.6.9 - negotiator: 0.6.4 - on-headers: 1.1.0 - safe-buffer: 5.2.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - concat-map@0.0.1: {} - - connect-history-api-fallback@2.0.0: {} - - content-disposition@0.5.2: {} - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-disposition@1.0.1: {} - - content-type@1.0.5: {} - - convert-source-map@1.9.0: {} - - convert-source-map@2.0.0: {} - - cookie-signature@1.0.7: {} - - cookie-signature@1.2.2: {} - - cookie@0.7.2: {} - - copy-anything@2.0.6: - dependencies: - is-what: 3.14.1 - - copy-webpack-plugin@13.0.1(webpack@5.104.1(esbuild@0.27.2)): - dependencies: - glob-parent: 6.0.2 - normalize-path: 3.0.0 - schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - tinyglobby: 0.2.15 - webpack: 5.104.1(esbuild@0.27.2) - - core-js-compat@3.48.0: - dependencies: - browserslist: 4.28.1 - - core-util-is@1.0.3: {} - - cors@2.8.5: - dependencies: - object-assign: 4.1.1 - vary: 1.1.2 - - cosmiconfig@7.1.0: - dependencies: - '@types/parse-json': 4.0.2 - import-fresh: 3.3.1 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - - cosmiconfig@9.0.0(typescript@4.1.6): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.1 - js-yaml: 4.1.1 - parse-json: 5.2.0 - optionalDependencies: - typescript: 4.1.6 - - cross-spawn@7.0.6: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - css-color-names@0.0.4: {} - - css-loader@7.1.2(webpack@5.104.1(esbuild@0.27.2)): - dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.6) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.6) - postcss-modules-scope: 3.2.1(postcss@8.5.6) - postcss-modules-values: 4.0.0(postcss@8.5.6) - postcss-value-parser: 4.2.0 - semver: 7.7.3 - optionalDependencies: - webpack: 5.104.1(esbuild@0.27.2) - - css-parse@2.0.0: - dependencies: - css: 2.2.4 - optional: true + w3c-xmlserializer@6.0.0: + resolution: {integrity: sha512-4Nsy8K5Tr6SPDH9jhKJOHf7ChDrc1zufZTVSF7x72hwuEXBqxqk9G6cK+K2NRUtB3iELRJqjXb4JPDMBjMTl2Q==} + engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - css-select@6.0.0: - dependencies: - boolbase: 1.0.0 - css-what: 7.0.0 - domhandler: 5.0.3 - domutils: 3.2.2 - nth-check: 2.1.1 + weak-lru-cache@1.2.2: + resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} - css-selector-tokenizer@0.7.3: - dependencies: - cssesc: 3.0.0 - fastparse: 1.1.2 + webidl-conversions@8.0.1: + resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==} + engines: {node: '>=20'} - css-unit-converter@1.1.2: {} + whatwg-mimetype@5.0.0: + resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==} + engines: {node: '>=20'} - css-what@7.0.0: {} + whatwg-url@16.0.1: + resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} - css@2.2.4: - dependencies: - inherits: 2.0.4 - source-map: 0.6.1 - source-map-resolve: 0.5.3 - urix: 0.1.0 - optional: true + whatwg-url@17.1.2: + resolution: {integrity: sha512-TEZA+Zqxin7Jjsm2cjRohCmen5awh+hT6Zi3VZdqZlNRk7zvOI/9WpBFg/DWlA56bWnzwm6DuB8NS0EsxQH9uQ==} + engines: {node: ^22.14.0 || >=24.0.0} - cssauron@1.4.0: - dependencies: - through: 2.3.8 + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true - cssesc@3.0.0: {} + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true - damerau-levenshtein@1.0.8: {} + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} - debug@2.6.9: - dependencies: - ms: 2.0.0 + wrap-ansi@10.0.2: + resolution: {integrity: sha512-6OLRNZqRntVGBm26ghZ5eZhCuWWyOkRCSn8XsOIuq5stpCE/tjLbdozd93naILZig0lmD8ANfRwnhn0DLeXGlg==} + engines: {node: '>=20'} - debug@3.1.0: - dependencies: - ms: 2.0.0 - optional: true + wrap-ansi@9.0.2: + resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} + engines: {node: '>=18'} - debug@4.4.3: - dependencies: - ms: 2.1.3 + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} - decode-uri-component@0.2.2: - optional: true + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - deep-extend@0.6.0: {} + xxhash-wasm@1.1.0: + resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==} - default-browser-id@5.0.1: {} + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} - default-browser@5.4.0: - dependencies: - bundle-name: 4.1.0 - default-browser-id: 5.0.1 + yargs-parser@22.0.0: + resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} - define-lazy-prop@3.0.0: {} + yargs@18.1.0: + resolution: {integrity: sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} - defined@1.0.1: {} + yargs@18.2.0: + resolution: {integrity: sha512-9OpKOLeaoNFecEp7P6iYbzze/5CqWoH7N3SMs/6y1XF4nMvFMspEGZzJ6uFi9MmQwXhyzqYoSEKO3tvA3Z/o2w==} + engines: {node: ^20.19.0 || ^22.12.0 || >=23} - depd@1.1.2: {} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} - depd@2.0.0: {} + yoctocolors@2.2.0: + resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} + engines: {node: '>=18'} - destroy@1.2.0: {} + zod@4.6.5: + resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} - detect-libc@2.1.2: - optional: true +snapshots: - detect-node@2.1.0: {} + '@alloc/quick-lru@5.3.0': {} - detective@5.2.1: + '@ampproject/remapping@2.3.0': dependencies: - acorn-node: 1.8.2 - defined: 1.0.1 - minimist: 1.2.8 - - didyoumean@1.2.2: {} + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - diff@4.0.4: {} + '@angular-devkit/architect@0.2202.0(chokidar@5.0.0)': + dependencies: + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar - dlv@1.1.3: {} + '@angular-devkit/core@22.2.0(chokidar@5.0.0)': + dependencies: + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) + jsonc-parser: 3.3.1 + picomatch: 4.0.7 + rxjs: 7.8.2 + source-map: 0.8.0 + optionalDependencies: + chokidar: 5.0.0 - dns-packet@5.6.1: + '@angular-devkit/schematics@22.2.0(chokidar@5.0.0)': dependencies: - '@leichtgewicht/ip-codec': 2.0.5 + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) + jsonc-parser: 3.3.1 + magic-string: 1.4.1 + ora: 9.4.1 + rxjs: 7.8.2 + transitivePeerDependencies: + - chokidar - dom-serializer@2.0.0: + '@angular-eslint/builder@22.5.0(chokidar@5.0.0)(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 + '@angular-devkit/architect': 0.2202.0(chokidar@5.0.0) + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) + eslint: 10.11.0(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - chokidar - domelementtype@2.3.0: {} + '@angular-eslint/bundled-angular-compiler@22.5.0': {} + + '@angular-eslint/eslint-plugin-template@22.5.0(@angular-eslint/template-parser@22.5.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/types@8.70.1)(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@angular-eslint/bundled-angular-compiler': 22.5.0 + '@angular-eslint/template-parser': 22.5.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@angular-eslint/utils': 22.5.0(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.70.1 + '@typescript-eslint/utils': 8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + aria-query: 5.3.2 + axobject-query: 4.1.0 + eslint: 10.11.0(jiti@2.7.0) + typescript: 6.0.3 + + '@angular-eslint/eslint-plugin@22.5.0(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@angular-eslint/bundled-angular-compiler': 22.5.0 + '@angular-eslint/utils': 22.5.0(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.11.0(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + + '@angular-eslint/schematics@22.5.0(@angular-eslint/template-parser@22.5.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/types@8.70.1)(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(chokidar@5.0.0)(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) + '@angular-devkit/schematics': 22.2.0(chokidar@5.0.0) + '@angular-eslint/eslint-plugin': 22.5.0(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@angular-eslint/eslint-plugin-template': 22.5.0(@angular-eslint/template-parser@22.5.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/types@8.70.1)(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + ignore: 7.0.8 + semver: 7.8.5 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - '@angular-eslint/template-parser' + - '@typescript-eslint/types' + - '@typescript-eslint/utils' + - chokidar + - eslint + - typescript - domhandler@5.0.3: + '@angular-eslint/template-parser@22.5.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - domelementtype: 2.3.0 + '@angular-eslint/bundled-angular-compiler': 22.5.0 + eslint: 10.11.0(jiti@2.7.0) + eslint-scope: 9.1.2 + typescript: 6.0.3 - domutils@3.2.2: + '@angular-eslint/utils@22.5.0(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 + '@angular-eslint/bundled-angular-compiler': 22.5.0 + '@typescript-eslint/utils': 8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.11.0(jiti@2.7.0) + typescript: 6.0.3 - dunder-proto@1.0.1: + '@angular/build@22.2.0(@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3))(@angular/compiler@22.2.0)(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(jiti@2.7.0)(postcss@8.5.28)(tailwindcss@4.3.3)(tslib@2.8.1)(typescript@6.0.3)(vitest@5.0.1(jsdom@30.1.1)(vite@8.3.0(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1)))': dependencies: - call-bind-apply-helpers: 1.0.2 - es-errors: 1.3.0 - gopd: 1.2.0 - - eastasianwidth@0.2.0: {} - - ee-first@1.1.1: {} - - electron-to-chromium@1.5.267: {} - - emoji-regex@10.6.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - emojis-list@3.0.0: {} - - encodeurl@2.0.0: {} + '@ampproject/remapping': 2.3.0 + '@angular-devkit/architect': 0.2202.0(chokidar@5.0.0) + '@angular/compiler': 22.2.0 + '@angular/compiler-cli': 22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3) + '@babel/core': 8.0.5 + '@inquirer/confirm': 6.3.2 + '@parcel/watcher': 2.6.0 + '@vitejs/plugin-basic-ssl': 2.3.0(vite@8.3.0(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1)) + beasties: 0.5.4 + browserslist: 4.29.1 + chokidar: 5.0.0 + esbuild: 0.28.2 + https-proxy-agent: 9.1.0 + jsonc-parser: 3.3.1 + listr2: 11.1.0 + magic-string: 1.4.1 + mrmime: 2.0.1 + oxc-parser: 0.150.0 + parse5-html-rewriting-stream: 8.0.1 + picomatch: 4.0.7 + piscina: 5.3.2 + rolldown: 1.2.8 + sass: 1.104.1 + sass-embedded: 1.104.1 + semver: 7.8.5 + source-map-support: 0.5.21 + tinyglobby: 0.2.17 + tslib: 2.8.1 + typescript: 6.0.3 + vite: 8.3.0(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1) + xxhash-wasm: 1.1.0 + optionalDependencies: + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + '@angular/platform-browser': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) + lmdb: 3.5.6 + postcss: 8.5.28 + tailwindcss: 4.3.3 + vitest: 5.0.1(jsdom@30.1.1)(vite@8.3.0(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1)) + transitivePeerDependencies: + - '@types/node' + - '@vitejs/devtools' + - jiti + - kerberos + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml - encoding@0.1.13: + '@angular/cli@22.2.0(chokidar@5.0.0)': dependencies: - iconv-lite: 0.6.3 - optional: true + '@angular-devkit/architect': 0.2202.0(chokidar@5.0.0) + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) + '@angular-devkit/schematics': 22.2.0(chokidar@5.0.0) + '@inquirer/prompts': 8.7.2 + '@listr2/prompt-adapter-inquirer': 4.2.7(@inquirer/prompts@8.7.2)(listr2@11.1.0) + '@modelcontextprotocol/server': 2.0.0 + '@schematics/angular': 22.2.0(chokidar@5.0.0) + jsonc-parser: 3.3.1 + listr2: 11.1.0 + npm-package-arg: 14.0.0 + parse5-html-rewriting-stream: 8.0.1 + semver: 7.8.5 + yargs: 18.1.0 + zod: 4.6.5 + transitivePeerDependencies: + - '@types/node' + - chokidar - enhanced-resolve@5.18.4: + '@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2)': dependencies: - graceful-fs: 4.2.11 - tapable: 2.3.0 - - entities@4.5.0: {} - - entities@6.0.1: {} - - entities@7.0.1: {} - - env-paths@2.2.1: {} - - environment@1.1.0: {} - - err-code@2.0.3: {} + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + rxjs: 7.8.2 + tslib: 2.8.1 - errno@0.1.8: + '@angular/compiler-cli@22.2.0(@angular/compiler@22.2.0)(typescript@6.0.3)': dependencies: - prr: 1.0.1 - optional: true + '@angular/compiler': 22.2.0 + '@babel/core': 8.0.1 + '@jridgewell/sourcemap-codec': 1.6.0 + chokidar: 5.0.0 + convert-source-map: 1.9.0 + reflect-metadata: 0.2.2 + semver: 7.8.5 + tslib: 2.8.1 + yargs: 18.2.0 + optionalDependencies: + typescript: 6.0.3 - error-ex@1.3.4: + '@angular/compiler@22.2.0': dependencies: - is-arrayish: 0.2.1 - - es-define-property@1.0.1: {} - - es-errors@1.3.0: {} - - es-module-lexer@2.0.0: {} + tslib: 2.8.1 - es-object-atoms@1.1.1: + '@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)': dependencies: - es-errors: 1.3.0 - - esbuild-wasm@0.27.2: {} - - esbuild@0.27.2: + rxjs: 7.8.2 + tslib: 2.8.1 optionalDependencies: - '@esbuild/aix-ppc64': 0.27.2 - '@esbuild/android-arm': 0.27.2 - '@esbuild/android-arm64': 0.27.2 - '@esbuild/android-x64': 0.27.2 - '@esbuild/darwin-arm64': 0.27.2 - '@esbuild/darwin-x64': 0.27.2 - '@esbuild/freebsd-arm64': 0.27.2 - '@esbuild/freebsd-x64': 0.27.2 - '@esbuild/linux-arm': 0.27.2 - '@esbuild/linux-arm64': 0.27.2 - '@esbuild/linux-ia32': 0.27.2 - '@esbuild/linux-loong64': 0.27.2 - '@esbuild/linux-mips64el': 0.27.2 - '@esbuild/linux-ppc64': 0.27.2 - '@esbuild/linux-riscv64': 0.27.2 - '@esbuild/linux-s390x': 0.27.2 - '@esbuild/linux-x64': 0.27.2 - '@esbuild/netbsd-arm64': 0.27.2 - '@esbuild/netbsd-x64': 0.27.2 - '@esbuild/openbsd-arm64': 0.27.2 - '@esbuild/openbsd-x64': 0.27.2 - '@esbuild/openharmony-arm64': 0.27.2 - '@esbuild/sunos-x64': 0.27.2 - '@esbuild/win32-arm64': 0.27.2 - '@esbuild/win32-ia32': 0.27.2 - '@esbuild/win32-x64': 0.27.2 + '@angular/compiler': 22.2.0 - escalade@3.2.0: {} + '@angular/forms@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2)': + dependencies: + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + '@angular/platform-browser': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) + '@standard-schema/spec': 1.1.0 + rxjs: 7.8.2 + tslib: 2.8.1 + zod: 4.6.5 - escape-html@1.0.3: {} + '@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))': + dependencies: + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + tslib: 2.8.1 - escape-string-regexp@1.0.5: {} + '@angular/router@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(@angular/platform-browser@22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)))(rxjs@7.8.2)': + dependencies: + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + '@angular/platform-browser': 22.2.0(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)) + rxjs: 7.8.2 + tslib: 2.8.1 - eslint-scope@5.1.1: + '@asamuzakjp/css-color@7.0.1': dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 + '@csstools/css-calc': 3.4.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1) + '@csstools/css-color-parser': 4.2.3(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.1) + '@csstools/css-tokenizer': 4.0.1 + lru-cache: 11.5.3 - esprima@4.0.1: {} + '@asamuzakjp/dom-selector@9.2.1': + dependencies: + bidi-js: 1.1.0 + css-tree: 3.2.1 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.5.3 - esrecurse@4.3.0: + '@babel/code-frame@8.0.6': dependencies: - estraverse: 5.3.0 + '@babel/helper-validator-identifier': 8.0.6 + js-tokens: 10.0.0 - estraverse@4.3.0: {} + '@babel/compat-data@8.0.5': {} - estraverse@5.3.0: {} + '@babel/core@8.0.1': + dependencies: + '@babel/code-frame': 8.0.6 + '@babel/generator': 8.0.6 + '@babel/helper-compilation-targets': 8.0.6 + '@babel/helpers': 8.0.5 + '@babel/parser': 8.0.6 + '@babel/template': 8.0.0 + '@babel/traverse': 8.0.6 + '@babel/types': 8.0.6 + '@types/gensync': 1.0.5 + convert-source-map: 2.0.0 + empathic: 2.1.0 + gensync: 1.0.0-beta.2 + import-meta-resolve: 4.2.0 + json5: 2.2.3 + obug: 2.2.1 + semver: 7.8.5 + + '@babel/core@8.0.5': + dependencies: + '@babel/code-frame': 8.0.6 + '@babel/generator': 8.0.6 + '@babel/helper-compilation-targets': 8.0.6 + '@babel/helpers': 8.0.5 + '@babel/parser': 8.0.6 + '@babel/template': 8.0.0 + '@babel/traverse': 8.0.6 + '@babel/types': 8.0.6 + '@types/gensync': 1.0.5 + convert-source-map: 2.0.0 + empathic: 2.1.0 + gensync: 1.0.0-beta.2 + import-meta-resolve: 4.2.0 + json5: 2.2.3 + obug: 2.2.1 + verkit: 0.3.2 - esutils@2.0.3: {} + '@babel/generator@8.0.6': + dependencies: + '@babel/parser': 8.0.6 + '@babel/types': 8.0.6 + '@jridgewell/gen-mapping': 0.4.0-beta.0 + '@jridgewell/trace-mapping': 0.3.31 + '@types/jsesc': 2.5.1 + jsesc: 3.1.0 - etag@1.8.1: {} + '@babel/helper-compilation-targets@8.0.6': + dependencies: + '@babel/compat-data': 8.0.5 + '@babel/helper-validator-option': 8.0.0 + browserslist: 4.29.1 + flru: 1.0.2 + verkit: 0.3.2 - eventemitter3@4.0.7: {} + '@babel/helper-globals@8.0.6': {} - eventemitter3@5.0.4: {} + '@babel/helper-string-parser@8.0.6': {} - events@3.3.0: {} + '@babel/helper-validator-identifier@8.0.6': {} - eventsource-parser@3.0.6: {} + '@babel/helper-validator-option@8.0.0': {} - eventsource@3.0.7: + '@babel/helpers@8.0.5': dependencies: - eventsource-parser: 3.0.6 + '@babel/template': 8.0.0 + '@babel/types': 8.0.6 - execa@5.1.1: + '@babel/parser@8.0.6': dependencies: - cross-spawn: 7.0.6 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - exponential-backoff@3.1.3: {} - - express-rate-limit@7.5.1(express@5.2.1): - dependencies: - express: 5.2.1 - - express@4.22.1: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.4 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.0.7 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.3.2 - fresh: 0.5.2 - http-errors: 2.0.1 - merge-descriptors: 1.0.3 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.12 - proxy-addr: 2.0.7 - qs: 6.14.1 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.2 - serve-static: 1.16.3 - setprototypeof: 1.2.0 - statuses: 2.0.2 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color + '@babel/types': 8.0.6 - express@5.2.1: + '@babel/template@8.0.0': dependencies: - accepts: 2.0.0 - body-parser: 2.2.2 - content-disposition: 1.0.1 - content-type: 1.0.5 - cookie: 0.7.2 - cookie-signature: 1.2.2 - debug: 4.4.3 - depd: 2.0.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 2.1.1 - fresh: 2.0.0 - http-errors: 2.0.1 - merge-descriptors: 2.0.0 - mime-types: 3.0.2 - on-finished: 2.4.1 - once: 1.4.0 - parseurl: 1.3.3 - proxy-addr: 2.0.7 - qs: 6.14.1 - range-parser: 1.2.1 - router: 2.2.0 - send: 1.2.1 - serve-static: 2.2.1 - statuses: 2.0.2 - type-is: 2.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - fast-deep-equal@3.1.3: {} + '@babel/code-frame': 8.0.6 + '@babel/parser': 8.0.6 + '@babel/types': 8.0.6 - fast-glob@3.3.3: + '@babel/traverse@8.0.6': dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-uri@3.1.0: {} + '@babel/code-frame': 8.0.6 + '@babel/generator': 8.0.6 + '@babel/helper-globals': 8.0.6 + '@babel/parser': 8.0.6 + '@babel/template': 8.0.0 + '@babel/types': 8.0.6 + obug: 2.2.1 - fastparse@1.1.2: {} - - fastq@1.20.1: + '@babel/types@8.0.6': dependencies: - reusify: 1.1.0 + '@babel/helper-string-parser': 8.0.6 + '@babel/helper-validator-identifier': 8.0.6 - faye-websocket@0.11.4: + '@bramus/specificity@2.4.2': dependencies: - websocket-driver: 0.7.4 + css-tree: 3.2.1 - fdir@6.5.0(picomatch@4.0.3): - optionalDependencies: - picomatch: 4.0.3 + '@bufbuild/protobuf@2.15.0': {} - fill-range@7.1.1: + '@cacheable/memory@2.2.0': dependencies: - to-regex-range: 5.0.1 + '@cacheable/utils': 2.5.0 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 - finalhandler@1.3.2: + '@cacheable/utils@2.5.0': dependencies: - debug: 2.6.9 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color + hashery: 1.5.1 + keyv: 5.6.0 - finalhandler@2.1.1: + '@csstools/color-helpers@6.1.1': {} + + '@csstools/css-calc@3.4.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1)': dependencies: - debug: 4.4.3 - encodeurl: 2.0.0 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.1) + '@csstools/css-tokenizer': 4.0.1 - find-up@5.0.0: + '@csstools/css-color-parser@4.2.3(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1)': dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 + '@csstools/color-helpers': 6.1.1 + '@csstools/css-calc': 3.4.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1) + '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.1) + '@csstools/css-tokenizer': 4.0.1 - flat@5.0.2: {} + '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1)': + dependencies: + '@csstools/css-tokenizer': 4.0.1 - follow-redirects@1.15.11(debug@4.4.3): + '@csstools/css-syntax-patches-for-csstree@1.1.14(css-tree@3.2.1)': optionalDependencies: - debug: 4.4.3 + css-tree: 3.2.1 - forwarded@0.2.0: {} + '@csstools/css-tokenizer@4.0.1': {} - fraction.js@5.3.4: {} + '@esbuild/aix-ppc64@0.28.2': + optional: true - fresh@0.5.2: {} + '@esbuild/android-arm64@0.28.2': + optional: true - fresh@2.0.0: {} + '@esbuild/android-arm@0.28.2': + optional: true - fs-extra@10.1.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.2.0 - universalify: 2.0.1 + '@esbuild/android-x64@0.28.2': + optional: true - fs-minipass@3.0.3: - dependencies: - minipass: 7.1.2 + '@esbuild/darwin-arm64@0.28.2': + optional: true - fs.realpath@1.0.0: {} + '@esbuild/darwin-x64@0.28.2': + optional: true - fsevents@2.3.3: + '@esbuild/freebsd-arm64@0.28.2': optional: true - function-bind@1.1.2: {} + '@esbuild/freebsd-x64@0.28.2': + optional: true - gensync@1.0.0-beta.2: {} + '@esbuild/linux-arm64@0.28.2': + optional: true - get-caller-file@2.0.5: {} + '@esbuild/linux-arm@0.28.2': + optional: true - get-east-asian-width@1.4.0: {} + '@esbuild/linux-ia32@0.28.2': + optional: true - get-intrinsic@1.3.0: - 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 + '@esbuild/linux-loong64@0.28.2': + optional: true - get-proto@1.0.1: - dependencies: - dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 + '@esbuild/linux-mips64el@0.28.2': + optional: true - get-stream@6.0.1: {} + '@esbuild/linux-ppc64@0.28.2': + optional: true - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 + '@esbuild/linux-riscv64@0.28.2': + optional: true - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 + '@esbuild/linux-s390x@0.28.2': + optional: true - glob-to-regex.js@1.2.0(tslib@2.8.1): - dependencies: - tslib: 2.8.1 + '@esbuild/linux-x64@0.28.2': + optional: true - glob-to-regexp@0.4.1: {} + '@esbuild/netbsd-arm64@0.28.2': + optional: true - glob@13.0.0: - dependencies: - minimatch: 10.1.1 - minipass: 7.1.2 - path-scurry: 2.0.1 + '@esbuild/netbsd-x64@0.28.2': + optional: true - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 + '@esbuild/openbsd-arm64@0.28.2': + optional: true - gopd@1.2.0: {} + '@esbuild/openbsd-x64@0.28.2': + optional: true - graceful-fs@4.2.11: {} + '@esbuild/openharmony-arm64@0.28.2': + optional: true - handle-thing@2.0.1: {} + '@esbuild/sunos-x64@0.28.2': + optional: true - has-flag@3.0.0: {} + '@esbuild/win32-arm64@0.28.2': + optional: true - has-flag@4.0.0: {} + '@esbuild/win32-ia32@0.28.2': + optional: true - has-symbols@1.1.0: {} + '@esbuild/win32-x64@0.28.2': + optional: true - hasown@2.0.2: + '@eslint-community/eslint-utils@4.10.1(eslint@10.11.0(jiti@2.7.0))': dependencies: - function-bind: 1.1.2 - - hex-color-regex@1.1.0: {} + eslint: 10.11.0(jiti@2.7.0) + eslint-visitor-keys: 3.4.3 - hono@4.11.5: {} + '@eslint-community/regexpp@4.12.2': {} - hosted-git-info@9.0.2: + '@eslint/config-array@0.23.5': dependencies: - lru-cache: 11.2.4 + '@eslint/object-schema': 3.0.5 + debug: 4.4.3 + minimatch: 10.2.6 + transitivePeerDependencies: + - supports-color - hpack.js@2.1.6: + '@eslint/config-helpers@0.7.0': dependencies: - inherits: 2.0.4 - obuf: 1.1.2 - readable-stream: 2.3.8 - wbuf: 1.7.3 + '@eslint/core': 1.2.1 - hsl-regex@1.0.0: {} + '@eslint/core@1.2.1': + dependencies: + '@types/json-schema': 7.0.15 - hsla-regex@1.0.0: {} + '@eslint/js@10.0.1(eslint@10.11.0(jiti@2.7.0))': + optionalDependencies: + eslint: 10.11.0(jiti@2.7.0) - html-tags@3.3.1: {} + '@eslint/object-schema@3.0.5': {} - htmlparser2@10.1.0: + '@eslint/plugin-kit@0.7.3': dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.2.2 - entities: 7.0.1 + '@eslint/core': 1.2.1 + levn: 0.4.1 - http-cache-semantics@4.2.0: {} + '@exodus/bytes@1.16.0': {} - http-deceiver@1.2.7: {} + '@harperfast/extended-iterable@1.0.3': + optional: true - http-errors@1.6.3: + '@humanfs/core@0.19.2': dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 + '@humanfs/types': 0.15.0 - http-errors@2.0.1: + '@humanfs/node@0.16.8': dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.2 - toidentifier: 1.0.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 + '@humanwhocodes/retry': 0.4.3 - http-parser-js@0.5.10: {} + '@humanfs/types@0.15.0': {} - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color + '@humanwhocodes/module-importer@1.0.1': {} - http-proxy-middleware@2.0.9(@types/express@4.17.25): - dependencies: - '@types/http-proxy': 1.17.17 - http-proxy: 1.18.1(debug@4.4.3) - is-glob: 4.0.3 - is-plain-obj: 3.0.0 - micromatch: 4.0.8 - optionalDependencies: - '@types/express': 4.17.25 - transitivePeerDependencies: - - debug + '@humanwhocodes/retry@0.4.3': {} - http-proxy-middleware@3.0.5: - dependencies: - '@types/http-proxy': 1.17.17 - debug: 4.4.3 - http-proxy: 1.18.1(debug@4.4.3) - is-glob: 4.0.3 - is-plain-object: 5.0.0 - micromatch: 4.0.8 - transitivePeerDependencies: - - supports-color + '@inquirer/ansi@2.0.8': {} - http-proxy@1.18.1(debug@4.4.3): + '@inquirer/checkbox@5.2.5': dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.11(debug@4.4.3) - requires-port: 1.0.0 - transitivePeerDependencies: - - debug + '@inquirer/ansi': 2.0.8 + '@inquirer/core': 12.0.3 + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1 - https-proxy-agent@7.0.6: + '@inquirer/confirm@6.3.2': dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color + '@inquirer/core': 12.0.3 + '@inquirer/type': 4.1.1 - human-signals@2.1.0: {} - - hyperdyperid@1.2.0: {} + '@inquirer/core@12.0.3': + dependencies: + '@inquirer/ansi': 2.0.8 + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1 + cli-width: 4.1.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 + signal-exit: 4.1.0 - iconv-lite@0.4.24: + '@inquirer/editor@5.3.3': dependencies: - safer-buffer: 2.1.2 + '@inquirer/core': 12.0.3 + '@inquirer/external-editor': 3.0.5 + '@inquirer/type': 4.1.1 - iconv-lite@0.6.3: + '@inquirer/expand@5.1.5': dependencies: - safer-buffer: 2.1.2 + '@inquirer/core': 12.0.3 + '@inquirer/type': 4.1.1 - iconv-lite@0.7.2: + '@inquirer/external-editor@3.0.5': dependencies: - safer-buffer: 2.1.2 + chardet: 2.2.0 + iconv-lite: 0.7.3 + + '@inquirer/figures@2.0.9': {} - icss-utils@5.1.0(postcss@8.5.6): + '@inquirer/input@5.1.6': dependencies: - postcss: 8.5.6 + '@inquirer/core': 12.0.3 + '@inquirer/type': 4.1.1 - ignore-walk@8.0.0: + '@inquirer/number@4.2.3': dependencies: - minimatch: 10.1.1 + '@inquirer/core': 12.0.3 + '@inquirer/type': 4.1.1 - image-size@0.5.5: - optional: true + '@inquirer/password@5.2.2': + dependencies: + '@inquirer/ansi': 2.0.8 + '@inquirer/core': 12.0.3 + '@inquirer/type': 4.1.1 - immutable@5.1.4: {} + '@inquirer/prompts@8.7.2': + dependencies: + '@inquirer/checkbox': 5.2.5 + '@inquirer/confirm': 6.3.2 + '@inquirer/editor': 5.3.3 + '@inquirer/expand': 5.1.5 + '@inquirer/input': 5.1.6 + '@inquirer/number': 4.2.3 + '@inquirer/password': 5.2.2 + '@inquirer/rawlist': 5.3.5 + '@inquirer/search': 4.3.3 + '@inquirer/select': 5.2.5 - import-fresh@3.3.1: + '@inquirer/rawlist@5.3.5': dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 + '@inquirer/core': 12.0.3 + '@inquirer/type': 4.1.1 - imurmurhash@0.1.4: {} + '@inquirer/search@4.3.3': + dependencies: + '@inquirer/core': 12.0.3 + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1 - inflight@1.0.6: + '@inquirer/select@5.2.5': dependencies: - once: 1.4.0 - wrappy: 1.0.2 + '@inquirer/ansi': 2.0.8 + '@inquirer/core': 12.0.3 + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1 - inherits@2.0.3: {} + '@inquirer/type@4.1.1': {} - inherits@2.0.4: {} + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 - ini@1.3.8: {} + '@jridgewell/gen-mapping@0.4.0-beta.0': + dependencies: + '@jridgewell/sourcemap-codec': 1.6.0 + '@jridgewell/trace-mapping': 0.3.31 - ini@6.0.0: {} + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 - ip-address@10.1.0: {} + '@jridgewell/resolve-uri@3.1.2': {} - ipaddr.js@1.9.1: {} + '@jridgewell/sourcemap-codec@1.6.0': {} - ipaddr.js@2.3.0: {} + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.6.0 - is-arrayish@0.2.1: {} + '@keyv/bigmap@1.3.1(keyv@5.6.0)': + dependencies: + hashery: 1.5.1 + hookified: 1.15.1 + keyv: 5.6.0 - is-arrayish@0.3.4: {} + '@keyv/serialize@1.1.1': {} - is-binary-path@2.1.0: + '@listr2/prompt-adapter-inquirer@4.2.7(@inquirer/prompts@8.7.2)(listr2@11.1.0)': dependencies: - binary-extensions: 2.3.0 + '@inquirer/prompts': 8.7.2 + '@inquirer/type': 4.1.1 + listr2: 11.1.0 + transitivePeerDependencies: + - '@types/node' - is-color-stop@1.1.0: - dependencies: - css-color-names: 0.0.4 - hex-color-regex: 1.1.0 - hsl-regex: 1.0.0 - hsla-regex: 1.0.0 - rgb-regex: 1.0.1 - rgba-regex: 1.0.0 + '@lmdb/lmdb-darwin-arm64@3.5.6': + optional: true - is-core-module@2.16.1: - dependencies: - hasown: 2.0.2 + '@lmdb/lmdb-darwin-x64@3.5.6': + optional: true - is-docker@2.2.1: {} + '@lmdb/lmdb-linux-arm64@3.5.6': + optional: true - is-docker@3.0.0: {} + '@lmdb/lmdb-linux-arm@3.5.6': + optional: true - is-extglob@2.1.1: {} + '@lmdb/lmdb-linux-x64@3.5.6': + optional: true - is-fullwidth-code-point@3.0.0: {} + '@lmdb/lmdb-win32-arm64@3.5.6': + optional: true - is-fullwidth-code-point@5.1.0: - dependencies: - get-east-asian-width: 1.4.0 + '@lmdb/lmdb-win32-x64@3.5.6': + optional: true - is-glob@4.0.3: + '@modelcontextprotocol/core@2.0.0': dependencies: - is-extglob: 2.1.1 - - is-in-ssh@1.0.0: {} + zod: 4.6.5 - is-inside-container@1.0.0: + '@modelcontextprotocol/server@2.0.0': dependencies: - is-docker: 3.0.0 + '@modelcontextprotocol/core': 2.0.0 + zod: 4.6.5 - is-interactive@2.0.0: {} + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.4': + optional: true - is-network-error@1.3.0: {} + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.4': + optional: true - is-number@7.0.0: {} + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.4': + optional: true - is-plain-obj@3.0.0: {} + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.4': + optional: true - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.4': + optional: true - is-plain-object@5.0.0: {} + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.4': + optional: true - is-port-reachable@4.0.0: {} + '@napi-rs/nice-android-arm-eabi@1.1.1': + optional: true - is-promise@4.0.0: {} + '@napi-rs/nice-android-arm64@1.1.1': + optional: true - is-stream@2.0.1: {} + '@napi-rs/nice-darwin-arm64@1.1.1': + optional: true - is-unicode-supported@2.1.0: {} + '@napi-rs/nice-darwin-x64@1.1.1': + optional: true - is-what@3.14.1: {} + '@napi-rs/nice-freebsd-x64@1.1.1': + optional: true - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 + '@napi-rs/nice-linux-arm-gnueabihf@1.1.1': + optional: true - is-wsl@3.1.0: - dependencies: - is-inside-container: 1.0.0 + '@napi-rs/nice-linux-arm64-gnu@1.1.1': + optional: true - isarray@1.0.0: {} + '@napi-rs/nice-linux-arm64-musl@1.1.1': + optional: true - isexe@2.0.0: {} + '@napi-rs/nice-linux-ppc64-gnu@1.1.1': + optional: true + + '@napi-rs/nice-linux-riscv64-gnu@1.1.1': + optional: true - isexe@3.1.1: {} + '@napi-rs/nice-linux-s390x-gnu@1.1.1': + optional: true - isobject@3.0.1: {} + '@napi-rs/nice-linux-x64-gnu@1.1.1': + optional: true - istanbul-lib-coverage@3.2.2: {} + '@napi-rs/nice-linux-x64-musl@1.1.1': + optional: true - istanbul-lib-instrument@6.0.3: - dependencies: - '@babel/core': 7.28.5 - '@babel/parser': 7.28.6 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 7.7.3 - transitivePeerDependencies: - - supports-color + '@napi-rs/nice-openharmony-arm64@1.1.1': + optional: true - jest-worker@27.5.1: - dependencies: - '@types/node': 12.20.55 - merge-stream: 2.0.0 - supports-color: 8.1.1 + '@napi-rs/nice-win32-arm64-msvc@1.1.1': + optional: true - jiti@2.6.1: {} + '@napi-rs/nice-win32-ia32-msvc@1.1.1': + optional: true - jose@6.1.3: {} + '@napi-rs/nice-win32-x64-msvc@1.1.1': + optional: true - js-tokens@4.0.0: {} + '@napi-rs/nice@1.1.1': + 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 + optional: true - js-yaml@3.14.2: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 + '@oxc-parser/binding-android-arm-eabi@0.150.0': + optional: true - js-yaml@4.1.1: - dependencies: - argparse: 2.0.1 + '@oxc-parser/binding-android-arm64@0.150.0': + optional: true - jsesc@3.1.0: {} + '@oxc-parser/binding-darwin-arm64@0.150.0': + optional: true - json-parse-even-better-errors@2.3.1: {} + '@oxc-parser/binding-darwin-x64@0.150.0': + optional: true - json-parse-even-better-errors@5.0.0: {} + '@oxc-parser/binding-freebsd-x64@0.150.0': + optional: true - json-schema-traverse@1.0.0: {} + '@oxc-parser/binding-linux-arm-gnueabihf@0.150.0': + optional: true - json-schema-typed@8.0.2: {} + '@oxc-parser/binding-linux-arm-musleabihf@0.150.0': + optional: true - json5@2.2.3: {} + '@oxc-parser/binding-linux-arm64-gnu@0.150.0': + optional: true - jsonc-parser@3.3.1: {} + '@oxc-parser/binding-linux-arm64-musl@0.150.0': + optional: true - jsonfile@6.2.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 + '@oxc-parser/binding-linux-ppc64-gnu@0.150.0': + optional: true - jsonparse@1.3.1: {} + '@oxc-parser/binding-linux-riscv64-gnu@0.150.0': + optional: true - jwt-decode@4.0.0: {} + '@oxc-parser/binding-linux-riscv64-musl@0.150.0': + optional: true - karma-source-map-support@1.4.0: - dependencies: - source-map-support: 0.5.21 + '@oxc-parser/binding-linux-s390x-gnu@0.150.0': + optional: true - kind-of@6.0.3: {} + '@oxc-parser/binding-linux-x64-gnu@0.150.0': + optional: true - launch-editor@2.12.0: - dependencies: - picocolors: 1.1.1 - shell-quote: 1.8.3 + '@oxc-parser/binding-linux-x64-musl@0.150.0': + optional: true - less-loader@12.3.0(less@4.4.2)(webpack@5.104.1(esbuild@0.27.2)): - dependencies: - less: 4.4.2 - optionalDependencies: - webpack: 5.104.1(esbuild@0.27.2) + '@oxc-parser/binding-openharmony-arm64@0.150.0': + optional: true - less@4.4.2: - dependencies: - copy-anything: 2.0.6 - parse-node-version: 1.0.1 - tslib: 2.8.1 - optionalDependencies: - errno: 0.1.8 - graceful-fs: 4.2.11 - image-size: 0.5.5 - make-dir: 2.1.0 - mime: 1.6.0 - needle: 3.3.1 - source-map: 0.6.1 + '@oxc-parser/binding-win32-arm64-msvc@0.150.0': + optional: true - license-webpack-plugin@4.0.2(webpack@5.104.1(esbuild@0.27.2)): - dependencies: - webpack-sources: 3.3.3 - optionalDependencies: - webpack: 5.104.1(esbuild@0.27.2) + '@oxc-parser/binding-win32-ia32-msvc@0.150.0': + optional: true - lilconfig@2.1.0: {} + '@oxc-parser/binding-win32-x64-msvc@0.150.0': + optional: true - lines-and-columns@1.2.4: {} + '@oxc-project/types@0.149.0': {} - listr2@9.0.5: - dependencies: - cli-truncate: 5.1.1 - colorette: 2.0.20 - eventemitter3: 5.0.4 - log-update: 6.1.0 - rfdc: 1.4.1 - wrap-ansi: 9.0.2 + '@oxc-project/types@0.150.0': {} - lmdb@3.4.4: - dependencies: - msgpackr: 1.11.8 - node-addon-api: 6.1.0 - node-gyp-build-optional-packages: 5.2.2 - ordered-binary: 1.6.1 - weak-lru-cache: 1.2.2 - optionalDependencies: - '@lmdb/lmdb-darwin-arm64': 3.4.4 - '@lmdb/lmdb-darwin-x64': 3.4.4 - '@lmdb/lmdb-linux-arm': 3.4.4 - '@lmdb/lmdb-linux-arm64': 3.4.4 - '@lmdb/lmdb-linux-x64': 3.4.4 - '@lmdb/lmdb-win32-arm64': 3.4.4 - '@lmdb/lmdb-win32-x64': 3.4.4 + '@parcel/watcher-android-arm64@2.6.0': optional: true - loader-runner@4.3.1: {} + '@parcel/watcher-darwin-arm64@2.6.0': + optional: true - loader-utils@2.0.0: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 + '@parcel/watcher-darwin-x64@2.6.0': + optional: true - loader-utils@3.3.1: {} + '@parcel/watcher-freebsd-x64@2.6.0': + optional: true - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 + '@parcel/watcher-linux-arm-glibc@2.6.0': + optional: true - lodash.debounce@4.0.8: {} + '@parcel/watcher-linux-arm-musl@2.6.0': + optional: true - lodash.topath@4.5.2: {} + '@parcel/watcher-linux-arm64-glibc@2.6.0': + optional: true - lodash@4.17.23: {} + '@parcel/watcher-linux-arm64-musl@2.6.0': + optional: true - log-symbols@7.0.1: - dependencies: - is-unicode-supported: 2.1.0 - yoctocolors: 2.1.2 + '@parcel/watcher-linux-x64-glibc@2.6.0': + optional: true - log-update@6.1.0: - dependencies: - ansi-escapes: 7.2.0 - cli-cursor: 5.0.0 - slice-ansi: 7.1.2 - strip-ansi: 7.1.2 - wrap-ansi: 9.0.2 + '@parcel/watcher-linux-x64-musl@2.6.0': + optional: true - lru-cache@11.2.4: {} + '@parcel/watcher-win32-arm64@2.6.0': + optional: true - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 + '@parcel/watcher-win32-x64@2.6.0': + optional: true - magic-string@0.30.21: + '@parcel/watcher@2.6.0': dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.7 + 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 - make-dir@2.1.0: - dependencies: - pify: 4.0.1 - semver: 5.7.2 + '@rolldown/binding-android-arm-eabi@1.2.8': optional: true - make-error@1.3.6: {} + '@rolldown/binding-android-arm64@1.2.8': + optional: true - make-fetch-happen@15.0.3: - dependencies: - '@npmcli/agent': 4.0.0 - cacache: 20.0.3 - http-cache-semantics: 4.2.0 - minipass: 7.1.2 - minipass-fetch: 5.0.0 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 1.0.0 - proc-log: 6.1.0 - promise-retry: 2.0.1 - ssri: 13.0.0 - transitivePeerDependencies: - - supports-color + '@rolldown/binding-darwin-arm64@1.2.8': + optional: true - math-intrinsics@1.1.0: {} + '@rolldown/binding-darwin-x64@1.2.8': + optional: true - media-typer@0.3.0: {} + '@rolldown/binding-freebsd-x64@1.2.8': + optional: true - media-typer@1.1.0: {} + '@rolldown/binding-linux-arm-gnueabihf@1.2.8': + optional: true - memfs@4.56.9(tslib@2.8.1): - dependencies: - '@jsonjoy.com/fs-core': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-fsa': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-node': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-node-builtins': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-node-to-fsa': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-node-utils': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-print': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/fs-snapshot': 4.56.9(tslib@2.8.1) - '@jsonjoy.com/json-pack': 1.21.0(tslib@2.8.1) - '@jsonjoy.com/util': 1.9.0(tslib@2.8.1) - glob-to-regex.js: 1.2.0(tslib@2.8.1) - thingies: 2.5.0(tslib@2.8.1) - tree-dump: 1.1.0(tslib@2.8.1) - tslib: 2.8.1 + '@rolldown/binding-linux-arm64-gnu@1.2.8': + optional: true - merge-descriptors@1.0.3: {} + '@rolldown/binding-linux-arm64-musl@1.2.8': + optional: true - merge-descriptors@2.0.0: {} + '@rolldown/binding-linux-ppc64-gnu@1.2.8': + optional: true - merge-stream@2.0.0: {} + '@rolldown/binding-linux-s390x-gnu@1.2.8': + optional: true - merge2@1.4.1: {} + '@rolldown/binding-linux-x64-gnu@1.2.8': + optional: true - methods@1.1.2: {} + '@rolldown/binding-linux-x64-musl@1.2.8': + optional: true - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 + '@rolldown/binding-openharmony-arm64@1.2.8': + optional: true - mime-db@1.33.0: {} + '@rolldown/binding-win32-arm64-msvc@1.2.8': + optional: true - mime-db@1.52.0: {} + '@rolldown/binding-win32-x64-msvc@1.2.8': + optional: true - mime-db@1.54.0: {} + '@rolldown/pluginutils@1.0.1': {} - mime-types@2.1.18: + '@schematics/angular@22.2.0(chokidar@5.0.0)': dependencies: - mime-db: 1.33.0 + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) + '@angular-devkit/schematics': 22.2.0(chokidar@5.0.0) + jsonc-parser: 3.3.1 + oxc-parser: 0.150.0 + typescript: 6.0.3 + transitivePeerDependencies: + - chokidar - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 + '@standard-schema/spec@1.1.0': {} - mime-types@3.0.2: + '@tailwindcss/node@4.3.3': dependencies: - mime-db: 1.54.0 - - mime@1.6.0: {} - - mimic-fn@2.1.0: {} + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.25.1 + jiti: 2.7.0 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.3.3 - mimic-function@5.0.1: {} + '@tailwindcss/oxide-android-arm64@4.3.3': + optional: true - mini-css-extract-plugin@2.9.4(webpack@5.104.1(esbuild@0.27.2)): - dependencies: - schema-utils: 4.3.3 - tapable: 2.3.0 - webpack: 5.104.1(esbuild@0.27.2) + '@tailwindcss/oxide-darwin-arm64@4.3.3': + optional: true - minimalistic-assert@1.0.1: {} + '@tailwindcss/oxide-darwin-x64@4.3.3': + optional: true - minimatch@10.1.1: - dependencies: - '@isaacs/brace-expansion': 5.0.0 + '@tailwindcss/oxide-freebsd-x64@4.3.3': + optional: true - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.12 + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3': + optional: true - minimist@1.2.8: {} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.3': + optional: true - minipass-collect@2.0.1: - dependencies: - minipass: 7.1.2 + '@tailwindcss/oxide-linux-arm64-musl@4.3.3': + optional: true - minipass-fetch@5.0.0: - dependencies: - minipass: 7.1.2 - minipass-sized: 1.0.3 - minizlib: 3.1.0 - optionalDependencies: - encoding: 0.1.13 + '@tailwindcss/oxide-linux-x64-gnu@4.3.3': + optional: true - minipass-flush@1.0.5: - dependencies: - minipass: 3.3.6 + '@tailwindcss/oxide-linux-x64-musl@4.3.3': + optional: true - minipass-pipeline@1.2.4: - dependencies: - minipass: 3.3.6 + '@tailwindcss/oxide-wasm32-wasi@4.3.3': + optional: true - minipass-sized@1.0.3: - dependencies: - minipass: 3.3.6 + '@tailwindcss/oxide-win32-arm64-msvc@4.3.3': + optional: true - minipass@3.3.6: - dependencies: - yallist: 4.0.0 + '@tailwindcss/oxide-win32-x64-msvc@4.3.3': + optional: true - minipass@7.1.2: {} + '@tailwindcss/oxide@4.3.3': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-arm64': 4.3.3 + '@tailwindcss/oxide-darwin-x64': 4.3.3 + '@tailwindcss/oxide-freebsd-x64': 4.3.3 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.3 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.3 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.3 + '@tailwindcss/oxide-linux-x64-musl': 4.3.3 + '@tailwindcss/oxide-wasm32-wasi': 4.3.3 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.3 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.3 - minizlib@3.1.0: + '@tailwindcss/postcss@4.3.3': dependencies: - minipass: 7.1.2 + '@alloc/quick-lru': 5.3.0 + '@tailwindcss/node': 4.3.3 + '@tailwindcss/oxide': 4.3.3 + postcss: 8.5.28 + tailwindcss: 4.3.3 - mkdirp@0.5.6: + '@types/chai@5.2.3': dependencies: - minimist: 1.2.8 + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 - mkdirp@1.0.4: - optional: true + '@types/deep-eql@4.0.2': {} - modern-normalize@1.1.0: {} + '@types/esrecurse@4.3.1': {} - mrmime@2.0.1: {} + '@types/estree@1.0.9': {} - ms@2.0.0: {} + '@types/gensync@1.0.5': {} - ms@2.1.3: {} + '@types/jsesc@2.5.1': {} - msgpackr-extract@3.0.3: - dependencies: - node-gyp-build-optional-packages: 5.2.2 - optionalDependencies: - '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 - '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 - optional: true + '@types/json-schema@7.0.15': {} - msgpackr@1.11.8: - optionalDependencies: - msgpackr-extract: 3.0.3 - optional: true + '@typescript-eslint/eslint-plugin@8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/type-utils': 8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/utils': 8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.69.0 + eslint: 10.11.0(jiti@2.7.0) + ignore: 7.0.10 + natural-compare: 1.4.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color - multicast-dns@7.2.5: + '@typescript-eslint/parser@8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - dns-packet: 5.6.1 - thunky: 1.1.0 - - mute-stream@2.0.0: {} + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.69.0 + debug: 4.4.3 + eslint: 10.11.0(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color - nanoid@3.3.11: {} + '@typescript-eslint/project-service@8.69.0(typescript@6.0.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.70.1(typescript@6.0.3) + '@typescript-eslint/types': 8.70.1 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color - needle@3.3.1: + '@typescript-eslint/project-service@8.70.1(typescript@6.0.3)': dependencies: - iconv-lite: 0.6.3 - sax: 1.4.4 - optional: true + '@typescript-eslint/tsconfig-utils': 8.70.1(typescript@6.0.3) + '@typescript-eslint/types': 8.70.1 + debug: 4.4.3 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color - negotiator@0.6.3: {} + '@typescript-eslint/scope-manager@8.69.0': + dependencies: + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/visitor-keys': 8.69.0 - negotiator@0.6.4: {} + '@typescript-eslint/scope-manager@8.70.1': + dependencies: + '@typescript-eslint/types': 8.70.1 + '@typescript-eslint/visitor-keys': 8.70.1 - negotiator@1.0.0: {} + '@typescript-eslint/tsconfig-utils@8.69.0(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 - neo-async@2.6.2: {} + '@typescript-eslint/tsconfig-utils@8.70.1(typescript@6.0.3)': + dependencies: + typescript: 6.0.3 - ng@0.0.0: {} + '@typescript-eslint/type-utils@8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + debug: 4.4.3 + eslint: 10.11.0(jiti@2.7.0) + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color - node-addon-api@6.1.0: - optional: true + '@typescript-eslint/types@8.69.0': {} - node-addon-api@7.1.1: - optional: true + '@typescript-eslint/types@8.70.1': {} - node-emoji@1.11.0: + '@typescript-eslint/typescript-estree@8.69.0(typescript@6.0.3)': dependencies: - lodash: 4.17.23 - - node-forge@1.3.3: {} + '@typescript-eslint/project-service': 8.69.0(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.69.0(typescript@6.0.3) + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/visitor-keys': 8.69.0 + debug: 4.4.3 + minimatch: 10.2.6 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color - node-gyp-build-optional-packages@5.2.2: + '@typescript-eslint/typescript-estree@8.70.1(typescript@6.0.3)': dependencies: - detect-libc: 2.1.2 - optional: true + '@typescript-eslint/project-service': 8.70.1(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.70.1(typescript@6.0.3) + '@typescript-eslint/types': 8.70.1 + '@typescript-eslint/visitor-keys': 8.70.1 + debug: 4.4.3 + minimatch: 10.2.6 + semver: 7.8.5 + tinyglobby: 0.2.17 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color - node-gyp@12.1.0: + '@typescript-eslint/utils@8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.3 - graceful-fs: 4.2.11 - make-fetch-happen: 15.0.3 - nopt: 9.0.0 - proc-log: 6.1.0 - semver: 7.7.3 - tar: 7.5.6 - tinyglobby: 0.2.15 - which: 6.0.0 + '@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.69.0 + '@typescript-eslint/types': 8.69.0 + '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3) + eslint: 10.11.0(jiti@2.7.0) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - node-releases@2.0.27: {} + '@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3)': + dependencies: + '@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(jiti@2.7.0)) + '@typescript-eslint/scope-manager': 8.70.1 + '@typescript-eslint/types': 8.70.1 + '@typescript-eslint/typescript-estree': 8.70.1(typescript@6.0.3) + eslint: 10.11.0(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color - nopt@9.0.0: + '@typescript-eslint/visitor-keys@8.69.0': dependencies: - abbrev: 4.0.0 + '@typescript-eslint/types': 8.69.0 + eslint-visitor-keys: 5.0.1 - normalize-path@3.0.0: {} + '@typescript-eslint/visitor-keys@8.70.1': + dependencies: + '@typescript-eslint/types': 8.70.1 + eslint-visitor-keys: 5.0.1 - npm-bundled@5.0.0: + '@vitejs/plugin-basic-ssl@2.3.0(vite@8.3.0(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1))': dependencies: - npm-normalize-package-bin: 5.0.0 + vite: 8.3.0(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1) - npm-install-checks@8.0.0: + '@vitest/mocker@5.0.1(vite@8.3.0(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1))': dependencies: - semver: 7.7.3 + '@jridgewell/trace-mapping': 0.3.31 + '@vitest/spy': 5.0.1 + estree-walker: 3.0.3 + magic-string: 1.4.2 + optionalDependencies: + vite: 8.3.0(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1) - npm-normalize-package-bin@5.0.0: {} + '@vitest/spy@5.0.1': {} - npm-package-arg@13.0.2: + acorn-jsx@5.3.2(acorn@8.18.0): dependencies: - hosted-git-info: 9.0.2 - proc-log: 6.1.0 - semver: 7.7.3 - validate-npm-package-name: 7.0.2 + acorn: 8.18.0 - npm-packlist@10.0.3: - dependencies: - ignore-walk: 8.0.0 - proc-log: 6.1.0 + acorn@8.18.0: {} + + agent-base@9.0.0: {} + + ajv-formats@3.0.1(ajv@8.20.0): + optionalDependencies: + ajv: 8.20.0 - npm-pick-manifest@11.0.3: + ajv@6.15.0: dependencies: - npm-install-checks: 8.0.0 - npm-normalize-package-bin: 5.0.0 - npm-package-arg: 13.0.2 - semver: 7.7.3 + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 - npm-registry-fetch@19.1.1: + ajv@8.20.0: dependencies: - '@npmcli/redact': 4.0.0 - jsonparse: 1.3.1 - make-fetch-happen: 15.0.3 - minipass: 7.1.2 - minipass-fetch: 5.0.0 - minizlib: 3.1.0 - npm-package-arg: 13.0.2 - proc-log: 6.1.0 + fast-deep-equal: 3.1.3 + fast-uri: 3.1.8 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + + angular-eslint@22.5.0(chokidar@5.0.0)(eslint@10.11.0(jiti@2.7.0))(typescript-eslint@8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(typescript@6.0.3): + dependencies: + '@angular-devkit/core': 22.2.0(chokidar@5.0.0) + '@angular-devkit/schematics': 22.2.0(chokidar@5.0.0) + '@angular-eslint/builder': 22.5.0(chokidar@5.0.0)(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@angular-eslint/eslint-plugin': 22.5.0(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@angular-eslint/eslint-plugin-template': 22.5.0(@angular-eslint/template-parser@22.5.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/types@8.70.1)(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@angular-eslint/schematics': 22.5.0(@angular-eslint/template-parser@22.5.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(@typescript-eslint/types@8.70.1)(@typescript-eslint/utils@8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(chokidar@5.0.0)(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@angular-eslint/template-parser': 22.5.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/types': 8.70.1 + '@typescript-eslint/utils': 8.70.1(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.11.0(jiti@2.7.0) + typescript: 6.0.3 + typescript-eslint: 8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) transitivePeerDependencies: + - chokidar - supports-color - npm-run-path@4.0.1: + angular-oauth2-oidc@22.0.2(@angular/common@22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2)): dependencies: - path-key: 3.1.1 + '@angular/common': 22.2.0(@angular/core@22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/core': 22.2.0(@angular/compiler@22.2.0)(rxjs@7.8.2) + tslib: 2.8.1 - nth-check@2.1.1: + ansi-escapes@7.3.0: dependencies: - boolbase: 1.0.0 + environment: 1.1.0 + + ansi-regex@6.3.0: {} - object-assign@4.1.1: {} + ansi-styles@6.2.3: {} - object-hash@2.2.0: {} + aria-query@5.3.2: {} - object-inspect@1.13.4: {} + assertion-error@2.0.1: {} - obuf@1.1.2: {} + axobject-query@4.1.0: {} - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 + balanced-match@4.0.4: {} - on-headers@1.1.0: {} + baseline-browser-mapping@2.11.26: {} - once@1.4.0: + beasties@0.5.4: dependencies: - wrappy: 1.0.2 + css-select: 7.0.0 + css-what: 8.0.0 + dom-serializer: 3.1.1 + domhandler: 6.0.1 + htmlparser2: 12.0.0 + picocolors: 1.1.1 + postcss: 8.5.28 + postcss-media-query-parser: 0.2.3 + postcss-safe-parser: 7.1.0(postcss@8.5.28) - onetime@5.1.2: + bidi-js@1.1.0: dependencies: - mimic-fn: 2.1.0 + require-from-string: 2.0.2 - onetime@7.0.0: - dependencies: - mimic-function: 5.0.1 + boolbase@2.0.0: {} - open@10.2.0: + brace-expansion@5.0.12: dependencies: - default-browser: 5.4.0 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - wsl-utils: 0.1.0 + balanced-match: 4.0.4 - open@11.0.0: + browserslist@4.29.1: dependencies: - default-browser: 5.4.0 - define-lazy-prop: 3.0.0 - is-in-ssh: 1.0.0 - is-inside-container: 1.0.0 - powershell-utils: 0.1.0 - wsl-utils: 0.3.1 + baseline-browser-mapping: 2.11.26 + caniuse-lite: 1.0.30001812 + electron-to-chromium: 1.5.438 + node-releases: 2.0.57 + update-browserslist-db: 1.3.3(browserslist@4.29.1) - ora@9.0.0: + buffer-from@1.1.2: {} + + cacheable@2.5.0: dependencies: - chalk: 5.6.2 - cli-cursor: 5.0.0 - cli-spinners: 3.4.0 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 7.0.1 - stdin-discarder: 0.2.2 - string-width: 8.1.0 - strip-ansi: 7.1.2 + '@cacheable/memory': 2.2.0 + '@cacheable/utils': 2.5.0 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.10.1 - ordered-binary@1.6.1: - optional: true + caniuse-lite@1.0.30001812: {} - p-limit@3.1.0: + chai@6.2.2: {} + + chalk@5.6.2: {} + + chardet@2.2.0: {} + + chokidar@5.0.0: dependencies: - yocto-queue: 0.1.0 + readdirp: 5.1.1 - p-locate@5.0.0: + cli-cursor@5.0.0: dependencies: - p-limit: 3.1.0 + restore-cursor: 5.1.0 - p-map@7.0.4: {} - - p-retry@6.2.1: - dependencies: - '@types/retry': 0.12.2 - is-network-error: 1.3.0 - retry: 0.13.1 - - pacote@21.0.4: - dependencies: - '@npmcli/git': 7.0.1 - '@npmcli/installed-package-contents': 4.0.0 - '@npmcli/package-json': 7.0.4 - '@npmcli/promise-spawn': 9.0.1 - '@npmcli/run-script': 10.0.3 - cacache: 20.0.3 - fs-minipass: 3.0.3 - minipass: 7.1.2 - npm-package-arg: 13.0.2 - npm-packlist: 10.0.3 - npm-pick-manifest: 11.0.3 - npm-registry-fetch: 19.1.1 - proc-log: 6.1.0 - promise-retry: 2.0.1 - sigstore: 4.1.0 - ssri: 13.0.0 - tar: 7.5.6 - transitivePeerDependencies: - - supports-color + cli-spinners@3.4.0: {} - parent-module@1.0.1: + cli-truncate@6.1.1: dependencies: - callsites: 3.1.0 + slice-ansi: 9.0.1 + string-width: 8.3.0 + + cli-width@4.1.0: {} - parse-json@5.2.0: + cliui@9.0.1: dependencies: - '@babel/code-frame': 7.28.6 - error-ex: 1.3.4 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 + string-width: 7.2.0 + strip-ansi: 7.2.0 + wrap-ansi: 9.0.2 - parse-node-version@1.0.1: {} + colorjs.io@0.7.1: {} + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} - parse5-html-rewriting-stream@8.0.0: + cross-spawn@7.0.6: dependencies: - entities: 6.0.1 - parse5: 8.0.0 - parse5-sax-parser: 8.0.0 + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - parse5-sax-parser@8.0.0: + css-select@7.0.0: dependencies: - parse5: 8.0.0 + boolbase: 2.0.0 + css-what: 8.0.0 + domhandler: 6.0.1 + domutils: 4.0.2 + nth-check: 3.0.1 - parse5@8.0.0: + css-tree@3.2.1: dependencies: - entities: 6.0.1 + mdn-data: 2.27.1 + source-map-js: 1.2.1 - parseurl@1.3.3: {} + css-what@8.0.0: {} - path-exists@4.0.0: {} + data-urls@7.0.0: + dependencies: + whatwg-mimetype: 5.0.0 + whatwg-url: 16.0.1 + transitivePeerDependencies: + - '@noble/hashes' + + debug@4.4.3: + dependencies: + ms: 2.1.3 - path-is-absolute@1.0.1: {} + decimal.js@10.6.0: {} - path-is-inside@1.0.2: {} + deep-is@0.1.4: {} - path-key@3.1.1: {} + detect-libc@2.1.2: {} + + dom-serializer@3.1.1: + dependencies: + domelementtype: 3.0.0 + domhandler: 6.0.1 + entities: 8.1.0 - path-parse@1.0.7: {} + domelementtype@3.0.0: {} - path-scurry@2.0.1: + domhandler@6.0.1: dependencies: - lru-cache: 11.2.4 - minipass: 7.1.2 + domelementtype: 3.0.0 - path-to-regexp@0.1.12: {} + domutils@4.0.2: + dependencies: + dom-serializer: 3.1.1 + domelementtype: 3.0.0 + domhandler: 6.0.1 - path-to-regexp@3.3.0: {} + electron-to-chromium@1.5.438: {} - path-to-regexp@8.3.0: {} + emoji-regex@10.6.0: {} - path-type@4.0.0: {} + empathic@2.1.0: {} - picocolors@1.1.1: {} + enhanced-resolve@5.25.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 - picomatch@2.3.1: {} + entities@8.1.0: {} - picomatch@4.0.3: {} + environment@1.1.0: {} - pify@4.0.1: - optional: true + es-module-lexer@2.3.2: {} - piscina@5.1.4: + esbuild@0.28.2: optionalDependencies: - '@napi-rs/nice': 1.1.1 + '@esbuild/aix-ppc64': 0.28.2 + '@esbuild/android-arm': 0.28.2 + '@esbuild/android-arm64': 0.28.2 + '@esbuild/android-x64': 0.28.2 + '@esbuild/darwin-arm64': 0.28.2 + '@esbuild/darwin-x64': 0.28.2 + '@esbuild/freebsd-arm64': 0.28.2 + '@esbuild/freebsd-x64': 0.28.2 + '@esbuild/linux-arm': 0.28.2 + '@esbuild/linux-arm64': 0.28.2 + '@esbuild/linux-ia32': 0.28.2 + '@esbuild/linux-loong64': 0.28.2 + '@esbuild/linux-mips64el': 0.28.2 + '@esbuild/linux-ppc64': 0.28.2 + '@esbuild/linux-riscv64': 0.28.2 + '@esbuild/linux-s390x': 0.28.2 + '@esbuild/linux-x64': 0.28.2 + '@esbuild/netbsd-arm64': 0.28.2 + '@esbuild/netbsd-x64': 0.28.2 + '@esbuild/openbsd-arm64': 0.28.2 + '@esbuild/openbsd-x64': 0.28.2 + '@esbuild/openharmony-arm64': 0.28.2 + '@esbuild/sunos-x64': 0.28.2 + '@esbuild/win32-arm64': 0.28.2 + '@esbuild/win32-ia32': 0.28.2 + '@esbuild/win32-x64': 0.28.2 - pkce-challenge@5.0.1: {} + escalade@3.2.0: {} - postcss-js@3.0.3: - dependencies: - camelcase-css: 2.0.1 - postcss: 8.5.6 + escape-string-regexp@4.0.0: {} - postcss-load-config@3.1.4(postcss@8.5.6)(ts-node@8.3.0(typescript@4.1.6)): + eslint-scope@9.1.2: dependencies: - lilconfig: 2.1.0 - yaml: 1.10.2 - optionalDependencies: - postcss: 8.5.6 - ts-node: 8.3.0(typescript@4.1.6) + '@types/esrecurse': 4.3.1 + '@types/estree': 1.0.9 + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@5.0.1: {} - postcss-loader@8.2.0(postcss@8.5.6)(typescript@4.1.6)(webpack@5.104.1(esbuild@0.27.2)): + eslint@10.11.0(jiti@2.7.0): dependencies: - cosmiconfig: 9.0.0(typescript@4.1.6) - jiti: 2.6.1 - postcss: 8.5.6 - semver: 7.7.3 + '@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(jiti@2.7.0)) + '@eslint-community/regexpp': 4.12.2 + '@eslint/config-array': 0.23.5 + '@eslint/config-helpers': 0.7.0 + '@eslint/core': 1.2.1 + '@eslint/plugin-kit': 0.7.3 + '@humanfs/node': 0.16.8 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.9 + ajv: 6.15.0 + cross-spawn: 7.0.6 + debug: 4.4.3 + escape-string-regexp: 4.0.0 + eslint-scope: 9.1.2 + eslint-visitor-keys: 5.0.1 + espree: 11.2.0 + esquery: 1.7.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 11.1.5 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + minimatch: 10.2.6 + natural-compare: 1.4.0 + optionator: 0.9.4 optionalDependencies: - webpack: 5.104.1(esbuild@0.27.2) + jiti: 2.7.0 transitivePeerDependencies: - - typescript - - postcss-media-query-parser@0.2.3: {} + - supports-color - postcss-modules-extract-imports@3.1.0(postcss@8.5.6): + espree@11.2.0: dependencies: - postcss: 8.5.6 + acorn: 8.18.0 + acorn-jsx: 5.3.2(acorn@8.18.0) + eslint-visitor-keys: 5.0.1 - postcss-modules-local-by-default@4.2.0(postcss@8.5.6): + esquery@1.7.0: dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 - postcss-selector-parser: 7.1.1 - postcss-value-parser: 4.2.0 + estraverse: 5.3.0 - postcss-modules-scope@3.2.1(postcss@8.5.6): + esrecurse@4.3.0: dependencies: - postcss: 8.5.6 - postcss-selector-parser: 7.1.1 + estraverse: 5.3.0 - postcss-modules-values@4.0.0(postcss@8.5.6): - dependencies: - icss-utils: 5.1.0(postcss@8.5.6) - postcss: 8.5.6 + estraverse@5.3.0: {} - postcss-nested@5.0.6(postcss@8.5.6): + estree-walker@3.0.3: dependencies: - postcss: 8.5.6 - postcss-selector-parser: 6.1.2 + '@types/estree': 1.0.9 - postcss-selector-parser@6.1.2: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 + esutils@2.0.3: {} - postcss-selector-parser@7.1.1: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 + expect-type@1.4.0: {} - postcss-value-parser@3.3.1: {} + fast-deep-equal@3.1.3: {} + + fast-json-stable-stringify@2.1.0: {} - postcss-value-parser@4.2.0: {} + fast-levenshtein@2.0.6: {} - postcss@8.5.6: + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 + fast-string-truncated-width: 3.0.3 - powershell-utils@0.1.0: {} + fast-uri@3.1.8: {} - pretty-hrtime@1.0.3: {} + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 - proc-log@6.1.0: {} + fdir@6.5.0(picomatch@4.0.7): + optionalDependencies: + picomatch: 4.0.7 - process-nextick-args@2.0.1: {} + file-entry-cache@11.1.5: + dependencies: + flat-cache: 6.1.23 - promise-retry@2.0.1: + find-up@5.0.0: dependencies: - err-code: 2.0.3 - retry: 0.12.0 + locate-path: 6.0.0 + path-exists: 4.0.0 - proxy-addr@2.0.7: + flat-cache@6.1.23: dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 + cacheable: 2.5.0 + flatted: 3.4.4 + hookified: 1.15.1 - prr@1.0.1: - optional: true + flatted@3.4.4: {} - punycode@2.3.1: {} + flru@1.0.2: {} - purgecss@4.1.3: - dependencies: - commander: 8.3.0 - glob: 7.2.3 - postcss: 8.5.6 - postcss-selector-parser: 6.1.2 + fsevents@2.3.3: + optional: true - qs@6.14.1: - dependencies: - side-channel: 1.1.0 + gensync@1.0.0-beta.2: {} - queue-microtask@1.2.3: {} + get-caller-file@2.0.5: {} - quick-lru@5.1.1: {} + get-east-asian-width@1.7.0: {} - randombytes@2.1.0: + glob-parent@6.0.2: dependencies: - safe-buffer: 5.2.1 + is-glob: 4.0.3 - range-parser@1.2.0: {} + graceful-fs@4.2.11: {} - range-parser@1.2.1: {} + has-flag@4.0.0: {} - raw-body@2.5.3: + hashery@1.5.1: dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.4.24 - unpipe: 1.0.0 + hookified: 1.15.1 + + hookified@1.15.1: {} - raw-body@3.0.2: + hookified@2.2.0: {} + + hosted-git-info@10.1.1: dependencies: - bytes: 3.1.2 - http-errors: 2.0.1 - iconv-lite: 0.7.2 - unpipe: 1.0.0 + lru-cache: 11.5.3 - rc@1.2.8: + html-encoding-sniffer@7.0.0: dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 + '@exodus/bytes': 1.16.0 + transitivePeerDependencies: + - '@noble/hashes' - readable-stream@2.3.8: + htmlparser2@12.0.0: dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 + domelementtype: 3.0.0 + domhandler: 6.0.1 + domutils: 4.0.2 + entities: 8.1.0 - readable-stream@3.6.2: + https-proxy-agent@9.1.0: dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 + agent-base: 9.0.0 + debug: 4.4.3 + proxy-agent-negotiate: 1.1.0 + transitivePeerDependencies: + - kerberos + - supports-color - readdirp@3.6.0: + iconv-lite@0.7.3: dependencies: - picomatch: 2.3.1 + safer-buffer: 2.1.2 - readdirp@4.1.2: {} + ignore@5.3.2: {} - readdirp@5.0.0: {} + ignore@7.0.10: {} - reduce-css-calc@2.1.8: - dependencies: - css-unit-converter: 1.1.2 - postcss-value-parser: 3.3.1 + ignore@7.0.8: {} - reflect-metadata@0.2.2: {} + immutable@5.1.9: {} - regenerate-unicode-properties@10.2.2: - dependencies: - regenerate: 1.4.2 + import-meta-resolve@4.2.0: {} - regenerate@1.4.2: {} + imurmurhash@0.1.4: {} - regex-parser@2.3.1: {} + is-extglob@2.1.1: {} - regexpu-core@6.4.0: + is-fullwidth-code-point@5.1.0: dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.2 - regjsgen: 0.8.0 - regjsparser: 0.13.0 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.2.1 + get-east-asian-width: 1.7.0 - registry-auth-token@3.3.2: + is-glob@4.0.3: dependencies: - rc: 1.2.8 - safe-buffer: 5.2.1 + is-extglob: 2.1.1 - registry-url@3.1.0: - dependencies: - rc: 1.2.8 + is-interactive@2.0.0: {} - regjsgen@0.8.0: {} + is-potential-custom-element-name@1.0.1: {} - regjsparser@0.13.0: - dependencies: - jsesc: 3.1.0 + is-unicode-supported@2.1.0: {} - require-from-string@2.0.2: {} + isexe@2.0.0: {} - requires-port@1.0.0: {} + jiti@2.7.0: {} + + js-tokens@10.0.0: {} + + jsdom@30.1.1: + dependencies: + '@asamuzakjp/css-color': 7.0.1 + '@asamuzakjp/dom-selector': 9.2.1 + '@bramus/specificity': 2.4.2 + '@csstools/css-syntax-patches-for-csstree': 1.1.14(css-tree@3.2.1) + '@exodus/bytes': 1.16.0 + css-tree: 3.2.1 + data-urls: 7.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 7.0.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.5.3 + parse5: 8.0.1 + saxes: 6.0.0 + tough-cookie: 6.0.2 + undici: 8.11.2 + w3c-xmlserializer: 6.0.0 + webidl-conversions: 8.0.1 + whatwg-mimetype: 5.0.0 + whatwg-url: 17.1.2 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - '@noble/hashes' - resolve-from@4.0.0: {} + jsesc@3.1.0: {} - resolve-url-loader@5.0.0: - dependencies: - adjust-sourcemap-loader: 4.0.0 - convert-source-map: 1.9.0 - loader-utils: 2.0.0 - postcss: 8.5.6 - source-map: 0.6.1 + json-schema-traverse@0.4.1: {} - resolve-url@0.2.1: - optional: true + json-schema-traverse@1.0.0: {} - resolve@1.22.11: + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@2.2.3: {} + + jsonc-parser@3.3.1: {} + + jwt-decode@4.0.0: {} + + keyv@5.6.0: dependencies: - is-core-module: 2.16.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 + '@keyv/serialize': 1.1.1 - restore-cursor@5.1.0: + levn@0.4.1: dependencies: - onetime: 7.0.0 - signal-exit: 4.1.0 + prelude-ls: 1.2.1 + type-check: 0.4.0 - retry@0.12.0: {} + lightningcss-android-arm64@1.32.0: + optional: true - retry@0.13.1: {} + lightningcss-android-arm64@1.33.0: + optional: true - reusify@1.1.0: {} + lightningcss-darwin-arm64@1.32.0: + optional: true - rfdc@1.4.1: {} + lightningcss-darwin-arm64@1.33.0: + optional: true - rgb-regex@1.0.1: {} + lightningcss-darwin-x64@1.32.0: + optional: true - rgba-regex@1.0.0: {} + lightningcss-darwin-x64@1.33.0: + optional: true - rolldown@1.0.0-beta.58: - dependencies: - '@oxc-project/types': 0.106.0 - '@rolldown/pluginutils': 1.0.0-beta.58 - optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.58 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.58 - '@rolldown/binding-darwin-x64': 1.0.0-beta.58 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.58 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.58 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.58 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.58 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.58 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.58 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.58 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.58 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.58 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.58 - - rollup@4.55.3: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.55.3 - '@rollup/rollup-android-arm64': 4.55.3 - '@rollup/rollup-darwin-arm64': 4.55.3 - '@rollup/rollup-darwin-x64': 4.55.3 - '@rollup/rollup-freebsd-arm64': 4.55.3 - '@rollup/rollup-freebsd-x64': 4.55.3 - '@rollup/rollup-linux-arm-gnueabihf': 4.55.3 - '@rollup/rollup-linux-arm-musleabihf': 4.55.3 - '@rollup/rollup-linux-arm64-gnu': 4.55.3 - '@rollup/rollup-linux-arm64-musl': 4.55.3 - '@rollup/rollup-linux-loong64-gnu': 4.55.3 - '@rollup/rollup-linux-loong64-musl': 4.55.3 - '@rollup/rollup-linux-ppc64-gnu': 4.55.3 - '@rollup/rollup-linux-ppc64-musl': 4.55.3 - '@rollup/rollup-linux-riscv64-gnu': 4.55.3 - '@rollup/rollup-linux-riscv64-musl': 4.55.3 - '@rollup/rollup-linux-s390x-gnu': 4.55.3 - '@rollup/rollup-linux-x64-gnu': 4.55.3 - '@rollup/rollup-linux-x64-musl': 4.55.3 - '@rollup/rollup-openbsd-x64': 4.55.3 - '@rollup/rollup-openharmony-arm64': 4.55.3 - '@rollup/rollup-win32-arm64-msvc': 4.55.3 - '@rollup/rollup-win32-ia32-msvc': 4.55.3 - '@rollup/rollup-win32-x64-gnu': 4.55.3 - '@rollup/rollup-win32-x64-msvc': 4.55.3 - fsevents: 2.3.3 + lightningcss-freebsd-x64@1.32.0: + optional: true - router@2.2.0: - dependencies: - debug: 4.4.3 - depd: 2.0.0 - is-promise: 4.0.0 - parseurl: 1.3.3 - path-to-regexp: 8.3.0 - transitivePeerDependencies: - - supports-color + lightningcss-freebsd-x64@1.33.0: + optional: true - run-applescript@7.1.0: {} + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 + lightningcss-linux-arm-gnueabihf@1.33.0: + optional: true - rxjs@6.6.7: - dependencies: - tslib: 1.14.1 + lightningcss-linux-arm64-gnu@1.32.0: + optional: true - rxjs@7.8.2: - dependencies: - tslib: 2.8.1 + lightningcss-linux-arm64-gnu@1.33.0: + optional: true - safe-buffer@5.1.2: {} + lightningcss-linux-arm64-musl@1.32.0: + optional: true - safe-buffer@5.2.1: {} + lightningcss-linux-arm64-musl@1.33.0: + optional: true - safer-buffer@2.1.2: {} + lightningcss-linux-x64-gnu@1.32.0: + optional: true - sass-loader@16.0.6(sass@1.97.1)(webpack@5.104.1(esbuild@0.27.2)): - dependencies: - neo-async: 2.6.2 - optionalDependencies: - sass: 1.97.1 - webpack: 5.104.1(esbuild@0.27.2) + lightningcss-linux-x64-gnu@1.33.0: + optional: true - sass@1.97.1: - dependencies: - chokidar: 4.0.3 - immutable: 5.1.4 - source-map-js: 1.2.1 - optionalDependencies: - '@parcel/watcher': 2.5.4 + lightningcss-linux-x64-musl@1.32.0: + optional: true - sax@1.2.4: + lightningcss-linux-x64-musl@1.33.0: optional: true - sax@1.4.4: + lightningcss-win32-arm64-msvc@1.32.0: optional: true - schema-utils@4.3.3: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.17.1 - ajv-formats: 2.1.1(ajv@8.17.1) - ajv-keywords: 5.1.0(ajv@8.17.1) + lightningcss-win32-arm64-msvc@1.33.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.33.0: + optional: true - select-hose@2.0.0: {} + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + lightningcss@1.33.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.33.0 + lightningcss-darwin-arm64: 1.33.0 + lightningcss-darwin-x64: 1.33.0 + lightningcss-freebsd-x64: 1.33.0 + lightningcss-linux-arm-gnueabihf: 1.33.0 + lightningcss-linux-arm64-gnu: 1.33.0 + lightningcss-linux-arm64-musl: 1.33.0 + lightningcss-linux-x64-gnu: 1.33.0 + lightningcss-linux-x64-musl: 1.33.0 + lightningcss-win32-arm64-msvc: 1.33.0 + lightningcss-win32-x64-msvc: 1.33.0 + + listr2@11.1.0: + dependencies: + cli-truncate: 6.1.1 + log-update: 8.0.0 + wrap-ansi: 10.0.2 + + lmdb@3.5.6: + dependencies: + '@harperfast/extended-iterable': 1.0.3 + msgpackr: 1.12.1 + node-addon-api: 6.1.0 + node-gyp-build-optional-packages: 5.2.2 + ordered-binary: 1.6.2 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 3.5.6 + '@lmdb/lmdb-darwin-x64': 3.5.6 + '@lmdb/lmdb-linux-arm': 3.5.6 + '@lmdb/lmdb-linux-arm64': 3.5.6 + '@lmdb/lmdb-linux-x64': 3.5.6 + '@lmdb/lmdb-win32-arm64': 3.5.6 + '@lmdb/lmdb-win32-x64': 3.5.6 + optional: true - selfsigned@2.4.1: + locate-path@6.0.0: dependencies: - '@types/node-forge': 1.3.14 - node-forge: 1.3.3 + p-locate: 5.0.0 - semver-dsl@1.0.1: + log-symbols@7.0.1: dependencies: - semver: 5.7.2 - - semver@5.7.2: {} + is-unicode-supported: 2.1.0 + yoctocolors: 2.2.0 - semver@6.3.1: {} + log-update@8.0.0: + dependencies: + ansi-escapes: 7.3.0 + cli-cursor: 5.0.0 + slice-ansi: 9.0.1 + string-width: 8.3.0 + strip-ansi: 7.2.0 + wrap-ansi: 10.0.2 - semver@7.7.3: {} + lru-cache@11.5.3: {} - send@0.19.2: + magic-string@0.30.21: dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 2.0.0 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.1 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.2 - transitivePeerDependencies: - - supports-color + '@jridgewell/sourcemap-codec': 1.6.0 - send@1.2.1: + magic-string@1.4.1: 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 - transitivePeerDependencies: - - supports-color + '@jridgewell/sourcemap-codec': 1.6.0 - serialize-javascript@6.0.2: + magic-string@1.4.2: dependencies: - randombytes: 2.1.0 + '@jridgewell/sourcemap-codec': 1.6.0 - serve-handler@6.1.6: - dependencies: - bytes: 3.0.0 - content-disposition: 0.5.2 - mime-types: 2.1.18 - minimatch: 3.1.2 - path-is-inside: 1.0.2 - path-to-regexp: 3.3.0 - range-parser: 1.2.0 + mdn-data@2.27.1: {} - serve-index@1.9.1: - dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9 - escape-html: 1.0.3 - http-errors: 1.6.3 - mime-types: 2.1.35 - parseurl: 1.3.3 - transitivePeerDependencies: - - supports-color + mimic-function@5.0.1: {} - serve-static@1.16.3: + minimatch@10.2.6: dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.19.2 - transitivePeerDependencies: - - supports-color + brace-expansion: 5.0.12 - serve-static@2.2.1: - dependencies: - encodeurl: 2.0.0 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 1.2.1 - transitivePeerDependencies: - - supports-color + mrmime@2.0.1: {} - serve@14.2.5: - dependencies: - '@zeit/schemas': 2.36.0 - ajv: 8.12.0 - arg: 5.0.2 - boxen: 7.0.0 - chalk: 5.0.1 - chalk-template: 0.4.0 - clipboardy: 3.0.0 - compression: 1.8.1 - is-port-reachable: 4.0.0 - serve-handler: 6.1.6 - update-check: 1.5.4 - transitivePeerDependencies: - - supports-color + ms@2.1.3: {} + + msgpackr-extract@3.0.4: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + 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 + optional: true - setprototypeof@1.1.0: {} + msgpackr@1.12.1: + optionalDependencies: + msgpackr-extract: 3.0.4 + optional: true - setprototypeof@1.2.0: {} + mute-stream@3.0.0: {} - shallow-clone@3.0.1: - dependencies: - kind-of: 6.0.3 + nanoid@3.3.19: {} - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 + natural-compare@1.4.0: {} - shebang-regex@3.0.0: {} + node-addon-api@6.1.0: + optional: true - shell-quote@1.8.3: {} + node-addon-api@7.1.1: {} - side-channel-list@1.0.0: + node-gyp-build-optional-packages@5.2.2: dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 + detect-libc: 2.1.2 + optional: true - side-channel-map@1.0.1: - dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 + node-releases@2.0.57: {} - side-channel-weakmap@1.0.2: + npm-package-arg@14.0.0: dependencies: - call-bound: 1.0.4 - es-errors: 1.3.0 - get-intrinsic: 1.3.0 - object-inspect: 1.13.4 - side-channel-map: 1.0.1 + hosted-git-info: 10.1.1 + proc-log: 7.0.0 + semver: 7.8.5 + validate-npm-package-name: 8.0.0 - side-channel@1.1.0: + nth-check@3.0.1: dependencies: - es-errors: 1.3.0 - object-inspect: 1.13.4 - side-channel-list: 1.0.0 - side-channel-map: 1.0.1 - side-channel-weakmap: 1.0.2 - - signal-exit@3.0.7: {} + boolbase: 2.0.0 - signal-exit@4.1.0: {} + obug@2.2.1: {} - sigstore@4.1.0: + onetime@7.0.0: dependencies: - '@sigstore/bundle': 4.0.0 - '@sigstore/core': 3.1.0 - '@sigstore/protobuf-specs': 0.5.0 - '@sigstore/sign': 4.1.0 - '@sigstore/tuf': 4.0.1 - '@sigstore/verify': 3.1.0 - transitivePeerDependencies: - - supports-color + mimic-function: 5.0.1 - simple-swizzle@0.2.4: + optionator@0.9.4: dependencies: - is-arrayish: 0.3.4 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 - slice-ansi@7.1.2: + ora@9.4.1: dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 5.1.0 + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.4.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.3.2 + string-width: 8.3.0 - smart-buffer@4.2.0: {} + ordered-binary@1.6.2: + optional: true - sockjs@0.3.24: + oxc-parser@0.150.0: dependencies: - faye-websocket: 0.11.4 - uuid: 8.3.2 - websocket-driver: 0.7.4 + '@oxc-project/types': 0.150.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.150.0 + '@oxc-parser/binding-android-arm64': 0.150.0 + '@oxc-parser/binding-darwin-arm64': 0.150.0 + '@oxc-parser/binding-darwin-x64': 0.150.0 + '@oxc-parser/binding-freebsd-x64': 0.150.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.150.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.150.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.150.0 + '@oxc-parser/binding-linux-arm64-musl': 0.150.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.150.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.150.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.150.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.150.0 + '@oxc-parser/binding-linux-x64-gnu': 0.150.0 + '@oxc-parser/binding-linux-x64-musl': 0.150.0 + '@oxc-parser/binding-openharmony-arm64': 0.150.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.150.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.150.0 + '@oxc-parser/binding-win32-x64-msvc': 0.150.0 - socks-proxy-agent@8.0.5: + p-limit@3.1.0: dependencies: - agent-base: 7.1.4 - debug: 4.4.3 - socks: 2.8.7 - transitivePeerDependencies: - - supports-color + yocto-queue: 0.1.0 - socks@2.8.7: + p-locate@5.0.0: dependencies: - ip-address: 10.1.0 - smart-buffer: 4.2.0 - - source-map-js@1.2.1: {} + p-limit: 3.1.0 - source-map-loader@5.0.0(webpack@5.104.1(esbuild@0.27.2)): + parse5-html-rewriting-stream@8.0.1: dependencies: - iconv-lite: 0.6.3 - source-map-js: 1.2.1 - webpack: 5.104.1(esbuild@0.27.2) + entities: 8.1.0 + parse5: 8.0.1 + parse5-sax-parser: 8.0.0 - source-map-resolve@0.5.3: + parse5-sax-parser@8.0.0: dependencies: - atob: 2.1.2 - decode-uri-component: 0.2.2 - resolve-url: 0.2.1 - source-map-url: 0.4.1 - urix: 0.1.0 - optional: true + parse5: 8.0.1 - source-map-support@0.5.21: + parse5@8.0.1: dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 + entities: 8.1.0 - source-map-url@0.4.1: - optional: true + path-exists@4.0.0: {} - source-map@0.5.7: {} + path-key@3.1.1: {} - source-map@0.6.1: {} + picocolors@1.1.1: {} - source-map@0.7.6: {} + picomatch@4.0.7: {} - spdx-correct@3.2.0: - dependencies: - spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.22 + piscina@5.3.2: + optionalDependencies: + '@napi-rs/nice': 1.1.1 - spdx-exceptions@2.5.0: {} + postcss-media-query-parser@0.2.3: {} - spdx-expression-parse@3.0.1: + postcss-safe-parser@7.1.0(postcss@8.5.28): dependencies: - spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.22 + postcss: 8.5.28 - spdx-license-ids@3.0.22: {} - - spdy-transport@3.0.0: + postcss@8.5.28: dependencies: - debug: 4.4.3 - detect-node: 2.1.0 - hpack.js: 2.1.6 - obuf: 1.1.2 - readable-stream: 3.6.2 - wbuf: 1.7.3 - transitivePeerDependencies: - - supports-color + nanoid: 3.3.19 + picocolors: 1.1.1 + source-map-js: 1.2.1 - spdy@4.0.2: + prelude-ls@1.2.1: {} + + prettier-plugin-tailwindcss@0.8.1(prettier@3.9.9): dependencies: - debug: 4.4.3 - handle-thing: 2.0.1 - http-deceiver: 1.2.7 - select-hose: 2.0.0 - spdy-transport: 3.0.0 - transitivePeerDependencies: - - supports-color + prettier: 3.9.9 + + prettier@3.9.9: {} + + proc-log@7.0.0: {} - sprintf-js@1.0.3: {} + proxy-agent-negotiate@1.1.0: {} - sprintf-js@1.1.3: {} + punycode@2.3.1: {} - ssri@13.0.0: + qified@0.10.1: dependencies: - minipass: 7.1.2 + hookified: 2.2.0 - statuses@1.5.0: {} + readdirp@5.1.1: {} - statuses@2.0.2: {} + reflect-metadata@0.2.2: {} - stdin-discarder@0.2.2: {} + require-from-string@2.0.2: {} - string-width@4.2.3: + restore-cursor@5.1.0: dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 + onetime: 7.0.0 + signal-exit: 4.1.0 - string-width@5.1.2: + rolldown@1.2.8: dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.2 + '@oxc-project/types': 0.149.0 + '@rolldown/pluginutils': 1.0.1 + optionalDependencies: + '@rolldown/binding-android-arm-eabi': 1.2.8 + '@rolldown/binding-android-arm64': 1.2.8 + '@rolldown/binding-darwin-arm64': 1.2.8 + '@rolldown/binding-darwin-x64': 1.2.8 + '@rolldown/binding-freebsd-x64': 1.2.8 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.8 + '@rolldown/binding-linux-arm64-gnu': 1.2.8 + '@rolldown/binding-linux-arm64-musl': 1.2.8 + '@rolldown/binding-linux-ppc64-gnu': 1.2.8 + '@rolldown/binding-linux-s390x-gnu': 1.2.8 + '@rolldown/binding-linux-x64-gnu': 1.2.8 + '@rolldown/binding-linux-x64-musl': 1.2.8 + '@rolldown/binding-openharmony-arm64': 1.2.8 + '@rolldown/binding-win32-arm64-msvc': 1.2.8 + '@rolldown/binding-win32-x64-msvc': 1.2.8 - string-width@7.2.0: + rxjs@7.8.2: dependencies: - emoji-regex: 10.6.0 - get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 + tslib: 2.8.1 - string-width@8.1.0: - dependencies: - get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 + safer-buffer@2.1.2: {} - string_decoder@1.1.1: + sass-embedded-all-unknown@1.104.1: dependencies: - safe-buffer: 5.1.2 + sass: 1.104.1 + optional: true - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 + sass-embedded-android-arm64@1.104.1: + optional: true - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 + sass-embedded-android-arm@1.104.1: + optional: true - strip-ansi@7.1.2: - dependencies: - ansi-regex: 6.2.2 + sass-embedded-android-riscv64@1.104.1: + optional: true - strip-final-newline@2.0.0: {} + sass-embedded-android-x64@1.104.1: + optional: true - strip-json-comments@2.0.1: {} + sass-embedded-darwin-arm64@1.104.1: + optional: true - stylus@0.54.8: - dependencies: - css-parse: 2.0.0 - debug: 3.1.0 - glob: 7.2.3 - mkdirp: 1.0.4 - safer-buffer: 2.1.2 - sax: 1.2.4 - semver: 6.3.1 - source-map: 0.7.6 - transitivePeerDependencies: - - supports-color + sass-embedded-darwin-x64@1.104.1: optional: true - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 + sass-embedded-linux-arm64@1.104.1: + optional: true - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 + sass-embedded-linux-arm@1.104.1: + optional: true - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 + sass-embedded-linux-musl-arm64@1.104.1: + optional: true - supports-preserve-symlinks-flag@1.0.0: {} - - tailwindcss@2.2.19(autoprefixer@10.4.23(postcss@8.5.6))(postcss@8.5.6)(ts-node@8.3.0(typescript@4.1.6)): - dependencies: - arg: 5.0.2 - autoprefixer: 10.4.23(postcss@8.5.6) - bytes: 3.1.2 - chalk: 4.1.2 - chokidar: 3.6.0 - color: 4.2.3 - cosmiconfig: 7.1.0 - detective: 5.2.1 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.3 - fs-extra: 10.1.0 - glob-parent: 6.0.2 - html-tags: 3.3.1 - is-color-stop: 1.1.0 - is-glob: 4.0.3 - lodash: 4.17.23 - lodash.topath: 4.5.2 - modern-normalize: 1.1.0 - node-emoji: 1.11.0 - normalize-path: 3.0.0 - object-hash: 2.2.0 - postcss: 8.5.6 - postcss-js: 3.0.3 - postcss-load-config: 3.1.4(postcss@8.5.6)(ts-node@8.3.0(typescript@4.1.6)) - postcss-nested: 5.0.6(postcss@8.5.6) - postcss-selector-parser: 6.1.2 - postcss-value-parser: 4.2.0 - pretty-hrtime: 1.0.3 - purgecss: 4.1.3 - quick-lru: 5.1.1 - reduce-css-calc: 2.1.8 - resolve: 1.22.11 - tmp: 0.2.5 - transitivePeerDependencies: - - ts-node + sass-embedded-linux-musl-arm@1.104.1: + optional: true + + sass-embedded-linux-musl-riscv64@1.104.1: + optional: true + + sass-embedded-linux-musl-x64@1.104.1: + optional: true + + sass-embedded-linux-riscv64@1.104.1: + optional: true - tapable@2.3.0: {} + sass-embedded-linux-x64@1.104.1: + optional: true - tar@7.5.6: + sass-embedded-unknown-all@1.104.1: dependencies: - '@isaacs/fs-minipass': 4.0.1 - chownr: 3.0.0 - minipass: 7.1.2 - minizlib: 3.1.0 - yallist: 5.0.0 + sass: 1.104.1 + optional: true + + sass-embedded-win32-arm64@1.104.1: + optional: true + + sass-embedded-win32-x64@1.104.1: + optional: true - terser-webpack-plugin@5.3.16(esbuild@0.27.2)(webpack@5.104.1): + sass-embedded@1.104.1: dependencies: - '@jridgewell/trace-mapping': 0.3.31 - jest-worker: 27.5.1 - schema-utils: 4.3.3 - serialize-javascript: 6.0.2 - terser: 5.44.1 - webpack: 5.104.1(esbuild@0.27.2) + '@bufbuild/protobuf': 2.15.0 + colorjs.io: 0.7.1 + immutable: 5.1.9 + rxjs: 7.8.2 + supports-color: 8.1.1 + sync-child-process: 1.0.2 + varint: 6.0.0 optionalDependencies: - esbuild: 0.27.2 - - terser@5.44.1: + sass-embedded-all-unknown: 1.104.1 + sass-embedded-android-arm: 1.104.1 + sass-embedded-android-arm64: 1.104.1 + sass-embedded-android-riscv64: 1.104.1 + sass-embedded-android-x64: 1.104.1 + sass-embedded-darwin-arm64: 1.104.1 + sass-embedded-darwin-x64: 1.104.1 + sass-embedded-linux-arm: 1.104.1 + sass-embedded-linux-arm64: 1.104.1 + sass-embedded-linux-musl-arm: 1.104.1 + sass-embedded-linux-musl-arm64: 1.104.1 + sass-embedded-linux-musl-riscv64: 1.104.1 + sass-embedded-linux-musl-x64: 1.104.1 + sass-embedded-linux-riscv64: 1.104.1 + sass-embedded-linux-x64: 1.104.1 + sass-embedded-unknown-all: 1.104.1 + sass-embedded-win32-arm64: 1.104.1 + sass-embedded-win32-x64: 1.104.1 + + sass@1.104.1: dependencies: - '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 - commander: 2.20.3 - source-map-support: 0.5.21 + chokidar: 5.0.0 + immutable: 5.1.9 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.6.0 - thingies@2.5.0(tslib@2.8.1): + saxes@6.0.0: dependencies: - tslib: 2.8.1 + xmlchars: 2.2.0 - through@2.3.8: {} + semver@7.8.5: {} - thunky@1.1.0: {} - - tinyglobby@0.2.15: + shebang-command@2.0.0: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + shebang-regex: 3.0.0 - tmp@0.2.5: {} + shebang-regex@3.0.0: {} - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 + siginfo@2.0.0: {} - toidentifier@1.0.1: {} + signal-exit@4.1.0: {} - tree-dump@1.1.0(tslib@2.8.1): + slice-ansi@9.0.1: dependencies: - tslib: 2.8.1 + ansi-styles: 6.2.3 + is-fullwidth-code-point: 5.1.0 - tree-kill@1.2.2: {} + source-map-js@1.2.1: {} - ts-node@8.3.0(typescript@4.1.6): + source-map-support@0.5.21: dependencies: - arg: 4.1.3 - diff: 4.0.4 - make-error: 1.3.6 - source-map-support: 0.5.21 - typescript: 4.1.6 - yn: 3.1.1 + buffer-from: 1.1.2 + source-map: 0.6.1 - tslib@1.14.1: {} + source-map@0.6.1: {} - tslib@2.8.1: {} + source-map@0.8.0: {} - tslint@6.1.3(typescript@4.1.6): - dependencies: - '@babel/code-frame': 7.28.6 - builtin-modules: 1.1.1 - chalk: 2.4.2 - commander: 2.20.3 - diff: 4.0.4 - glob: 7.2.3 - js-yaml: 3.14.2 - minimatch: 3.1.2 - mkdirp: 0.5.6 - resolve: 1.22.11 - semver: 5.7.2 - tslib: 1.14.1 - tsutils: 2.29.0(typescript@4.1.6) - typescript: 4.1.6 + stackback@0.0.2: {} - tsutils@2.29.0(typescript@4.1.6): - dependencies: - tslib: 1.14.1 - typescript: 4.1.6 + std-env@4.2.0: {} - tuf-js@4.1.0: - dependencies: - '@tufjs/models': 4.1.0 - debug: 4.4.3 - make-fetch-happen: 15.0.3 - transitivePeerDependencies: - - supports-color + stdin-discarder@0.3.2: {} - type-fest@2.19.0: {} + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.7.0 + strip-ansi: 7.2.0 - type-is@1.6.18: + string-width@8.3.0: dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 + get-east-asian-width: 1.7.0 + strip-ansi: 7.2.0 - type-is@2.0.1: + strip-ansi@7.2.0: dependencies: - content-type: 1.0.5 - media-typer: 1.1.0 - mime-types: 3.0.2 + ansi-regex: 6.3.0 - typed-assert@1.0.9: {} + strip-json-comments@3.1.1: {} - typescript@4.1.6: {} + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 - undici@7.18.2: {} + sync-child-process@1.0.2: + dependencies: + sync-message-port: 1.2.0 - unicode-canonical-property-names-ecmascript@2.0.1: {} + sync-message-port@1.2.0: {} - unicode-match-property-ecmascript@2.0.0: - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.1 - unicode-property-aliases-ecmascript: 2.2.0 + tailwindcss@4.3.3: {} - unicode-match-property-value-ecmascript@2.2.1: {} + tapable@2.3.3: {} - unicode-property-aliases-ecmascript@2.2.0: {} + tinybench@6.1.4: {} - unique-filename@5.0.0: - dependencies: - unique-slug: 6.0.0 + tinyexec@1.3.0: {} - unique-slug@6.0.0: + tinyglobby@0.2.17: dependencies: - imurmurhash: 0.1.4 + fdir: 6.5.0(picomatch@4.0.7) + picomatch: 4.0.7 - universalify@2.0.1: {} + tldts-core@7.4.15: {} - unpipe@1.0.0: {} - - update-browserslist-db@1.2.3(browserslist@4.28.1): + tldts@7.4.15: dependencies: - browserslist: 4.28.1 - escalade: 3.2.0 - picocolors: 1.1.1 + tldts-core: 7.4.15 - update-check@1.5.4: + tough-cookie@6.0.2: dependencies: - registry-auth-token: 3.3.2 - registry-url: 3.1.0 + tldts: 7.4.15 - uri-js@4.4.1: + tr46@6.0.0: dependencies: punycode: 2.3.1 - urix@0.1.0: - optional: true - - util-deprecate@1.0.2: {} + ts-api-utils@2.5.0(typescript@6.0.3): + dependencies: + typescript: 6.0.3 - utils-merge@1.0.1: {} + tslib@2.8.1: {} - uuid@8.3.2: {} + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 - validate-npm-package-license@3.0.4: + typescript-eslint@8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3): dependencies: - spdx-correct: 3.2.0 - spdx-expression-parse: 3.0.1 + '@typescript-eslint/eslint-plugin': 8.69.0(@typescript-eslint/parser@8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3))(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/parser': 8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.69.0(typescript@6.0.3) + '@typescript-eslint/utils': 8.69.0(eslint@10.11.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.11.0(jiti@2.7.0) + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color - validate-npm-package-name@7.0.2: {} + typescript@6.0.3: {} - vary@1.1.2: {} + undici@8.11.2: {} - vite@7.3.0(@types/node@12.20.55)(jiti@2.6.1)(less@4.4.2)(sass@1.97.1)(stylus@0.54.8)(terser@5.44.1): + update-browserslist-db@1.3.3(browserslist@4.29.1): dependencies: - esbuild: 0.27.2 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.55.3 - tinyglobby: 0.2.15 - optionalDependencies: - '@types/node': 12.20.55 - fsevents: 2.3.3 - jiti: 2.6.1 - less: 4.4.2 - sass: 1.97.1 - stylus: 0.54.8 - terser: 5.44.1 + browserslist: 4.29.1 + escalade: 3.2.0 + picocolors: 1.1.1 - watchpack@2.5.0: + uri-js@4.4.1: dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 + punycode: 2.3.1 - watchpack@2.5.1: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 + validate-npm-package-name@8.0.0: {} - wbuf@1.7.3: - dependencies: - minimalistic-assert: 1.0.1 + varint@6.0.0: {} - weak-lru-cache@1.2.2: - optional: true + verkit@0.3.2: {} - webpack-dev-middleware@7.4.5(tslib@2.8.1)(webpack@5.104.1): + vite@8.3.0(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1): dependencies: - colorette: 2.0.20 - memfs: 4.56.9(tslib@2.8.1) - mime-types: 3.0.2 - on-finished: 2.4.1 - range-parser: 1.2.1 - schema-utils: 4.3.3 + lightningcss: 1.33.0 + picomatch: 4.0.7 + postcss: 8.5.28 + rolldown: 1.2.8 + tinyglobby: 0.2.17 optionalDependencies: - webpack: 5.104.1(esbuild@0.27.2) - transitivePeerDependencies: - - tslib - - webpack-dev-server@5.2.2(tslib@2.8.1)(webpack@5.104.1): - dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.25 - '@types/express-serve-static-core': 4.19.8 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.10 - '@types/sockjs': 0.3.36 - '@types/ws': 8.18.1 - ansi-html-community: 0.0.8 - bonjour-service: 1.3.0 - chokidar: 3.6.0 - colorette: 2.0.20 - compression: 1.8.1 - connect-history-api-fallback: 2.0.0 - express: 4.22.1 - graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.25) - ipaddr.js: 2.3.0 - launch-editor: 2.12.0 - open: 10.2.0 - p-retry: 6.2.1 - schema-utils: 4.3.3 - selfsigned: 2.4.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack-dev-middleware: 7.4.5(tslib@2.8.1)(webpack@5.104.1) - ws: 8.19.0 + esbuild: 0.28.2 + fsevents: 2.3.3 + jiti: 2.7.0 + sass: 1.104.1 + sass-embedded: 1.104.1 + + vitest@5.0.1(jsdom@30.1.1)(vite@8.3.0(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1)): + dependencies: + '@types/chai': 5.2.3 + '@vitest/mocker': 5.0.1(vite@8.3.0(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1)) + chai: 6.2.2 + es-module-lexer: 2.3.2 + expect-type: 1.4.0 + magic-string: 1.4.2 + obug: 2.2.1 + picomatch: 4.0.7 + std-env: 4.2.0 + tinybench: 6.1.4 + tinyexec: 1.3.0 + tinyglobby: 0.2.17 + vite: 8.3.0(esbuild@0.28.2)(jiti@2.7.0)(sass-embedded@1.104.1)(sass@1.104.1) + why-is-node-running: 2.3.0 optionalDependencies: - webpack: 5.104.1(esbuild@0.27.2) + jsdom: 30.1.1 transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - tslib - - utf-8-validate + - msw - webpack-merge@6.0.1: + w3c-xmlserializer@6.0.0: dependencies: - clone-deep: 4.0.1 - flat: 5.0.2 - wildcard: 2.0.1 + xml-name-validator: 5.0.0 + + weak-lru-cache@1.2.2: + optional: true - webpack-sources@3.3.3: {} + webidl-conversions@8.0.1: {} - webpack-subresource-integrity@5.1.0(webpack@5.104.1(esbuild@0.27.2)): - dependencies: - typed-assert: 1.0.9 - webpack: 5.104.1(esbuild@0.27.2) + whatwg-mimetype@5.0.0: {} - webpack@5.104.1(esbuild@0.27.2): + whatwg-url@16.0.1: dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.28.1 - chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.4 - es-module-lexer: 2.0.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.1 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.3 - tapable: 2.3.0 - terser-webpack-plugin: 5.3.16(esbuild@0.27.2)(webpack@5.104.1) - watchpack: 2.5.1 - webpack-sources: 3.3.3 + '@exodus/bytes': 1.16.0 + tr46: 6.0.0 + webidl-conversions: 8.0.1 transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js + - '@noble/hashes' - websocket-driver@0.7.4: + whatwg-url@17.1.2: dependencies: - http-parser-js: 0.5.10 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - - websocket-extensions@0.1.4: {} + '@exodus/bytes': 1.16.0 + tr46: 6.0.0 + webidl-conversions: 8.0.1 + transitivePeerDependencies: + - '@noble/hashes' which@2.0.2: dependencies: isexe: 2.0.0 - which@6.0.0: - dependencies: - isexe: 3.1.1 - - widest-line@4.0.1: + why-is-node-running@2.3.0: dependencies: - string-width: 5.1.2 + siginfo: 2.0.0 + stackback: 0.0.2 - wildcard@2.0.1: {} + word-wrap@1.2.5: {} - wrap-ansi@6.2.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: + wrap-ansi@10.0.2: dependencies: ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.1.2 + string-width: 8.3.0 wrap-ansi@9.0.2: dependencies: ansi-styles: 6.2.3 string-width: 7.2.0 - strip-ansi: 7.1.2 - - wrappy@1.0.2: {} - - ws@8.19.0: {} + strip-ansi: 7.2.0 - wsl-utils@0.1.0: - dependencies: - is-wsl: 3.1.0 + xml-name-validator@5.0.0: {} - wsl-utils@0.3.1: - dependencies: - is-wsl: 3.1.0 - powershell-utils: 0.1.0 + xmlchars@2.2.0: {} - xtend@4.0.2: {} + xxhash-wasm@1.1.0: {} y18n@5.0.8: {} - yallist@3.1.1: {} - - yallist@4.0.0: {} - - yallist@5.0.0: {} - - yaml@1.10.2: {} - yargs-parser@22.0.0: {} - yargs@18.0.0: + yargs@18.1.0: dependencies: cliui: 9.0.1 escalade: 3.2.0 get-caller-file: 2.0.5 - string-width: 7.2.0 + string-width: 8.3.0 y18n: 5.0.8 yargs-parser: 22.0.0 - yn@3.1.1: {} - - yocto-queue@0.1.0: {} - - yoctocolors-cjs@2.1.3: {} - - yoctocolors@2.1.2: {} - - zod-to-json-schema@3.25.1(zod@4.3.5): + yargs@18.2.0: dependencies: - zod: 4.3.5 + cliui: 9.0.1 + escalade: 3.2.0 + get-caller-file: 2.0.5 + string-width: 8.3.0 + y18n: 5.0.8 + yargs-parser: 22.0.0 - zod@4.3.5: {} + yocto-queue@0.1.0: {} - zone.js@0.10.3: {} + yoctocolors@2.2.0: {} - zone.js@0.11.8: - dependencies: - tslib: 2.8.1 + zod@4.6.5: {} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/favicon.ico b/frameworks/spring-boot-keycloak/angularclient/public/favicon.ico similarity index 100% rename from frameworks/spring-boot-keycloak/angularclient/src/favicon.ico rename to frameworks/spring-boot-keycloak/angularclient/public/favicon.ico diff --git a/frameworks/spring-boot-keycloak/angularclient/src/assets/home-bg-mobile.webp b/frameworks/spring-boot-keycloak/angularclient/public/home-bg-mobile.webp similarity index 100% rename from frameworks/spring-boot-keycloak/angularclient/src/assets/home-bg-mobile.webp rename to frameworks/spring-boot-keycloak/angularclient/public/home-bg-mobile.webp diff --git a/frameworks/spring-boot-keycloak/angularclient/src/assets/home-bg.webp b/frameworks/spring-boot-keycloak/angularclient/public/home-bg.webp similarity index 100% rename from frameworks/spring-boot-keycloak/angularclient/src/assets/home-bg.webp rename to frameworks/spring-boot-keycloak/angularclient/public/home-bg.webp diff --git a/frameworks/spring-boot-keycloak/angularclient/src/assets/logo_phase_slash.svg b/frameworks/spring-boot-keycloak/angularclient/public/logo_phase_slash.svg similarity index 100% rename from frameworks/spring-boot-keycloak/angularclient/src/assets/logo_phase_slash.svg rename to frameworks/spring-boot-keycloak/angularclient/public/logo_phase_slash.svg diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/api/api.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/api/api.ts new file mode 100644 index 0000000..4d2d123 --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/api/api.ts @@ -0,0 +1,34 @@ +import { HttpClient, HttpErrorResponse } from '@angular/common/http'; +import { Injectable, inject } from '@angular/core'; +import { Observable, catchError, map, of } from 'rxjs'; +import { environment } from '../../environments/environment'; + +export interface ApiResponse { + path: string; + text: string; +} + +@Injectable({ providedIn: 'root' }) +export class Api { + private readonly http = inject(HttpClient); + + get(path: string): Observable { + return this.http.get(environment.apiBaseUrl + path).pipe( + map((body) => ({ path, text: JSON.stringify(body, null, 2) })), + catchError((error: HttpErrorResponse) => of({ path, text: errorMessage(error) })), + ); + } +} + +function errorMessage(error: HttpErrorResponse): string { + switch (error.status) { + case 0: + return `The API is not reachable. Is it running on ${environment.apiBaseUrl}?`; + case 401: + return '401 Unauthorized: this endpoint needs a valid access token. Log in first.'; + case 403: + return '403 Forbidden: the access token does not have the required role.'; + default: + return `HTTP ${error.status}`; + } +} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/app-routing.module.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/app-routing.module.ts deleted file mode 100644 index 12cbdbe..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/app-routing.module.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; -import { AuthGuard } from './commons/auth.guard'; -import { HomeComponent } from './components/home/home.component'; - -const routes: Routes = [ - { - path: '', - // canActivate: [AuthGuard], // Full route protection - component: HomeComponent, - }, - { - path: '**', - redirectTo: '', - } -]; - -@NgModule({ - imports: [RouterModule.forRoot(routes)], - exports: [RouterModule] -}) -export class AppRoutingModule {} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/app.component.html b/frameworks/spring-boot-keycloak/angularclient/src/app/app.component.html deleted file mode 100644 index fa852ed..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/app.component.html +++ /dev/null @@ -1,3 +0,0 @@ -
- -
diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/app.component.scss b/frameworks/spring-boot-keycloak/angularclient/src/app/app.component.scss deleted file mode 100644 index 5fa6f68..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/app.component.scss +++ /dev/null @@ -1,23 +0,0 @@ -.page-bg { - background-position: top center; - background-repeat: no-repeat; - background-size: 100% auto; -} -.page-home { - position: absolute; - left: 0; - top: 0; - width: 100vw; - height: 100vh; - z-index: -1; -} -@media (min-width: 768px) { - .page-home { - left: 50%; - transform: translateX(-50%); - width: 100vw; - height: 100vh; - object-fit: cover; - object-position: bottom; - } -} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/app.component.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/app.component.ts deleted file mode 100644 index c5592d4..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/app.component.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-root', - templateUrl: './app.component.html', - styleUrls: ['./app.component.scss'] -}) -export class AppComponent { - - constructor() { - - } -} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/app.config.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/app.config.ts new file mode 100644 index 0000000..228216a --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/app.config.ts @@ -0,0 +1,41 @@ +import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; +import { + ApplicationConfig, + inject, + provideAppInitializer, + provideBrowserGlobalErrorListeners, +} from '@angular/core'; +import { Router, provideRouter } from '@angular/router'; +import { OAuthService, provideOAuthClient } from 'angular-oauth2-oidc'; +import { environment } from '../environments/environment'; +import { routes } from './app.routes'; +import { authConfig } from './auth/auth.config'; + +export const appConfig: ApplicationConfig = { + providers: [ + provideBrowserGlobalErrorListeners(), + provideRouter(routes), + provideHttpClient(withInterceptorsFromDi()), + provideOAuthClient({ + resourceServer: { + allowedUrls: [environment.apiBaseUrl], + sendAccessToken: true, + }, + }), + provideAppInitializer(async () => { + const oauth = inject(OAuthService); + const router = inject(Router); + oauth.configure(authConfig); + oauth.setupAutomaticSilentRefresh(); + try { + await oauth.loadDiscoveryDocumentAndTryLogin(); + } catch (error) { + console.error('Could not reach Keycloak or finish the login', error); + return; + } + if (oauth.state) { + void router.navigateByUrl(decodeURIComponent(oauth.state)); + } + }), + ], +}; diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/app.html b/frameworks/spring-boot-keycloak/angularclient/src/app/app.html new file mode 100644 index 0000000..2cf9f18 --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/app.html @@ -0,0 +1,31 @@ +
+ + + + + +
+
+ + Phase Two + + + + + +

Spring Boot · Angular

+
+
+
+
+ +
+
+ +
diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/app.module.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/app.module.ts deleted file mode 100644 index 68404b1..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/app.module.ts +++ /dev/null @@ -1,80 +0,0 @@ -import { APP_INITIALIZER, NgModule } from '@angular/core'; -import { BrowserModule } from '@angular/platform-browser'; - -import { AppRoutingModule } from './app-routing.module'; -import { AppComponent } from './app.component'; -import { OAuthModule, OAuthService, OAuthStorage } from 'angular-oauth2-oidc'; -import { FormsModule } from '@angular/forms'; -import { HttpClientModule } from '@angular/common/http'; -import { HomeComponent } from './components/home/home.component'; -import { - LOCAL_STORAGE_TOKEN, - localStorageFactory, -} from './service/local-storage.service'; -import { isDefined } from './commons/commons'; -import { from, Observable } from 'rxjs'; -import { map } from 'rxjs/operators'; -import { UserComponent } from './components/user/user.component'; - -@NgModule({ - declarations: [AppComponent, HomeComponent, UserComponent], - imports: [ - BrowserModule, - AppRoutingModule, - FormsModule, - HttpClientModule, - OAuthModule.forRoot() - ], - providers: [ - { - provide: APP_INITIALIZER, - useFactory: applicationInitializerFactory, - deps: [OAuthService], - multi: true - }, - { provide: LOCAL_STORAGE_TOKEN, useFactory: localStorageFactory }, - { provide: OAuthStorage, useFactory: localStorageFactory }, - ], - bootstrap: [AppComponent], -}) -export class AppModule {} - -export function applicationInitializerFactory(oauthService: OAuthService) { - return () => - new Promise((resolve) => { - configure(); - oauthService.setupAutomaticSilentRefresh(); - - // Load Discovery Document and then try to login the user - oauthService - .loadDiscoveryDocument() - .then(() => checkIdentity().subscribe(() => resolve(true))); - - function checkIdentity(): Observable { - if (isDefined(oauthService.getRefreshToken())) { - return from(oauthService.refreshToken()).pipe( - map(() => oauthService.hasValidAccessToken()) - ); - } - - return from(oauthService.tryLogin()); - } - - function configure() { - oauthService.configure({ - // URL of the SPA to redirect the user to after login - redirectUri: window.location.origin + '/index.html', - // The SPA's id. The SPA is registered with this id at the auth-server - clientId: 'demo-spa', - // set the scope for the permissions the client should request - scope: 'openid', - // url for /.well-known/openid-configuration endpoint - issuer: 'http://localhost:8888/auth/realms/demo-realm', - disablePKCE: true, - //initialize the code flow - responseType: 'code', - showDebugInformation: true, - }); - } - }); -} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/app.routes.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/app.routes.ts new file mode 100644 index 0000000..af902bd --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/app.routes.ts @@ -0,0 +1,10 @@ +import { Routes } from '@angular/router'; +import { authGuard } from './auth/auth.guard'; +import { Home } from './home/home'; +import { Protected } from './protected/protected'; + +export const routes: Routes = [ + { path: '', component: Home }, + { path: 'protected', component: Protected, canActivate: [authGuard] }, + { path: '**', redirectTo: '' }, +]; diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/app.spec.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/app.spec.ts new file mode 100644 index 0000000..2e88bde --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/app.spec.ts @@ -0,0 +1,36 @@ +import { TestBed } from '@angular/core/testing'; +import { provideRouter } from '@angular/router'; +import { App } from './app'; + +describe('App', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [App], + providers: [provideRouter([])], + }); + }); + + it('links to the example on GitHub', async () => { + const fixture = TestBed.createComponent(App); + await fixture.whenStable(); + const element = fixture.nativeElement as HTMLElement; + + expect( + element.querySelector('a[aria-label="Source code on GitHub"]')?.getAttribute('href'), + ).toBe('https://github.com/p2-inc/examples/tree/main/frameworks/spring-boot-keycloak'); + expect(element.textContent).toContain('Spring Boot · Angular'); + }); + + it('renders the footer links', async () => { + const fixture = TestBed.createComponent(App); + await fixture.whenStable(); + const links = (fixture.nativeElement as HTMLElement).querySelectorAll('footer a'); + + expect(Array.from(links, (link) => link.textContent?.trim())).toEqual([ + 'Docs', + 'Github', + 'Blog', + 'Contact', + ]); + }); +}); diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/app.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/app.ts new file mode 100644 index 0000000..4a4e6ac --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/app.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; +import { Footer } from './layout/footer'; +import { AngularIcon, GithubIcon } from './layout/icons'; + +@Component({ + selector: 'app-root', + imports: [RouterOutlet, Footer, AngularIcon, GithubIcon], + templateUrl: './app.html', +}) +export class App {} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.config.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.config.ts new file mode 100644 index 0000000..e5deea2 --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.config.ts @@ -0,0 +1,11 @@ +import { AuthConfig } from 'angular-oauth2-oidc'; +import { environment } from '../../environments/environment'; + +export const authConfig: AuthConfig = { + issuer: environment.issuer, + clientId: environment.clientId, + redirectUri: window.location.origin + '/', + postLogoutRedirectUri: window.location.origin + '/', + responseType: 'code', + scope: 'openid profile email', +}; diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.guard.spec.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.guard.spec.ts new file mode 100644 index 0000000..f1197f7 --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.guard.spec.ts @@ -0,0 +1,29 @@ +import { TestBed } from '@angular/core/testing'; +import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; +import { OAuthService } from 'angular-oauth2-oidc'; +import { authGuard } from './auth.guard'; + +function runGuard(hasValidAccessToken: boolean) { + const oauth = { hasValidAccessToken: () => hasValidAccessToken, initCodeFlow: vi.fn() }; + TestBed.configureTestingModule({ providers: [{ provide: OAuthService, useValue: oauth }] }); + const result = TestBed.runInInjectionContext(() => + authGuard({} as ActivatedRouteSnapshot, { url: '/protected' } as RouterStateSnapshot), + ); + return { result, oauth }; +} + +describe('authGuard', () => { + it('lets users with a valid access token through', () => { + const { result, oauth } = runGuard(true); + + expect(result).toBe(true); + expect(oauth.initCodeFlow).not.toHaveBeenCalled(); + }); + + it('starts the login and keeps the requested page in the state', () => { + const { result, oauth } = runGuard(false); + + expect(result).toBe(false); + expect(oauth.initCodeFlow).toHaveBeenCalledWith('/protected'); + }); +}); diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.guard.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.guard.ts new file mode 100644 index 0000000..0bfc025 --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.guard.ts @@ -0,0 +1,12 @@ +import { inject } from '@angular/core'; +import { CanActivateFn } from '@angular/router'; +import { OAuthService } from 'angular-oauth2-oidc'; + +export const authGuard: CanActivateFn = (_route, state) => { + const oauth = inject(OAuthService); + if (oauth.hasValidAccessToken()) { + return true; + } + oauth.initCodeFlow(state.url); + return false; +}; diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.ts new file mode 100644 index 0000000..a26aad6 --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/auth/auth.ts @@ -0,0 +1,45 @@ +import { Injectable, computed, inject } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { OAuthService } from 'angular-oauth2-oidc'; +import { JwtPayload, jwtDecode } from 'jwt-decode'; +import { map, startWith } from 'rxjs'; + +export interface IdTokenClaims extends JwtPayload { + name?: string; + email?: string; +} + +@Injectable({ providedIn: 'root' }) +export class Auth { + private readonly oauth = inject(OAuthService); + + private readonly session = toSignal( + this.oauth.events.pipe( + startWith(null), + map(() => ({ + keycloakReachable: this.oauth.discoveryDocumentLoaded, + authenticated: this.oauth.hasValidAccessToken(), + accessToken: this.oauth.getAccessToken(), + idToken: this.oauth.getIdToken(), + })), + ), + { requireSync: true }, + ); + + readonly keycloakReachable = computed(() => this.session().keycloakReachable); + readonly authenticated = computed(() => this.session().authenticated); + readonly accessTokenClaims = computed(() => decode(this.session().accessToken)); + readonly idTokenClaims = computed(() => decode(this.session().idToken)); + + login(): void { + this.oauth.initCodeFlow(); + } + + logout(): void { + this.oauth.logOut(); + } +} + +function decode(token: string | null): T | null { + return token ? jwtDecode(token) : null; +} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/commons/auth.guard.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/commons/auth.guard.ts deleted file mode 100644 index 2a2489d..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/commons/auth.guard.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Injectable } from '@angular/core'; -import { - ActivatedRouteSnapshot, - CanActivate, - RouterStateSnapshot, - UrlTree -} from '@angular/router'; -import { Observable, of } from 'rxjs'; -import { OAuthService } from 'angular-oauth2-oidc'; - -@Injectable({ - providedIn: 'root', -}) -export class AuthGuard implements CanActivate { - constructor(private oauthService: OAuthService) {} - - canActivate( - route: ActivatedRouteSnapshot, - state: RouterStateSnapshot - ): Observable { - // if(!this.oauthService.hasValidAccessToken()) { - // this.oauthService.initLoginFlow(); - // } - return of(true); - } -} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/commons/commons.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/commons/commons.ts deleted file mode 100644 index 001f23f..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/commons/commons.ts +++ /dev/null @@ -1,7 +0,0 @@ -export function isNullOrUndefined(value: any): boolean { - return value === undefined || value === null; -} - -export function isDefined(value: any): boolean { - return !isNullOrUndefined(value); -} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.component.html b/frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.component.html deleted file mode 100644 index bc78d8a..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.component.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - Gradient Background - - -
-
- -
-
- diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.component.scss b/frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.component.scss deleted file mode 100644 index e69de29..0000000 diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.component.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.component.ts deleted file mode 100644 index f6e65b9..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -@Component({ - selector: 'app-home', - templateUrl: './home.component.html', -}) -export class HomeComponent implements OnInit { - constructor() {} - - ngOnInit(): void {} -} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.module.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.module.ts deleted file mode 100644 index b0d0d85..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/components/home/home.module.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { HomeComponent } from './home.component'; -import { UserModule } from '../user/user.module'; - -@NgModule({ - declarations: [HomeComponent], - imports: [CommonModule, UserModule], - exports: [HomeComponent], -}) -export class HomeModule {} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/components/user/user.component.html b/frameworks/spring-boot-keycloak/angularclient/src/app/components/user/user.component.html deleted file mode 100644 index 9a6452b..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/components/user/user.component.html +++ /dev/null @@ -1,16 +0,0 @@ -
- -
Authenticated
-
-
-

Username: {{ userInfo.username }}

-

Email: {{ userInfo.email }}

-

Roles: {{ userInfo.roles }}

-
-
- -
-
-
Not authenticated.
- -
diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/components/user/user.component.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/components/user/user.component.ts deleted file mode 100644 index 8970b2a..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/components/user/user.component.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { Component, OnInit } from '@angular/core'; -import { OAuthService } from 'angular-oauth2-oidc'; -import { Subscription } from 'rxjs'; -import { AuthService } from '../../service/auth.service'; - -@Component({ - selector: 'app-user', - templateUrl: './user.component.html', -}) -export class UserComponent implements OnInit { - isLoggedIn: boolean = false; - private authSubscription: Subscription; - userInfo: any; - - buttonClasses = - 'rounded-md bg-indigo-600 px-2.5 py-1.5 text-sm font-semibold text-white shadow-sm hover:bg-indigo-500 focus-visible:outline focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-indigo-600'; - - constructor( - private oauthService: OAuthService, - private authService: AuthService - ) {} - - signIn() { - return this.authService.signIn(); - } - - signOut() { - this.authService.signOut(); - } - - ngOnInit(): void { - this.userInfo = this.authService.getUserInfo(); - this.isLoggedIn = this.oauthService.hasValidAccessToken(); - - this.authSubscription = this.oauthService.events.subscribe((event) => { - if (event.type === 'token_received' || event.type === 'token_expires') { - this.isLoggedIn = this.oauthService.hasValidAccessToken(); - } - }); - } - - ngOnDestroy(): void { - if (this.authSubscription) { - this.authSubscription.unsubscribe(); - } - } -} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/components/user/user.module.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/components/user/user.module.ts deleted file mode 100644 index ac5fc28..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/components/user/user.module.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { UserComponent } from './user.component'; - -@NgModule({ - declarations: [UserComponent], - imports: [CommonModule], - exports: [UserComponent], -}) -export class UserModule {} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/home/home.html b/frameworks/spring-boot-keycloak/angularclient/src/app/home/home.html new file mode 100644 index 0000000..90631cf --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/home/home.html @@ -0,0 +1,97 @@ +
Your current status is:
+@if (auth.authenticated()) { +
Authenticated
+
+
{{ auth.idTokenClaims()?.name }}
+
{{ auth.idTokenClaims()?.email }}
+
+ +} @else { +
Not authenticated.
+ @if (!auth.keycloakReachable()) { +

+ Keycloak is not reachable at {{ issuer }}. Start it with + docker compose up -d --wait. +

+ } + +} + +
+

Spring Boot API

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

+ Open the protected page, a route + guarded by authGuard. +

+
+ +@if (auth.authenticated()) { +
+
+ + +
+
+ + +
+
+} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/home/home.spec.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/home/home.spec.ts new file mode 100644 index 0000000..9f9d285 --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/home/home.spec.ts @@ -0,0 +1,95 @@ +import { provideHttpClient } from '@angular/common/http'; +import { HttpTestingController, provideHttpClientTesting } from '@angular/common/http/testing'; +import { TestBed } from '@angular/core/testing'; +import { provideRouter } from '@angular/router'; +import { OAuthService } from 'angular-oauth2-oidc'; +import { Subject } from 'rxjs'; +import { Home } from './home'; + +function fakeJwt(claims: object): string { + const encode = (part: object) => + btoa(JSON.stringify(part)).replace(/=+$/, '').replace(/\+/g, '-').replace(/\//g, '_'); + return `${encode({ alg: 'RS256', typ: 'JWT' })}.${encode(claims)}.signature`; +} + +async function render(loggedIn: boolean) { + const issuer = 'http://localhost:8888/auth/realms/demo-realm'; + const oauth = { + events: new Subject(), + discoveryDocumentLoaded: true, + hasValidAccessToken: () => loggedIn, + getAccessToken: () => + loggedIn ? fakeJwt({ iss: issuer, realm_access: { roles: ['user'] } }) : null, + getIdToken: () => + loggedIn ? fakeJwt({ iss: issuer, name: 'Test User', email: 'test@example.com' }) : null, + initCodeFlow: vi.fn(), + logOut: vi.fn(), + }; + TestBed.configureTestingModule({ + imports: [Home], + providers: [ + provideRouter([]), + provideHttpClient(), + provideHttpClientTesting(), + { provide: OAuthService, useValue: oauth }, + ], + }); + const fixture = TestBed.createComponent(Home); + await fixture.whenStable(); + const element = fixture.nativeElement as HTMLElement; + const button = (name: string) => + Array.from(element.querySelectorAll('button')).find( + (candidate) => candidate.textContent?.trim() === name, + ) as HTMLButtonElement; + const textarea = (id: string) => element.querySelector(`#${id}`); + return { fixture, element, oauth, button, textarea, http: TestBed.inject(HttpTestingController) }; +} + +describe('Home', () => { + it('starts the login when logged out', async () => { + const { element, oauth, button, textarea } = await render(false); + + expect(element.textContent).toContain('Not authenticated.'); + expect(textarea('access-token')).toBeNull(); + + button('Log in').click(); + expect(oauth.initCodeFlow).toHaveBeenCalled(); + }); + + it('shows the user and the decoded tokens when logged in', async () => { + const { element, oauth, button, textarea } = await render(true); + + expect(element.textContent).toContain('Authenticated'); + expect(element.textContent).toContain('Test User'); + expect(element.textContent).toContain('test@example.com'); + expect(textarea('access-token')?.value).toContain('"iss"'); + expect(textarea('id-token')?.value).toContain('"email": "test@example.com"'); + + button('Log out').click(); + expect(oauth.logOut).toHaveBeenCalled(); + }); + + it('shows the JSON returned by the API', async () => { + const { fixture, button, textarea, http } = await render(true); + + button('Call /api/test/user').click(); + http + .expectOne('http://localhost:8080/api/test/user') + .flush({ message: 'Hello Secured with user role.', user: 'test' }); + await fixture.whenStable(); + + expect(textarea('api-response')?.value).toContain('"user": "test"'); + }); + + it('shows the HTTP status when the API refuses the call', async () => { + const { fixture, button, textarea, http } = await render(true); + + button('Call /api/test/user').click(); + http + .expectOne('http://localhost:8080/api/test/user') + .flush(null, { status: 403, statusText: 'Forbidden' }); + await fixture.whenStable(); + + expect(textarea('api-response')?.value).toContain('403 Forbidden'); + }); +}); diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/home/home.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/home/home.ts new file mode 100644 index 0000000..2efa1b3 --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/home/home.ts @@ -0,0 +1,23 @@ +import { JsonPipe } from '@angular/common'; +import { Component, inject, signal } from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { environment } from '../../environments/environment'; +import { Api, ApiResponse } from '../api/api'; +import { Auth } from '../auth/auth'; + +@Component({ + selector: 'app-home', + imports: [JsonPipe, RouterLink], + templateUrl: './home.html', +}) +export class Home { + protected readonly auth = inject(Auth); + private readonly api = inject(Api); + + protected readonly issuer = environment.issuer; + protected readonly response = signal(null); + + protected call(path: string): void { + this.api.get(path).subscribe((response) => this.response.set(response)); + } +} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/layout/footer.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/layout/footer.ts new file mode 100644 index 0000000..dc25020 --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/layout/footer.ts @@ -0,0 +1,35 @@ +import { NgComponentOutlet } from '@angular/common'; +import { Component } from '@angular/core'; +import { EmailIcon, ExternalLinkIcon, GithubIcon } from './icons'; + +@Component({ + selector: 'app-footer', + imports: [NgComponentOutlet], + template: ` + + `, +}) +export class Footer { + protected readonly links = [ + { label: 'Docs', href: 'https://phasetwo.io/docs/introduction/', icon: ExternalLinkIcon }, + { label: 'Github', href: 'https://github.com/p2-inc/', icon: GithubIcon }, + { label: 'Blog', href: 'https://phasetwo.io/blog/', icon: ExternalLinkIcon }, + { label: 'Contact', href: 'mailto:support@phasetwo.io', icon: EmailIcon }, + ]; +} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/layout/icons.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/layout/icons.ts new file mode 100644 index 0000000..22d54d8 --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/layout/icons.ts @@ -0,0 +1,88 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-angular-icon', + host: { class: 'inline-flex' }, + template: ` + + `, +}) +export class AngularIcon {} + +@Component({ + selector: 'app-github-icon', + host: { class: 'inline-flex' }, + template: ` + + `, +}) +export class GithubIcon {} + +@Component({ + selector: 'app-external-link-icon', + host: { class: 'inline-flex' }, + template: ` + + `, +}) +export class ExternalLinkIcon {} + +@Component({ + selector: 'app-email-icon', + host: { class: 'inline-flex' }, + template: ` + + `, +}) +export class EmailIcon {} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/protected/protected.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/protected/protected.ts new file mode 100644 index 0000000..bf5fe34 --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/src/app/protected/protected.ts @@ -0,0 +1,33 @@ +import { Component, inject } from '@angular/core'; +import { toSignal } from '@angular/core/rxjs-interop'; +import { RouterLink } from '@angular/router'; +import { Api } from '../api/api'; + +@Component({ + selector: 'app-protected', + imports: [RouterLink], + template: ` +

Protected page

+

+ Only logged-in users get here: authGuard sends everyone else to Keycloak first. +

+
+ + +
+ + Back to the home page + + `, +}) +export class Protected { + protected readonly response = toSignal(inject(Api).get('/api/test/user')); +} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/service/auth.service.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/service/auth.service.ts deleted file mode 100644 index 19f6561..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/service/auth.service.ts +++ /dev/null @@ -1,40 +0,0 @@ -// auth.service.ts -import { Injectable } from '@angular/core'; -import { OAuthService } from 'angular-oauth2-oidc'; -import { jwtDecode } from 'jwt-decode'; - -@Injectable({ - providedIn: 'root', -}) -export class AuthService { - constructor(private oauthService: OAuthService) {} - - signIn() { - return this.oauthService.initLoginFlow(); - } - - signOut() { - this.oauthService.logOut(); - } - - getDecodedAccessToken(): any { - const token = this.oauthService.getAccessToken(); - if (token) { - return jwtDecode(token); - } - return null; - } - - getUserInfo(): any { - const decodedToken = this.getDecodedAccessToken(); - if (decodedToken) { - return { - username: decodedToken.preferred_username, - email: decodedToken.email, - roles: decodedToken.realm_access.roles.join(', '), - // Add other fields as necessary - }; - } - return null; - } -} diff --git a/frameworks/spring-boot-keycloak/angularclient/src/app/service/local-storage.service.ts b/frameworks/spring-boot-keycloak/angularclient/src/app/service/local-storage.service.ts deleted file mode 100644 index 8a1104f..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/app/service/local-storage.service.ts +++ /dev/null @@ -1,41 +0,0 @@ -import {Inject, Injectable, InjectionToken} from "@angular/core"; -import {isDefined} from "../commons/commons"; - -export let LOCAL_STORAGE_TOKEN = new InjectionToken('LOCAL_STORAGE'); - -@Injectable({ - providedIn: 'root' -}) -export class LocalStorageService { - - constructor(@Inject(LOCAL_STORAGE_TOKEN) private localStorageProvider: any) { - } - - setItem(key: string, value: T): void { - isDefined(value) - ? this.localStorageProvider.setItem(key, JSON.stringify(value)) - : this.localStorageProvider.removeItem(key); - } - - getItem(key: string): T | null { - const serializedObject = this.localStorageProvider.getItem(key); - return isDefined(serializedObject) ? JSON.parse(serializedObject) as T : null; - } - - removeItem(key: string): void { - this.localStorageProvider.removeItem(key); - } - - clear(): void { - this.localStorageProvider.clear(); - } -} - - -declare const localStorage: any; - -export function localStorageFactory(): any { - return localStorage; -} - - diff --git a/frameworks/spring-boot-keycloak/angularclient/src/assets/.gitkeep b/frameworks/spring-boot-keycloak/angularclient/src/assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/frameworks/spring-boot-keycloak/angularclient/src/environments/environment.prod.ts b/frameworks/spring-boot-keycloak/angularclient/src/environments/environment.prod.ts deleted file mode 100644 index 3612073..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/environments/environment.prod.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const environment = { - production: true -}; diff --git a/frameworks/spring-boot-keycloak/angularclient/src/environments/environment.ts b/frameworks/spring-boot-keycloak/angularclient/src/environments/environment.ts index 7b4f817..8a79541 100644 --- a/frameworks/spring-boot-keycloak/angularclient/src/environments/environment.ts +++ b/frameworks/spring-boot-keycloak/angularclient/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 + issuer: 'http://localhost:8888/auth/realms/demo-realm', + clientId: 'demo-spa', + apiBaseUrl: 'http://localhost:8080', }; - -/* - * 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/frameworks/spring-boot-keycloak/angularclient/src/index.html b/frameworks/spring-boot-keycloak/angularclient/src/index.html index d3e2e21..6603bc3 100644 --- a/frameworks/spring-boot-keycloak/angularclient/src/index.html +++ b/frameworks/spring-boot-keycloak/angularclient/src/index.html @@ -1,8 +1,8 @@ - + - Phase Two | Angular Application Secured with Keycloak + Phase Two | Spring Boot and Angular with Keycloak diff --git a/frameworks/spring-boot-keycloak/angularclient/src/main.ts b/frameworks/spring-boot-keycloak/angularclient/src/main.ts index c7b673c..190f341 100644 --- a/frameworks/spring-boot-keycloak/angularclient/src/main.ts +++ b/frameworks/spring-boot-keycloak/angularclient/src/main.ts @@ -1,12 +1,5 @@ -import { enableProdMode } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { bootstrapApplication } from '@angular/platform-browser'; +import { appConfig } from './app/app.config'; +import { App } from './app/app'; -import { AppModule } from './app/app.module'; -import { environment } from './environments/environment'; - -if (environment.production) { - enableProdMode(); -} - -platformBrowserDynamic().bootstrapModule(AppModule) - .catch(err => console.error(err)); +bootstrapApplication(App, appConfig).catch((err) => console.error(err)); diff --git a/frameworks/spring-boot-keycloak/angularclient/src/polyfills.ts b/frameworks/spring-boot-keycloak/angularclient/src/polyfills.ts deleted file mode 100644 index d5f67bd..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/polyfills.ts +++ /dev/null @@ -1,65 +0,0 @@ -/** - * This file includes polyfills needed by Angular and is loaded before the app. - * You can add your own extra polyfills to this file. - * - * This file is divided into 2 sections: - * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. - * 2. Application imports. Files imported after ZoneJS that should be loaded before your main - * file. - * - * The current setup is for so-called "evergreen" browsers; the last versions of browsers that - * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), - * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. - * - * Learn more in https://angular.io/guide/browser-support - */ - -/*************************************************************************************************** - * BROWSER POLYFILLS - */ - -/** - * IE11 requires the following for NgClass support on SVG elements - */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - -/** - * Web Animations `@angular/platform-browser/animations` - * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. - * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). - */ -// import 'web-animations-js'; // Run `npm install --save web-animations-js`. - -/** - * By default, zone.js will patch all possible macroTask and DomEvents - * user can disable parts of macroTask/DomEvents patch by setting following flags - * because those flags need to be set before `zone.js` being loaded, and webpack - * will put import in the top of bundle, so user need to create a separate file - * in this directory (for example: zone-flags.ts), and put the following flags - * into that file, and then add the following code before importing zone.js. - * import './zone-flags'; - * - * The flags allowed in zone-flags.ts are listed here. - * - * The following flags will work for all browsers. - * - * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame - * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick - * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames - * - * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js - * with the following flag, it will bypass `zone.js` patch for IE/Edge - * - * (window as any).__Zone_enable_cross_context_check = true; - * - */ - -/*************************************************************************************************** - * Zone JS is required by default for Angular itself. - */ -import 'zone.js/dist/zone'; // Included with Angular CLI. - - -/*************************************************************************************************** - * APPLICATION IMPORTS - */ diff --git a/frameworks/spring-boot-keycloak/angularclient/src/styles.css b/frameworks/spring-boot-keycloak/angularclient/src/styles.css index f02024c..f1fa810 100644 --- a/frameworks/spring-boot-keycloak/angularclient/src/styles.css +++ b/frameworks/spring-boot-keycloak/angularclient/src/styles.css @@ -1,27 +1,43 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@import 'tailwindcss'; -.page-bg { - background-position: top center; - background-repeat: no-repeat; - background-size: 100% auto; +@theme { + --color-p2blue-100: #f9fcfe; + --color-p2blue-200: #edf5fb; + --color-p2blue-500: #5b9fdd; + --color-p2blue-700: #1570c2; + --color-p2blue-900: #3c474e; + --color-p2gray-800: #1c1d1e; + --color-p2gray-900: #252627; + --color-p2grad-100: #739fe5; + --color-p2grad-200: #295398; + --color-p2dark-900: #111111; + --color-p2dark-1000: #000000; + --drop-shadow-btn-dark: 0px 1px 8px rgba(11, 25, 35, 0.4); + --drop-shadow-btn-light: 0px 1px 8px rgba(11, 25, 35, 0.1); } -.page-home { - position: absolute; - left: 0; - top: 0; - width: 100vw; - height: 100vh; - z-index: -1; -} -@media (min-width: 768px) { + +@layer components { + .page-bg { + background-position: top center; + background-repeat: no-repeat; + background-size: 100% auto; + } + .page-home { - left: 50%; - transform: translateX(-50%); + position: absolute; + top: 0; + left: 0; + z-index: -1; width: 100vw; height: 100vh; - object-fit: cover; - object-position: bottom; + } + + @media (min-width: 768px) { + .page-home { + left: 50%; + transform: translateX(-50%); + object-fit: cover; + object-position: bottom; + } } } diff --git a/frameworks/spring-boot-keycloak/angularclient/src/styles.scss b/frameworks/spring-boot-keycloak/angularclient/src/styles.scss deleted file mode 100644 index 90d4ee0..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/src/styles.scss +++ /dev/null @@ -1 +0,0 @@ -/* You can add global styles to this file, and also import other style files */ diff --git a/frameworks/spring-boot-keycloak/angularclient/tailwind.config.js b/frameworks/spring-boot-keycloak/angularclient/tailwind.config.js deleted file mode 100644 index 95f0fd4..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/tailwind.config.js +++ /dev/null @@ -1,38 +0,0 @@ -module.exports = { - purge: [], - darkMode: false, // or 'media' or 'class' - content: ["./src/**/*.{html,ts}"], - theme: { - extend: { - colors: { - p2blue: { - 100: "#F9FCFE", - 200: "#EDF5FB", - 500: "#5B9FDD", - 700: "#1570C2", - 900: "#3C474E", - }, - p2gray: { - 800: "#1C1D1E", - 900: "#252627", - }, - p2grad: { - 100: "#739FE5", - 200: "#295398", - }, - p2dark: { - 900: "#111111", - 1000: "#000000", - }, - }, - dropShadow: { - "btn-dark": "0px 1px 8px rgba(11, 25, 35, 0.4)", - "btn-light": "0px 1px 8px rgba(11, 25, 35, 0.1)", - }, - }, - }, - variants: { - extend: {}, - }, - plugins: [], -}; diff --git a/frameworks/spring-boot-keycloak/angularclient/tsconfig.app.json b/frameworks/spring-boot-keycloak/angularclient/tsconfig.app.json index 82d91dc..281dc21 100644 --- a/frameworks/spring-boot-keycloak/angularclient/tsconfig.app.json +++ b/frameworks/spring-boot-keycloak/angularclient/tsconfig.app.json @@ -1,15 +1,8 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ { "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "./out-tsc/app", "types": [] }, - "files": [ - "src/main.ts", - "src/polyfills.ts" - ], - "include": [ - "src/**/*.d.ts" - ] + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts"] } diff --git a/frameworks/spring-boot-keycloak/angularclient/tsconfig.json b/frameworks/spring-boot-keycloak/angularclient/tsconfig.json index 4a4dc62..d31de45 100644 --- a/frameworks/spring-boot-keycloak/angularclient/tsconfig.json +++ b/frameworks/spring-boot-keycloak/angularclient/tsconfig.json @@ -1,23 +1,29 @@ -/* To learn more about this file see: https://angular.io/config/tsconfig. */ { "compileOnSave": false, "compilerOptions": { - "baseUrl": "./", - "outDir": "./dist/out-tsc", - "sourceMap": true, - "declaration": false, - "downlevelIteration": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "isolatedModules": true, "experimentalDecorators": true, - "moduleResolution": "node", "importHelpers": true, - "target": "es2015", - "module": "es2020", - "lib": [ - "es2018", - "dom" - ] + "target": "ES2022", + "module": "preserve" }, "angularCompilerOptions": { - "enableI18nLegacyMessageIdFormat": false - } + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true + }, + "files": [], + "references": [ + { + "path": "./tsconfig.app.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] } diff --git a/frameworks/spring-boot-keycloak/angularclient/tsconfig.spec.json b/frameworks/spring-boot-keycloak/angularclient/tsconfig.spec.json new file mode 100644 index 0000000..d5b00dc --- /dev/null +++ b/frameworks/spring-boot-keycloak/angularclient/tsconfig.spec.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": ["vitest/globals"] + }, + "include": ["src/**/*.d.ts", "src/**/*.spec.ts"] +} diff --git a/frameworks/spring-boot-keycloak/angularclient/tslint.json b/frameworks/spring-boot-keycloak/angularclient/tslint.json deleted file mode 100644 index 277c8eb..0000000 --- a/frameworks/spring-boot-keycloak/angularclient/tslint.json +++ /dev/null @@ -1,152 +0,0 @@ -{ - "extends": "tslint:recommended", - "rulesDirectory": [ - "codelyzer" - ], - "rules": { - "align": { - "options": [ - "parameters", - "statements" - ] - }, - "array-type": false, - "arrow-return-shorthand": true, - "curly": true, - "deprecation": { - "severity": "warning" - }, - "eofline": true, - "import-blacklist": [ - true, - "rxjs/Rx" - ], - "import-spacing": true, - "indent": { - "options": [ - "spaces" - ] - }, - "max-classes-per-file": false, - "max-line-length": [ - true, - 140 - ], - "member-ordering": [ - true, - { - "order": [ - "static-field", - "instance-field", - "static-method", - "instance-method" - ] - } - ], - "no-console": [ - true, - "debug", - "info", - "time", - "timeEnd", - "trace" - ], - "no-empty": false, - "no-inferrable-types": [ - true, - "ignore-params" - ], - "no-non-null-assertion": true, - "no-redundant-jsdoc": true, - "no-switch-case-fall-through": true, - "no-var-requires": false, - "object-literal-key-quotes": [ - true, - "as-needed" - ], - "quotemark": [ - true, - "single" - ], - "semicolon": { - "options": [ - "always" - ] - }, - "space-before-function-paren": { - "options": { - "anonymous": "never", - "asyncArrow": "always", - "constructor": "never", - "method": "never", - "named": "never" - } - }, - "typedef": [ - true, - "call-signature" - ], - "typedef-whitespace": { - "options": [ - { - "call-signature": "nospace", - "index-signature": "nospace", - "parameter": "nospace", - "property-declaration": "nospace", - "variable-declaration": "nospace" - }, - { - "call-signature": "onespace", - "index-signature": "onespace", - "parameter": "onespace", - "property-declaration": "onespace", - "variable-declaration": "onespace" - } - ] - }, - "variable-name": { - "options": [ - "ban-keywords", - "check-format", - "allow-pascal-case" - ] - }, - "whitespace": { - "options": [ - "check-branch", - "check-decl", - "check-operator", - "check-separator", - "check-type", - "check-typecast" - ] - }, - "component-class-suffix": true, - "contextual-lifecycle": true, - "directive-class-suffix": true, - "no-conflicting-lifecycle": true, - "no-host-metadata-property": true, - "no-input-rename": true, - "no-inputs-metadata-property": true, - "no-output-native": true, - "no-output-on-prefix": true, - "no-output-rename": true, - "no-outputs-metadata-property": true, - "template-banana-in-box": true, - "template-no-negated-async": true, - "use-lifecycle-interface": true, - "use-pipe-transform-interface": true, - "directive-selector": [ - true, - "attribute", - "app", - "camelCase" - ], - "component-selector": [ - true, - "element", - "app", - "kebab-case" - ] - } -} diff --git a/frameworks/spring-boot-keycloak/build.gradle b/frameworks/spring-boot-keycloak/build.gradle index a48bc6a..42aef3b 100644 --- a/frameworks/spring-boot-keycloak/build.gradle +++ b/frameworks/spring-boot-keycloak/build.gradle @@ -1,29 +1,32 @@ plugins { - id 'java' - id 'org.springframework.boot' version '3.2.5' - id 'io.spring.dependency-management' version '1.1.4' + id 'java' + id 'org.springframework.boot' version '4.1.1' + id 'io.spring.dependency-management' version '1.1.7' } group = 'com.example' version = '0.0.1-SNAPSHOT' java { - sourceCompatibility = '17' + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } } repositories { - mavenCentral() + mavenCentral() } dependencies { - implementation 'org.springframework.boot:spring-boot-starter-security' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server' - - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.springframework.security:spring-security-test' + implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.springframework.boot:spring-boot-starter-security-oauth2-resource-server' + implementation 'org.springframework.boot:spring-boot-starter-webmvc' + testImplementation 'org.springframework.boot:spring-boot-starter-security-oauth2-resource-server-test' + testImplementation 'org.springframework.boot:spring-boot-starter-security-test' + testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { - useJUnitPlatform() + useJUnitPlatform() } diff --git a/frameworks/spring-boot-keycloak/docker-compose.yml b/frameworks/spring-boot-keycloak/docker-compose.yml index 9971b34..0dac81a 100644 --- a/frameworks/spring-boot-keycloak/docker-compose.yml +++ b/frameworks/spring-boot-keycloak/docker-compose.yml @@ -1,14 +1,27 @@ -version: '3.8' +name: p2-examples-spring-boot-keycloak services: keycloak: - image: quay.io/keycloak/keycloak:24.0.3 - entrypoint: ["/opt/keycloak/bin/kc.sh", "start-dev"] + image: quay.io/phasetwo/phasetwo-keycloak:26.6 + command: ["start-dev", "--import-realm"] environment: - - KEYCLOAK_ADMIN=admin - - KEYCLOAK_ADMIN_PASSWORD=admin - - KC_HTTP_RELATIVE_PATH=/auth/ - - JAVA_OPTS=-agentlib:jdwp=transport=dt_socket,address=*:8787,server=y,suspend=n -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true + KC_BOOTSTRAP_ADMIN_USERNAME: admin + KC_BOOTSTRAP_ADMIN_PASSWORD: admin + KC_HTTP_RELATIVE_PATH: /auth + KC_HEALTH_ENABLED: "true" ports: - "8888:8080" - restart: always + volumes: + - ./keycloak:/opt/keycloak/data/import:ro + healthcheck: + test: + [ + "CMD", + "bash", + "-c", + "exec 3<>/dev/tcp/127.0.0.1/9000 && printf 'GET /auth/health/ready HTTP/1.0\\r\\nHost: localhost\\r\\n\\r\\n' >&3 && grep -q UP <&3", + ] + interval: 5s + timeout: 5s + retries: 60 + start_period: 20s diff --git a/frameworks/spring-boot-keycloak/gradle/wrapper/gradle-wrapper.jar b/frameworks/spring-boot-keycloak/gradle/wrapper/gradle-wrapper.jar index e6441136f3d4ba8a0da8d277868979cfbc8ad796..eddabd2eef8d94a5437d6168ff9c87a78ff725b3 100644 GIT binary patch delta 39487 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 C)#{i4 delta 35519 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 /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -112,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -170,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -203,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/frameworks/spring-boot-keycloak/gradlew.bat b/frameworks/spring-boot-keycloak/gradlew.bat index 25da30d..a51ec4f 100644 --- a/frameworks/spring-boot-keycloak/gradlew.bat +++ b/frameworks/spring-boot-keycloak/gradlew.bat @@ -13,16 +13,18 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem -@rem Gradle startup script for Windows +@rem gradlew startup script for Windows @rem @rem ########################################################################## -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @@ -49,7 +51,7 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -63,30 +65,18 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% -:mainEnd -if "%OS%"=="Windows_NT" endlocal +@rem Execute gradlew +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel -:omega +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/frameworks/spring-boot-keycloak/keycloak/demo-realm-realm.json b/frameworks/spring-boot-keycloak/keycloak/demo-realm-realm.json new file mode 100644 index 0000000..2f93304 --- /dev/null +++ b/frameworks/spring-boot-keycloak/keycloak/demo-realm-realm.json @@ -0,0 +1,71 @@ +{ + "realm": "demo-realm", + "displayName": "Spring Boot example (local)", + "enabled": true, + "sslRequired": "external", + "registrationAllowed": false, + "loginWithEmailAllowed": true, + "duplicateEmailsAllowed": false, + "resetPasswordAllowed": false, + "roles": { + "realm": [ + { + "name": "user", + "description": "Can call GET /api/test/user on the Spring Boot API" + } + ] + }, + "clients": [ + { + "clientId": "demo-spa", + "name": "Spring Boot example: Angular client", + "enabled": true, + "publicClient": true, + "standardFlowEnabled": true, + "directAccessGrantsEnabled": false, + "implicitFlowEnabled": false, + "rootUrl": "http://localhost:4200", + "baseUrl": "/", + "redirectUris": ["http://localhost:4200/*"], + "webOrigins": ["+"], + "attributes": { + "pkce.code.challenge.method": "S256", + "post.logout.redirect.uris": "+" + } + } + ], + "users": [ + { + "username": "test", + "email": "test@example.com", + "firstName": "Test", + "lastName": "User", + "enabled": true, + "emailVerified": true, + "realmRoles": ["default-roles-demo-realm", "user"], + "credentials": [ + { + "type": "password", + "value": "test", + "temporary": false + } + ] + }, + { + "username": "noaccess", + "email": "noaccess@example.com", + "firstName": "No", + "lastName": "Access", + "enabled": true, + "emailVerified": true, + "realmRoles": ["default-roles-demo-realm"], + "credentials": [ + { + "type": "password", + "value": "noaccess", + "temporary": false + } + ] + } + ] +} diff --git a/frameworks/spring-boot-keycloak/settings.gradle b/frameworks/spring-boot-keycloak/settings.gradle index 07763d1..dfca616 100644 --- a/frameworks/spring-boot-keycloak/settings.gradle +++ b/frameworks/spring-boot-keycloak/settings.gradle @@ -1 +1,5 @@ +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' +} + rootProject.name = 'spring-boot-keycloak' diff --git a/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/SpringBootKeycloakApplication.java b/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/SpringBootKeycloakApplication.java index 6fd3d8f..0da3472 100644 --- a/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/SpringBootKeycloakApplication.java +++ b/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/SpringBootKeycloakApplication.java @@ -6,7 +6,7 @@ @SpringBootApplication public class SpringBootKeycloakApplication { - public static void main(String[] args) { - SpringApplication.run(SpringBootKeycloakApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(SpringBootKeycloakApplication.class, args); + } } diff --git a/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/config/JwtClaimsConverter.java b/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/config/JwtClaimsConverter.java index 7d718cb..09d4e28 100644 --- a/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/config/JwtClaimsConverter.java +++ b/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/config/JwtClaimsConverter.java @@ -1,41 +1,36 @@ package com.example.springbootkeycloak.config; +import java.util.Collection; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + import org.springframework.core.convert.converter.Converter; import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.oauth2.jwt.Jwt; import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken; -import org.springframework.stereotype.Component; - -import java.util.Collection; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -@Component public class JwtClaimsConverter implements Converter { @Override public AbstractAuthenticationToken convert(Jwt jwt) { - var authorities = extractRealmRoles(jwt); - return new JwtAuthenticationToken(jwt, authorities, getPrincipalFromClaim(jwt)); + return new JwtAuthenticationToken(jwt, realmRoles(jwt), username(jwt)); } - private String getPrincipalFromClaim(Jwt jwt) { - var claimName = "preferred_username"; - return jwt.getClaim(claimName); + private static String username(Jwt jwt) { + String username = jwt.getClaimAsString("preferred_username"); + return username != null ? username : jwt.getSubject(); } - private Collection extractRealmRoles(Jwt jwt) { - Map resource = jwt.getClaim("realm_access"); - Collection roles; - if (resource == null - || (roles = (Collection) resource.get("roles")) == null) { - return Set.of(); + private static Set realmRoles(Jwt jwt) { + if (jwt.getClaims().get("realm_access") instanceof Map realmAccess + && realmAccess.get("roles") instanceof Collection roles) { + return roles.stream() + .map(role -> new SimpleGrantedAuthority("ROLE_" + role)) + .collect(Collectors.toUnmodifiableSet()); } - return roles.stream() - .map(role -> new SimpleGrantedAuthority("ROLE_" + role)) - .collect(Collectors.toSet()); + return Set.of(); } -} \ No newline at end of file +} diff --git a/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/config/SecurityConfig.java b/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/config/SecurityConfig.java index f4c3e42..2026f2c 100644 --- a/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/config/SecurityConfig.java +++ b/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/config/SecurityConfig.java @@ -1,38 +1,51 @@ package com.example.springbootkeycloak.config; +import static org.springframework.security.config.Customizer.withDefaults; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.web.SecurityFilterChain; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.CorsConfigurationSource; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; @Configuration -@EnableWebSecurity @EnableMethodSecurity public class SecurityConfig { - private final JwtClaimsConverter jwtAuthConverter; - - public SecurityConfig(JwtClaimsConverter jwtAuthConverter) { - this.jwtAuthConverter = jwtAuthConverter; + @Bean + SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .cors(withDefaults()) + .csrf(AbstractHttpConfigurer::disable) + .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .authorizeHttpRequests(authorize -> authorize + .requestMatchers("/error").permitAll() + .requestMatchers(HttpMethod.GET, "/api/test/anonymous").permitAll() + .requestMatchers("/api/**").authenticated() + .anyRequest().denyAll()) + .oauth2ResourceServer(resourceServer -> resourceServer + .jwt(jwt -> jwt.jwtAuthenticationConverter(new JwtClaimsConverter()))); + return http.build(); } @Bean - public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - http.authorizeHttpRequests(authz -> - authz - .requestMatchers("/api/**") - .authenticated() - ); - http.oauth2ResourceServer(oauth2ResourceServer -> - oauth2ResourceServer.jwt(jwt -> jwt.jwtAuthenticationConverter(jwtAuthConverter)) - ); - http.csrf(AbstractHttpConfigurer::disable); - - http.sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); - return http.build(); + CorsConfigurationSource corsConfigurationSource( + @Value("${app.cors.allowed-origins}") List allowedOrigins) { + var configuration = new CorsConfiguration(); + configuration.setAllowedOrigins(allowedOrigins); + configuration.setAllowedMethods(List.of("GET")); + configuration.setAllowedHeaders(List.of("Authorization")); + var source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/api/**", configuration); + return source; } } diff --git a/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/web/TestController.java b/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/web/TestController.java index 26c0a36..6327012 100644 --- a/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/web/TestController.java +++ b/frameworks/spring-boot-keycloak/src/main/java/com/example/springbootkeycloak/web/TestController.java @@ -1,24 +1,29 @@ package com.example.springbootkeycloak.web; -import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/api/test") public class TestController { - @RequestMapping(value = "/anonymous", method = RequestMethod.GET) - public ResponseEntity getAnonymous() { - return ResponseEntity.ok("Hello Anonymous"); + @GetMapping("/anonymous") + public Message anonymous() { + return new Message("Hello Anonymous"); } - @PreAuthorize("hasRole('ROLE_user')") - @RequestMapping(value = "/user", method = RequestMethod.GET) - public ResponseEntity getUser() - { - return ResponseEntity.ok("Hello Secured with user role."); + @GetMapping("/user") + @PreAuthorize("hasRole('user')") + public UserMessage user(Authentication authentication) { + return new UserMessage("Hello Secured with user role.", authentication.getName()); + } + + public record Message(String message) { + } + + public record UserMessage(String message, String user) { } } diff --git a/frameworks/spring-boot-keycloak/src/main/resources/application.yaml b/frameworks/spring-boot-keycloak/src/main/resources/application.yaml index 4414498..440b64f 100644 --- a/frameworks/spring-boot-keycloak/src/main/resources/application.yaml +++ b/frameworks/spring-boot-keycloak/src/main/resources/application.yaml @@ -5,10 +5,9 @@ spring: oauth2: resourceserver: jwt: - issuer-uri: http://localhost:8888/auth/realms/demo-realm - jwk-set-uri: ${spring.security.oauth2.resourceserver.jwt.issuer-uri}/protocol/openid-connect/certs -logging: - level: - org.springframework.security: TRACE + issuer-uri: ${KEYCLOAK_ISSUER_URI:http://localhost:8888/auth/realms/demo-realm} server: - port: '8080' \ No newline at end of file + port: 8080 +app: + cors: + allowed-origins: ${CORS_ALLOWED_ORIGINS:http://localhost:4200} diff --git a/frameworks/spring-boot-keycloak/src/test/java/com/example/springbootkeycloak/SpringBootKeycloakApplicationTests.java b/frameworks/spring-boot-keycloak/src/test/java/com/example/springbootkeycloak/SpringBootKeycloakApplicationTests.java index 9511da3..54701f9 100644 --- a/frameworks/spring-boot-keycloak/src/test/java/com/example/springbootkeycloak/SpringBootKeycloakApplicationTests.java +++ b/frameworks/spring-boot-keycloak/src/test/java/com/example/springbootkeycloak/SpringBootKeycloakApplicationTests.java @@ -6,8 +6,7 @@ @SpringBootTest class SpringBootKeycloakApplicationTests { - @Test - void contextLoads() { - } - + @Test + void contextLoads() { + } } diff --git a/frameworks/spring-boot-keycloak/src/test/java/com/example/springbootkeycloak/config/JwtClaimsConverterTests.java b/frameworks/spring-boot-keycloak/src/test/java/com/example/springbootkeycloak/config/JwtClaimsConverterTests.java new file mode 100644 index 0000000..299b634 --- /dev/null +++ b/frameworks/spring-boot-keycloak/src/test/java/com/example/springbootkeycloak/config/JwtClaimsConverterTests.java @@ -0,0 +1,50 @@ +package com.example.springbootkeycloak.config; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.Test; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.oauth2.jwt.Jwt; + +class JwtClaimsConverterTests { + + private final JwtClaimsConverter converter = new JwtClaimsConverter(); + + @Test + void mapsRealmRolesToAuthoritiesAndUsesThePreferredUsername() { + var authentication = converter.convert(jwt(Map.of( + "preferred_username", "test", + "realm_access", Map.of("roles", List.of("user", "offline_access"))))); + + assertThat(authentication.getName()).isEqualTo("test"); + assertThat(authentication.getAuthorities()) + .extracting(GrantedAuthority::getAuthority) + .containsExactlyInAnyOrder("ROLE_user", "ROLE_offline_access"); + } + + @Test + void grantsNoAuthoritiesWithoutRealmRoles() { + var authentication = converter.convert(jwt(Map.of("scope", "openid"))); + + assertThat(authentication.getName()).isEqualTo("subject"); + assertThat(authentication.getAuthorities()).isEmpty(); + } + + @Test + void ignoresMalformedRealmAccessClaims() { + assertThat(converter.convert(jwt(Map.of("realm_access", "user"))).getAuthorities()).isEmpty(); + assertThat(converter.convert(jwt(Map.of("realm_access", Map.of("roles", "user")))).getAuthorities()) + .isEmpty(); + } + + private static Jwt jwt(Map claims) { + return Jwt.withTokenValue("token") + .header("alg", "RS256") + .subject("subject") + .claims(existing -> existing.putAll(claims)) + .build(); + } +} diff --git a/frameworks/spring-boot-keycloak/src/test/java/com/example/springbootkeycloak/web/TestControllerTests.java b/frameworks/spring-boot-keycloak/src/test/java/com/example/springbootkeycloak/web/TestControllerTests.java new file mode 100644 index 0000000..d837f39 --- /dev/null +++ b/frameworks/spring-boot-keycloak/src/test/java/com/example/springbootkeycloak/web/TestControllerTests.java @@ -0,0 +1,99 @@ +package com.example.springbootkeycloak.web; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.BDDMockito.given; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.jwt; + +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.webmvc.test.autoconfigure.WebMvcTest; +import org.springframework.context.annotation.Import; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.oauth2.jwt.Jwt; +import org.springframework.security.oauth2.jwt.JwtDecoder; +import org.springframework.test.context.bean.override.mockito.MockitoBean; +import org.springframework.test.web.servlet.assertj.MockMvcTester; + +import com.example.springbootkeycloak.config.SecurityConfig; + +@WebMvcTest(TestController.class) +@Import(SecurityConfig.class) +class TestControllerTests { + + @Autowired + private MockMvcTester mvc; + + @MockitoBean + private JwtDecoder jwtDecoder; + + @Test + void anonymousEndpointIsPublic() { + assertThat(mvc.get().uri("/api/test/anonymous")) + .hasStatusOk() + .bodyJson().extractingPath("$.message").isEqualTo("Hello Anonymous"); + } + + @Test + void userEndpointRequiresAToken() { + assertThat(mvc.get().uri("/api/test/user")) + .hasStatus(HttpStatus.UNAUTHORIZED); + } + + @Test + void userEndpointRejectsATokenWithoutTheUserRole() { + assertThat(mvc.get().uri("/api/test/user").with(jwt())) + .hasStatus(HttpStatus.FORBIDDEN); + } + + @Test + void userEndpointAcceptsTheUserRole() { + assertThat(mvc.get().uri("/api/test/user") + .with(jwt().authorities(new SimpleGrantedAuthority("ROLE_user")))) + .hasStatusOk() + .bodyJson().extractingPath("$.message").isEqualTo("Hello Secured with user role."); + } + + @Test + void realmRolesOfABearerTokenAreMappedToSpringRoles() { + given(jwtDecoder.decode("keycloak-token")).willReturn(Jwt.withTokenValue("keycloak-token") + .header("alg", "RS256") + .subject("3f1c2b9e-7d4a-4f0e-9a51-0c6d2e8b7a10") + .claim("preferred_username", "test") + .claim("realm_access", Map.of("roles", List.of("user", "default-roles-demo-realm"))) + .build()); + + assertThat(mvc.get().uri("/api/test/user") + .header(HttpHeaders.AUTHORIZATION, "Bearer keycloak-token")) + .hasStatusOk() + .bodyJson().extractingPath("$.user").isEqualTo("test"); + } + + @Test + void corsAllowsTheAngularClient() { + assertThat(mvc.options().uri("/api/test/user") + .header(HttpHeaders.ORIGIN, "http://localhost:4200") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_HEADERS, "authorization")) + .hasStatusOk() + .hasHeader(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN, "http://localhost:4200"); + } + + @Test + void corsRejectsOtherOrigins() { + assertThat(mvc.options().uri("/api/test/user") + .header(HttpHeaders.ORIGIN, "https://other.example") + .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET")) + .hasStatus(HttpStatus.FORBIDDEN); + } + + @Test + void pathsOutsideTheApiAreDenied() { + assertThat(mvc.get().uri("/actuator").with(jwt())) + .hasStatus(HttpStatus.FORBIDDEN); + } +} From 3e083c192ba9d7b4d12b42eaa80f05ff49952354 Mon Sep 17 00:00:00 2001 From: WictorGirardi Date: Thu, 24 Sep 2026 16:02:28 -0300 Subject: [PATCH 2/8] Upgrade SAML example to Spring Boot 4.1, Java 21 and Gradle 9.7.1 --- saml2/idp-initiated/build.gradle | 42 ++-- .../gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 47505 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 +- saml2/idp-initiated/gradlew | 18 +- saml2/idp-initiated/gradlew.bat | 36 ++-- saml2/idp-initiated/settings.gradle | 4 + .../IdpInitiatedApplication.java | 6 +- .../idp_initiated/SecurityConfiguration.java | 22 +++ .../controllers/RootController.java | 15 +- .../src/main/resources/application.yaml | 18 +- .../src/main/resources/templates/index.html | 186 ++++++++++++++---- .../IdpInitiatedApplicationTests.java | 82 +++++++- .../src/test/resources/application.yaml | 17 ++ .../test/resources/test-realm-descriptor.xml | 25 +++ 14 files changed, 356 insertions(+), 119 deletions(-) create mode 100644 saml2/idp-initiated/src/main/java/com/saml2/idp_initiated/SecurityConfiguration.java create mode 100644 saml2/idp-initiated/src/test/resources/application.yaml create mode 100644 saml2/idp-initiated/src/test/resources/test-realm-descriptor.xml diff --git a/saml2/idp-initiated/build.gradle b/saml2/idp-initiated/build.gradle index bfbcad0..884c25b 100644 --- a/saml2/idp-initiated/build.gradle +++ b/saml2/idp-initiated/build.gradle @@ -1,38 +1,36 @@ plugins { - id 'java' - id 'org.springframework.boot' version '3.4.3' - id 'io.spring.dependency-management' version '1.1.7' + id 'java' + id 'org.springframework.boot' version '4.1.1' + id 'io.spring.dependency-management' version '1.1.7' } group = 'com.saml2' version = '0.0.1-SNAPSHOT' java { - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } } repositories { - mavenCentral() - maven { url "https://build.shibboleth.net/nexus/content/repositories/releases/" } + mavenCentral() + maven { url = 'https://build.shibboleth.net/maven/releases' } } dependencies { - implementation 'org.springframework.boot:spring-boot-starter' - constraints { - implementation "org.opensaml:opensaml-saml-api:5.1.3" - implementation "org.opensaml:opensaml-saml-impl:5.1.3" - } - implementation 'org.springframework.boot:spring-boot-starter-security' - implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.security:spring-security-saml2-service-provider' - - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.springframework.boot:spring-boot-starter-security-saml2' + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' + implementation 'org.springframework.boot:spring-boot-starter-webmvc' + implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6' + testImplementation 'org.springframework.boot:spring-boot-starter-security-saml2-test' + testImplementation 'org.springframework.boot:spring-boot-starter-security-test' + testImplementation 'org.springframework.boot:spring-boot-starter-thymeleaf-test' + testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.named('test') { - useJUnitPlatform() -} \ No newline at end of file + useJUnitPlatform() +} diff --git a/saml2/idp-initiated/gradle/wrapper/gradle-wrapper.jar b/saml2/idp-initiated/gradle/wrapper/gradle-wrapper.jar index a4b76b9530d66f5e68d973ea569d8e19de379189..eddabd2eef8d94a5437d6168ff9c87a78ff725b3 100644 GIT binary patch delta 39486 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 delta 35650 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 /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -173,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -206,15 +203,14 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/saml2/idp-initiated/gradlew.bat b/saml2/idp-initiated/gradlew.bat index 9d21a21..a51ec4f 100644 --- a/saml2/idp-initiated/gradlew.bat +++ b/saml2/idp-initiated/gradlew.bat @@ -19,12 +19,12 @@ @if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem -@rem Gradle startup script for Windows +@rem gradlew startup script for Windows @rem @rem ########################################################################## -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @@ -51,7 +51,7 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -65,30 +65,18 @@ echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +@rem Execute gradlew +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/saml2/idp-initiated/settings.gradle b/saml2/idp-initiated/settings.gradle index 5bb4d1d..08b0929 100644 --- a/saml2/idp-initiated/settings.gradle +++ b/saml2/idp-initiated/settings.gradle @@ -1 +1,5 @@ +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' +} + rootProject.name = 'idp-initiated' diff --git a/saml2/idp-initiated/src/main/java/com/saml2/idp_initiated/IdpInitiatedApplication.java b/saml2/idp-initiated/src/main/java/com/saml2/idp_initiated/IdpInitiatedApplication.java index fbd4e29..a5f19e3 100644 --- a/saml2/idp-initiated/src/main/java/com/saml2/idp_initiated/IdpInitiatedApplication.java +++ b/saml2/idp-initiated/src/main/java/com/saml2/idp_initiated/IdpInitiatedApplication.java @@ -6,8 +6,8 @@ @SpringBootApplication public class IdpInitiatedApplication { - public static void main(String[] args) { - SpringApplication.run(IdpInitiatedApplication.class, args); - } + public static void main(String[] args) { + SpringApplication.run(IdpInitiatedApplication.class, args); + } } diff --git a/saml2/idp-initiated/src/main/java/com/saml2/idp_initiated/SecurityConfiguration.java b/saml2/idp-initiated/src/main/java/com/saml2/idp_initiated/SecurityConfiguration.java new file mode 100644 index 0000000..eafc824 --- /dev/null +++ b/saml2/idp-initiated/src/main/java/com/saml2/idp_initiated/SecurityConfiguration.java @@ -0,0 +1,22 @@ +package com.saml2.idp_initiated; + +import static org.springframework.security.config.Customizer.withDefaults; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration(proxyBeanMethods = false) +public class SecurityConfiguration { + + @Bean + SecurityFilterChain securityFilterChain(HttpSecurity http) { + http.authorizeHttpRequests((requests) -> requests.anyRequest().authenticated()) + .saml2Login(withDefaults()) + .saml2Logout(withDefaults()) + .saml2Metadata(withDefaults()); + return http.build(); + } + +} diff --git a/saml2/idp-initiated/src/main/java/com/saml2/idp_initiated/controllers/RootController.java b/saml2/idp-initiated/src/main/java/com/saml2/idp_initiated/controllers/RootController.java index 151a481..d115d63 100644 --- a/saml2/idp-initiated/src/main/java/com/saml2/idp_initiated/controllers/RootController.java +++ b/saml2/idp-initiated/src/main/java/com/saml2/idp_initiated/controllers/RootController.java @@ -1,7 +1,7 @@ package com.saml2.idp_initiated.controllers; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticatedPrincipal; +import org.springframework.security.saml2.provider.service.authentication.Saml2AssertionAuthentication; +import org.springframework.security.saml2.provider.service.authentication.Saml2ResponseAssertionAccessor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -10,10 +10,13 @@ public class RootController { @GetMapping("/") - public String root(Model model, @AuthenticationPrincipal Saml2AuthenticatedPrincipal principal) { - String name = principal.getName(); - model.addAttribute("name", name); - + public String index(Saml2AssertionAuthentication authentication, Model model) { + Saml2ResponseAssertionAccessor assertion = authentication.getCredentials(); + model.addAttribute("registrationId", authentication.getRelyingPartyRegistrationId()); + model.addAttribute("nameId", assertion.getNameId()); + model.addAttribute("sessionIndexes", assertion.getSessionIndexes()); + model.addAttribute("attributes", assertion.getAttributes()); return "index"; } + } diff --git a/saml2/idp-initiated/src/main/resources/application.yaml b/saml2/idp-initiated/src/main/resources/application.yaml index 51f4aba..8539c8c 100644 --- a/saml2/idp-initiated/src/main/resources/application.yaml +++ b/saml2/idp-initiated/src/main/resources/application.yaml @@ -7,11 +7,15 @@ spring: saml2: relyingparty: registration: - okta-app: + keycloak: entity-id: "{baseUrl}/saml2/metadata" - acs.location: "{baseUrl}/login/saml2/sso" - signing.credentials: - - private-key-location: classpath:credentials/private.key # you need replace this with private key from keycloak saml client in order to validate signature - certificate-location: classpath:credentials/cert.crt # you need replace this with cert from keycloak saml client in order to validate signature - idp-entity-id: http://localhost:8080/realms/test-realm - assertingparty.metadata-uri: http://localhost:8080/realms/test-realm/protocol/saml/descriptor \ No newline at end of file + acs: + location: "{baseUrl}/login/saml2/sso" + singlelogout: + url: "{baseUrl}/logout/saml2/slo" + signing: + credentials: + - private-key-location: classpath:credentials/private.key + certificate-location: classpath:credentials/cert.crt + assertingparty: + metadata-uri: http://localhost:8080/realms/test-realm/protocol/saml/descriptor diff --git a/saml2/idp-initiated/src/main/resources/templates/index.html b/saml2/idp-initiated/src/main/resources/templates/index.html index 25d2e89..258630d 100644 --- a/saml2/idp-initiated/src/main/resources/templates/index.html +++ b/saml2/idp-initiated/src/main/resources/templates/index.html @@ -1,46 +1,148 @@ - - - - - + + + + + + Phase Two SAML 2.0 IdP-initiated example - SAML Login - - - -
- -
-
-

Authenticated Page

-
-
-

You are successfully logged in as

-
-
-
- -
-
+ + +
+ Phase Two +

Spring Boot · SAML 2.0 service provider · IdP-initiated SSO

+ + Source code on GitHub + +
+
+

Your current status is:

+

Authenticated

+

Logged in as user

+
+ +
+
+

SAML assertion (decoded)

+ + + + + + + + + + + + + + + + + + + +
Relying party registrationkeycloak
NameIDuser
Session indexindex
attributevalue
+
-
- + + diff --git a/saml2/idp-initiated/src/test/java/com/saml2/idp_initiated/IdpInitiatedApplicationTests.java b/saml2/idp-initiated/src/test/java/com/saml2/idp_initiated/IdpInitiatedApplicationTests.java index 44151d0..fc888c8 100644 --- a/saml2/idp-initiated/src/test/java/com/saml2/idp_initiated/IdpInitiatedApplicationTests.java +++ b/saml2/idp-initiated/src/test/java/com/saml2/idp_initiated/IdpInitiatedApplicationTests.java @@ -1,13 +1,89 @@ package com.saml2.idp_initiated; +import static org.hamcrest.Matchers.containsString; +import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.authentication; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.redirectedUrl; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.xpath; + +import java.util.List; +import java.util.Map; + import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.webmvc.test.autoconfigure.AutoConfigureMockMvc; +import org.springframework.security.core.AuthenticatedPrincipal; +import org.springframework.security.core.authority.AuthorityUtils; +import org.springframework.security.saml2.provider.service.authentication.Saml2AssertionAuthentication; +import org.springframework.security.saml2.provider.service.authentication.Saml2ResponseAssertion; +import org.springframework.test.web.servlet.MockMvc; @SpringBootTest +@AutoConfigureMockMvc class IdpInitiatedApplicationTests { - @Test - void contextLoads() { - } + private static final Map METADATA_NAMESPACE = Map.of("md", "urn:oasis:names:tc:SAML:2.0:metadata"); + + @Autowired + private MockMvc mvc; + + @Test + void publishesServiceProviderMetadata() throws Exception { + mvc.perform(get("/saml2/metadata")) + .andExpect(status().isOk()) + .andExpect(content().contentTypeCompatibleWith("application/samlmetadata+xml")) + .andExpect(xpath("/md:EntityDescriptor/@entityID", METADATA_NAMESPACE) + .string("http://localhost/saml2/metadata")) + .andExpect(xpath("//md:AssertionConsumerService/@Location", METADATA_NAMESPACE) + .string("http://localhost/login/saml2/sso")) + .andExpect(xpath("//md:SingleLogoutService/@Location", METADATA_NAMESPACE) + .string("http://localhost/logout/saml2/slo")); + } + + @Test + void publishesMetadataUnderTheRegistrationId() throws Exception { + mvc.perform(get("/saml2/metadata/keycloak")) + .andExpect(status().isOk()) + .andExpect(xpath("/md:EntityDescriptor/@entityID", METADATA_NAMESPACE) + .string("http://localhost/saml2/metadata")); + } + + @Test + void redirectsAnonymousUsersToTheSamlLogin() throws Exception { + mvc.perform(get("/")) + .andExpect(status().isFound()) + .andExpect(redirectedUrl("/saml2/authenticate?registrationId=keycloak")); + } + + @Test + void sendsAuthenticationRequestsToKeycloak() throws Exception { + mvc.perform(get("/saml2/authenticate").param("registrationId", "keycloak")) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("action=\"http://localhost:8080/realms/test-realm/protocol/saml\""))) + .andExpect(content().string(containsString("name=\"SAMLRequest\""))); + } + + @Test + void showsTheSamlAssertionToAuthenticatedUsers() throws Exception { + Map> attributes = Map.of("email", List.of("test@example.com")); + Saml2ResponseAssertion assertion = Saml2ResponseAssertion.withResponseValue("") + .nameId("test") + .sessionIndexes(List.of("session-1")) + .attributes(attributes) + .build(); + AuthenticatedPrincipal principal = () -> "test"; + Saml2AssertionAuthentication user = new Saml2AssertionAuthentication(principal, assertion, + AuthorityUtils.createAuthorityList("ROLE_USER"), "keycloak"); + + mvc.perform(get("/").with(authentication(user))) + .andExpect(status().isOk()) + .andExpect(content().string(containsString("Authenticated"))) + .andExpect(content().string(containsString("Logged in as test"))) + .andExpect(content().string(containsString("test@example.com"))) + .andExpect(content().string(containsString("session-1"))); + } } diff --git a/saml2/idp-initiated/src/test/resources/application.yaml b/saml2/idp-initiated/src/test/resources/application.yaml new file mode 100644 index 0000000..b8ab4ce --- /dev/null +++ b/saml2/idp-initiated/src/test/resources/application.yaml @@ -0,0 +1,17 @@ +spring: + application: + name: idp-initiated + security: + saml2: + relyingparty: + registration: + keycloak: + entity-id: "{baseUrl}/saml2/metadata" + acs: + location: "{baseUrl}/login/saml2/sso" + singlelogout: + url: "{baseUrl}/logout/saml2/slo" + assertingparty: + metadata-uri: classpath:test-realm-descriptor.xml + singlesignon: + sign-request: false diff --git a/saml2/idp-initiated/src/test/resources/test-realm-descriptor.xml b/saml2/idp-initiated/src/test/resources/test-realm-descriptor.xml new file mode 100644 index 0000000..289b119 --- /dev/null +++ b/saml2/idp-initiated/src/test/resources/test-realm-descriptor.xml @@ -0,0 +1,25 @@ + + + + + v3hvsG_POeQyr85avHMkzDo0yB-yXI7yvIqcSjMW_pA + + MIIDCzCCAfOgAwIBAgIUJCnFcTe4jwKouJrlKtkHENJ1OykwDQYJKoZIhvcNAQELBQAwFTETMBEGA1UEAwwKdGVzdC1yZWFsbTAeFw0yNjA5MjQxODQ3MzBaFw0zNjA5MjExODQ3MzBaMBUxEzARBgNVBAMMCnRlc3QtcmVhbG0wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC2zMh2sZ1CuOWQyki3ZWHnrXRt9gwKd9vGe494hC/1cojbWv/rVdsDu0FIfGi4VhewmeTEvAe/B/OoUiZO4payMZfMAIAYedwa+j2u3dsj/T0lT4+xWkfI28IQYVqwR1xOdTs5k/CDPvAFtiFHM350Qz8SNqb+iTdcdqzB4qRyAbTAhBLzncQgUirvwdEcl7HegHRwTZoyWtNy9O4BPoIwhs700Kq60ExH06d+R7XdZ+PHawuyOw2ZUrARddNVJqLH/HVxavmloYanEXJz9Kp/Y1UGAWXGEc7ZPdcbJbHbPn60nSwVbkETjMJ4U/mHHphR9P0f7hs8pJGuUACdT50pAgMBAAGjUzBRMB0GA1UdDgQWBBTNnwsYMxDfcJp5yHYJZvMa8i9wWDAfBgNVHSMEGDAWgBTNnwsYMxDfcJp5yHYJZvMa8i9wWDAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQAKsWrhzhDjmFJj2HCkpjj1pJYUC9Egb1eX8PyVK8KUwxV+273aFcVfnTKMIQzPo804Nvf2HsjEfJnKSURFGxDNiokQ9ykxryuCbLLjbg9+5FHAnq+4u4+GdsSFNFHWHcBXTLua1pKPXxLc4LcCppsQLCFz8nvhaEEKiNn7WmAkEAAotSBRf4LyfTs1o+qO3/AF4+kVYcVce3lytMDzZl9KBfhJ3dP9M0BtWKIs2Xnvn0alnhBlA7bdCxruSWBkJNqm9BWbyzVbIEXtQkbcJM3HwqguIw66Am83vKi6h+WmSStwsGom+bacXgyLg1aFIXEJQ3QPkVuZE84t5D6Iojyy + + + + + + + + + urn:oasis:names:tc:SAML:2.0:nameid-format:persistent + urn:oasis:names:tc:SAML:2.0:nameid-format:transient + urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified + urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress + + + + + + From f172b3a58df4c7a338b4f537ed9258ad3ce5e089 Mon Sep 17 00:00:00 2001 From: WictorGirardi Date: Thu, 24 Sep 2026 16:02:38 -0300 Subject: [PATCH 3/8] Generate the SP signing key locally instead of committing it --- saml2/idp-initiated/.gitattributes | 1 + saml2/idp-initiated/.gitignore | 5 +--- .../scripts/generate-sp-credentials.sh | 22 +++++++++++++++ .../src/main/resources/application.yaml | 4 +-- .../src/main/resources/credentials/cert.crt | 18 ------------- .../main/resources/credentials/private.key | 27 ------------------- 6 files changed, 26 insertions(+), 51 deletions(-) create mode 100755 saml2/idp-initiated/scripts/generate-sp-credentials.sh delete mode 100644 saml2/idp-initiated/src/main/resources/credentials/cert.crt delete mode 100644 saml2/idp-initiated/src/main/resources/credentials/private.key diff --git a/saml2/idp-initiated/.gitattributes b/saml2/idp-initiated/.gitattributes index 8af972c..6e40691 100644 --- a/saml2/idp-initiated/.gitattributes +++ b/saml2/idp-initiated/.gitattributes @@ -1,3 +1,4 @@ /gradlew text eol=lf +*.sh text eol=lf *.bat text eol=crlf *.jar binary diff --git a/saml2/idp-initiated/.gitignore b/saml2/idp-initiated/.gitignore index c2065bc..b4615e8 100644 --- a/saml2/idp-initiated/.gitignore +++ b/saml2/idp-initiated/.gitignore @@ -1,11 +1,11 @@ HELP.md +/credentials/ .gradle build/ !gradle/wrapper/gradle-wrapper.jar !**/src/main/**/build/ !**/src/test/**/build/ -### STS ### .apt_generated .classpath .factorypath @@ -17,7 +17,6 @@ bin/ !**/src/main/**/bin/ !**/src/test/**/bin/ -### IntelliJ IDEA ### .idea *.iws *.iml @@ -26,12 +25,10 @@ out/ !**/src/main/**/out/ !**/src/test/**/out/ -### NetBeans ### /nbproject/private/ /nbbuild/ /dist/ /nbdist/ /.nb-gradle/ -### VS Code ### .vscode/ diff --git a/saml2/idp-initiated/scripts/generate-sp-credentials.sh b/saml2/idp-initiated/scripts/generate-sp-credentials.sh new file mode 100755 index 0000000..7c804f1 --- /dev/null +++ b/saml2/idp-initiated/scripts/generate-sp-credentials.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd "$(dirname "$0")/.." + +entity_id="http://localhost:8081/saml2/metadata" +key_file="credentials/private.key" +cert_file="credentials/cert.crt" + +if [[ -f "$key_file" && -f "$cert_file" ]]; then + echo "$key_file and $cert_file already exist. Delete them to generate a new pair." + exit 0 +fi + +mkdir -p credentials +MSYS_NO_PATHCONV=1 openssl req -x509 -newkey rsa:2048 -nodes -sha256 -days 3650 \ + -subj "/CN=${entity_id//\//\\/}" \ + -keyout "$key_file" \ + -out "$cert_file" +chmod 600 "$key_file" + +echo "Created $key_file and $cert_file for $entity_id" diff --git a/saml2/idp-initiated/src/main/resources/application.yaml b/saml2/idp-initiated/src/main/resources/application.yaml index 8539c8c..9db54b0 100644 --- a/saml2/idp-initiated/src/main/resources/application.yaml +++ b/saml2/idp-initiated/src/main/resources/application.yaml @@ -15,7 +15,7 @@ spring: url: "{baseUrl}/logout/saml2/slo" signing: credentials: - - private-key-location: classpath:credentials/private.key - certificate-location: classpath:credentials/cert.crt + - private-key-location: file:credentials/private.key + certificate-location: file:credentials/cert.crt assertingparty: metadata-uri: http://localhost:8080/realms/test-realm/protocol/saml/descriptor diff --git a/saml2/idp-initiated/src/main/resources/credentials/cert.crt b/saml2/idp-initiated/src/main/resources/credentials/cert.crt deleted file mode 100644 index f905981..0000000 --- a/saml2/idp-initiated/src/main/resources/credentials/cert.crt +++ /dev/null @@ -1,18 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC1zCCAb8CBgGVPT9ESDANBgkqhkiG9w0BAQsFADAvMS0wKwYDVQQDDCRodHRw -Oi8vbG9jYWxob3N0OjgwODEvc2FtbDIvbWV0YWRhdGEwHhcNMjUwMjI1MTMxMzMx -WhcNMzUwMjI1MTMxNTExWjAvMS0wKwYDVQQDDCRodHRwOi8vbG9jYWxob3N0Ojgw -ODEvc2FtbDIvbWV0YWRhdGEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB -AQCqBFrHFZf94TZ7miZSmrB2mzPSZTof500+YjJfSfs4hOXzj3a9gqo4/0tiw5q4 -dFMfLisrXM58qyq1ifTvUoVe8IsvCUVT8varEF91Wrua3+8xJcMwO1NhUfDVQE2j -8YM4WpfSYYnpUx9RBOuYEGBacZbOjOKbRbdqiRiq3T0xi48mhZV7g+etx+N4FrSb -KifQEfp9R01XxCxLGChATHeIfu4x1B+sQKS1alSiz7rxL1etqyv+yI5TcA9Ew0PS -NwZWV43k+zHAn+4AsSZw3Q2szZv/9BXrdCrdrGgmbwUbngPFHU5wYcYKsv+PdY66 -z+O9uUWQhVbiz6xvJgWSQukvAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAAo6g+Kk -INIH6JIyJ2W0E2rsvhQSDgUwOB0CBUOqCiHnru8OqILLhrk53dh4SV8cPCwU7GHs -7AhLU3PtSZxqxEwAC5GR5d32jhNCt06P9Sb1DSnnQsGBORM9QUIkqe9tndBMiNlE -QZIOOYXx7fATdi5c8JAT0OFVmxMzdY7ZWTKm0iNi+KWpgqL7uP7E7FyGFMz0MKLO -QlUlmJSsVnnLf018PAnugfCJlQbRHofVweICFzXvI46q74UcUxFlObETtZTsXmD/ -14ltvqTVoYmOtd2q3xqahFp4x4VnKn3mjlaV643XmXLvqOOVPqjFkitQGn5259DS -ShKL8ajM4pV3M0o= ------END CERTIFICATE----- diff --git a/saml2/idp-initiated/src/main/resources/credentials/private.key b/saml2/idp-initiated/src/main/resources/credentials/private.key deleted file mode 100644 index 79670b1..0000000 --- a/saml2/idp-initiated/src/main/resources/credentials/private.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpQIBAAKCAQEAqgRaxxWX/eE2e5omUpqwdpsz0mU6H+dNPmIyX0n7OITl8492 -vYKqOP9LYsOauHRTHy4rK1zOfKsqtYn071KFXvCLLwlFU/L2qxBfdVq7mt/vMSXD -MDtTYVHw1UBNo/GDOFqX0mGJ6VMfUQTrmBBgWnGWzozim0W3aokYqt09MYuPJoWV -e4PnrcfjeBa0myon0BH6fUdNV8QsSxgoQEx3iH7uMdQfrECktWpUos+68S9Xrasr -/siOU3APRMND0jcGVleN5PsxwJ/uALEmcN0NrM2b//QV63Qq3axoJm8FG54DxR1O -cGHGCrL/j3WOus/jvblFkIVW4s+sbyYFkkLpLwIDAQABAoIBABOWbdj6+WhkDpFd -+KVSshrwFZ/bTr+HOASEbrZAwUNJOG7/q9f4mmD3tLk7vPMcX8k7Wfjkd9uwIrsI -mmIKOVhvUTHJmSWrW9TojX7pRaz5uMaKSbsgUqJnPN5syqUlOY+ADHbOCwQJMhX1 -Aami1V8GMDA61g66kP+irOdeluLCt8MbdJMXZN0VoCbgfkgNPH3AmYAWK5xOG7/q -/fiCc1IAP+t0m4MohVn/HiQ54agi5pcpx2Vq66RTg1J8vH0Qk5ZD3QIzmECusAff -kX33EeOIqdjgpjW6NpJQkESh5swdlPC6eDR6tQvF6Yw8/O67A7M/O08jgbUXUbnz -PmKvPjUCgYEA3Uf5KKqFlqxmKFS34B6Mvxgyvq9857MPm0XP+LQUh3ByNrL+dBHK -15yzgVgMohYkInhktVEneclcQEJ1e8xv3mAAbRZGSZqTISZWHRb0KIuI1hkysUk6 -RZl6Nux8CYkgd+Sko7vWC5/rPavMIBgjV51MjbRSZgUbvAU+HnMfpgUCgYEAxLFL -faG2wuj8yaZBg4Uf23QKuacvFpyPilLQieM9C90jJcxs56Pid2r8XCNYwgYz9DoY -HQbSmLW1ObmgW54yI2hL/35ZJPcCP56T4gUtz94z5HLM4ko6bYv37HXWLskDiYbh -XiqW1MvACHl4VPZAcYlHQFC8omxkLwb0fLaNpKMCgYEAzCD+F2afD60AHIpyiZyF -CC/heAjZN8D2T63qOaqeGYdAxXb/xsE3FwnmihZYqRm1wdrARIeV3AJGSL1GNasV -M9Xp7rgSpQmkWntMC0/GcrStyZu7KNK9n8ECfjJQBlfqjM9uleDMhzLCRsT57E14 -JPXlzf8f2B80Q5GuiVZ4RqUCgYEAq6pJRpaTGb2akqvl1dGkIjY+/hVpxYRSytjI -ZO/M4cPY3y5xhiHEj5DyO8AlwQEE6wyg6wR/XQSJ7J2T1SJWhAyM96ngR6DFd50B -WGxItXkrNSD0rDM4l09nzBp0GlUaHzd3DmaBSauiKENLwGtDh1PWuc09NU0AiwK4 -8veo250CgYEA279Kq3IkFD1CSEBXEiFvYY4MWxkgNdP6WNkgcH1Moo8+MxuA63fA -/uGuhwdtkD1Nceg/dAJyA30Aq7fDyUaTIK7IRyxtwl/0Xa+fL4sRI0fjPQMn594/ -3rjT0+5Cg4b03a/LbAdCZRg6QGuKdH/23HPFOwRMAv/h2j9P199dZnQ= ------END RSA PRIVATE KEY----- From 922d4b9bdd8c705af7bb0e211c6801e909dbbf44 Mon Sep 17 00:00:00 2001 From: WictorGirardi Date: Thu, 24 Sep 2026 16:02:43 -0300 Subject: [PATCH 4/8] Add Keycloak compose file and sanitized test realm for the SAML example --- saml2/idp-initiated/docker-compose.yml | 26 + saml2/idp-initiated/keycloak/saml-client.json | 65 - .../keycloak/test-realm-export.json | 2224 ----------------- saml2/idp-initiated/keycloak/test-realm.json | 118 + 4 files changed, 144 insertions(+), 2289 deletions(-) create mode 100644 saml2/idp-initiated/docker-compose.yml delete mode 100644 saml2/idp-initiated/keycloak/saml-client.json delete mode 100644 saml2/idp-initiated/keycloak/test-realm-export.json create mode 100644 saml2/idp-initiated/keycloak/test-realm.json diff --git a/saml2/idp-initiated/docker-compose.yml b/saml2/idp-initiated/docker-compose.yml new file mode 100644 index 0000000..1ddda52 --- /dev/null +++ b/saml2/idp-initiated/docker-compose.yml @@ -0,0 +1,26 @@ +name: saml2-idp-initiated + +services: + keycloak: + image: quay.io/phasetwo/phasetwo-keycloak:26.6 + command: ["start-dev", "--import-realm"] + environment: + KC_BOOTSTRAP_ADMIN_USERNAME: admin + KC_BOOTSTRAP_ADMIN_PASSWORD: admin + KC_HEALTH_ENABLED: "true" + ports: + - "8080:8080" + volumes: + - ./keycloak:/opt/keycloak/data/import:ro + healthcheck: + test: + [ + "CMD", + "bash", + "-c", + "exec 3<>/dev/tcp/127.0.0.1/9000 && printf 'GET /health/ready HTTP/1.0\\r\\nHost: localhost\\r\\n\\r\\n' >&3 && grep -q UP <&3", + ] + interval: 5s + timeout: 5s + retries: 60 + start_period: 20s diff --git a/saml2/idp-initiated/keycloak/saml-client.json b/saml2/idp-initiated/keycloak/saml-client.json deleted file mode 100644 index 823cf09..0000000 --- a/saml2/idp-initiated/keycloak/saml-client.json +++ /dev/null @@ -1,65 +0,0 @@ -{ - "clientId": "http://localhost:8081/saml2/metadata", - "name": "", - "description": "", - "rootUrl": "", - "adminUrl": "", - "baseUrl": "", - "surrogateAuthRequired": false, - "enabled": true, - "alwaysDisplayInConsole": false, - "clientAuthenticatorType": "client-secret", - "redirectUris": [ - "http://localhost:8081/*" - ], - "webOrigins": [], - "notBefore": 0, - "bearerOnly": false, - "consentRequired": false, - "standardFlowEnabled": true, - "implicitFlowEnabled": false, - "directAccessGrantsEnabled": true, - "serviceAccountsEnabled": false, - "publicClient": true, - "frontchannelLogout": true, - "protocol": "saml", - "attributes": { - "saml.assertion.signature": "false", - "saml.force.post.binding": "true", - "saml_single_logout_service_url_post": "http://localhost:8081/logout/saml2/slo", - "saml.encrypt": "false", - "post.logout.redirect.uris": "http://localhost:8081/*", - "saml_assertion_consumer_url_post": "http://localhost:8081/login/saml2/sso", - "saml.server.signature": "true", - "saml_idp_initiated_sso_url_name": "okta-client", - "saml.server.signature.keyinfo.ext": "false", - "saml.signing.certificate": "MIICpTCCAY0CBgGVPDMgIzANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDDAtva3RhLWNsaWVudDAeFw0yNTAyMjUwODIwMzhaFw0zNTAyMjUwODIyMThaMBYxFDASBgNVBAMMC29rdGEtY2xpZW50MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3QlnZM0WoaDWTszywlkz4FF9EnhAPLpQKqRMazLRg2p+h2KjidvMquDc8VQOsj6aNqgn+NmZXx4xolZ3s+0bjourGGeueHUS7qQqXDygWZ90Q6GYpgPVFW51LSTAwGZ6svObJW6MwN9f8Siff8+nkAtvMcxcpQwO11U7rl8Wt98xcixTcYzm341hWBPETfzDOLSrb2YZu3uRhds51NBXIEwsrPfqSM9NB5O7ELkFRVfvfwK13ACci6BxOi6vz4CQLuLkSvcd8o2FH+vOU8IGJpELp2EmELZ0wWL1STD7sBbGGpVnaGj0m5i63qn4jym12ARyHiENhvvtjUJEPY7E2QIDAQABMA0GCSqGSIb3DQEBCwUAA4IBAQB0BncWx4ANYcCWW3h+UXGageM5qV73fy/vg9IFeyduW7/wtcZLlCH5iBdfws8H3fsfinWHqWT5rwUIkjgTbGC7LkjB60MBqziaGeUn6KxHKvzWHGruFNHBmBYcaXZbC3YvxjRtBJsKPJ0dyVZWMRPJw8k/4z4o5Chxfj72dsGpCboAnrOjHwJKNIbVXtEXhyO8iNmVbjiMgPufOhCveoD2rsSQlFJhkx500KpkZY6T8quXiRFsasreRYT9hegsJYQGycvbaQSdHM2kz7fLuf6WIFrL+c7JRnW9FMvfik1cqSuCDcuSdE8LZ7u/52cvURX+NxZbgW0QZO1EhV8mnGTJ", - "realm_client": "false", - "saml.artifact.binding.identifier": "ug3P4zN09U1DuSnNZh4ltkTvjwA=", - "saml.artifact.binding": "false", - "saml.signature.algorithm": "RSA_SHA256", - "saml_force_name_id_format": "false", - "saml.client.signature": "false", - "saml.authnstatement": "true", - "display.on.consent.screen": "false", - "saml_name_id_format": "username", - "saml.signing.private.key": "MIIEpQIBAAKCAQEA3QlnZM0WoaDWTszywlkz4FF9EnhAPLpQKqRMazLRg2p+h2KjidvMquDc8VQOsj6aNqgn+NmZXx4xolZ3s+0bjourGGeueHUS7qQqXDygWZ90Q6GYpgPVFW51LSTAwGZ6svObJW6MwN9f8Siff8+nkAtvMcxcpQwO11U7rl8Wt98xcixTcYzm341hWBPETfzDOLSrb2YZu3uRhds51NBXIEwsrPfqSM9NB5O7ELkFRVfvfwK13ACci6BxOi6vz4CQLuLkSvcd8o2FH+vOU8IGJpELp2EmELZ0wWL1STD7sBbGGpVnaGj0m5i63qn4jym12ARyHiENhvvtjUJEPY7E2QIDAQABAoIBAAP9TtZPDNLlPyT8Nj/7gfARLHWcQcWO09JXNZFkQQuTDR5WsY60DsdBSH+bFapSLrCgm5sWW1owBnOQhbfTxmDt5KxLt8aRD2LLCAAy8G55riyn0qRhcpPA0wDZ9lgqqVmIQ9M6wfPbvESzJ+DTz8mN6Ud/8aahd3Wbwlhg+z0dk7UDIapnlC5lCaNuantQi2zClAzOu4mUnGAxXMgl0rMaZfVZRXPjH2L5+wRxd/TEyZUZ/A41YpyBuip7Eh4f+7surjoEnVmnqM3WNBgdLaFmXK0FSUY0wmP1CRRFtZr6izWgf1jhPrHgxySjx+zBLjE18d9tV8zhEAqpgR81z7ECgYEA9Byw9GZp12p7uOHNbGzQ7TkLsY+W7uF5hHYPhk51FF7SYcwhjXo5MVAPAVMU4PxRLBkysOJoJN6ZVVppvFMbEHStont70uYS8osXwSkRGreRc/VwOKGSh2qgxzEo5xlbeC9Z12utshltJGwU023+FhC0v6TKTkNzoL9nF5KQp4kCgYEA580JK5TWKG7Fva2V+nGSsVST8W5zhOxtBui771z/SZbK2zEUhMGxZjnHcFz8HKi9iWTFIyatong6jYgfEcv2uNqb+Ax+KYazckESSaRekoV7GVSCWm5nFAEnFDEgzlij8baY7VGTcvXaiHqpJmufsR2pOUBYnl+rfFda7+pIjtECgYEAx/RgdjEVbWBJq606CSAxGr9pdq45Yb7LPNc/7DGD8YWiKn181lhRVLVRNTKKnafQDaEuRnmN+PVk/+cpSRuBxb7tI3Smfp/60TVh5dTvr8TBngxjOeAPGGEdBUydRn8cz5tpqe0HwCTXo8fsXytvvz877uba17Skl/1wQnzJhJECgYEAwMujnfD8MsL3iyzOunAuL3oGVt+kC2HNyNpYPd1eo+lcrfTjeQvVLg5OmGFue7PJeXYsFXF9J83R/ZfDJ706Z0PESAq0AHv90sDWohOpaTrGSSomBWsgJt5Sj5PREm9dZJSYG4MnHY3pBmznNYJ8Xwcpkem4C3nNGu1ZQITfdpECgYEAhin1SLP/wlMc/Xmu3SdRJTlzvsftY0UQw/oPfJtg2J+TJwCQT5/zrFaJFklYSHQv3ZYOvz6WOfWSDHJm0Y1qyBZv/9QpAGddSh9zSpUFTPwki/uI5dQiCNlt5Hr4zJhNnw7ieYm1EA4cWk8n3pRac4+j8Qx6lmvmyShESdp7S2Q=", - "saml.allow.ecp.flow": "false", - "saml_signature_canonicalization_method": "http://www.w3.org/2001/10/xml-exc-c14n#", - "saml.onetimeuse.condition": "false", - "saml.server.signature.keyinfo.xmlSigKeyInfoKeyNameTransformer": "NONE" - }, - "authenticationFlowBindingOverrides": {}, - "fullScopeAllowed": true, - "nodeReRegistrationTimeout": -1, - "defaultClientScopes": [ - "saml_organization", - "role_list" - ], - "optionalClientScopes": [], - "access": { - "view": true, - "configure": true, - "manage": true - } -} \ No newline at end of file diff --git a/saml2/idp-initiated/keycloak/test-realm-export.json b/saml2/idp-initiated/keycloak/test-realm-export.json deleted file mode 100644 index 09c7305..0000000 --- a/saml2/idp-initiated/keycloak/test-realm-export.json +++ /dev/null @@ -1,2224 +0,0 @@ -{ - "realm": "test-realm", - "notBefore": 0, - "defaultSignatureAlgorithm": "RS256", - "revokeRefreshToken": false, - "refreshTokenMaxReuse": 0, - "accessTokenLifespan": 300, - "accessTokenLifespanForImplicitFlow": 900, - "ssoSessionIdleTimeout": 1800, - "ssoSessionMaxLifespan": 36000, - "ssoSessionIdleTimeoutRememberMe": 0, - "ssoSessionMaxLifespanRememberMe": 0, - "offlineSessionIdleTimeout": 2592000, - "offlineSessionMaxLifespanEnabled": false, - "offlineSessionMaxLifespan": 5184000, - "clientSessionIdleTimeout": 0, - "clientSessionMaxLifespan": 0, - "clientOfflineSessionIdleTimeout": 0, - "clientOfflineSessionMaxLifespan": 0, - "accessCodeLifespan": 60, - "accessCodeLifespanUserAction": 300, - "accessCodeLifespanLogin": 1800, - "actionTokenGeneratedByAdminLifespan": 43200, - "actionTokenGeneratedByUserLifespan": 300, - "oauth2DeviceCodeLifespan": 600, - "oauth2DevicePollingInterval": 5, - "enabled": true, - "sslRequired": "external", - "registrationAllowed": false, - "registrationEmailAsUsername": false, - "rememberMe": false, - "verifyEmail": false, - "loginWithEmailAllowed": true, - "duplicateEmailsAllowed": false, - "resetPasswordAllowed": false, - "editUsernameAllowed": false, - "bruteForceProtected": false, - "permanentLockout": false, - "maxTemporaryLockouts": 0, - "bruteForceStrategy": "MULTIPLE", - "maxFailureWaitSeconds": 900, - "minimumQuickLoginWaitSeconds": 60, - "waitIncrementSeconds": 60, - "quickLoginCheckMilliSeconds": 1000, - "maxDeltaTimeSeconds": 43200, - "failureFactor": 30, - "defaultRole": { - "id": "c5ffa4d0-7f09-41ff-a54d-cf198c3a1549", - "name": "default-roles-test-realm", - "description": "${role_default-roles}", - "composite": true, - "clientRole": false, - "containerId": "1e2d347c-43e2-4841-b199-b6a649d9bf2e" - }, - "requiredCredentials": [ - "password" - ], - "otpPolicyType": "totp", - "otpPolicyAlgorithm": "HmacSHA1", - "otpPolicyInitialCounter": 0, - "otpPolicyDigits": 6, - "otpPolicyLookAheadWindow": 1, - "otpPolicyPeriod": 30, - "otpPolicyCodeReusable": false, - "otpSupportedApplications": [ - "totpAppFreeOTPName", - "totpAppGoogleName", - "totpAppMicrosoftAuthenticatorName" - ], - "localizationTexts": {}, - "webAuthnPolicyRpEntityName": "keycloak", - "webAuthnPolicySignatureAlgorithms": [ - "ES256", - "RS256" - ], - "webAuthnPolicyRpId": "", - "webAuthnPolicyAttestationConveyancePreference": "not specified", - "webAuthnPolicyAuthenticatorAttachment": "not specified", - "webAuthnPolicyRequireResidentKey": "not specified", - "webAuthnPolicyUserVerificationRequirement": "not specified", - "webAuthnPolicyCreateTimeout": 0, - "webAuthnPolicyAvoidSameAuthenticatorRegister": false, - "webAuthnPolicyAcceptableAaguids": [], - "webAuthnPolicyExtraOrigins": [], - "webAuthnPolicyPasswordlessRpEntityName": "keycloak", - "webAuthnPolicyPasswordlessSignatureAlgorithms": [ - "ES256", - "RS256" - ], - "webAuthnPolicyPasswordlessRpId": "", - "webAuthnPolicyPasswordlessAttestationConveyancePreference": "not specified", - "webAuthnPolicyPasswordlessAuthenticatorAttachment": "not specified", - "webAuthnPolicyPasswordlessRequireResidentKey": "not specified", - "webAuthnPolicyPasswordlessUserVerificationRequirement": "not specified", - "webAuthnPolicyPasswordlessCreateTimeout": 0, - "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister": false, - "webAuthnPolicyPasswordlessAcceptableAaguids": [], - "webAuthnPolicyPasswordlessExtraOrigins": [], - "scopeMappings": [ - { - "clientScope": "offline_access", - "roles": [ - "offline_access" - ] - } - ], - "clientScopes": [ - { - "id": "9716d4a9-70ab-49e9-9215-33e5bfbea06c", - "name": "microprofile-jwt", - "description": "Microprofile - JWT built-in scope", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "false" - }, - "protocolMappers": [ - { - "id": "dcc6602b-5594-4670-8977-9d769736a181", - "name": "upn", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "username", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "upn", - "jsonType.label": "String" - } - }, - { - "id": "27d367a5-2f00-45e4-848d-cef298727e75", - "name": "groups", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-realm-role-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "multivalued": "true", - "user.attribute": "foo", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "groups", - "jsonType.label": "String" - } - } - ] - }, - { - "id": "c59c0a2f-f92c-4d65-9371-d5aa829f7edd", - "name": "offline_access", - "description": "OpenID Connect built-in scope: offline_access", - "protocol": "openid-connect", - "attributes": { - "consent.screen.text": "${offlineAccessScopeConsentText}", - "display.on.consent.screen": "true" - } - }, - { - "id": "8a1d42c1-1365-4ef2-b217-0f6c4a97e50b", - "name": "basic", - "description": "OpenID Connect scope for add all basic claims to the token", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "false", - "display.on.consent.screen": "false" - }, - "protocolMappers": [ - { - "id": "b3f9f3fe-f1d6-4971-911f-0d5ae54b1116", - "name": "auth_time", - "protocol": "openid-connect", - "protocolMapper": "oidc-usersessionmodel-note-mapper", - "consentRequired": false, - "config": { - "user.session.note": "AUTH_TIME", - "id.token.claim": "true", - "introspection.token.claim": "true", - "access.token.claim": "true", - "claim.name": "auth_time", - "jsonType.label": "long" - } - }, - { - "id": "f5bc781e-b973-40be-9049-be08173cf23f", - "name": "sub", - "protocol": "openid-connect", - "protocolMapper": "oidc-sub-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "access.token.claim": "true" - } - } - ] - }, - { - "id": "da6b69cc-7354-4cfc-b866-6d1fd8e436d8", - "name": "roles", - "description": "OpenID Connect scope for add user roles to the access token", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "false", - "consent.screen.text": "${rolesScopeConsentText}", - "display.on.consent.screen": "true" - }, - "protocolMappers": [ - { - "id": "886dc446-7d82-42c5-8f8d-9a438dfae14f", - "name": "realm roles", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-realm-role-mapper", - "consentRequired": false, - "config": { - "user.attribute": "foo", - "introspection.token.claim": "true", - "access.token.claim": "true", - "claim.name": "realm_access.roles", - "jsonType.label": "String", - "multivalued": "true" - } - }, - { - "id": "487b5b11-1b0e-4ac5-81a8-b18483e9734b", - "name": "audience resolve", - "protocol": "openid-connect", - "protocolMapper": "oidc-audience-resolve-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "access.token.claim": "true" - } - }, - { - "id": "7e4ea93b-22e1-4113-9b4a-ce0d1258ce56", - "name": "client roles", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-client-role-mapper", - "consentRequired": false, - "config": { - "user.attribute": "foo", - "introspection.token.claim": "true", - "access.token.claim": "true", - "claim.name": "resource_access.${client_id}.roles", - "jsonType.label": "String", - "multivalued": "true" - } - } - ] - }, - { - "id": "c418037b-5e27-4716-b5dc-d052db99d7c7", - "name": "phone", - "description": "OpenID Connect built-in scope: phone", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "consent.screen.text": "${phoneScopeConsentText}", - "display.on.consent.screen": "true" - }, - "protocolMappers": [ - { - "id": "76669311-e8a7-479a-9a6d-e1d356d46a94", - "name": "phone number", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "phoneNumber", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "phone_number", - "jsonType.label": "String" - } - }, - { - "id": "13fb945e-1cdb-474b-ba1f-a9e028838ce2", - "name": "phone number verified", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "phoneNumberVerified", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "phone_number_verified", - "jsonType.label": "boolean" - } - } - ] - }, - { - "id": "dbaa2fa5-1c56-4fe5-b2fc-7d1fcf907c36", - "name": "role_list", - "description": "SAML role list", - "protocol": "saml", - "attributes": { - "consent.screen.text": "${samlRoleListScopeConsentText}", - "display.on.consent.screen": "true" - }, - "protocolMappers": [ - { - "id": "7ce2f2ab-b2eb-4d6e-9cc2-876ae85bf701", - "name": "role list", - "protocol": "saml", - "protocolMapper": "saml-role-list-mapper", - "consentRequired": false, - "config": { - "single": "false", - "attribute.nameformat": "Basic", - "attribute.name": "Role" - } - } - ] - }, - { - "id": "fd67ee33-e066-4381-98f6-39f6be15c59f", - "name": "web-origins", - "description": "OpenID Connect scope for add allowed web origins to the access token", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "false", - "consent.screen.text": "", - "display.on.consent.screen": "false" - }, - "protocolMappers": [ - { - "id": "a2cd0e49-3d42-4306-96f7-74ac636857bb", - "name": "allowed web origins", - "protocol": "openid-connect", - "protocolMapper": "oidc-allowed-origins-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "access.token.claim": "true" - } - } - ] - }, - { - "id": "6db6a45c-dc08-4761-8813-a6d6031263c2", - "name": "email", - "description": "OpenID Connect built-in scope: email", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "consent.screen.text": "${emailScopeConsentText}", - "display.on.consent.screen": "true" - }, - "protocolMappers": [ - { - "id": "6e6b1d8b-b64d-40f1-9124-9bf4443bc28b", - "name": "email verified", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-property-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "emailVerified", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "email_verified", - "jsonType.label": "boolean" - } - }, - { - "id": "e34c46bf-3a8b-451d-b032-4e748e84ff94", - "name": "email", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "email", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "email", - "jsonType.label": "String" - } - } - ] - }, - { - "id": "676d5990-14d3-4184-8914-de09eb870b7c", - "name": "address", - "description": "OpenID Connect built-in scope: address", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "consent.screen.text": "${addressScopeConsentText}", - "display.on.consent.screen": "true" - }, - "protocolMappers": [ - { - "id": "62e290dc-b95e-4349-b157-18fe3c59312f", - "name": "address", - "protocol": "openid-connect", - "protocolMapper": "oidc-address-mapper", - "consentRequired": false, - "config": { - "user.attribute.formatted": "formatted", - "user.attribute.country": "country", - "introspection.token.claim": "true", - "user.attribute.postal_code": "postal_code", - "userinfo.token.claim": "true", - "user.attribute.street": "street", - "id.token.claim": "true", - "user.attribute.region": "region", - "access.token.claim": "true", - "user.attribute.locality": "locality" - } - } - ] - }, - { - "id": "6009c9f3-0b85-4190-b96a-a2250b0f18f4", - "name": "acr", - "description": "OpenID Connect scope for add acr (authentication context class reference) to the token", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "false", - "display.on.consent.screen": "false" - }, - "protocolMappers": [ - { - "id": "cb1e8f29-c493-4050-8d61-51449bcb9a4a", - "name": "acr loa level", - "protocol": "openid-connect", - "protocolMapper": "oidc-acr-mapper", - "consentRequired": false, - "config": { - "id.token.claim": "true", - "introspection.token.claim": "true", - "access.token.claim": "true" - } - } - ] - }, - { - "id": "ab5cecfa-7e71-4648-b064-515434dfca60", - "name": "saml_organization", - "description": "Organization Membership", - "protocol": "saml", - "attributes": { - "display.on.consent.screen": "false" - }, - "protocolMappers": [ - { - "id": "ab631711-fde8-4df6-86ba-d9d1cd99ed15", - "name": "organization", - "protocol": "saml", - "protocolMapper": "saml-organization-membership-mapper", - "consentRequired": false, - "config": {} - } - ] - }, - { - "id": "3060eda9-70f7-4683-a1d8-3f1f6cf8f7cc", - "name": "organization", - "description": "Additional claims about the organization a subject belongs to", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "consent.screen.text": "${organizationScopeConsentText}", - "display.on.consent.screen": "true" - }, - "protocolMappers": [ - { - "id": "0b6ea7b1-994b-4c66-923f-f3b4f74110dc", - "name": "organization", - "protocol": "openid-connect", - "protocolMapper": "oidc-organization-membership-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "multivalued": "true", - "userinfo.token.claim": "false", - "addOrganizationAttributes": "false", - "id.token.claim": "true", - "lightweight.claim": "true", - "access.token.claim": "true", - "claim.name": "organization", - "jsonType.label": "String", - "addOrganizationId": "true" - } - } - ] - }, - { - "id": "5957dee3-52e9-47ae-a1bb-b0e9b073acba", - "name": "p2-org", - "description": "", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "display.on.consent.screen": "true", - "gui.order": "", - "consent.screen.text": "" - }, - "protocolMappers": [ - { - "id": "520ed26f-03cb-4299-91db-a2fc0248b219", - "name": "test", - "protocol": "openid-connect", - "protocolMapper": "oidc-active-organization-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "id.token.claim": "true", - "lightweight.claim": "true", - "access.token.claim": "true", - "included.active.organization.properties": "id, name, role, attribute", - "claim.name": "active-org", - "jsonType.label": "String" - } - } - ] - }, - { - "id": "f1d3fe6f-8b38-4b7e-a0ad-c270d6f3a188", - "name": "profile", - "description": "OpenID Connect built-in scope: profile", - "protocol": "openid-connect", - "attributes": { - "include.in.token.scope": "true", - "consent.screen.text": "${profileScopeConsentText}", - "display.on.consent.screen": "true" - }, - "protocolMappers": [ - { - "id": "bef74d4e-7058-428c-8196-fcc284d1ce67", - "name": "gender", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "gender", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "gender", - "jsonType.label": "String" - } - }, - { - "id": "a5f6d01f-3644-4359-85b2-bae816f63889", - "name": "updated at", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "updatedAt", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "updated_at", - "jsonType.label": "long" - } - }, - { - "id": "3af29723-b245-4013-9fd4-786d9989efaa", - "name": "middle name", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "middleName", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "middle_name", - "jsonType.label": "String" - } - }, - { - "id": "0243a06b-9709-45e4-bcf0-30f9feba42ca", - "name": "given name", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "firstName", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "given_name", - "jsonType.label": "String" - } - }, - { - "id": "60c74748-04c9-4b33-be78-5f1bb55a4db5", - "name": "locale", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "locale", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "locale", - "jsonType.label": "String" - } - }, - { - "id": "dfabc58a-c00d-413f-8854-8e3bd32dac5f", - "name": "family name", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "lastName", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "family_name", - "jsonType.label": "String" - } - }, - { - "id": "df8e5ee5-860d-4059-8c3c-4260d6660986", - "name": "nickname", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "nickname", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "nickname", - "jsonType.label": "String" - } - }, - { - "id": "95cdad09-c58a-4e73-a425-44532300a67d", - "name": "website", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "website", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "website", - "jsonType.label": "String" - } - }, - { - "id": "57b38b68-58aa-4a07-9210-ef544c262989", - "name": "zoneinfo", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "zoneinfo", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "zoneinfo", - "jsonType.label": "String" - } - }, - { - "id": "9b95e6c8-92f4-4481-a7a9-2df8aa5f3c3e", - "name": "full name", - "protocol": "openid-connect", - "protocolMapper": "oidc-full-name-mapper", - "consentRequired": false, - "config": { - "id.token.claim": "true", - "introspection.token.claim": "true", - "access.token.claim": "true", - "userinfo.token.claim": "true" - } - }, - { - "id": "c5042b8a-a6e7-408d-ae2b-5bce9160db43", - "name": "birthdate", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "birthdate", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "birthdate", - "jsonType.label": "String" - } - }, - { - "id": "652ca5aa-4b78-4c0e-a281-93b693083cf9", - "name": "profile", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "profile", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "profile", - "jsonType.label": "String" - } - }, - { - "id": "97865d02-967d-497e-8dae-2342d5ea5782", - "name": "picture", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "picture", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "picture", - "jsonType.label": "String" - } - }, - { - "id": "35607b22-5057-4fd2-9b8e-040423e40529", - "name": "username", - "protocol": "openid-connect", - "protocolMapper": "oidc-usermodel-attribute-mapper", - "consentRequired": false, - "config": { - "introspection.token.claim": "true", - "userinfo.token.claim": "true", - "user.attribute": "username", - "id.token.claim": "true", - "access.token.claim": "true", - "claim.name": "preferred_username", - "jsonType.label": "String" - } - } - ] - } - ], - "defaultDefaultClientScopes": [ - "role_list", - "saml_organization", - "profile", - "email", - "roles", - "web-origins", - "acr", - "basic" - ], - "defaultOptionalClientScopes": [ - "offline_access", - "address", - "phone", - "microprofile-jwt", - "organization", - "p2-org" - ], - "browserSecurityHeaders": { - "contentSecurityPolicyReportOnly": "", - "xContentTypeOptions": "nosniff", - "referrerPolicy": "no-referrer", - "xRobotsTag": "none", - "xFrameOptions": "SAMEORIGIN", - "contentSecurityPolicy": "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", - "xXSSProtection": "1; mode=block", - "strictTransportSecurity": "max-age=31536000; includeSubDomains" - }, - "smtpServer": {}, - "eventsEnabled": true, - "eventsListeners": [ - "jboss-logging" - ], - "enabledEventTypes": [ - "SEND_RESET_PASSWORD", - "UPDATE_CONSENT_ERROR", - "GRANT_CONSENT", - "VERIFY_PROFILE_ERROR", - "REMOVE_TOTP", - "REVOKE_GRANT", - "UPDATE_TOTP", - "LOGIN_ERROR", - "CLIENT_LOGIN", - "RESET_PASSWORD_ERROR", - "UPDATE_CREDENTIAL", - "IMPERSONATE_ERROR", - "CODE_TO_TOKEN_ERROR", - "CUSTOM_REQUIRED_ACTION", - "OAUTH2_DEVICE_CODE_TO_TOKEN_ERROR", - "RESTART_AUTHENTICATION", - "IMPERSONATE", - "UPDATE_PROFILE_ERROR", - "LOGIN", - "OAUTH2_DEVICE_VERIFY_USER_CODE", - "UPDATE_PASSWORD_ERROR", - "CLIENT_INITIATED_ACCOUNT_LINKING", - "OAUTH2_EXTENSION_GRANT", - "USER_DISABLED_BY_PERMANENT_LOCKOUT", - "REMOVE_CREDENTIAL_ERROR", - "TOKEN_EXCHANGE", - "AUTHREQID_TO_TOKEN", - "LOGOUT", - "REGISTER", - "DELETE_ACCOUNT_ERROR", - "CLIENT_REGISTER", - "IDENTITY_PROVIDER_LINK_ACCOUNT", - "USER_DISABLED_BY_TEMPORARY_LOCKOUT", - "DELETE_ACCOUNT", - "UPDATE_PASSWORD", - "CLIENT_DELETE", - "FEDERATED_IDENTITY_LINK_ERROR", - "IDENTITY_PROVIDER_FIRST_LOGIN", - "CLIENT_DELETE_ERROR", - "VERIFY_EMAIL", - "CLIENT_LOGIN_ERROR", - "RESTART_AUTHENTICATION_ERROR", - "EXECUTE_ACTIONS", - "REMOVE_FEDERATED_IDENTITY_ERROR", - "TOKEN_EXCHANGE_ERROR", - "PERMISSION_TOKEN", - "FEDERATED_IDENTITY_OVERRIDE_LINK", - "SEND_IDENTITY_PROVIDER_LINK_ERROR", - "UPDATE_CREDENTIAL_ERROR", - "EXECUTE_ACTION_TOKEN_ERROR", - "OAUTH2_EXTENSION_GRANT_ERROR", - "SEND_VERIFY_EMAIL", - "OAUTH2_DEVICE_AUTH", - "EXECUTE_ACTIONS_ERROR", - "REMOVE_FEDERATED_IDENTITY", - "OAUTH2_DEVICE_CODE_TO_TOKEN", - "IDENTITY_PROVIDER_POST_LOGIN", - "IDENTITY_PROVIDER_LINK_ACCOUNT_ERROR", - "FEDERATED_IDENTITY_OVERRIDE_LINK_ERROR", - "OAUTH2_DEVICE_VERIFY_USER_CODE_ERROR", - "UPDATE_EMAIL", - "REGISTER_ERROR", - "REVOKE_GRANT_ERROR", - "EXECUTE_ACTION_TOKEN", - "LOGOUT_ERROR", - "UPDATE_EMAIL_ERROR", - "CLIENT_UPDATE_ERROR", - "AUTHREQID_TO_TOKEN_ERROR", - "INVITE_ORG_ERROR", - "UPDATE_PROFILE", - "CLIENT_REGISTER_ERROR", - "FEDERATED_IDENTITY_LINK", - "INVITE_ORG", - "SEND_IDENTITY_PROVIDER_LINK", - "SEND_VERIFY_EMAIL_ERROR", - "RESET_PASSWORD", - "CLIENT_INITIATED_ACCOUNT_LINKING_ERROR", - "OAUTH2_DEVICE_AUTH_ERROR", - "REMOVE_CREDENTIAL", - "UPDATE_CONSENT", - "REMOVE_TOTP_ERROR", - "VERIFY_EMAIL_ERROR", - "SEND_RESET_PASSWORD_ERROR", - "CLIENT_UPDATE", - "CUSTOM_REQUIRED_ACTION_ERROR", - "IDENTITY_PROVIDER_POST_LOGIN_ERROR", - "UPDATE_TOTP_ERROR", - "CODE_TO_TOKEN", - "VERIFY_PROFILE", - "GRANT_CONSENT_ERROR", - "IDENTITY_PROVIDER_FIRST_LOGIN_ERROR" - ], - "adminEventsEnabled": false, - "adminEventsDetailsEnabled": false, - "identityProviders": [ - { - "alias": "okta-broker", - "displayName": "", - "internalId": "086002ac-3242-424e-90b5-71757542ecd6", - "providerId": "saml", - "enabled": true, - "updateProfileFirstLoginMode": "on", - "trustEmail": false, - "storeToken": false, - "addReadTokenRoleOnCreate": false, - "authenticateByDefault": false, - "linkOnly": false, - "hideOnLogin": true, - "config": { - "postBindingLogout": "false", - "postBindingResponse": "true", - "backchannelSupported": "false", - "caseSensitiveOriginalUsername": "false", - "idpEntityId": "http://www.okta.com/exkngyq2mxx2aPSyx5d7", - "loginHint": "false", - "allowCreate": "true", - "enabledFromMetadata": "true", - "syncMode": "LEGACY", - "authnContextComparisonType": "exact", - "singleSignOnServiceUrl": "https://dev-99079880.okta.com/app/dev-99079880_testlogin_1/exkngyq2mxx2aPSyx5d7/sso/saml", - "wantAuthnRequestsSigned": "false", - "allowedClockSkew": "0", - "artifactBindingResponse": "false", - "validateSignature": "false", - "signingCertificate": "MIIDqDCCApCgAwIBAgIGAZUiq660MA0GCSqGSIb3DQEBCwUAMIGUMQswCQYDVQQGEwJVUzETMBEG\nA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsGA1UECgwET2t0YTEU\nMBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDGRldi05OTA3OTg4MDEcMBoGCSqGSIb3DQEJ\nARYNaW5mb0Bva3RhLmNvbTAeFw0yNTAyMjAwOTIyNTFaFw0zNTAyMjAwOTIzNTFaMIGUMQswCQYD\nVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTEWMBQGA1UEBwwNU2FuIEZyYW5jaXNjbzENMAsG\nA1UECgwET2t0YTEUMBIGA1UECwwLU1NPUHJvdmlkZXIxFTATBgNVBAMMDGRldi05OTA3OTg4MDEc\nMBoGCSqGSIb3DQEJARYNaW5mb0Bva3RhLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC\nggEBAMdMDqiLeYhl2b3CGXxHvLGYXuuXzQr8gI1B5+3bOYMgzvpQ3Bt0dxHoBPza19ZGTRN+vK8N\nbZe4WimqcSuuTORssX2f9daOixm0Hokdjp9FBOqzKsac0rNzGjNohfCDUKEjdXo/UmuaknpKBqp6\nJzJ2GgYMyv34NqDFU0awtT3S08TO8sYdIcE8qdMoxDgEN6y5HP7u5ztu6AOObbp0m19XGH/NJ856\nr0rlT5n5yx+DlBH5LsxDH4shrQ1gomh1p9Z7KkRPAedSVyy4W2uUfj5XVi1pxyZmK+QcCBL6ECem\n6QOtO/KScEnpURQXWFWVs3NX58oerar5O93cM95a3MkCAwEAATANBgkqhkiG9w0BAQsFAAOCAQEA\nq4r9TuBiiUH4K6QlHP28Ua2tZQcMt0ZmjFfWKdhyR19juA4U7drQMb/NhCBC1kunZTBZ3TrGItJ5\nbKLt1mHxgjndy71YC/u3CiNsfJI9Iq0bjRuMLkRSTIkQC7+l/P0p2CBLCKOrr2HSlJ4f7PPib0NG\n/wNJvXCHTevzItlP4Hg/nFeBm4pGKpEOFdKYkhW3RnORErVPmeO0yfc92HYwZeX47stIOcpBZVnP\nKu1FJOTfno7zXr2Oz5sGCaZDiL+DhmTCdeluGguixQwMrIVEEx+oS/pLz75sFcGE0PAMJn6Ltntj\nJGYg4MIv+cXs+0/LbwrEoJVwBA5YKuT+pupC1A==", - "nameIDPolicyFormat": "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", - "entityId": "http://localhost:8080/realms/test-realm", - "signSpMetadata": "false", - "wantAssertionsEncrypted": "false", - "sendClientIdOnLogout": "false", - "wantAssertionsSigned": "false", - "sendIdTokenOnLogout": "true", - "postBindingAuthnRequest": "true", - "forceAuthn": "false", - "attributeConsumingServiceIndex": "0", - "addExtensionsElementWithKeyInfo": "false", - "principalType": "SUBJECT" - } - } - ], - "identityProviderMappers": [], - "components": { - "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy": [ - { - "id": "f7dc37de-9df7-4c51-b7c1-40593558b2ca", - "name": "Max Clients Limit", - "providerId": "max-clients", - "subType": "anonymous", - "subComponents": {}, - "config": { - "max-clients": [ - "200" - ] - } - }, - { - "id": "e081e8ad-238f-4fd7-b4bb-9ba31bc434e1", - "name": "Consent Required", - "providerId": "consent-required", - "subType": "anonymous", - "subComponents": {}, - "config": {} - }, - { - "id": "98f15875-e611-444a-9d4c-e43a303d41a5", - "name": "Allowed Protocol Mapper Types", - "providerId": "allowed-protocol-mappers", - "subType": "authenticated", - "subComponents": {}, - "config": { - "allowed-protocol-mapper-types": [ - "oidc-sha256-pairwise-sub-mapper", - "oidc-address-mapper", - "saml-user-property-mapper", - "saml-role-list-mapper", - "oidc-usermodel-property-mapper", - "oidc-full-name-mapper", - "saml-user-attribute-mapper", - "oidc-usermodel-attribute-mapper" - ] - } - }, - { - "id": "b3878b7d-07a3-4d89-a41b-671fd63b0bf1", - "name": "Allowed Client Scopes", - "providerId": "allowed-client-templates", - "subType": "authenticated", - "subComponents": {}, - "config": { - "allow-default-scopes": [ - "true" - ] - } - }, - { - "id": "7602d8e1-23cd-416f-a8b3-e8dc159e3a95", - "name": "Full Scope Disabled", - "providerId": "scope", - "subType": "anonymous", - "subComponents": {}, - "config": {} - }, - { - "id": "2959b792-4a01-4c36-91df-2b3170c93a0d", - "name": "Trusted Hosts", - "providerId": "trusted-hosts", - "subType": "anonymous", - "subComponents": {}, - "config": { - "host-sending-registration-request-must-match": [ - "true" - ], - "client-uris-must-match": [ - "true" - ] - } - }, - { - "id": "6224dc4b-903d-4295-8503-a9d3133d1d6d", - "name": "Allowed Protocol Mapper Types", - "providerId": "allowed-protocol-mappers", - "subType": "anonymous", - "subComponents": {}, - "config": { - "allowed-protocol-mapper-types": [ - "oidc-sha256-pairwise-sub-mapper", - "oidc-full-name-mapper", - "oidc-address-mapper", - "oidc-usermodel-attribute-mapper", - "saml-user-attribute-mapper", - "saml-user-property-mapper", - "oidc-usermodel-property-mapper", - "saml-role-list-mapper" - ] - } - }, - { - "id": "bbcf3c26-005e-4aa4-9f89-efebd336f89f", - "name": "Allowed Client Scopes", - "providerId": "allowed-client-templates", - "subType": "anonymous", - "subComponents": {}, - "config": { - "allow-default-scopes": [ - "true" - ] - } - } - ], - "org.keycloak.userprofile.UserProfileProvider": [ - { - "id": "58198d81-7c1f-4a59-b6f7-e51773765e0f", - "providerId": "declarative-user-profile", - "subComponents": {}, - "config": { - "kc.user.profile.config": [ - "{\"attributes\":[{\"name\":\"username\",\"displayName\":\"${username}\",\"validations\":{\"length\":{\"min\":3,\"max\":255},\"username-prohibited-characters\":{},\"up-username-not-idn-homograph\":{}},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"email\",\"displayName\":\"${email}\",\"validations\":{\"email\":{},\"length\":{\"max\":255}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"firstName\",\"displayName\":\"${firstName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"lastName\",\"displayName\":\"${lastName}\",\"validations\":{\"length\":{\"max\":255},\"person-name-prohibited-characters\":{}},\"required\":{\"roles\":[\"user\"]},\"permissions\":{\"view\":[\"admin\",\"user\"],\"edit\":[\"admin\",\"user\"]},\"multivalued\":false},{\"name\":\"org.ro.active\",\"displayName\":\"Active organization ID\",\"permissions\":{\"view\":[\"admin\"],\"edit\":[\"admin\"]},\"multivalued\":false}],\"groups\":[{\"name\":\"user-metadata\",\"displayHeader\":\"User metadata\",\"displayDescription\":\"Attributes, which refer to user metadata\"}]}" - ] - } - } - ], - "org.keycloak.keys.KeyProvider": [ - { - "id": "b601091a-9f95-4fa5-a60b-b9fd5a2edb41", - "name": "hmac-generated-hs512", - "providerId": "hmac-generated", - "subComponents": {}, - "config": { - "priority": [ - "100" - ], - "algorithm": [ - "HS512" - ] - } - }, - { - "id": "06acf65c-d4d1-43ab-89a6-198f622a91ab", - "name": "rsa-enc-generated", - "providerId": "rsa-enc-generated", - "subComponents": {}, - "config": { - "priority": [ - "100" - ], - "algorithm": [ - "RSA-OAEP" - ] - } - }, - { - "id": "ce14d2e3-845a-463b-b64e-465890906d80", - "name": "rsa-generated", - "providerId": "rsa-generated", - "subComponents": {}, - "config": { - "priority": [ - "100" - ] - } - }, - { - "id": "a3b500b8-fdd5-4f8b-8b00-1c3e4da4d8ce", - "name": "aes-generated", - "providerId": "aes-generated", - "subComponents": {}, - "config": { - "priority": [ - "100" - ] - } - } - ] - }, - "internationalizationEnabled": false, - "supportedLocales": [], - "authenticationFlows": [ - { - "id": "dd02f104-42a9-4e91-a5ce-6171fde27319", - "alias": "Account verification options", - "description": "Method with which to verity the existing account", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "idp-email-verification", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "ALTERNATIVE", - "priority": 20, - "autheticatorFlow": true, - "flowAlias": "Verify Existing Account by Re-authentication", - "userSetupAllowed": false - } - ] - }, - { - "id": "7664aaab-19df-4a3c-91fe-496fecb26488", - "alias": "Browser - Conditional OTP", - "description": "Flow to determine if the OTP is required for the authentication", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "conditional-user-configured", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "auth-otp-form", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "e41ef55f-0893-44e7-a6a8-aa4b3640c886", - "alias": "Browser - Conditional Organization", - "description": "Flow to determine if the organization identity-first login is to be used", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "conditional-user-configured", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "organization", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "530671ad-24b8-44d3-9a5d-831dc7b909a9", - "alias": "Cookies Sub-Flow", - "description": "Cookie sub-flow which can be used to switch org.", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "auth-cookie", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "ext-select-org", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "00cc805a-18b7-43f7-b6ec-ab368923a4c4", - "alias": "Copy of browser", - "description": "Browser based authentication", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": false, - "authenticationExecutions": [ - { - "authenticator": "auth-cookie", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "auth-spnego", - "authenticatorFlow": false, - "requirement": "DISABLED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "identity-provider-redirector", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 25, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "ALTERNATIVE", - "priority": 30, - "autheticatorFlow": true, - "flowAlias": "Copy of browser forms", - "userSetupAllowed": false - } - ] - }, - { - "id": "c2332aa8-2fcc-47e3-9519-5ff2537c55d6", - "alias": "Copy of browser forms", - "description": "Username, password, otp and other auth forms.", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": false, - "authenticationExecutions": [ - { - "authenticator": "auth-username-password-form", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "ext-select-org", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 11, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "0bbfc104-2d7c-462c-a6ce-6c0af28797d6", - "alias": "Direct Grant - Conditional OTP", - "description": "Flow to determine if the OTP is required for the authentication", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "conditional-user-configured", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "direct-grant-validate-otp", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "d670b3ff-64ab-4162-ae56-383caec0857e", - "alias": "First Broker Login - Conditional Organization", - "description": "Flow to determine if the authenticator that adds organization members is to be used", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "conditional-user-configured", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "idp-add-organization-member", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "654e1721-5c10-47cd-bfc4-3ab5f18ae55b", - "alias": "First broker login - Conditional OTP", - "description": "Flow to determine if the OTP is required for the authentication", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "conditional-user-configured", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "auth-otp-form", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "e249296e-553b-4f71-a471-4cc58138e9e1", - "alias": "Forms Sub-Flow", - "description": "Username, password, otp and other auth forms.", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "auth-username-password-form", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "CONDITIONAL", - "priority": 20, - "autheticatorFlow": true, - "flowAlias": "Org Browser - Conditional OTP", - "userSetupAllowed": false - }, - { - "authenticator": "ext-select-org", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 30, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "02ff8a60-636e-4eb8-95c7-1d8e8f107127", - "alias": "Handle Existing Account", - "description": "Handle what to do if there is existing account with same email/username like authenticated identity provider", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "idp-confirm-link", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": true, - "flowAlias": "Account verification options", - "userSetupAllowed": false - } - ] - }, - { - "id": "b2cf2b2f-31c5-4199-a67d-57136dc06682", - "alias": "IDP Sub-Flow", - "description": "IDP sub-flow to select org.", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "identity-provider-redirector", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "ext-select-org", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "bd36b4cd-a661-470b-8982-e39f84c1057e", - "alias": "Org Browser - Conditional OTP", - "description": "Flow to determine if the OTP is required for the authentication", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "conditional-user-configured", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "auth-otp-form", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "3ceab586-1f3c-4a76-a9de-731ab1470e5f", - "alias": "Org Browser Flow", - "description": "Browser flow with select organization step.", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticatorFlow": true, - "requirement": "ALTERNATIVE", - "priority": 10, - "autheticatorFlow": true, - "flowAlias": "Cookies Sub-Flow", - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "ALTERNATIVE", - "priority": 20, - "autheticatorFlow": true, - "flowAlias": "IDP Sub-Flow", - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "ALTERNATIVE", - "priority": 30, - "autheticatorFlow": true, - "flowAlias": "Forms Sub-Flow", - "userSetupAllowed": false - } - ] - }, - { - "id": "cd69d7eb-a8b5-4f0d-83ca-93f5ec44ed58", - "alias": "Org Direct Grant - Conditional OTP", - "description": "Flow to determine if the OTP is required for the authentication", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "conditional-user-configured", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "auth-otp-form", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "09ffeaf0-780e-4c4d-a4ab-5cb02ff2699a", - "alias": "Org Direct Grant Flow", - "description": "Direct grant flow with select organization step.", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "direct-grant-validate-username", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "direct-grant-validate-password", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "CONDITIONAL", - "priority": 30, - "autheticatorFlow": true, - "flowAlias": "Org Direct Grant - Conditional OTP", - "userSetupAllowed": false - }, - { - "authenticator": "ext-select-org", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 30, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "d692cbbd-aa9e-4b82-851b-a181eccdb7a3", - "alias": "Organization", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticatorFlow": true, - "requirement": "CONDITIONAL", - "priority": 10, - "autheticatorFlow": true, - "flowAlias": "Browser - Conditional Organization", - "userSetupAllowed": false - } - ] - }, - { - "id": "d25abb90-d036-48f6-8bed-07bc886120a3", - "alias": "Reset - Conditional OTP", - "description": "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "conditional-user-configured", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "reset-otp", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "2ede7a30-6192-4f69-9507-d67002017baf", - "alias": "User creation or linking", - "description": "Flow for the existing/non-existing user alternatives", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticatorConfig": "create unique user config", - "authenticator": "idp-create-user-if-unique", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "ALTERNATIVE", - "priority": 20, - "autheticatorFlow": true, - "flowAlias": "Handle Existing Account", - "userSetupAllowed": false - } - ] - }, - { - "id": "ea9d6076-f4b5-4858-b93f-a59041085dd8", - "alias": "Verify Existing Account by Re-authentication", - "description": "Reauthentication of existing account", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "idp-username-password-form", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "CONDITIONAL", - "priority": 20, - "autheticatorFlow": true, - "flowAlias": "First broker login - Conditional OTP", - "userSetupAllowed": false - } - ] - }, - { - "id": "a1d9ab01-87b6-4f6e-9eb6-e884310674b5", - "alias": "browser", - "description": "Browser based authentication", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "auth-cookie", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "auth-spnego", - "authenticatorFlow": false, - "requirement": "DISABLED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "identity-provider-redirector", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 25, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "ALTERNATIVE", - "priority": 26, - "autheticatorFlow": true, - "flowAlias": "Organization", - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "ALTERNATIVE", - "priority": 30, - "autheticatorFlow": true, - "flowAlias": "forms", - "userSetupAllowed": false - } - ] - }, - { - "id": "ed12fac2-2132-4d12-b7ad-729f69fc2d43", - "alias": "clients", - "description": "Base authentication for clients", - "providerId": "client-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "client-secret", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "client-jwt", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "client-secret-jwt", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 30, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "client-x509", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 40, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "c8333af0-961a-4e24-8f42-9b82a1d708c1", - "alias": "direct grant", - "description": "OpenID Connect Resource Owner Grant", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "direct-grant-validate-username", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "direct-grant-validate-password", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "CONDITIONAL", - "priority": 30, - "autheticatorFlow": true, - "flowAlias": "Direct Grant - Conditional OTP", - "userSetupAllowed": false - } - ] - }, - { - "id": "2421e5d2-fffc-4a2c-955f-f5a5e7df54cb", - "alias": "docker auth", - "description": "Used by Docker clients to authenticate against the IDP", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "docker-http-basic-authenticator", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "b1a39fa2-d348-4872-8a2d-1757f5610eaf", - "alias": "first broker login", - "description": "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticatorConfig": "review profile config", - "authenticator": "idp-review-profile", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": true, - "flowAlias": "User creation or linking", - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "CONDITIONAL", - "priority": 50, - "autheticatorFlow": true, - "flowAlias": "First Broker Login - Conditional Organization", - "userSetupAllowed": false - } - ] - }, - { - "id": "82d170ca-0872-411c-a80b-ac2e1c48f8f6", - "alias": "forms", - "description": "Username, password, otp and other auth forms.", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "auth-username-password-form", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "CONDITIONAL", - "priority": 20, - "autheticatorFlow": true, - "flowAlias": "Browser - Conditional OTP", - "userSetupAllowed": false - } - ] - }, - { - "id": "3fa519f8-1ab5-40a5-b637-23a34e5945f4", - "alias": "magic link", - "description": "Simple magic link authentication flow.", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "auth-cookie", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 0, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "identity-provider-redirector", - "authenticatorFlow": false, - "requirement": "ALTERNATIVE", - "priority": 0, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "ALTERNATIVE", - "priority": 1, - "autheticatorFlow": true, - "flowAlias": "magic link forms", - "userSetupAllowed": false - } - ] - }, - { - "id": "a1fdbf95-31db-4099-9a5a-0347ae463529", - "alias": "magic link forms", - "description": "Forms for simple magic link authentication flow.", - "providerId": "basic-flow", - "topLevel": false, - "builtIn": false, - "authenticationExecutions": [ - { - "authenticator": "ext-magic-form", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 0, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "d5fd5fdc-c324-4913-b4af-30e86ab7507a", - "alias": "post org broker login", - "description": "Post broker login flow used for organization IdPs.", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "ext-auth-org-note", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 0, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "ext-auth-org-add-user", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 0, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "a834ab07-b949-4580-8651-9766e1525487", - "alias": "registration", - "description": "Registration flow", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "registration-page-form", - "authenticatorFlow": true, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": true, - "flowAlias": "registration form", - "userSetupAllowed": false - } - ] - }, - { - "id": "9535e9d1-64ec-4328-9f47-b788afb5f884", - "alias": "registration form", - "description": "Registration form", - "providerId": "form-flow", - "topLevel": false, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "registration-user-creation", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "registration-password-action", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 50, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "registration-recaptcha-action", - "authenticatorFlow": false, - "requirement": "DISABLED", - "priority": 60, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "registration-terms-and-conditions", - "authenticatorFlow": false, - "requirement": "DISABLED", - "priority": 70, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - }, - { - "id": "4cda7288-e2c8-4c76-ba83-8609029a15ec", - "alias": "reset credentials", - "description": "Reset credentials for a user if they forgot their password or something", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "reset-credentials-choose-user", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "reset-credential-email", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 20, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticator": "reset-password", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 30, - "autheticatorFlow": false, - "userSetupAllowed": false - }, - { - "authenticatorFlow": true, - "requirement": "CONDITIONAL", - "priority": 40, - "autheticatorFlow": true, - "flowAlias": "Reset - Conditional OTP", - "userSetupAllowed": false - } - ] - }, - { - "id": "46184936-df91-4a2f-9863-cc99fe082fe7", - "alias": "saml ecp", - "description": "SAML ECP Profile Authentication Flow", - "providerId": "basic-flow", - "topLevel": true, - "builtIn": true, - "authenticationExecutions": [ - { - "authenticator": "http-basic-authenticator", - "authenticatorFlow": false, - "requirement": "REQUIRED", - "priority": 10, - "autheticatorFlow": false, - "userSetupAllowed": false - } - ] - } - ], - "authenticatorConfig": [ - { - "id": "ef713bde-9f2d-4f37-98f4-8c84f623d809", - "alias": "create unique user config", - "config": { - "require.password.update.after.registration": "false" - } - }, - { - "id": "6aaf8437-72d8-45d6-80f1-5845d1eb9600", - "alias": "review profile config", - "config": { - "update.profile.on.first.login": "missing" - } - } - ], - "requiredActions": [ - { - "alias": "CONFIGURE_TOTP", - "name": "Configure OTP", - "providerId": "CONFIGURE_TOTP", - "enabled": true, - "defaultAction": false, - "priority": 10, - "config": {} - }, - { - "alias": "TERMS_AND_CONDITIONS", - "name": "Terms and Conditions", - "providerId": "TERMS_AND_CONDITIONS", - "enabled": false, - "defaultAction": false, - "priority": 20, - "config": {} - }, - { - "alias": "UPDATE_PASSWORD", - "name": "Update Password", - "providerId": "UPDATE_PASSWORD", - "enabled": true, - "defaultAction": false, - "priority": 30, - "config": {} - }, - { - "alias": "UPDATE_PROFILE", - "name": "Update Profile", - "providerId": "UPDATE_PROFILE", - "enabled": true, - "defaultAction": false, - "priority": 40, - "config": {} - }, - { - "alias": "VERIFY_EMAIL", - "name": "Verify Email", - "providerId": "VERIFY_EMAIL", - "enabled": true, - "defaultAction": false, - "priority": 50, - "config": {} - }, - { - "alias": "delete_account", - "name": "Delete Account", - "providerId": "delete_account", - "enabled": false, - "defaultAction": false, - "priority": 60, - "config": {} - }, - { - "alias": "webauthn-register", - "name": "Webauthn Register", - "providerId": "webauthn-register", - "enabled": true, - "defaultAction": false, - "priority": 70, - "config": {} - }, - { - "alias": "webauthn-register-passwordless", - "name": "Webauthn Register Passwordless", - "providerId": "webauthn-register-passwordless", - "enabled": true, - "defaultAction": false, - "priority": 80, - "config": {} - }, - { - "alias": "VERIFY_PROFILE", - "name": "Verify Profile", - "providerId": "VERIFY_PROFILE", - "enabled": true, - "defaultAction": false, - "priority": 90, - "config": {} - }, - { - "alias": "delete_credential", - "name": "Delete Credential", - "providerId": "delete_credential", - "enabled": true, - "defaultAction": false, - "priority": 100, - "config": {} - }, - { - "alias": "update_user_locale", - "name": "Update User Locale", - "providerId": "update_user_locale", - "enabled": true, - "defaultAction": false, - "priority": 1000, - "config": {} - } - ], - "browserFlow": "browser", - "registrationFlow": "registration", - "directGrantFlow": "direct grant", - "resetCredentialsFlow": "reset credentials", - "clientAuthenticationFlow": "clients", - "dockerAuthenticationFlow": "docker auth", - "firstBrokerLoginFlow": "first broker login", - "attributes": { - "cibaBackchannelTokenDeliveryMode": "poll", - "cibaExpiresIn": "120", - "cibaAuthRequestedUserHint": "login_hint", - "oauth2DeviceCodeLifespan": "600", - "oauth2DevicePollingInterval": "5", - "parRequestUriLifespan": "60", - "cibaInterval": "5", - "realmReusableOtpCode": "false" - }, - "keycloakVersion": "26.0.8", - "userManagedAccessAllowed": false, - "organizationsEnabled": false, - "clientProfiles": { - "profiles": [] - }, - "clientPolicies": { - "policies": [] - } -} \ No newline at end of file diff --git a/saml2/idp-initiated/keycloak/test-realm.json b/saml2/idp-initiated/keycloak/test-realm.json new file mode 100644 index 0000000..fcd5e71 --- /dev/null +++ b/saml2/idp-initiated/keycloak/test-realm.json @@ -0,0 +1,118 @@ +{ + "realm": "test-realm", + "displayName": "SAML IdP-initiated example", + "enabled": true, + "sslRequired": "external", + "registrationAllowed": false, + "loginWithEmailAllowed": true, + "duplicateEmailsAllowed": false, + "resetPasswordAllowed": false, + "clients": [ + { + "clientId": "http://localhost:8081/saml2/metadata", + "name": "Spring Boot SAML service provider", + "protocol": "saml", + "enabled": true, + "frontchannelLogout": true, + "fullScopeAllowed": true, + "redirectUris": ["http://localhost:8081/*"], + "attributes": { + "saml_idp_initiated_sso_url_name": "okta-client", + "saml_assertion_consumer_url_post": "http://localhost:8081/login/saml2/sso", + "saml_single_logout_service_url_post": "http://localhost:8081/logout/saml2/slo", + "saml_name_id_format": "username", + "saml_force_name_id_format": "false", + "saml.force.post.binding": "true", + "saml.server.signature": "true", + "saml.signature.algorithm": "RSA_SHA256", + "saml.assertion.signature": "false", + "saml.client.signature": "false", + "saml.encrypt": "false", + "saml.authnstatement": "true" + }, + "protocolMappers": [ + { + "name": "email", + "protocol": "saml", + "protocolMapper": "saml-user-property-mapper", + "consentRequired": false, + "config": { + "user.attribute": "email", + "attribute.name": "email", + "friendly.name": "email", + "attribute.nameformat": "Basic" + } + }, + { + "name": "firstName", + "protocol": "saml", + "protocolMapper": "saml-user-property-mapper", + "consentRequired": false, + "config": { + "user.attribute": "firstName", + "attribute.name": "firstName", + "friendly.name": "firstName", + "attribute.nameformat": "Basic" + } + }, + { + "name": "lastName", + "protocol": "saml", + "protocolMapper": "saml-user-property-mapper", + "consentRequired": false, + "config": { + "user.attribute": "lastName", + "attribute.name": "lastName", + "friendly.name": "lastName", + "attribute.nameformat": "Basic" + } + } + ] + } + ], + "users": [ + { + "username": "test", + "email": "test@example.com", + "firstName": "Test", + "lastName": "User", + "enabled": true, + "emailVerified": true, + "credentials": [ + { + "type": "password", + "value": "test", + "temporary": false + } + ] + } + ], + "identityProviders": [ + { + "alias": "okta-broker", + "displayName": "Okta", + "providerId": "saml", + "enabled": false, + "hideOnLogin": true, + "trustEmail": false, + "storeToken": false, + "linkOnly": false, + "config": { + "entityId": "http://localhost:8080/realms/test-realm", + "idpEntityId": "http://www.okta.com/your-okta-app-id", + "singleSignOnServiceUrl": "https://your-okta-domain.okta.com/app/your-okta-app/your-okta-app-id/sso/saml", + "nameIDPolicyFormat": "urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified", + "principalType": "SUBJECT", + "postBindingResponse": "true", + "postBindingAuthnRequest": "true", + "postBindingLogout": "false", + "wantAuthnRequestsSigned": "false", + "wantAssertionsSigned": "false", + "wantAssertionsEncrypted": "false", + "validateSignature": "true", + "allowCreate": "true", + "syncMode": "IMPORT" + } + } + ] +} From 45b52372be2713deb1196a0b7b3eeaf37ab82061 Mon Sep 17 00:00:00 2001 From: WictorGirardi Date: Thu, 24 Sep 2026 16:02:49 -0300 Subject: [PATCH 5/8] Rewrite the SAML example README --- saml2/idp-initiated/README.md | 156 +++++++++++++++++++++++++++++++--- 1 file changed, 144 insertions(+), 12 deletions(-) diff --git a/saml2/idp-initiated/README.md b/saml2/idp-initiated/README.md index 2c632a2..74a86f1 100644 --- a/saml2/idp-initiated/README.md +++ b/saml2/idp-initiated/README.md @@ -1,15 +1,147 @@ -# Spring boot SAML 2.0 Idp-initiated flow example +# Phase Two SAML 2.0 example: IdP-initiated SSO with Spring Boot -This project was generated with [Spring Initializr](https://start.spring.io/). Contributions and corrections are welcome as pull requests. +A Spring Boot SAML 2.0 service provider (SP) that accepts IdP-initiated logins from Keycloak, either with Keycloak as the identity provider or with Keycloak brokering a login that starts in Okta. It is the code for the tutorial [Keycloak SAML Identity Provider (IdP) Initiated Flow with Okta](https://phasetwo.io/blog/keycloak-saml-identity-provider-idp-initiated-flow-with-okta). -### Local Development +## IdP-initiated SSO -1. Start a Keycloak instance locally. (e.q: http://localhost:8080/) . -2. Go to your OKTA tenant and add a new SAML 2.0 application with the following:\ - ```Single sign-on URL```: http://localhost:8080/realms/test-realm/broker/okta-broker/endpoint/clients/okta-client \ - ```Audience URI (SP Entity ID)```: http://localhost:8080/realms/test-realm -3. Import realm in file: `/keycloak/test-realm-export.json`\ - You will need to change the ```singleSignOnServiceUrl``` with the one found in the metadata from OKTA application created at step 1 -4. Import saml-client: `/keycloak/saml-client.json` -5. Run project using: `./gradlew bootRun` -6. Start authentication from OKTA application page +In the usual, SP-initiated flow, the user opens the application first. The SP sends a SAML `AuthnRequest` to the identity provider (IdP), the user logs in there, and the IdP posts a SAML `Response` back to the SP's assertion consumer service (ACS). The response refers to the request (`InResponseTo`), so the SP knows it asked for it. + +In the IdP-initiated flow, the user starts at the IdP, for example by clicking the application's tile in the Okta dashboard. There is no `AuthnRequest`: the IdP posts an unsolicited `Response` to the SP's ACS. The SP accepts it when it is signed by the IdP it trusts, addressed to its ACS (`Destination`), meant for its entity ID (`Audience`) and still valid. Because an unsolicited response can't be matched to a request, it is more exposed to replay and login CSRF than an SP-initiated one: keep assertion lifetimes short, sign (and, for sensitive attributes, encrypt) assertions, and prefer SP-initiated logins where you can. + +## Architecture + +The example runs in one of two ways: + +- **Keycloak as the IdP** (no Okta needed): the browser opens Keycloak's IdP-initiated SSO URL for the SAML client, the user logs in to Keycloak, and Keycloak posts a SAML response to the SP. +- **Okta, brokered by Keycloak**: the user clicks the app in Okta, Okta posts a SAML response to Keycloak's broker endpoint for the `okta-broker` identity provider, Keycloak validates it, creates or links the user and starts a Keycloak session, and then Keycloak's SAML client posts a new SAML response to the SP. + +```mermaid +sequenceDiagram + participant User + participant Okta + participant Keycloak as Keycloak (test-realm) + participant SP as Spring Boot SP (port 8081) + + User->>Okta: Clicks the app tile + Okta->>Keycloak: SAML response to /broker/okta-broker/endpoint/clients/okta-client + Keycloak->>Keycloak: Validates it, creates or links the user + Keycloak->>SP: SAML response to /login/saml2/sso + SP->>User: Logged in +``` + +Without Okta, the flow starts at Keycloak's `/protocol/saml/clients/okta-client` URL instead of the broker endpoint. `okta-client` is the SAML client's "IDP-Initiated SSO URL name", a name from the tutorial: both flows use the same client. + +| What | Value | +| ----------------------------------- | ----------------------------------------------------------------------------------------- | +| SP entity ID (Keycloak client ID) | `http://localhost:8081/saml2/metadata` | +| SP assertion consumer service (ACS) | `http://localhost:8081/login/saml2/sso` | +| SP single logout service | `http://localhost:8081/logout/saml2/slo` | +| SP metadata | `http://localhost:8081/saml2/metadata` (also `/saml2/metadata/keycloak`) | +| Keycloak IdP metadata | `http://localhost:8080/realms/test-realm/protocol/saml/descriptor` | +| Keycloak IdP-initiated SSO URL | `http://localhost:8080/realms/test-realm/protocol/saml/clients/okta-client` | +| Keycloak broker endpoint for Okta | `http://localhost:8080/realms/test-realm/broker/okta-broker/endpoint/clients/okta-client` | + +## The code + +- [build.gradle](./build.gradle): Spring Boot 4.1 with `spring-boot-starter-security-saml2`, which brings Spring Security 7.1 and OpenSAML 5. OpenSAML is not published to Maven Central, hence the Shibboleth repository. The build uses a Java 21 toolchain, which Gradle downloads if you don't have one. +- [application.yaml](./src/main/resources/application.yaml) defines the relying party registration `keycloak`: the SP's entity ID, ACS and single logout URLs, its signing key pair, and the URL of Keycloak's IdP metadata, which Spring reads at startup to learn Keycloak's endpoints and signing certificate. `{baseUrl}` is replaced with the URL the request came in on. +- [SecurityConfiguration.java](./src/main/java/com/saml2/idp_initiated/SecurityConfiguration.java) requires a login for every page. `saml2Login` processes SAML responses posted to `/login/saml2/sso` (the registration is found from the response's issuer, so the ACS URL needs no registration ID) and sends users who aren't logged in to Keycloak. `saml2Logout` handles single logout, and `saml2Metadata` publishes the SP metadata, which Spring Boot's default configuration doesn't. +- [RootController.java](./src/main/java/com/saml2/idp_initiated/controllers/RootController.java) and [index.html](./src/main/resources/templates/index.html) show the logged-in user and the decoded assertion: the NameID, the session index and every attribute. They read it through Spring Security 7's `Saml2AssertionAuthentication` and `Saml2ResponseAssertionAccessor`, which replace the deprecated `Saml2AuthenticatedPrincipal`. +- [keycloak/test-realm.json](./keycloak/test-realm.json) is the `test-realm` realm: the SAML client, a test user and a disabled placeholder for the Okta identity provider. +- [scripts/generate-sp-credentials.sh](./scripts/generate-sp-credentials.sh) creates the SP's signing key pair. + +## Prerequisites + +- Java 17 or newer to run Gradle (the build itself uses Java 21, see above) +- Docker with the Compose plugin +- bash and OpenSSL, to create the key pair (on Windows, use Git Bash or WSL) +- Ports 8080 and 8081 free. If the repository's shared Keycloak is running, stop it first: `docker compose -f keycloak/docker-compose.yml down` from the repository root. +- An Okta account, only for the [Okta flow](#full-flow-with-okta) + +## Run it + +In `saml2/idp-initiated`: + +```sh +./scripts/generate-sp-credentials.sh +docker compose up -d --wait +./gradlew bootRun +``` + +1. `generate-sp-credentials.sh` writes a 2048-bit RSA key and a self-signed certificate, valid for 10 years, to `credentials/private.key` and `credentials/cert.crt`. The `credentials` folder is ignored by git. Running the script again keeps an existing pair; delete the folder to create a new one. +2. `docker compose up -d --wait` starts a Phase Two Keycloak on port 8080 and imports [keycloak/test-realm.json](./keycloak/test-realm.json): the realm `test-realm`, the SAML client for this SP and the user `test` / `test`. The admin console is at , with `admin` / `admin`. +3. `./gradlew bootRun` starts the SP on . Start Keycloak first: the SP downloads Keycloak's IdP metadata at startup and doesn't start without it. It doesn't start without the key pair either, and then fails with `Private key location 'URL [file:credentials/private.key]' does not exist`. + +Opening starts an SP-initiated login: the SP sends you to Keycloak, and after you log in as `test` / `test`, back to the SP. + +Use `localhost` rather than `127.0.0.1`. The SP checks the response's `Destination` and `Audience` against URLs built from the host the request came in on, and Keycloak has `localhost` URLs. + +## Quick test without Okta + +1. Open Keycloak's IdP-initiated SSO URL for the client: . +2. Log in as `test` / `test`. +3. Keycloak posts a signed SAML response to , and the SP shows "Authenticated", the NameID `test` and the attributes Keycloak sent: `email`, `firstName` and `lastName` from the client's mappers, and `Role` from Keycloak's default `role_list` client scope. + +"Log out" logs you out of both: the SP ends its session and sends a signed `LogoutRequest` to Keycloak, Keycloak ends its session and posts a `LogoutResponse` back to `/logout/saml2/slo`, and the SP shows Spring Security's default login page with "You have been signed out". Its `keycloak` link starts an SP-initiated login. + +If a login fails, the SP redirects to the same page with the reason, for example an invalid signature or a mismatched `Destination`. + +## Full flow with Okta + +The realm has a SAML identity provider `okta-broker` with placeholder values (`your-okta-domain`, `your-okta-app-id`). It is disabled until you connect it to your Okta application. + +1. In the Okta admin console, create an app integration with SAML 2.0 as the sign-in method and these settings: + + | Okta setting | Value | + | --------------------------- | ----------------------------------------------------------------------------------------- | + | Single sign-on URL | `http://localhost:8080/realms/test-realm/broker/okta-broker/endpoint/clients/okta-client` | + | Audience URI (SP Entity ID) | `http://localhost:8080/realms/test-realm` | + | Name ID format | Unspecified | + | Application username | Okta username | + + Keep "Use this for Recipient URL and Destination URL" checked. Optionally, add the attribute statements `email`, `firstName` and `lastName` (from `user.email`, `user.firstName` and `user.lastName`), then assign the application to your Okta user. The single sign-on URL is Keycloak's broker endpoint followed by `/clients/okta-client`, which tells Keycloak which client to send the user to afterwards. + +2. In the Keycloak admin console, open `test-realm` > Identity providers > `okta-broker` and replace the placeholders with the values from the application's Sign On tab in Okta ("View SAML setup instructions", or the metadata URL): the identity provider entity ID (`http://www.okta.com/...`), the single sign-on service URL and Okta's signing certificate. Keep "Validate signatures" on and the service provider entity ID `http://localhost:8080/realms/test-realm`, then enable the provider. You can also delete `okta-broker` and create it again from Okta's metadata, as the tutorial does, as long as you keep the alias `okta-broker`. + +3. Open the Okta end-user dashboard and click the application's tile. Okta posts its response to Keycloak, Keycloak posts its own to the SP, and you land on the SP logged in with your Okta username as the NameID. On the first login, Keycloak creates the user and asks you to complete the profile unless Okta sent the email and names and you have added attribute importer mappers for them to `okta-broker`. + +## The SP's signing key and the Keycloak client + +- Keycloak's IdP metadata says it wants signed authentication requests (`WantAuthnRequestsSigned="true"`), so Spring Boot doesn't start without a signing key. The SP signs its `AuthnRequest`s (SP-initiated logins) and its logout requests with `credentials/private.key`. IdP-initiated logins don't use it: the SP sends nothing, it only verifies Keycloak's signature. +- The imported client has "Client signature required" off (`saml.client.signature` is `false`), so Keycloak doesn't check the SP's signatures and needs no SP certificate. To have them checked, turn it on and give Keycloak `credentials/cert.crt` in the client's Keys tab, or create the client from the SP metadata at , which contains the certificate. After creating a new key pair, update the certificate in Keycloak too. +- Keycloak signs its SAML responses with the realm's own key (Realm settings > Keys). The SP gets the matching certificate from the IdP metadata at startup. Neither side needs the other's private key: an earlier version of this example had you copy a private key from the Keycloak client into the SP, which isn't necessary. +- The certificate's common name is the SP entity ID only to make it easy to recognize. Neither Spring nor Keycloak checks it. + +## Using your own Keycloak + +To use another Keycloak, for example a [Phase Two](https://phasetwo.io) deployment, either import [keycloak/test-realm.json](./keycloak/test-realm.json) as a new realm, or create the client in an existing realm: + +1. Point `assertingparty.metadata-uri` in [application.yaml](./src/main/resources/application.yaml) at your realm's IdP metadata: `https:///realms//protocol/saml/descriptor`, with `/auth` before `/realms` on Keycloaks that use it, such as Phase Two's. +2. Start the SP, then import its metadata in Keycloak: Clients > Import client, with the file downloaded from . This sets the client ID, the ACS and single logout URLs, and the SP's certificate. +3. On the client, set "IDP-Initiated SSO URL name" to `okta-client` and check that "Sign documents" is on. Add `email`, `firstName` and `lastName` user property mappers if you want those attributes. + +The IdP-initiated SSO URL is then `https:///realms//protocol/saml/clients/okta-client`. + +## Tests + +```sh +./gradlew build +``` + +The tests need neither Keycloak nor a key pair, so they run in CI as they are. [src/test/resources/application.yaml](./src/test/resources/application.yaml) replaces the main configuration: it reads the IdP metadata from [test-realm-descriptor.xml](./src/test/resources/test-realm-descriptor.xml), a Keycloak descriptor for `test-realm` with a throwaway certificate, and sets `singlesignon.sign-request: false`, so no signing key is needed. The tests check the SP metadata endpoint, the redirect to the SAML login, the authentication request sent to Keycloak and the page shown after a SAML login. + +The [GitHub workflow](../../.github/workflows/saml2-idp-initiated.yml) runs `./gradlew build` with Java 21. + +## Stop + +```sh +docker compose down +``` + +Keycloak keeps nothing: the next `docker compose up` imports the realm again. + +## Security notes + +- Earlier versions of this example committed an SP private key (`src/main/resources/credentials/private.key`) and a Keycloak client private key (in `keycloak/saml-client.json`). They remain in the git history, so they are public: never trust or reuse them. +- `admin` / `admin` and `test` / `test` exist only in the local container. +- The Okta identity provider validates Okta's signatures. Don't turn "Validate signatures" off: Keycloak would then accept any response posted to its broker endpoint. From ce5c0f1127fd6730649e1b05f4a571fc6d3d11cd Mon Sep 17 00:00:00 2001 From: WictorGirardi Date: Thu, 24 Sep 2026 16:02:49 -0300 Subject: [PATCH 6/8] Add CI workflow for the SAML example --- .github/workflows/saml2-idp-initiated.yml | 27 +++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/saml2-idp-initiated.yml diff --git a/.github/workflows/saml2-idp-initiated.yml b/.github/workflows/saml2-idp-initiated.yml new file mode 100644 index 0000000..f3db11a --- /dev/null +++ b/.github/workflows/saml2-idp-initiated.yml @@ -0,0 +1,27 @@ +name: SAML 2.0 IdP-initiated (Spring Boot) + +on: + push: + branches: [main] + paths: + - "saml2/idp-initiated/**" + - ".github/workflows/saml2-idp-initiated.yml" + pull_request: + branches: [main] + paths: + - "saml2/idp-initiated/**" + - ".github/workflows/saml2-idp-initiated.yml" + workflow_dispatch: + +permissions: + contents: read + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} + +jobs: + ci: + uses: ./.github/workflows/_gradle-ci.yml + with: + working-directory: saml2/idp-initiated From dd8558f2438fbe74526efca9442f6e2d0e25dd67 Mon Sep 17 00:00:00 2001 From: WictorGirardi Date: Thu, 24 Sep 2026 16:24:37 -0300 Subject: [PATCH 7/8] Rename the SAML realm file so Keycloak imports it --- saml2/idp-initiated/README.md | 6 +++--- .../keycloak/{test-realm.json => test-realm-export.json} | 0 2 files changed, 3 insertions(+), 3 deletions(-) rename saml2/idp-initiated/keycloak/{test-realm.json => test-realm-export.json} (100%) diff --git a/saml2/idp-initiated/README.md b/saml2/idp-initiated/README.md index 74a86f1..77702ea 100644 --- a/saml2/idp-initiated/README.md +++ b/saml2/idp-initiated/README.md @@ -47,7 +47,7 @@ Without Okta, the flow starts at Keycloak's `/protocol/saml/clients/okta-client` - [application.yaml](./src/main/resources/application.yaml) defines the relying party registration `keycloak`: the SP's entity ID, ACS and single logout URLs, its signing key pair, and the URL of Keycloak's IdP metadata, which Spring reads at startup to learn Keycloak's endpoints and signing certificate. `{baseUrl}` is replaced with the URL the request came in on. - [SecurityConfiguration.java](./src/main/java/com/saml2/idp_initiated/SecurityConfiguration.java) requires a login for every page. `saml2Login` processes SAML responses posted to `/login/saml2/sso` (the registration is found from the response's issuer, so the ACS URL needs no registration ID) and sends users who aren't logged in to Keycloak. `saml2Logout` handles single logout, and `saml2Metadata` publishes the SP metadata, which Spring Boot's default configuration doesn't. - [RootController.java](./src/main/java/com/saml2/idp_initiated/controllers/RootController.java) and [index.html](./src/main/resources/templates/index.html) show the logged-in user and the decoded assertion: the NameID, the session index and every attribute. They read it through Spring Security 7's `Saml2AssertionAuthentication` and `Saml2ResponseAssertionAccessor`, which replace the deprecated `Saml2AuthenticatedPrincipal`. -- [keycloak/test-realm.json](./keycloak/test-realm.json) is the `test-realm` realm: the SAML client, a test user and a disabled placeholder for the Okta identity provider. +- [keycloak/test-realm-export.json](./keycloak/test-realm-export.json) is the `test-realm` realm: the SAML client, a test user and a disabled placeholder for the Okta identity provider. Keep the `-export` suffix: Keycloak's import reads a file named `-realm.json` as the realm ``, so `test-realm.json` would fail to import. - [scripts/generate-sp-credentials.sh](./scripts/generate-sp-credentials.sh) creates the SP's signing key pair. ## Prerequisites @@ -69,7 +69,7 @@ docker compose up -d --wait ``` 1. `generate-sp-credentials.sh` writes a 2048-bit RSA key and a self-signed certificate, valid for 10 years, to `credentials/private.key` and `credentials/cert.crt`. The `credentials` folder is ignored by git. Running the script again keeps an existing pair; delete the folder to create a new one. -2. `docker compose up -d --wait` starts a Phase Two Keycloak on port 8080 and imports [keycloak/test-realm.json](./keycloak/test-realm.json): the realm `test-realm`, the SAML client for this SP and the user `test` / `test`. The admin console is at , with `admin` / `admin`. +2. `docker compose up -d --wait` starts a Phase Two Keycloak on port 8080 and imports [keycloak/test-realm-export.json](./keycloak/test-realm-export.json): the realm `test-realm`, the SAML client for this SP and the user `test` / `test`. The admin console is at , with `admin` / `admin`. 3. `./gradlew bootRun` starts the SP on . Start Keycloak first: the SP downloads Keycloak's IdP metadata at startup and doesn't start without it. It doesn't start without the key pair either, and then fails with `Private key location 'URL [file:credentials/private.key]' does not exist`. Opening starts an SP-initiated login: the SP sends you to Keycloak, and after you log in as `test` / `test`, back to the SP. @@ -114,7 +114,7 @@ The realm has a SAML identity provider `okta-broker` with placeholder values (`y ## Using your own Keycloak -To use another Keycloak, for example a [Phase Two](https://phasetwo.io) deployment, either import [keycloak/test-realm.json](./keycloak/test-realm.json) as a new realm, or create the client in an existing realm: +To use another Keycloak, for example a [Phase Two](https://phasetwo.io) deployment, either import [keycloak/test-realm-export.json](./keycloak/test-realm-export.json) as a new realm, or create the client in an existing realm: 1. Point `assertingparty.metadata-uri` in [application.yaml](./src/main/resources/application.yaml) at your realm's IdP metadata: `https:///realms//protocol/saml/descriptor`, with `/auth` before `/realms` on Keycloaks that use it, such as Phase Two's. 2. Start the SP, then import its metadata in Keycloak: Clients > Import client, with the file downloaded from . This sets the client ID, the ACS and single logout URLs, and the SP's certificate. diff --git a/saml2/idp-initiated/keycloak/test-realm.json b/saml2/idp-initiated/keycloak/test-realm-export.json similarity index 100% rename from saml2/idp-initiated/keycloak/test-realm.json rename to saml2/idp-initiated/keycloak/test-realm-export.json From 2088faddfee3c507719c70e47af87a19a0e5bf18 Mon Sep 17 00:00:00 2001 From: WictorGirardi Date: Thu, 24 Sep 2026 16:24:45 -0300 Subject: [PATCH 8/8] Correct SAML README claims found in end-to-end testing --- saml2/idp-initiated/README.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/saml2/idp-initiated/README.md b/saml2/idp-initiated/README.md index 77702ea..c0dbcd5 100644 --- a/saml2/idp-initiated/README.md +++ b/saml2/idp-initiated/README.md @@ -74,17 +74,21 @@ docker compose up -d --wait Opening starts an SP-initiated login: the SP sends you to Keycloak, and after you log in as `test` / `test`, back to the SP. -Use `localhost` rather than `127.0.0.1`. The SP checks the response's `Destination` and `Audience` against URLs built from the host the request came in on, and Keycloak has `localhost` URLs. +Use `localhost` rather than `127.0.0.1`. The SP builds its entity ID and URLs from the host the request came in on, so on `127.0.0.1` it introduces itself as `http://127.0.0.1:8081/saml2/metadata`, which isn't a client in the realm, and Keycloak answers "Invalid Request". ## Quick test without Okta 1. Open Keycloak's IdP-initiated SSO URL for the client: . 2. Log in as `test` / `test`. -3. Keycloak posts a signed SAML response to , and the SP shows "Authenticated", the NameID `test` and the attributes Keycloak sent: `email`, `firstName` and `lastName` from the client's mappers, and `Role` from Keycloak's default `role_list` client scope. +3. Keycloak posts a signed SAML response to , and the SP shows "Authenticated", the NameID `test` and the attributes from the client's mappers: `email`, `firstName` and `lastName`. Keycloak's default `role_list` client scope also sends a `Role` attribute for users who have roles, such as users created in the admin console. The imported `test` user has none. "Log out" logs you out of both: the SP ends its session and sends a signed `LogoutRequest` to Keycloak, Keycloak ends its session and posts a `LogoutResponse` back to `/logout/saml2/slo`, and the SP shows Spring Security's default login page with "You have been signed out". Its `keycloak` link starts an SP-initiated login. -If a login fails, the SP redirects to the same page with the reason, for example an invalid signature or a mismatched `Destination`. +If a login fails, the SP sends you to the same page with only "Invalid credentials". The reason, for example `invalid_signature` or `invalid_destination`, is logged at trace level: + +```sh +./gradlew bootRun --args='--logging.level.org.springframework.security.saml2=TRACE' +``` ## Full flow with Okta @@ -117,7 +121,7 @@ The realm has a SAML identity provider `okta-broker` with placeholder values (`y To use another Keycloak, for example a [Phase Two](https://phasetwo.io) deployment, either import [keycloak/test-realm-export.json](./keycloak/test-realm-export.json) as a new realm, or create the client in an existing realm: 1. Point `assertingparty.metadata-uri` in [application.yaml](./src/main/resources/application.yaml) at your realm's IdP metadata: `https:///realms//protocol/saml/descriptor`, with `/auth` before `/realms` on Keycloaks that use it, such as Phase Two's. -2. Start the SP, then import its metadata in Keycloak: Clients > Import client, with the file downloaded from . This sets the client ID, the ACS and single logout URLs, and the SP's certificate. +2. Start the SP, then import its metadata in Keycloak: Clients > Import client, with the file downloaded from . This sets the client ID, the ACS and single logout URLs, and the SP's certificate, and turns "Client signature required" on, so Keycloak checks the SP's signatures. 3. On the client, set "IDP-Initiated SSO URL name" to `okta-client` and check that "Sign documents" is on. Add `email`, `firstName` and `lastName` user property mappers if you want those attributes. The IdP-initiated SSO URL is then `https:///realms//protocol/saml/clients/okta-client`. @@ -138,10 +142,11 @@ The [GitHub workflow](../../.github/workflows/saml2-idp-initiated.yml) runs `./g docker compose down ``` -Keycloak keeps nothing: the next `docker compose up` imports the realm again. +Keycloak keeps nothing: the next `docker compose up` imports the realm again, with new signing keys. Restart the SP after that, since it reads Keycloak's certificate only at startup; until then, logins fail with `invalid_signature`. ## Security notes - Earlier versions of this example committed an SP private key (`src/main/resources/credentials/private.key`) and a Keycloak client private key (in `keycloak/saml-client.json`). They remain in the git history, so they are public: never trust or reuse them. - `admin` / `admin` and `test` / `test` exist only in the local container. - The Okta identity provider validates Okta's signatures. Don't turn "Validate signatures" off: Keycloak would then accept any response posted to its broker endpoint. +- Spring Security accepts a response with an `InResponseTo` only in the browser session that sent the request, but it accepts an unsolicited, IdP-initiated response in any session and doesn't remember the responses it has already accepted. A captured response therefore logs in again until it expires: with Keycloak's defaults, about a minute after it is issued, plus the five minutes of clock skew Spring allows. Keep the client's "Assertion Lifespan" short in Keycloak and use HTTPS outside your machine.