diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..128e4ef --- /dev/null +++ b/.env.example @@ -0,0 +1,31 @@ +# Local environment template. Copy it and fill it in: +# +# cp .env.example .env +# +# `.env` is gitignored; this template is committed so a fresh clone can see what it +# needs instead of finding out from a blank page. Vite only exposes variables +# prefixed with VITE_ to the browser bundle. +# +# Every variable the app reads is declared and typed in src/env.ts. + +# --- Required --------------------------------------------------------------- + +# Firebase web API key. +# Firebase console -> Project settings -> Your apps -> Web app -> API key. +# Without it the app cannot initialise Firebase, so sign-in (and therefore the +# API docs) will not work. src/env.ts checks this before rendering and prints an +# actionable error rather than failing mysteriously later. +VITE_FirebaseAPIKey= + +# --- Optional --------------------------------------------------------------- + +# Release tag shown in the site footer. CI writes this during deploy; leave it +# unset locally and the footer shows "dev". +VITE_TAG= + +# --- NOT read from this file -------------------------------------------------- + +# ACCESS_TOKEN, used by `npm run spec` (scripts/downloadYML.js), is read from the +# real process environment. Nothing loads `.env` into Node, so put it in your +# shell or a CI `env:` entry rather than here. It is optional: the OpenAPI release +# asset downloads anonymously, and the token only helps with rate limits. diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 6cec2e8..9c7b688 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -5,30 +5,62 @@ on: - master jobs: + # Publishing is gated on the test suite. Previously `build` ran straight into the + # artifact upload, so a deploy - including a manually re-run one - could ship + # code that fails its own tests. The check set lives in package.json (`npm run + # verify`) rather than being restated here, so this workflow and test.yml cannot + # drift apart. + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: nodejs + uses: actions/setup-node@v4 + with: + node-version-file: .nvmrc + cache: npm + - name: install dependencies + run: npm ci + - name: generate OpenAPI spec + # src/swagger_spec.json is git-ignored and imported by app code, so the + # browser tests cannot even load the module graph without it. + run: npm run spec + env: + ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} + - name: install browser test dependencies + run: npx playwright install --with-deps chromium + - name: verify + run: npm run verify + build: runs-on: ubuntu-latest + needs: test steps: - uses: actions/checkout@v4 - name: nodejs uses: actions/setup-node@v4 with: - node-version: "23.5.0" - - name: setup for deploy + node-version-file: .nvmrc + cache: npm + - name: install dependencies + run: npm ci + - name: generate OpenAPI spec + # Also writes scripts/releases.json, which scripts/outputTag reads below. + run: npm run spec + env: + ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} + - name: build run: | - for i in {1..5}; do curl -L -H "Authorization: token ${{ secrets.ACCESS_TOKEN }}" -o ./scripts/releases.json https://api.github.com/repos/realoptions/option_price_faas/releases/latest && break || sleep 10; done tag=$(node ./scripts/outputTag) echo "VITE_TAG=$tag" >> .env - echo "this is the tag #: $tag" echo "VITE_FirebaseAPIKey=${{ secrets.FIREBASE_API_KEY }}" >> .env - npm ci - access_token=${{ secrets.ACCESS_TOKEN }} node ./scripts/downloadYML.js npm run build env: CI: true - name: Upload static files as artifact id: deployment - uses: actions/upload-pages-artifact@v3 # or specific "vX.X.X" version tag for this action + uses: actions/upload-pages-artifact@v3 with: path: dist/ diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 5eb0825..ac52bfd 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -9,16 +9,25 @@ jobs: - name: nodejs uses: actions/setup-node@v4 with: - node-version: "23.5.0" - - name: test install - run: | - npm ci - for i in {1..5}; do curl -L -H "Authorization: token ${{ secrets.ACCESS_TOKEN }}" -o ./scripts/releases.json https://api.github.com/repos/realoptions/option_price_faas/releases/latest && break || sleep 10; done - tag=$(node ./scripts/outputTag) - echo "VITE_TAG=$tag" >> .env - echo "this is the tag #: $tag" - echo "VITE_FirebaseAPIKey=${{ secrets.FIREBASE_API_KEY }}" >> .env - access_token=${{ secrets.ACCESS_TOKEN }} node ./scripts/downloadYML.js - npm run build + node-version-file: .nvmrc + cache: npm + - name: install dependencies + run: npm ci + - name: generate OpenAPI spec + # src/swagger_spec.json is git-ignored and imported by src/App.tsx, so it must + # be generated before typecheck/build. The token guards against the anonymous + # GitHub API rate limit that shared CI runner IPs are prone to hit. + run: npm run spec + env: + ACCESS_TOKEN: ${{ secrets.ACCESS_TOKEN }} + - name: install browser test dependencies + run: npx playwright install --with-deps chromium + # The check set itself is defined once, in package.json, and shared with the + # deploy workflow's gating job. Restating the steps in each workflow is how + # the two would quietly drift apart. + - name: verify + run: npm run verify + - name: build + run: npm run build env: CI: true diff --git a/.gitignore b/.gitignore index 64a6968..073dbfb 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,7 @@ openapi_v2.yml releases.json swagger_spec.json dist + +# vitest browser-mode artifacts (failure screenshots, captured attachments) +__screenshots__/ +.vitest-attachments/ diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..a45fd52 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24 diff --git a/README.md b/README.md index 54ef094..f546559 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,339 @@ -This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app). +# Finside developer site -## Available Scripts +Public developer portal for the Finside options-pricing API. Sign in with an +identity provider, copy your issued token into Swagger's `JWT (apiKey)` box, and +browse and exercise the API against the live OpenAPI spec. -In the project directory, you can run: +## Stack -### `npm start` +| Concern | Choice | +| -------------- | --------------------------------------------------- | +| Build / dev | [Vite 8](https://vite.dev) + `@vitejs/plugin-react` | +| UI | React 19, [antd 6](https://ant.design), `@ant-design/icons` | +| API docs | `swagger-ui-react` 5 | +| Auth | Firebase 12 (`firebase/auth`) | +| Language | TypeScript 5.9 (strict; `noUnusedLocals`) | +| Tests | Vitest 4 in **real-browser** mode (Playwright/Chromium) | +| Hosting | GitHub Actions → GitHub Pages | -Runs the app in the development mode.
-Open [http://localhost:3000](http://localhost:3000) to view it in the browser. +## Prerequisites -The page will reload if you make edits.
-You will also see any lint errors in the console. +- **Node 24**, as pinned in [`.nvmrc`](.nvmrc) (`nvm use` picks it up). + `package.json` allows `^22.12.0 || >=24.0.0`; Node 23 is deliberately excluded. +- **npm >= 10**. +- A Firebase project with the Google, Facebook and GitHub providers enabled, and a + web app API key (see [Configuration](#configuration)). -### `npm test` +## Quick start -Launches the test runner in the interactive watch mode.
-See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information. +```bash +npm ci +cp .env.example .env # then fill in VITE_FirebaseAPIKey +npm run spec # generates src/swagger_spec.json (git-ignored) +npm run dev # http://localhost:5173 +``` -### `npm run build` +`npm run spec` is a required step, not an optional extra — see +[The OpenAPI spec](#the-openapi-spec-generated-git-ignored). `npm run dev` and +`npm run build` both run `scripts/checkSpec.js` first, so a missing spec fails +with that remedy rather than an unresolved-import error. -Builds the app for production to the `build` folder.
-It correctly bundles React in production mode and optimizes the build for the best performance. +## Commands -The build is minified and the filenames include the hashes.
-Your app is ready to be deployed! +| Command | What it does | +| --------------------- | --------------------------------------------------------- | +| `npm run dev` | Dev server with HMR (runs the spec preflight first). | +| `npm run build` | Production build to `dist/` (runs the spec preflight first). | +| `npm run preview` | Serve the built `dist/` locally. | +| `npm run spec` | Download the OpenAPI spec and write it as JSON. | +| `npm run verify` | The whole gate: guards + typecheck + tests. | +| `npm run lint` | Both source guards (`lint:colors` + `lint:theme`). | +| `npm run typecheck` | `tsc -p tsconfig.app.json --noEmit`. | +| `npm test` | Single run of the browser test suite. | +| `npm run test:watch` | Watch mode for the same suite. | +| `npm run test:coverage` | Same suite with V8 coverage. | +| `npm run lint:colors` | Fails on any colour literal outside `src/theme.ts`. | -See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information. +`npm run verify` is the one command that answers "is this safe to ship?". It is +what CI runs, and both CI workflows call it rather than restating the steps, so +the local gate and the deployed gate cannot drift. It deliberately does **not** +include `build`: the deploy build step stamps `VITE_TAG` and +`VITE_FirebaseAPIKey` into `.env` first, and a build inside `verify` would +produce an artifact without them. -### `npm run eject` +> **Not Create React App.** This project was migrated to Vite. The legacy CRA +> scripts and the `build/` output directory from those docs are gone; only the +> commands in the table above are supported. -**Note: this is a one-way operation. Once you `eject`, you can’t go back!** +## Configuration -If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. +All environment reads live in **[`src/env.ts`](src/env.ts)**, typed via the +`ImportMetaEnv` declaration in `src/vite-env.d.ts`. Nothing else in `src` touches +`import.meta.env`. Copy `.env.example` and fill it in; `.env` is git-ignored. -Instead, it will copy all the configuration files and the transitive dependencies (webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. +| Variable | Required | Purpose | +| -------------------- | -------- | -------------------------------------------------------- | +| `VITE_FirebaseAPIKey`| **Yes** | Firebase web API key. Firebase console → Project settings → Your apps → Web app. | +| `VITE_TAG` | No | Release tag shown in the site footer. Written by CI; locally the footer reads `dev`. | -You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. +Non-secret Firebase project settings are committed in +[`src/config.json`](src/config.json); only the API key is injected at build time. -## Learn More +Only variables prefixed `VITE_` reach the browser bundle. `VITE_FirebaseAPIKey` is +validated **before render** by `assertEnv()` in +[`src/index.tsx`](src/index.tsx) — a misconfigured build shows a readable +"Configuration error" panel instead of a page whose auth calls fail silently. -You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started). +## The OpenAPI spec (generated, git-ignored) -To learn React, check out the [React documentation](https://reactjs.org/). +`src/swagger_spec.json` is imported directly by `src/App.tsx` but is +**git-ignored**, so it does not exist in a fresh clone. -### Code Splitting +```bash +npm run spec # anonymous — usually fine +ACCESS_TOKEN=ghp_xxx npm run spec # only if rate-limited +``` -This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting +`scripts/downloadYML.js` fetches `openapi_gcp.yml` from the latest +[`realoptions/option_price_faas`](https://github.com/realoptions/option_price_faas) +release and writes it as JSON. It validates the YAML and its `paths` **before** +writing, so a failed run cannot clobber a good spec. `ACCESS_TOKEN` is optional +(the asset is public) and is read from the real process environment — nothing loads +`.env` into Node. -### Analyzing the Bundle Size +`npm run spec` also writes `scripts/releases.json`, whose `tag_name` +`scripts/outputTag` reports at deploy time. That tag is the **`option_price_faas` +release** (e.g. `v0.22.0`) — not this site's own `package.json` version. -This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size +## Authentication -### Making a Progressive Web App +Three providers are wired up via Firebase popup sign-in: **Google**, **Facebook** +and **GitHub** ([`src/authProviders.ts`](src/authProviders.ts)). After signing +in, the app reads the Firebase ID token and offers a **Copy Token** button; paste +that into Swagger UI's `JWT (apiKey)` box to authenticate requests. -This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app +### Adding a sign-in provider -### Advanced Configuration +Append one entry to the `PROVIDERS` array in `src/authProviders.ts`: -This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration +```ts +{ + key: "microsoft", + label: "Continue with Microsoft", + Icon: WindowsOutlined, + create: () => new OAuthProvider("microsoft.com"), +} +``` -### Deployment +That is the whole change. The login panel maps over the array, so no component, +markup or layout edit is needed, and the new button inherits the existing width, +centreing, pending-state and error handling. -This section has moved here: https://facebook.github.io/create-react-app/docs/deployment +Providers are built by `create()` **at sign-in time**, never at import. Besides +keeping module import side-effect free, this gives every attempt a fresh provider, +so a cancelled popup cannot leave stale scopes or custom parameters behind for the +next one. -### `npm run build` fails to minify +Failures are translated into a user-visible sentence via +`describeSignInError` ([`src/authErrors.ts`](src/authErrors.ts)); add a case to +`ERROR_MESSAGES` there if you want a custom string for a new Firebase error code. +Unrecognised codes still surface their underlying message rather than going silent. -This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify +Clipboard copying goes through the async Clipboard API +([`src/copyToClipboard.ts`](src/copyToClipboard.ts)), so it requires a secure +context (HTTPS or localhost) and reports failures rather than always claiming +success. Sign-in popups additionally need a real user gesture and providers +actually enabled in your Firebase project. + +## Local API backend + +In development, requests to `/api` are proxied to a locally running backend at +`http://localhost:8000/api/` (see `server.proxy` in +[`vite.config.ts`](vite.config.ts)). Start the pricing service separately if you +want to exercise endpoints. + +## Testing + +Tests run in a **real Chromium browser** under +[`vitetest.config.ts`](vitetest.config.ts) (`@vitest/browser-playwright`), not jsdom. + +```bash +npx playwright install --with-deps chromium # once +npm test # the suite +npm run test:coverage # same, with a coverage report +``` + +A failing test exits non-zero and therefore fails the CI build. So does a run that +collects **zero** tests — the suite cannot quietly become empty and still report +green. + +### What the suite covers + +| File | Covers | +| --- | --- | +| `hooks/useAuth.test.tsx` | Auth state machine: loading vs authenticated vs signed-out, token fetch failure, unsubscribe on unmount, and the invariant that importing `App` creates no Firebase app | +| `components/LoginPanel.test.tsx` | Providers are data-driven: one button per config entry, lazy provider construction, pending-state, centring from 320px to 1920px | +| `signInFlow.test.tsx` | End to end through the real `App`: a click reaches `signInWithPopup` with a real provider, and a failure surfaces a readable message | +| `components/AppHeader.test.tsx` | Brand mark, and that the Log Out item tracks session state and fires exactly once | +| `components/TokenNotice.test.tsx` | Copy success, unavailable clipboard, blocked clipboard | +| `layout.viewport.test.tsx` | Header/footer geometry from 320px to 1920px: no overflow, no clipping | +| `copyToClipboard.test.ts` | Async Clipboard API wrapper and its unsupported-context error | +| `env.test.ts` | Env validation helpers | +| `harness.test.ts` | Proves the browser harness and matchers are actually wired up | + +### Gotchas when writing tests here + +Each of these cost real debugging time; they are properties of this setup, not of +your test. + +- **`await render(...)`.** Rendering is async in this harness; skipping `await` + queries the DOM before anything is in it. +- **Effects do not flush synchronously.** After a render, poll for the state you + expect with `await expect.poll(() => ...)` rather than asserting immediately. +- **Set viewports with `page.viewport(w, h)`** from `vitest/browser`. Playwright's + `page.setViewportSize` does not exist here, and importing `page` from the older + `@vitest/browser/context` path is deprecated and will break in the next major. +- **antd `message` outlives `unmount()`.** It renders into its own portal, so a + toast from one test can satisfy the next test's assertion while proving nothing. + Call `message.destroy()` in `beforeEach` and assert the area is empty first. Do + *not* reset by wiping `document.body.innerHTML` — antd caches that container and + later toasts render into a detached node that never appears. +- **A test that cannot fail is worse than no test.** Where an assertion matters, + break the thing it guards and confirm the test goes red. Both the responsive and + the copy-feedback tests were only trusted after that exercise — and the copy + feedback tests turned out to be passing vacuously before it. + +## Continuous integration & deployment + +- **[`test.yml`](.github/workflows/test.yml)** runs on every push: install → + `npm run spec` → install Chromium → `npm run verify` → build. +- **[`deploy.yml`](.github/workflows/deploy.yml)** runs on push to `master` as + three jobs: `test` → `build` → `deploy`. The `test` job runs the same + `npm run verify` gate, and `build` declares `needs: test`, so a failing suite + stops the artifact being uploaded and published rather than merely reporting a + red tick on a separate workflow. + +The gate is enforced by exit codes, not by watching: a failing test exits 1, a run +matching zero test files also exits 1 (a silently-empty suite cannot pass), and +nothing in either workflow uses `continue-on-error`, `|| true` or `if: always()`. + +Tests pass without a `.env`, which matters because `.env` is git-ignored and CI +has none. + +Required repository secrets: `FIREBASE_API_KEY`, and `ACCESS_TOKEN` (optional, +GitHub API rate-limit relief for the spec download). + +## Repository layout + +``` +src/ + index.tsx Entry point; validates env before render. + App.tsx Composition root: wires useAuth to the components. + hooks/useAuth.ts Auth state machine: loading / authenticated / signed-out. + components/ + AppHeader.tsx Header: brand mark + sign-out menu. + AppFooter.tsx Footer with the deployed release tag. + AuthLoading.tsx Rendered while the session is unresolved. + TokenNotice.tsx Token explanation + Copy Token action. + ApiDocs.tsx Swagger UI wrapper. + Logo.tsx Brand mark. + LoginPanel.tsx Sign-in buttons, rendered from the provider array. + authProviders.ts Sign-in provider config array (add a provider here). + authErrors.ts Firebase auth error codes -> user-facing messages. + env.ts All (typed) environment reads + validation. + firebase.ts Lazy, memoised Firebase app/auth singletons. + copyToClipboard.ts Async Clipboard API wrapper. + theme.ts EVERY brand/accent colour, per light/dark mode. + wcag.ts Contrast maths used to assert the palette is AA. + index.css Design tokens (spacing scale, header/logo sizes). + App.css App shell layout (flexbox). + config.json Non-secret Firebase project settings. + swagger_spec.json GENERATED — git-ignored. +scripts/ + downloadYML.js Fetch + validate the OpenAPI spec. + checkSpec.js Preflight guard run before dev/build. + checkColorTokens.js Fails the build on any colour literal outside theme.ts. + outputTag.js Print the release tag from releases.json. + releases.json GENERATED — git-ignored. Release metadata from the last spec run. +``` + +## Styling + +Layout is flexbox. The spacing scale and layout dimensions live as CSS custom +properties in `src/index.css` (`--space-xs` … `--space-4xl`, `--header-height`, +`--logo-size`, and the fluid `--gutter`), and that file is the only place those +numbers are written down. + +Reference the tokens instead of restating literals: + +```css +.app-content { padding-inline: var(--gutter); } /* good */ +.app-content { padding-inline: 50px; } /* bad */ +``` + +`--gutter` is a `clamp()`, so header, content and footer share one horizontal +rhythm that tightens on phones and widens on desktops without breakpoint +bookkeeping. + +### Colour + +**`src/theme.ts` is the only file in `src/` that contains a colour literal.** It +defines the brand palette per light/dark mode and feeds it to both consumers: + +- antd components, via `` in `src/index.tsx` +- our own stylesheet, via CSS custom properties applied to the document element + by `applyThemeCssVars(mode)` + +Re-skinning the app means editing `theme.ts` and nothing else. `npm run +lint:colors` (also run by `predev`/`prebuild` and CI) fails the build if a hex or +`rgb()` value reappears anywhere else in `src`, so the invariant cannot rot. + +```css +.logo-primary { fill: var(--brand-accent); } /* good */ +.logo-primary { fill: #eb2f96; } /* fails lint:colors */ +``` + +There is deliberately **no fallback value** in `var(...)`. A fallback would keep +the old colour alive when a token is missing, which is how a hardcoded value +smuggles itself back in. + +**The brand colour is not the button colour.** `BRAND.accent` (`#eb2f96`) is +3.90:1 on white: enough for the logo (WCAG asks 3:1 of non-text content), not +enough for text. `BRAND.action` (`#c41d7f`) is the same hue darkened until white +label text clears 4.5:1 — in **all three states** (rest 5.48, hover 4.97, +active 7.70), because WCAG applies to hover and active too, not just rest. +`src/theme.test.ts` asserts every pair in both modes, so a palette edit that +breaks contrast fails CI rather than shipping an unreadable button. `wcag.ts` is +the contrast maths behind that check; it is not used at runtime. + +Mode resolution lives in `readThemeMode()`, which is the **only** place in `src/` +permitted to touch `localStorage` or `matchMedia`. It is read once in +`src/index.tsx` and passed down as a value — components receive the resolved mode +instead of deriving it, because two components independently resolving it feed +different sinks (CSS custom properties vs antd tokens) and a half-updated theme +reads as a styling bug rather than the wiring bug it is. + +`npm run lint:theme` enforces that: any `localStorage`, `sessionStorage` or +`matchMedia` reference outside `src/theme.ts` fails the build. `readThemeMode` +takes its environment as an optional argument so tests can drive both branches +without stubbing globals, and its throw-handling sits at the call site — Safari in +private mode throws on storage *access* rather than returning null, and an +uncaught throw there would stop the app rendering at all. + +## Troubleshooting + +**`Could not resolve "./swagger_spec.json"`, or the prebuild check fails.** +The generated spec is missing or empty. Run `npm run spec`. + +**The page shows "Configuration error".** +`VITE_FirebaseAPIKey` is unset. `cp .env.example .env`, fill it in, restart. + +**Tests fail to launch a browser.** +Chromium isn't installed: `npx playwright install --with-deps chromium`. + +**"optimized dependencies changed. reloading" on a cold test/dev run.** +Vite's dependency optimizer re-bundling mid-session. The second run is clean; it +is a harness artefact, not an application fault. + +**Copy works in dev but not when opened over plain HTTP.** +Expected: the Clipboard API requires a secure context. Use HTTPS or `localhost`. diff --git a/package-lock.json b/package-lock.json index ee5c56f..459fc97 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,16 +8,21 @@ "name": "developer_site", "version": "0.1.0", "dependencies": { + "@ant-design/icons": "^6.1.0", "antd": "^6.3.1", "firebase": "^12.10.0", - "react-social-login-buttons": "^4.1.1", - "swagger-ui-react": "^5.32.11" + "react": "^19.2.4", + "react-dom": "^19.2.4", + "swagger-ui-react": "^5.32.15" }, "devDependencies": { + "@testing-library/jest-dom": "^7.0.1", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@types/swagger-ui-react": "^5.18.0", "@vitejs/plugin-react": "^5.2.0", + "@vitest/browser-playwright": "^4.1.8", + "@vitest/coverage-v8": "^4.1.11", "follow-redirects": "^1.16.0", "js-yaml": "^4.3.1", "playwright": "^1.58.2", @@ -25,8 +30,19 @@ "vite": "^8.0.16", "vitest": "^4.1.8", "vitest-browser-react": "^2.0.5" + }, + "engines": { + "node": "^22.12.0 || >=24.0.0", + "npm": ">=10.0.0" } }, + "node_modules/@adobe/css-tools": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz", + "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@ant-design/colors": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-8.0.1.tgz", @@ -80,14 +96,14 @@ } }, "node_modules/@ant-design/icons": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-6.1.0.tgz", - "integrity": "sha512-KrWMu1fIg3w/1F2zfn+JlfNDU8dDqILfA5Tg85iqs1lf8ooyGlbkA+TkwfOKKgqpUmAiRY1PTFpuOU2DAIgSUg==", + "version": "6.3.4", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-6.3.4.tgz", + "integrity": "sha512-kDoUlppczVyCUTFthF6cHmPzMBYqNZQhu9j6EyIX/YIdM9j9CZNZoJUjzVw7/1v1VO8WwVMmPp15r/uwIAS0AQ==", "license": "MIT", "dependencies": { - "@ant-design/colors": "^8.0.0", - "@ant-design/icons-svg": "^4.4.0", - "@rc-component/util": "^1.3.0", + "@ant-design/colors": "^8.0.1", + "@ant-design/icons-svg": "^4.6.0", + "@rc-component/util": "^1.11.0", "clsx": "^2.1.1" }, "engines": { @@ -99,9 +115,9 @@ } }, "node_modules/@ant-design/icons-svg": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", - "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.6.0.tgz", + "integrity": "sha512-PRomU725ABMf/lnQp5HiB7my1kjEbFY0D10N4lXYxK6TIB1gKjIVD5MRThpDaezLgw1D774J8eOeeDB0M6wHrQ==", "license": "MIT" }, "node_modules/@ant-design/react-slick": { @@ -177,14 +193,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", - "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -253,9 +269,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "dev": true, "license": "MIT", "engines": { @@ -307,13 +323,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", - "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.29.7" + "@babel/types": "^7.29.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -323,13 +339,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -339,13 +355,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -355,9 +371,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -391,18 +407,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", - "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.7", - "@babel/generator": "^7.29.7", + "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", - "@babel/parser": "^7.29.7", + "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", - "@babel/types": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -410,9 +426,9 @@ } }, "node_modules/@babel/types": { - "version": "7.29.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", - "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", "dev": true, "license": "MIT", "dependencies": { @@ -423,39 +439,22 @@ "node": ">=6.9.0" } }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" + "engines": { + "node": ">=18" } }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "node_modules/@blazediff/core": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@blazediff/core/-/core-1.9.1.tgz", + "integrity": "sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==", "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } + "license": "MIT" }, "node_modules/@emotion/hash": { "version": "0.8.0", @@ -470,15 +469,15 @@ "license": "MIT" }, "node_modules/@firebase/ai": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-2.9.0.tgz", - "integrity": "sha512-NPvBBuvdGo9x3esnABAucFYmqbBmXvyTMimBq2PCuLZbdANZoHzGlx7vfzbwNDaEtCBq4RGGNMliLIv6bZ+PtA==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-2.16.0.tgz", + "integrity": "sha512-WRVxl58B61Orwf7st7949ZIW2L4huV80Gpaum1z8v2eH+m2xaxWtC8mOjQyVAOirr6O/yf89cBjlPvoyBpBfTg==", "license": "Apache-2.0", "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", + "@firebase/app-check-interop-types": "0.3.5", + "@firebase/component": "0.7.5", + "@firebase/logger": "0.5.2", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "engines": { @@ -490,15 +489,15 @@ } }, "node_modules/@firebase/analytics": { - "version": "0.10.20", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.20.tgz", - "integrity": "sha512-adGTNVUWH5q66tI/OQuKLSN6mamPpfYhj0radlH2xt+3eL6NFPtXoOs+ulvs+UsmK27vNFx5FjRDfWk+TyduHg==", + "version": "0.10.25", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.25.tgz", + "integrity": "sha512-oDagV3PHeNXBdxemksZCdj+GmUT19eCnTOcLdQePIIovFXlm3zWy3Gjeaokt9Nqx24kc4ljK8lU0XGcGmmKZ1A==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/installations": "0.6.20", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/installations": "0.6.24", + "@firebase/logger": "0.5.2", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -506,36 +505,37 @@ } }, "node_modules/@firebase/analytics-compat": { - "version": "0.2.26", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.26.tgz", - "integrity": "sha512-0j2ruLOoVSwwcXAF53AMoniJKnkwiTjGVfic5LDzqiRkR13vb5j6TXMeix787zbLeQtN/m1883Yv1TxI0gItbA==", + "version": "0.2.31", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.31.tgz", + "integrity": "sha512-msTlG9REujk5rjtOHNLngiuPmvaWGQte8ugL4/F6ZCMb+92Ue7SgjSEpNxINkM8ZtTrbGS83j5SZkt0r+M1Tjw==", "license": "Apache-2.0", "dependencies": { - "@firebase/analytics": "0.10.20", - "@firebase/analytics-types": "0.8.3", - "@firebase/component": "0.7.1", - "@firebase/util": "1.14.0", + "@firebase/analytics": "0.10.25", + "@firebase/analytics-types": "0.8.5", + "@firebase/component": "0.7.5", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "peerDependencies": { + "@firebase/app": "0.x", "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/analytics-types": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.3.tgz", - "integrity": "sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.5.tgz", + "integrity": "sha512-kdnooE7Bis2jEnsqcerRwn/UQpH5D3uvHpku7OdUM9TJN3omlu6iYtbyAQ6XkAJRgJtO0aNf9OOkW8J6D59oCA==", "license": "Apache-2.0" }, "node_modules/@firebase/app": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.14.9.tgz", - "integrity": "sha512-3gtUX0e584MYkKBQMgSECMvE1Dwzg+eONefDQ0wxVSe5YMBsZwdN5pL7UapwWBlV8+i8QCztF9TP947tEjZAGA==", + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.16.2.tgz", + "integrity": "sha512-fyCLPahl3r0Zb7Wzm+JLWcOOH3SaDgAyJzJ8EWIDiv51aNiv+2Pjbpa6myEuP7iXxjmJqrcbVm0GUF7h229T1Q==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/logger": "0.5.2", + "@firebase/util": "1.15.3", "idb": "7.1.1", "tslib": "^2.1.0" }, @@ -544,14 +544,14 @@ } }, "node_modules/@firebase/app-check": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.11.1.tgz", - "integrity": "sha512-gmKfwQ2k8aUQlOyRshc+fOQLq0OwUmibIZvpuY1RDNu2ho0aTMlwxOuEiJeYOs7AxzhSx7gnXPFNsXCFbnvXUQ==", + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.13.1.tgz", + "integrity": "sha512-l8y3dmnhodXks/APAwx4tWqRl3tk8b9874KF1FJyKg1DIU+kMD0l52iz7S9/MW+eK8k6cjJg0G0iJ5KQAsQpow==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/logger": "0.5.2", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "engines": { @@ -562,47 +562,48 @@ } }, "node_modules/@firebase/app-check-compat": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.4.1.tgz", - "integrity": "sha512-yjSvSl5B1u4CirnxhzirN1uiTRCRfx+/qtfbyeyI+8Cx8Cw1RWAIO/OqytPSVwLYbJJ1vEC3EHfxazRaMoWKaA==", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.4.7.tgz", + "integrity": "sha512-fBb/xSMyIKv1nDmccfzz3IAGBzx/cQOxmZai66rJzifb1hMMkztf824Xx7LhpTUe7HNUbXwY90IvJ66fi8q6yg==", "license": "Apache-2.0", "dependencies": { - "@firebase/app-check": "0.11.1", - "@firebase/app-check-types": "0.5.3", - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", + "@firebase/app-check": "0.13.1", + "@firebase/app-check-types": "0.5.5", + "@firebase/component": "0.7.5", + "@firebase/logger": "0.5.2", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "engines": { "node": ">=20.0.0" }, "peerDependencies": { + "@firebase/app": "0.x", "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz", - "integrity": "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.5.tgz", + "integrity": "sha512-qId34pVZ2CXTmtu4ofW5leiI93DvnOvIcr/5GT7MZPw5WXAi6nZoU+g9cNRgl7K90UJSbK0cXxten4meYMPyZg==", "license": "Apache-2.0" }, "node_modules/@firebase/app-check-types": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.3.tgz", - "integrity": "sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.5.tgz", + "integrity": "sha512-+DF4gzFrlwGFyky38o4T/YN/r51l70yCtJ2HTkwmRj8FCMwPjm4hLH4fQbj6BUvzkiFqliBkitFsRpf1/YZkWA==", "license": "Apache-2.0" }, "node_modules/@firebase/app-compat": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.5.9.tgz", - "integrity": "sha512-e5LzqjO69/N2z7XcJeuMzIp4wWnW696dQeaHAUpQvGk89gIWHAIvG6W+mA3UotGW6jBoqdppEJ9DnuwbcBByug==", + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.5.18.tgz", + "integrity": "sha512-77H57WuGEsgrv59HdtuhHG+eQdP8di6myz7O93yW6yTZlR/tLSmsCxCq5vHp6AWWDwSV0EVtKUvizXQiQZVBWA==", "license": "Apache-2.0", "dependencies": { - "@firebase/app": "0.14.9", - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", + "@firebase/app": "0.16.2", + "@firebase/component": "0.7.5", + "@firebase/logger": "0.5.2", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "engines": { @@ -610,20 +611,23 @@ } }, "node_modules/@firebase/app-types": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", - "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", - "license": "Apache-2.0" + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.6.tgz", + "integrity": "sha512-yPLahy7Esfu2w/yme3msVK4xTkDXQqq6szfQn8yVOQpCKiT5GVFjqNpLbuz6NkX0WuTwUidkmPewW3r4xkvpeg==", + "license": "Apache-2.0", + "dependencies": { + "@firebase/logger": "0.5.2" + } }, "node_modules/@firebase/auth": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.12.1.tgz", - "integrity": "sha512-nXKj7d5bMBlnq6XpcQQpmnSVwEeHBkoVbY/+Wk0P1ebLSICoH4XPtvKOFlXKfIHmcS84mLQ99fk3njlDGKSDtw==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.13.6.tgz", + "integrity": "sha512-MKRLvF72HJ/irNn2fJR0Gv5FOZNtqv1IBeJHRwK8l8pZ/wi9vuUw8ecyCMvQDDNxfS6uW0MWACL5KC4Y8Pp+fA==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/logger": "0.5.2", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "engines": { @@ -631,7 +635,7 @@ }, "peerDependencies": { "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^2.2.0" + "@react-native-async-storage/async-storage": "^2.2.0 || ^3.0.0" }, "peerDependenciesMeta": { "@react-native-async-storage/async-storage": { @@ -640,34 +644,35 @@ } }, "node_modules/@firebase/auth-compat": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.6.3.tgz", - "integrity": "sha512-nHOkupcYuGVxI1AJJ/OBhLPaRokbP14Gq4nkkoVvf1yvuREEWqdnrYB/CdsSnPxHMAnn5wJIKngxBF9jNX7s/Q==", + "version": "0.6.11", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.6.11.tgz", + "integrity": "sha512-L+xp3DTJQrBV08Vt0UhcL/ofUOSjXom7JOJfbT6oas4o7gCrQnTYFKs8wfiuKLmHoo8BxMr5LdgjAs7o6aAsqQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/auth": "1.12.1", - "@firebase/auth-types": "0.13.0", - "@firebase/component": "0.7.1", - "@firebase/util": "1.14.0", + "@firebase/auth": "1.13.6", + "@firebase/auth-types": "0.13.2", + "@firebase/component": "0.7.5", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "engines": { "node": ">=20.0.0" }, "peerDependencies": { + "@firebase/app": "0.x", "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/auth-interop-types": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz", - "integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.6.tgz", + "integrity": "sha512-FgwZqDrBqgK0BHI70QTv1v/5wmuDF9f8fsJFvKSxoRlK2PPfSQtZAk2jhXu4pe9BZzFi/e4UYusU/bEQHdf6Qg==", "license": "Apache-2.0" }, "node_modules/@firebase/auth-types": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.13.0.tgz", - "integrity": "sha512-S/PuIjni0AQRLF+l9ck0YpsMOdE8GO2KU6ubmBB7P+7TJUCQDa3R1dlgYm9UzGbbePMZsp0xzB93f2b/CgxMOg==", + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.13.2.tgz", + "integrity": "sha512-OU+miuoSxIWYN7GT291d2ylVJBL3k/OePo7/JDSoQtkFQoEiGBc4AHuMjj/seqFIsHrqnjrAfRCk4pfufoJolQ==", "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", @@ -675,12 +680,12 @@ } }, "node_modules/@firebase/component": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.7.1.tgz", - "integrity": "sha512-mFzsm7CLHR60o08S23iLUY8m/i6kLpOK87wdEFPLhdlCahaxKmWOwSVGiWoENYSmFJJoDhrR3gKSCxz7ENdIww==", + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.7.5.tgz", + "integrity": "sha512-vuFDcL91Q+2ZuBJkyOh86T4q0B4ffNTDjc/A38tybO56odQABxRTFLTIowCWqAKeIcgo37GowWMVgFF73gD8Qw==", "license": "Apache-2.0", "dependencies": { - "@firebase/util": "1.14.0", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "engines": { @@ -688,15 +693,15 @@ } }, "node_modules/@firebase/data-connect": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.4.0.tgz", - "integrity": "sha512-vLXM6WHNIR3VtEeYNUb/5GTsUOyl3Of4iWNZHBe1i9f88sYFnxybJNWVBjvJ7flhCyF8UdxGpzWcUnv6F5vGfg==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.7.4.tgz", + "integrity": "sha512-su1aGWlzhxb+xtggCUSsufJn1FDa06SBDK71y+fpQ+g2zMhMExik6FUv/odkKzOF/xfWVjabCbWBcjJY3MceDA==", "license": "Apache-2.0", "dependencies": { - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", + "@firebase/auth-interop-types": "0.2.6", + "@firebase/component": "0.7.5", + "@firebase/logger": "0.5.2", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -704,16 +709,16 @@ } }, "node_modules/@firebase/database": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.1.1.tgz", - "integrity": "sha512-LwIXe8+mVHY5LBPulWECOOIEXDiatyECp/BOlu0gOhe+WOcKjWHROaCbLlkFTgHMY7RHr5MOxkLP/tltWAH3dA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.1.5.tgz", + "integrity": "sha512-/JGpvszLoNXNgzilRXocigGfFF4hbcPA9wN1i1kjJx6oKkXgkHteZYl3lQs1lJX3ETDf6bv7zI15lPMVUp4sAQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", + "@firebase/app-check-interop-types": "0.3.5", + "@firebase/auth-interop-types": "0.2.6", + "@firebase/component": "0.7.5", + "@firebase/logger": "0.5.2", + "@firebase/util": "1.15.3", "faye-websocket": "0.11.4", "tslib": "^2.1.0" }, @@ -722,44 +727,57 @@ } }, "node_modules/@firebase/database-compat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.1.1.tgz", - "integrity": "sha512-heAEVZ9Z8c8PnBUcmGh91JHX0cXcVa1yESW/xkLuwaX7idRFyLiN8sl73KXpR8ZArGoPXVQDanBnk6SQiekRCQ==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.1.7.tgz", + "integrity": "sha512-lBq9sJm8MnJINKJnkAKSOj2MbC66xGoSVCcGkPtstl+lkoKEBtD46qHLbuDgW/WbLPoKVm17RIN8BxHj+Z2F2w==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/database": "1.1.1", - "@firebase/database-types": "1.0.17", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/database": "1.1.5", + "@firebase/database-types": "1.0.22", + "@firebase/logger": "0.5.2", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "engines": { "node": ">=20.0.0" + }, + "peerDependencies": { + "@firebase/app": "0.x", + "@firebase/app-compat": "0.x" + }, + "peerDependenciesMeta": { + "@firebase/app": { + "optional": true + }, + "@firebase/app-compat": { + "optional": true + } } }, "node_modules/@firebase/database-types": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.17.tgz", - "integrity": "sha512-4eWaM5fW3qEIHjGzfi3cf0Jpqi1xQsAdT6rSDE1RZPrWu8oGjgrq6ybMjobtyHQFgwGCykBm4YM89qDzc+uG/w==", + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.22.tgz", + "integrity": "sha512-YAZNXsjY9EQQ+pKw/3ax8n5FgolHC7Qew7EY5RceYdl0R2ZP+kCv1O0DkKlcceue8uQCOreHCNN7PWVFpY1Nug==", "license": "Apache-2.0", "dependencies": { - "@firebase/app-types": "0.9.3", - "@firebase/util": "1.14.0" + "@firebase/app-types": "0.9.6", + "@firebase/util": "1.15.3" } }, "node_modules/@firebase/firestore": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.12.0.tgz", - "integrity": "sha512-PM47OyiiAAoAMB8kkq4Je14mTciaRoAPDd3ng3Ckqz9i2TX9D9LfxIRcNzP/OxzNV4uBKRq6lXoOggkJBQR3Gw==", + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.17.2.tgz", + "integrity": "sha512-SiyQEK1dYPOjItFVA+kZGdvOoRAtMebDBvUaSxJPNZMkKcRwYYK2kzWo5UXTZZj523uMxJnkr+KKVySEMme3kQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", - "@firebase/webchannel-wrapper": "1.0.5", + "@firebase/component": "0.7.5", + "@firebase/logger": "0.5.2", + "@firebase/util": "1.15.3", + "@firebase/webchannel-wrapper": "1.0.7", "@grpc/grpc-js": "~1.9.0", "@grpc/proto-loader": "^0.7.8", + "re2js": "^2.8.3", "tslib": "^2.1.0" }, "engines": { @@ -770,28 +788,29 @@ } }, "node_modules/@firebase/firestore-compat": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.4.6.tgz", - "integrity": "sha512-NgVyR4hHHN2FvSNQOtbgBOuVsEdD/in30d9FKbEvvITiAChrBN2nBstmhfjI4EOTnHaP8zigwvkNYFI9yKGAkQ==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.4.14.tgz", + "integrity": "sha512-HJ2HBNgNPrRsWIJ4E+Kc0u0h1U7HlF7If8AtYjie9HZXlMUmwYSJaXBj9VFm6gkSj5dlKZNcOQ0Ou25CVVG6rA==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/firestore": "4.12.0", - "@firebase/firestore-types": "3.0.3", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/firestore": "4.17.2", + "@firebase/firestore-types": "3.0.5", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "engines": { "node": ">=20.0.0" }, "peerDependencies": { + "@firebase/app": "0.x", "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/firestore-types": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.3.tgz", - "integrity": "sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.5.tgz", + "integrity": "sha512-dbdMAQkMd5dwWc48eupz/Y6/E9ruat3+gY5lhVKscvvT/HnDBEEMzJW38zdKhgdnglZHGk2vUsJMOHAphMHGMA==", "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", @@ -799,16 +818,16 @@ } }, "node_modules/@firebase/functions": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.13.2.tgz", - "integrity": "sha512-tHduUD+DeokM3NB1QbHCvEMoL16e8Z8JSkmuVA4ROoJKPxHn8ibnecHPO2e3nVCJR1D9OjuKvxz4gksfq92/ZQ==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.14.0.tgz", + "integrity": "sha512-DhuYFr0eMhp+s/PNEk6SiMsYkc00+XVOUeKbrl8MOzQNZI3SKQpqoDR1d+keNDAutwmHRWTUAdXBoVPD+xxVUw==", "license": "Apache-2.0", "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.7.1", - "@firebase/messaging-interop-types": "0.2.3", - "@firebase/util": "1.14.0", + "@firebase/app-check-interop-types": "0.3.5", + "@firebase/auth-interop-types": "0.2.6", + "@firebase/component": "0.7.5", + "@firebase/messaging-interop-types": "0.2.6", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "engines": { @@ -819,38 +838,39 @@ } }, "node_modules/@firebase/functions-compat": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.4.2.tgz", - "integrity": "sha512-YNxgnezvZDkqxqXa6cT7/oTeD4WXbxgIP7qZp4LFnathQv5o2omM6EoIhXiT9Ie5AoQDcIhG9Y3/dj+DFJGaGQ==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.5.0.tgz", + "integrity": "sha512-T3BDIToESZUHt7438wyKYMkRjKg3m1xAIux5fVpNvTRQlDOFLukWniQWBDhJ2znpU9kxMTR6+e31TVo8P15PZw==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/functions": "0.13.2", - "@firebase/functions-types": "0.6.3", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/functions": "0.14.0", + "@firebase/functions-types": "0.6.5", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "engines": { "node": ">=20.0.0" }, "peerDependencies": { + "@firebase/app": "0.x", "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/functions-types": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.3.tgz", - "integrity": "sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.5.tgz", + "integrity": "sha512-Zc0pURjthHXzSj54ZivCkzKDSV1r/wIpnmHdhq82q2yFFPVoncG/ZJjnVMiANvQfeww/QnElhzODpfwUucVwdA==", "license": "Apache-2.0" }, "node_modules/@firebase/installations": { - "version": "0.6.20", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.20.tgz", - "integrity": "sha512-LOzvR7XHPbhS0YB5ANXhqXB5qZlntPpwU/4KFwhSNpXNsGk/sBQ9g5hepi0y0/MfenJLe2v7t644iGOOElQaHQ==", + "version": "0.6.24", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.24.tgz", + "integrity": "sha512-Ui52ey8wHoWqkBbXRKJEKYWylI0JZogZmoLS+o8Anh1bxWtK27ZYjLla1UJAAdC5DCKLJ2qAp0VpJOjg8VOX1g==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/util": "1.15.3", "idb": "7.1.1", "tslib": "^2.1.0" }, @@ -859,34 +879,35 @@ } }, "node_modules/@firebase/installations-compat": { - "version": "0.2.20", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.20.tgz", - "integrity": "sha512-9C9pL/DIEGucmoPj8PlZTnztbX3nhNj5RTYVpUM7wQq/UlHywaYv99969JU/WHLvi9ptzIogXYS9d1eZ6XFe9g==", + "version": "0.2.24", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.24.tgz", + "integrity": "sha512-8M5nlcWwYt881x83COP2odq5vgf+NgwJh+RMd4LRSv8JI1pxwDfgrDJOERrjTgfC9J5Z0vnQX4b1pdN914e0Zw==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/installations": "0.6.20", - "@firebase/installations-types": "0.5.3", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/installations": "0.6.24", + "@firebase/installations-types": "0.5.5", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "peerDependencies": { + "@firebase/app": "0.x", "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/installations-types": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.3.tgz", - "integrity": "sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.5.tgz", + "integrity": "sha512-e9UYcju3puDl1vdrcKIi5dExzHLameOT/Tc61Q48PYwxtsM1NzZh/ikGbdBQTsbRgg0EMZqdPr0/m5ODUBobrg==", "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x" } }, "node_modules/@firebase/logger": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.5.0.tgz", - "integrity": "sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.5.2.tgz", + "integrity": "sha512-J2VO4NFTc0xQFrxV1B/lm5balicm9cwuX2acR9Yn41fN8KgUeQFo+VJV222IqW2FPSXKDu9uo5WdQFWf9TPbYg==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" @@ -896,15 +917,15 @@ } }, "node_modules/@firebase/messaging": { - "version": "0.12.24", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.24.tgz", - "integrity": "sha512-UtKoubegAhHyehcB7iQjvQ8OVITThPbbWk3g2/2ze42PrQr6oe6OmCElYQkBrE5RDCeMTNucXejbdulrQ2XwVg==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.13.3.tgz", + "integrity": "sha512-nRXPAp+z0kA3KziJtRY9kktHECvRwaaONzHvislFgllhCwJMscW7icWNQA5IjyP8Uc2+GS/4px8Uz6rx6ftTag==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/installations": "0.6.20", - "@firebase/messaging-interop-types": "0.2.3", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/installations": "0.6.24", + "@firebase/messaging-interop-types": "0.2.6", + "@firebase/util": "1.15.3", "idb": "7.1.1", "tslib": "^2.1.0" }, @@ -913,36 +934,37 @@ } }, "node_modules/@firebase/messaging-compat": { - "version": "0.2.24", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.24.tgz", - "integrity": "sha512-wXH8FrKbJvFuFe6v98TBhAtvgknxKIZtGM/wCVsfpOGmaAE80bD8tBxztl+uochjnFb9plihkd6mC4y7sZXSpA==", + "version": "0.2.30", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.30.tgz", + "integrity": "sha512-m1DPT2ET5x0qYqXLoHwKMAyf1mgZZOhuoE6H6/H4OPsp8zSxMIDEFPaW7MaffPJsCA5J7kHzo+BHVNXK4ZoV+w==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/messaging": "0.12.24", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/messaging": "0.13.3", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "peerDependencies": { + "@firebase/app": "0.x", "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/messaging-interop-types": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.3.tgz", - "integrity": "sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==", + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.6.tgz", + "integrity": "sha512-MVzvkKe2V4H2dHu5oOxRfeKQcfTwWmCgnzsC4V1q3ixun5iiL8riCZ2qI35rDhCL4glPGiu0jHxDbpVNuTKfow==", "license": "Apache-2.0" }, "node_modules/@firebase/performance": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.10.tgz", - "integrity": "sha512-8nRFld+Ntzp5cLKzZuG9g+kBaSn8Ks9dmn87UQGNFDygbmR6ebd8WawauEXiJjMj1n70ypkvAOdE+lzeyfXtGA==", + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.14.tgz", + "integrity": "sha512-9PH1XEZVHErxGdbXluvGz4Uyjw4W955H8v7Mv9rHIybRrg5F2Ac2tvf5+mSf5EtnxWNmxrD2WLnvMFaZP4sMrQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/installations": "0.6.20", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/installations": "0.6.24", + "@firebase/logger": "0.5.2", + "@firebase/util": "1.15.3", "tslib": "^2.1.0", "web-vitals": "^4.2.4" }, @@ -951,38 +973,39 @@ } }, "node_modules/@firebase/performance-compat": { - "version": "0.2.23", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.23.tgz", - "integrity": "sha512-c7qOAGBUAOpIuUlHu1axWcrCVtIYKPMhH0lMnoCDWnPwn1HcPuPUBVTWETbC7UWw71RMJF8DpirfWXzMWJQfgA==", + "version": "0.2.27", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.27.tgz", + "integrity": "sha512-O/ozTf/EbChN94Pk7bd1eUC0PAC36726AwsaiJyC0bZzSBWfLGSWASGPH5pebUWXQPJtGxIJYRkkbX5l0Qa+Hw==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/performance": "0.7.10", - "@firebase/performance-types": "0.2.3", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/logger": "0.5.2", + "@firebase/performance": "0.7.14", + "@firebase/performance-types": "0.2.5", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "peerDependencies": { + "@firebase/app": "0.x", "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/performance-types": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.3.tgz", - "integrity": "sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==", + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.5.tgz", + "integrity": "sha512-PRzOgB+/M+6AKlEkY8a9xy5Ff5SfZPIh4iShXhn2WAcL/euSbK7bdLqWysHduunNJhGFsXa22Ag3ixqL6rQtYg==", "license": "Apache-2.0" }, "node_modules/@firebase/remote-config": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.8.1.tgz", - "integrity": "sha512-L86TReBnPiiJOWd7k9iaiE9f7rHtMpjAoYN0fH2ey2ZRzsOChHV0s5sYf1+IIUYzplzsE46pjlmAUNkRRKwHSQ==", + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.9.2.tgz", + "integrity": "sha512-Rii93DkXjM+RE/ytHdYa7EIiQLJbdBr+W8EEiqd/vbLCOC+1FdkDuRiumJBp6t3yewHGbdqbpjB3fk3z0cZ+8g==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/installations": "0.6.20", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/installations": "0.6.24", + "@firebase/logger": "0.5.2", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "peerDependencies": { @@ -990,36 +1013,37 @@ } }, "node_modules/@firebase/remote-config-compat": { - "version": "0.2.22", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.22.tgz", - "integrity": "sha512-uW/eNKKtRBot2gnCC5mnoy5Voo2wMzZuQ7dwqqGHU176fO9zFgMwKiRzk+aaC99NLrFk1KOmr0ZVheD+zdJmjQ==", + "version": "0.2.29", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.29.tgz", + "integrity": "sha512-mY7JtTISK6F4g4T0x3kVepr5cp0NXL7f5yjIUXXGaTrg4qUlFBWRbENaHaqZ78dwmNcLm24h/yPsOVRlDXEXhA==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/remote-config": "0.8.1", - "@firebase/remote-config-types": "0.5.0", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/logger": "0.5.2", + "@firebase/remote-config": "0.9.2", + "@firebase/remote-config-types": "0.5.2", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "peerDependencies": { + "@firebase/app": "0.x", "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/remote-config-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.5.0.tgz", - "integrity": "sha512-vI3bqLoF14L/GchtgayMiFpZJF+Ao3uR8WCde0XpYNkSokDpAKca2DxvcfeZv7lZUqkUwQPL2wD83d3vQ4vvrg==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.5.2.tgz", + "integrity": "sha512-i8k1omVfoAnaT1ZPv2FFjxMZrATYsO/GnFgHEj5+7fAJLzi8wLnGGv1WK06oEAD6ltrWXSO1HzeNyajn/NjMWw==", "license": "Apache-2.0" }, "node_modules/@firebase/storage": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.14.1.tgz", - "integrity": "sha512-uIpYgBBsv1vIET+5xV20XT7wwqV+H4GFp6PBzfmLUcEgguS4SWNFof56Z3uOC2lNDh0KDda1UflYq2VwD9Nefw==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.14.5.tgz", + "integrity": "sha512-r2tozN/BlEewLi70tJNUQPzWwbex9GM7NgXZsamHKQrjKEfcR0i4jGgHBKAKA4hbwiPE9eNMb3hcxWnDpeJZwg==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "engines": { @@ -1030,28 +1054,29 @@ } }, "node_modules/@firebase/storage-compat": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.4.1.tgz", - "integrity": "sha512-bgl3FHHfXAmBgzIK/Fps6Xyv2HiAQlSTov07CBL+RGGhrC5YIk4lruS8JVIC+UkujRdYvnf8cpQFGn2RCilJ/A==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.4.5.tgz", + "integrity": "sha512-vO0tFPxXbKDKdlTu8tYT08S9t9ezUTJYEdLCULpWxWq2aq6zojwN1QmAB+1a50AI/g47GlWUJn1XPncm/PDZsw==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/storage": "0.14.1", - "@firebase/storage-types": "0.8.3", - "@firebase/util": "1.14.0", + "@firebase/component": "0.7.5", + "@firebase/storage": "0.14.5", + "@firebase/storage-types": "0.8.5", + "@firebase/util": "1.15.3", "tslib": "^2.1.0" }, "engines": { "node": ">=20.0.0" }, "peerDependencies": { + "@firebase/app": "0.x", "@firebase/app-compat": "0.x" } }, "node_modules/@firebase/storage-types": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.3.tgz", - "integrity": "sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg==", + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.5.tgz", + "integrity": "sha512-GEDs5P+rNUfNcS+wxIdOLAHficife2YXtvTJnyi3ssrX11AAtBg+nDUdbYh8vuBzWehVQZPmztGUUnud4L+4yg==", "license": "Apache-2.0", "peerDependencies": { "@firebase/app-types": "0.x", @@ -1059,9 +1084,9 @@ } }, "node_modules/@firebase/util": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.14.0.tgz", - "integrity": "sha512-/gnejm7MKkVIXnSJGpc9L2CvvvzJvtDPeAEq5jAwgVlf/PeNxot+THx/bpD20wQ8uL5sz0xqgXy1nisOYMU+mw==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.15.3.tgz", + "integrity": "sha512-c/z/gaIlaaLZEuGbE6sLUuJ61tskg1JghvhcNQzW948ASBinbVBBRnZTC4b4yt4LaEtJQkYlyzqLHcutFwEIvA==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -1072,9 +1097,9 @@ } }, "node_modules/@firebase/webchannel-wrapper": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.5.tgz", - "integrity": "sha512-+uGNN7rkfn41HLO0vekTFhTxk61eKa8mTpRGLO0QSqlQdKvIoGAvLp3ppdVIWbTGYJWM6Kp0iN+PjMIOcnVqTw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.7.tgz", + "integrity": "sha512-phBFwieDLvkZGYN9CE9ZFNEIoBVksprzsnCzQejCmCHtgwCXReeuRpoEGN9C4EbhONztv8NRV1tau6Rb9pONwQ==", "license": "Apache-2.0" }, "node_modules/@grpc/grpc-js": { @@ -1141,9 +1166,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", "dev": true, "license": "MIT" }, @@ -1158,34 +1183,22 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", - "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", + "node_modules/@oxc-project/types": { + "version": "0.149.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.149.0.tgz", + "integrity": "sha512-Efcc+iF0j3Bf67YjEqIqWXbX5XddXoK/Mw4K1/JuXwRCZ8N16VR7iT23nlCc9XrveFVh/E5Rqs2StT0V8v9LdA==", "dev": true, "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.2" - }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" + "url": "https://github.com/sponsors/oxc-project" } }, - "node_modules/@oxc-project/types": { - "version": "0.133.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.133.0.tgz", - "integrity": "sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==", + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } + "license": "MIT" }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", @@ -1239,15 +1252,15 @@ "license": "BSD-3-Clause" }, "node_modules/@protobufjs/utf8": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", - "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz", + "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", "license": "BSD-3-Clause" }, "node_modules/@rc-component/async-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-5.1.0.tgz", - "integrity": "sha512-n4HcR5siNUXRX23nDizbZBQPO0ZM/5oTtmKZ6/eqL0L2bo747cklFdZGRN2f+c9qWGICwDzrhW0H7tE9PptdcA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-6.0.0.tgz", + "integrity": "sha512-D3AGQwdyE58gmvx6waVSXJ80JGO+IY5L2O8HDnSOex7JNlzB3GuN/4hyHNTdhy2qtOhkpbIjmeAN3tL993wKbA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.4" @@ -1257,14 +1270,14 @@ } }, "node_modules/@rc-component/cascader": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@rc-component/cascader/-/cascader-1.14.0.tgz", - "integrity": "sha512-Ip9356xwZUR2nbW5PRVGif4B/bDve4pLa/N+PGbvBaTnjbvmN4PFMBGQSmlDlzKP1ovxaYMvwF/dI9lXNLT4iQ==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/@rc-component/cascader/-/cascader-1.22.0.tgz", + "integrity": "sha512-SffrA57aS9oub3VuI7ajPhJTPtaNxngSvtRhD40Rd8dwJ5vfWPSrVanWgeepdWFGBt7EHftIK5RUU0u3rCTwWw==", "license": "MIT", "dependencies": { - "@rc-component/select": "~1.6.0", - "@rc-component/tree": "~1.2.0", - "@rc-component/util": "^1.4.0", + "@rc-component/select": "~1.10.0", + "@rc-component/tree": "~1.4.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1318,25 +1331,25 @@ } }, "node_modules/@rc-component/context": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-2.0.1.tgz", - "integrity": "sha512-HyZbYm47s/YqtP6pKXNMjPEMaukyg7P0qVfgMLzr7YiFNMHbK2fKTAGzms9ykfGHSfyf75nBbgWw+hHkp+VImw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-2.0.2.tgz", + "integrity": "sha512-uiGpAlblCNlziHPwj4S4Iy/oemeuz/hR03mbiEjTCXwsqOIN3BOzsRMyDwpyO5Fm0vIEEJRUf9ZtbRLbhksuTA==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.3.0" + "@rc-component/util": "^1.11.0" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, "node_modules/@rc-component/dialog": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/@rc-component/dialog/-/dialog-1.8.4.tgz", - "integrity": "sha512-Ay6PM7phkTkquplG8fWfUGFZ2GTLx9diTl4f0d8Eqxd7W1u1KjE9AQooFQHOHnhZf0Ya3z51+5EKCWHmt/dNEw==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@rc-component/dialog/-/dialog-1.10.0.tgz", + "integrity": "sha512-eDukNlz9vNszAGv7i3zKXdxEd3wgVmNxuJijYt8zvTh17QwTu8KK/bdURRd/lU4qaMzhO1HKKmMrwOnkaw0BvQ==", "license": "MIT", "dependencies": { - "@rc-component/motion": "^1.1.3", + "@rc-component/motion": "^1.3.3", "@rc-component/portal": "^2.1.0", "@rc-component/util": "^1.9.0", "clsx": "^2.1.1" @@ -1363,13 +1376,13 @@ } }, "node_modules/@rc-component/dropdown": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rc-component/dropdown/-/dropdown-1.0.2.tgz", - "integrity": "sha512-6PY2ecUSYhDPhkNHHb4wfeAya04WhpmUSKzdR60G+kMNVUCX2vjT/AgTS0Lz0I/K6xrPMJ3enQbwVpeN3sHCgg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rc-component/dropdown/-/dropdown-1.0.3.tgz", + "integrity": "sha512-YTST/N6kpqpDz3IMuM/PSSZnrDpSOA6dgHv12gPA90ZTSLv2CoqkZ0+9NtwTY6BeO7dstPblSic2QJg7dSFy/g==", "license": "MIT", "dependencies": { "@rc-component/trigger": "^3.0.0", - "@rc-component/util": "^1.2.1", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1378,13 +1391,13 @@ } }, "node_modules/@rc-component/form": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@rc-component/form/-/form-1.6.2.tgz", - "integrity": "sha512-OgIn2RAoaSBqaIgzJf/X6iflIa9LpTozci1lagLBdURDFhGA370v0+T0tXxOi8YShMjTha531sFhwtnrv+EJaQ==", + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@rc-component/form/-/form-1.8.6.tgz", + "integrity": "sha512-1EXVsSKPZC6kGrIqxVck7kAWM6T65b6et/n5wIcyiaIa41VrDshD0nVLHoBDEIZr2ATQsOP6icb4XQkNFMLBAw==", "license": "MIT", "dependencies": { - "@rc-component/async-validator": "^5.1.0", - "@rc-component/util": "^1.6.2", + "@rc-component/async-validator": "^6.0.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "engines": { @@ -1396,14 +1409,14 @@ } }, "node_modules/@rc-component/image": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@rc-component/image/-/image-1.6.0.tgz", - "integrity": "sha512-tSfn2ZE/oP082g4QIOxeehkmgnXB7R+5AFj/lIFr4k7pEuxHBdyGIq9axoCY9qea8NN0DY6p4IB/F07tLqaT5A==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@rc-component/image/-/image-1.10.0.tgz", + "integrity": "sha512-BjeZCRQ+hw+4WAhvrw8rJvy5fckA2xpf/X2XQEOABUHvLTNB9inB98X3Mp54jYQ7g10DfWERQWHXeC4ylxp1Uw==", "license": "MIT", "dependencies": { "@rc-component/motion": "^1.0.0", "@rc-component/portal": "^2.1.2", - "@rc-component/util": "^1.3.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1412,12 +1425,13 @@ } }, "node_modules/@rc-component/input": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rc-component/input/-/input-1.1.2.tgz", - "integrity": "sha512-Q61IMR47piUBudgixJ30CciKIy9b1H95qe7GgEKOmSJVJXvFRWJllJfQry9tif+MX2cWFXWJf/RXz4kaCeq/Fg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@rc-component/input/-/input-1.3.1.tgz", + "integrity": "sha512-iFvTUT9W+JC/MSin2aGAk8NqsVlTzcExNC9DZariON1IWirju9NoNeEk47an4Q8iHazkoVI/y1LnDi88+CPcig==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.4.0", + "@rc-component/resize-observer": "^1.1.1", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1440,17 +1454,34 @@ "react-dom": ">=16.9.0" } }, + "node_modules/@rc-component/listy": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rc-component/listy/-/listy-1.2.3.tgz", + "integrity": "sha512-IXiMjV5s0rczLBlfh7G5nB4M3365mrEeedjwKtf5I+Ns3PqRUsebR2h5u8CeFarsVfLUPC2I5p0h09TNoOWyvQ==", + "license": "MIT", + "dependencies": { + "@rc-component/motion": "^1.1.4", + "@rc-component/portal": "^2.0.0", + "@rc-component/resize-observer": "^1.0.0", + "@rc-component/util": "^1.3.1", + "@rc-component/virtual-list": "^1.4.0", + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, "node_modules/@rc-component/mentions": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@rc-component/mentions/-/mentions-1.6.0.tgz", - "integrity": "sha512-KIkQNP6habNuTsLhUv0UGEOwG67tlmE7KNIJoQZZNggEZl5lQJTytFDb69sl5CK3TDdISCTjKP3nGEBKgT61CQ==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/@rc-component/mentions/-/mentions-1.12.0.tgz", + "integrity": "sha512-v5MBx8zDcqCT+uybJgKpcx3Fgrvj0m3u+A/15RlSBaMx12lLoJZTTYggC3pbYYfohcKujWWUyBz6O6Gp2vGiNA==", "license": "MIT", "dependencies": { - "@rc-component/input": "~1.1.0", - "@rc-component/menu": "~1.2.0", - "@rc-component/textarea": "~1.1.0", + "@rc-component/input": "~1.3.1", + "@rc-component/menu": "~1.5.0", "@rc-component/trigger": "^3.0.0", - "@rc-component/util": "^1.3.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1459,26 +1490,26 @@ } }, "node_modules/@rc-component/menu": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rc-component/menu/-/menu-1.2.0.tgz", - "integrity": "sha512-VWwDuhvYHSnTGj4n6bV3ISrLACcPAzdPOq3d0BzkeiM5cve8BEYfvkEhNoM0PLzv51jpcejeyrLXeMVIJ+QJlg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@rc-component/menu/-/menu-1.5.0.tgz", + "integrity": "sha512-RjvzPsZkwVEg3xu+/jDDqDeUCBJAnWylONFlGeQgg5enlNAnlpybqhaMGE/UPEIvr6hL90PGhjFBguJqj0Qb2Q==", "license": "MIT", "dependencies": { "@rc-component/motion": "^1.1.4", "@rc-component/overflow": "^1.0.0", "@rc-component/trigger": "^3.0.0", - "@rc-component/util": "^1.3.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, "node_modules/@rc-component/mini-decimal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz", - "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.4.tgz", + "integrity": "sha512-xiuXcaCwyOWpD8a8scdExFl+bntNphAW8XeenL1ig2en0AAZY0Pcp4pC0dI22qJ+NvxKn9RoNIoRdqYU3BLH4w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0" @@ -1488,12 +1519,12 @@ } }, "node_modules/@rc-component/motion": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@rc-component/motion/-/motion-1.3.1.tgz", - "integrity": "sha512-Wo1mkd0tCcHtvYvpPOmlYJz546z16qlsiwaygmW7NPJpOZOF9GBjhGzdzZSsC2lEJ1IUkWLF4gMHlRA1aSA+Yw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@rc-component/motion/-/motion-1.3.3.tgz", + "integrity": "sha512-Xh3IszxvlSv3/PLYFyC2UZi9LNB83yOnkB/LNmRzaypZLvkhqUIPS7MQpGZcCMWrNsXV2p6YTSWbSGvFpEle9A==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.2.0", + "@rc-component/util": "^1.11.0", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1518,27 +1549,27 @@ } }, "node_modules/@rc-component/notification": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rc-component/notification/-/notification-1.2.0.tgz", - "integrity": "sha512-OX3J+zVU7rvoJCikjrfW7qOUp7zlDeFBK2eA3SFbGSkDqo63Sl4Ss8A04kFP+fxHSxMDIS9jYVEZtU1FNCFuBA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@rc-component/notification/-/notification-2.0.8.tgz", + "integrity": "sha512-MTRA3b8eHE14gh5R9nlXzbWZEDEBFVkEHj/FI1VOXw2zrSnSxqbuuU3drsq+k53e6MHwtegoFay1tnNYhtl61Q==", "license": "MIT", "dependencies": { "@rc-component/motion": "^1.1.4", - "@rc-component/util": "^1.2.1", + "@rc-component/util": "^1.11.0", "clsx": "^2.1.1" }, "engines": { "node": ">=8.x" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": ">=18.0.0", + "react-dom": ">=18.0.0" } }, "node_modules/@rc-component/overflow": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@rc-component/overflow/-/overflow-1.0.0.tgz", - "integrity": "sha512-GSlBeoE0XTBi5cf3zl8Qh7Uqhn7v8RrlJ8ajeVpEkNe94HWy5l5BQ0Mwn2TVUq9gdgbfEMUmTX7tJFAg7mz0Rw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rc-component/overflow/-/overflow-1.0.1.tgz", + "integrity": "sha512-syfmgAABaHCnCDzPwHZ/2tuvIcpOO3jefYZMmfkN+pmo8HKTzsfhS57vxo4ksPdN0By+uWVJhJWNFozNBxi2eA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.11.1", @@ -1552,12 +1583,12 @@ } }, "node_modules/@rc-component/pagination": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@rc-component/pagination/-/pagination-1.2.0.tgz", - "integrity": "sha512-YcpUFE8dMLfSo6OARJlK6DbHHvrxz7pMGPGmC/caZSJJz6HRKHC1RPP001PRHCvG9Z/veD039uOQmazVuLJzlw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/pagination/-/pagination-1.4.0.tgz", + "integrity": "sha512-CW1g7P9V8u+e8JQdUsl2RWg+GCsoee0mtJjZUCCxn/vb3jzOwDKm6hAdwddHCVBfWJ58eGUBZz3IvnU8rRktjw==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.3.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1566,15 +1597,15 @@ } }, "node_modules/@rc-component/picker": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@rc-component/picker/-/picker-1.9.0.tgz", - "integrity": "sha512-OLisdk8AWVCG9goBU1dWzuH5QlBQk8jktmQ6p0/IyBFwdKGwyIZOSjnBYo8hooHiTdl0lU+wGf/OfMtVBw02KQ==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@rc-component/picker/-/picker-1.12.2.tgz", + "integrity": "sha512-ZB1A+tzTQkgtR4flPrAMvxIAOelIIOOOsp22fU2Nad6PbZcJacnyGJUJqUH7ZS9mwxeUwurf1pLMKXrVsK1tlA==", "license": "MIT", "dependencies": { "@rc-component/overflow": "^1.0.0", "@rc-component/resize-observer": "^1.0.0", "@rc-component/trigger": "^3.6.15", - "@rc-component/util": "^1.3.0", + "@rc-component/util": "^1.13.0", "clsx": "^2.1.1" }, "engines": { @@ -1604,12 +1635,12 @@ } }, "node_modules/@rc-component/portal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-2.2.0.tgz", - "integrity": "sha512-oc6FlA+uXCMiwArHsJyHcIkX4q6uKyndrPol2eWX8YPkAnztHOPsFIRtmWG4BMlGE5h7YIRE3NiaJ5VS8Lb1QQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-2.2.1.tgz", + "integrity": "sha512-ck+r1kW/JSv0wxPji3KN2ss9K6Z0qqwusw/mf/0JobXhZ8hC2ejZwCJObW/SvDi0uhA0VzmCnx0CaCci95tcmA==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.2.1", + "@rc-component/util": "^1.11.0", "clsx": "^2.1.1" }, "engines": { @@ -1621,12 +1652,12 @@ } }, "node_modules/@rc-component/progress": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rc-component/progress/-/progress-1.0.2.tgz", - "integrity": "sha512-WZUnH9eGxH1+xodZKqdrHke59uyGZSWgj5HBM5Kwk5BrTMuAORO7VJ2IP5Qbm9aH3n9x3IcesqHHR0NWPBC7fQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@rc-component/progress/-/progress-1.0.3.tgz", + "integrity": "sha512-Q1nPLIvKr95el/q76yaBh5nv1hqCsWaHQb8U7vXEDMefEhHgM7n3CPoN+o4LHnTyANQHmMFgoS/naAT4Bhxuaw==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.2.1", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1635,9 +1666,9 @@ } }, "node_modules/@rc-component/qrcode": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-1.1.1.tgz", - "integrity": "sha512-LfLGNymzKdUPjXUbRP+xOhIWY4jQ+YMj5MmWAcgcAq1Ij8XP7tRmAXqyuv96XvLUBE/5cA8hLFl9eO1JQMujrA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-2.0.0.tgz", + "integrity": "sha512-aAv3QhPP1xyafuTZOxub6a54pCeBnN3IwQkpETrBtthq4BL5IgxnCbuoBWPDpdLw1y1j6BgBUCAKV92+yX06Dw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7" @@ -1668,9 +1699,9 @@ } }, "node_modules/@rc-component/resize-observer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@rc-component/resize-observer/-/resize-observer-1.1.1.tgz", - "integrity": "sha512-NfXXMmiR+SmUuKE1NwJESzEUYUFWIDUn2uXpxCTOLwiRUUakd62DRNFjRJArgzyFW8S5rsL4aX5XlyIXyC/vRA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@rc-component/resize-observer/-/resize-observer-1.1.2.tgz", + "integrity": "sha512-t/Bb0W8uvL4PYKAB3YcChC+DlHh0Wt5kM7q/J+0qpVEUMLe7Hk5zuvc9km0hMnTFPSx5Z7Wu/fzCLN6erVLE8Q==", "license": "MIT", "dependencies": { "@rc-component/util": "^1.2.0" @@ -1697,15 +1728,15 @@ } }, "node_modules/@rc-component/select": { - "version": "1.6.14", - "resolved": "https://registry.npmjs.org/@rc-component/select/-/select-1.6.14.tgz", - "integrity": "sha512-T1IWeLlSas7Z/igZtPtJ/bweCxMMkXIGKQBtnigK+I/n1AVNjCs+ZdL3Fj42mq3uqm4sd1uzeQLZkdCqR26ADw==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@rc-component/select/-/select-1.10.1.tgz", + "integrity": "sha512-H+yQsl+qED9NilQ3g6zdpsMwUgwVjrcMTkNHAWRVU/MoNCYgTbDgU+MIMgZDK+rVdd2JUfI/MkysMcZZ0cyQKw==", "license": "MIT", "dependencies": { "@rc-component/overflow": "^1.0.0", "@rc-component/trigger": "^3.0.0", - "@rc-component/util": "^1.3.0", - "@rc-component/virtual-list": "^1.0.1", + "@rc-component/util": "^1.11.1", + "@rc-component/virtual-list": "^1.2.0", "clsx": "^2.1.1" }, "engines": { @@ -1717,9 +1748,9 @@ } }, "node_modules/@rc-component/slider": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rc-component/slider/-/slider-1.0.1.tgz", - "integrity": "sha512-uDhEPU1z3WDfCJhaL9jfd2ha/Eqpdfxsn0Zb0Xcq1NGQAman0TWaR37OWp2vVXEOdV2y0njSILTMpTfPV1454g==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@rc-component/slider/-/slider-1.1.1.tgz", + "integrity": "sha512-LSzgWGYDgeCDgR4r1XlU29gbYws6HpLnvJd/uMhLeW/vQgxldeR+Wb4uzHDCHiYEbr1bnEHWdjkPxjJRHxuiig==", "license": "MIT", "dependencies": { "@rc-component/util": "^1.3.0", @@ -1734,12 +1765,12 @@ } }, "node_modules/@rc-component/steps": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@rc-component/steps/-/steps-1.2.2.tgz", - "integrity": "sha512-/yVIZ00gDYYPHSY0JP+M+s3ZvuXLu2f9rEjQqiUDs7EcYsUYrpJ/1bLj9aI9R7MBR3fu/NGh6RM9u2qGfqp+Nw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@rc-component/steps/-/steps-1.2.3.tgz", + "integrity": "sha512-/b9gHcvDGjTDWJZW7+1kKFvzs0jrEeQ8mFvvIgX+h7xNT0FsOYODJYKjyJR4fPbvMBCfCOEqaBK66HBxov5BQA==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.2.1", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "engines": { @@ -1765,14 +1796,14 @@ } }, "node_modules/@rc-component/table": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@rc-component/table/-/table-1.9.1.tgz", - "integrity": "sha512-FVI5ZS/GdB3BcgexfCYKi3iHhZS3Fr59EtsxORszYGrfpH1eWr33eDNSYkVfLI6tfJ7vftJDd9D5apfFWqkdJg==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@rc-component/table/-/table-1.11.1.tgz", + "integrity": "sha512-OWdS6DMmeWb7bJBGqPxYZpQbzBlBiXZUu2sqo6Ii7Sjs9GeK1IsrXrWk26SL2c6KEseabswdxrRj7WUm9LdECw==", "license": "MIT", "dependencies": { "@rc-component/context": "^2.0.1", "@rc-component/resize-observer": "^1.0.0", - "@rc-component/util": "^1.1.0", + "@rc-component/util": "^1.11.1", "@rc-component/virtual-list": "^1.0.1", "clsx": "^2.1.1" }, @@ -1785,16 +1816,16 @@ } }, "node_modules/@rc-component/tabs": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@rc-component/tabs/-/tabs-1.7.0.tgz", - "integrity": "sha512-J48cs2iBi7Ho3nptBxxIqizEliUC+ExE23faspUQKGQ550vaBlv3aGF8Epv/UB1vFWeoJDTW/dNzgIU0Qj5i/w==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@rc-component/tabs/-/tabs-1.13.0.tgz", + "integrity": "sha512-3FXr+9ZII8tFLWuDWrgjRaxZd2mazkKJAGRFEfVmp4r1qnBglOlxQ78l54Td1aj6/iFaaEReKSAF2HToztU5uw==", "license": "MIT", "dependencies": { "@rc-component/dropdown": "~1.0.0", - "@rc-component/menu": "~1.2.0", + "@rc-component/menu": "~1.5.0", "@rc-component/motion": "^1.1.3", "@rc-component/resize-observer": "^1.0.0", - "@rc-component/util": "^1.3.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "engines": { @@ -1805,30 +1836,14 @@ "react-dom": ">=16.9.0" } }, - "node_modules/@rc-component/textarea": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@rc-component/textarea/-/textarea-1.1.2.tgz", - "integrity": "sha512-9rMUEODWZDMovfScIEHXWlVZuPljZ2pd1LKNjslJVitn4SldEzq5vO1CL3yy3Dnib6zZal2r2DPtjy84VVpF6A==", - "license": "MIT", - "dependencies": { - "@rc-component/input": "~1.1.0", - "@rc-component/resize-observer": "^1.0.0", - "@rc-component/util": "^1.3.0", - "clsx": "^2.1.1" - }, - "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" - } - }, "node_modules/@rc-component/tooltip": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@rc-component/tooltip/-/tooltip-1.4.0.tgz", - "integrity": "sha512-8Rx5DCctIlLI4raR0I0xHjVTf1aF48+gKCNeAAo5bmF5VoR5YED+A/XEqzXv9KKqrJDRcd3Wndpxh2hyzrTtSg==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@rc-component/tooltip/-/tooltip-1.5.2.tgz", + "integrity": "sha512-VLq4BclU3LgRe46g2hTr2bdsM8tFYs7dVwpuD88rPNNg4lCGe8mBSS4FiRzYzS+ffnZ46y4SI8KYKo9K7qBnhw==", "license": "MIT", "dependencies": { - "@rc-component/trigger": "^3.7.1", - "@rc-component/util": "^1.3.0", + "@rc-component/trigger": "^3.10.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1837,9 +1852,9 @@ } }, "node_modules/@rc-component/tour": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-2.3.0.tgz", - "integrity": "sha512-K04K9r32kUC+auBSQfr+Fss4SpSIS9JGe56oq/ALAX0p+i2ylYOI1MgR83yBY7v96eO6ZFXcM/igCQmubps0Ow==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-2.4.0.tgz", + "integrity": "sha512-aui4r4TqmTzwaBgcQxHYep8kM8PTjZFufjokObpy35KfFeZ0k9ArquWFZqegQlH24P14t+F0qO0mGTgzlav1yg==", "license": "MIT", "dependencies": { "@rc-component/portal": "^2.2.0", @@ -1856,14 +1871,14 @@ } }, "node_modules/@rc-component/tree": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@rc-component/tree/-/tree-1.2.3.tgz", - "integrity": "sha512-mG8hF2ogQcKaEpfyxzPvMWqqkptofd7Sf+YiXOpPzuXLTLwNKfLDJtysc1/oybopbnzxNqWh2Vgwi+GYwNIb7w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@rc-component/tree/-/tree-1.4.0.tgz", + "integrity": "sha512-dGsJGDJQedA0BqqVgj3F8BvHXTSZijyhTXdbAdkcx8lynzZkty/CV3Z3LOm/fxz+BCfl3dfGiAQpb7Q5XNvl0Q==", "license": "MIT", "dependencies": { "@rc-component/motion": "^1.0.0", - "@rc-component/util": "^1.8.1", - "@rc-component/virtual-list": "^1.0.1", + "@rc-component/util": "^1.11.1", + "@rc-component/virtual-list": "^1.2.0", "clsx": "^2.1.1" }, "engines": { @@ -1875,14 +1890,14 @@ } }, "node_modules/@rc-component/tree-select": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@rc-component/tree-select/-/tree-select-1.8.0.tgz", - "integrity": "sha512-iYsPq3nuLYvGqdvFAW+l+I9ASRIOVbMXyA8FGZg2lGym/GwkaWeJGzI4eJ7c9IOEhRj0oyfIN4S92Fl3J05mjQ==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@rc-component/tree-select/-/tree-select-1.16.1.tgz", + "integrity": "sha512-a1Oi6EJhqAhdOxxupdJi6fP0RPHMKn5TcfkX2+llaQ4lF4nwfH7b6SCHcnsybaa2s+pk1yZYwVyeOYkDnEBRdg==", "license": "MIT", "dependencies": { - "@rc-component/select": "~1.6.0", - "@rc-component/tree": "~1.2.0", - "@rc-component/util": "^1.4.0", + "@rc-component/select": "~1.10.0", + "@rc-component/tree": "~1.4.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1891,15 +1906,15 @@ } }, "node_modules/@rc-component/trigger": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-3.9.0.tgz", - "integrity": "sha512-X8btpwfrT27AgrZVOz4swclhEHTZcqaHeQMXXBgveagOiakTa36uObXbdwerXffgV8G9dH1fAAE0DHtVQs8EHg==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-3.10.1.tgz", + "integrity": "sha512-mXlDN0IXdtV8Yqqm8195ECCyrbmfvvfKvwVvSlH0+qvKD6BUF8gRhEjSy0FOcD1+CcDRHgTiX99LoxfQrmh3Cw==", "license": "MIT", "dependencies": { - "@rc-component/motion": "^1.1.4", - "@rc-component/portal": "^2.2.0", - "@rc-component/resize-observer": "^1.1.1", - "@rc-component/util": "^1.2.1", + "@rc-component/motion": "^1.3.3", + "@rc-component/portal": "^2.2.1", + "@rc-component/resize-observer": "^1.1.2", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "engines": { @@ -1911,12 +1926,12 @@ } }, "node_modules/@rc-component/upload": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rc-component/upload/-/upload-1.1.0.tgz", - "integrity": "sha512-LIBV90mAnUE6VK5N4QvForoxZc4XqEYZimcp7fk+lkE4XwHHyJWxpIXQQwMU8hJM+YwBbsoZkGksL1sISWHQxw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@rc-component/upload/-/upload-1.1.1.tgz", + "integrity": "sha512-GvYWSKeaJTOxxC5p6+nOSadzfvXA1h8C/iHFPFZX+szH3JUXrvs+DLiW8YUTBgvMh8m63mJeHrlYlJzAlg+pDA==", "license": "MIT", "dependencies": { - "@rc-component/util": "^1.3.0", + "@rc-component/util": "^1.11.1", "clsx": "^2.1.1" }, "peerDependencies": { @@ -1925,13 +1940,13 @@ } }, "node_modules/@rc-component/util": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.9.0.tgz", - "integrity": "sha512-5uW6AfhIigCWeEQDthTozlxiT4Prn6xYQWeO0xokjcaa186OtwPRHBZJ2o0T0FhbjGhZ3vXdbkv0sx3gAYW7Vg==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.13.0.tgz", + "integrity": "sha512-IXf2zBfZrbQGT+G8LxnoICDBGnMHIPIiq5HCRn3EDfKUx28x1rnbZBj46ULJf4sM8ImTG1SepqfNBdxZziqQ4w==", "license": "MIT", "dependencies": { "is-mobile": "^5.0.0", - "react-is": "^18.2.0" + "react-is": "^19.2.7" }, "peerDependencies": { "react": ">=18.0.0", @@ -1939,12 +1954,12 @@ } }, "node_modules/@rc-component/virtual-list": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@rc-component/virtual-list/-/virtual-list-1.0.2.tgz", - "integrity": "sha512-uvTol/mH74FYsn5loDGJxo+7kjkO4i+y4j87Re1pxJBs0FaeuMuLRzQRGaXwnMcV1CxpZLi2Z56Rerj2M00fjQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@rc-component/virtual-list/-/virtual-list-1.5.1.tgz", + "integrity": "sha512-boqHxdtyWC88u8quYgEO49bcBy5fzRiOcnBge+N4nLzs2k8hUQ/yw7JE9dM6yCBE4jSm5YSHVCVMS+suBuJGKA==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.20.0", + "@babel/runtime": "^8.0.0", "@rc-component/resize-observer": "^1.0.1", "@rc-component/util": "^1.4.0", "clsx": "^2.1.1" @@ -1953,14 +1968,37 @@ "node": ">=8.x" }, "peerDependencies": { - "react": ">=16.9.0", - "react-dom": ">=16.9.0" + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@rc-component/virtual-list/node_modules/@babel/runtime": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-8.0.5.tgz", + "integrity": "sha512-7NK+Lz3spQ52XsUGTxIEVU4jYN2/dIaX8sTxRFAUtYmttYZnVh3aehiihv+/Gb7+duMNHl2OrFcBQRyOHScxpg==", + "license": "MIT" + }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.8.tgz", + "integrity": "sha512-tN5aztYkKCte4i5SIrrz5yK/HMjEuCqCSCJa418jOV8tZ1cBY3YF2otxB1ktPxzsLA1BeTqwapK0bfjxNvHJVw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.3.tgz", - "integrity": "sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.8.tgz", + "integrity": "sha512-dIYTWl9XprMUiQFoc55KUyk/oS8SKYH3zFl0LTR7RT0Xj4hgSVyuJcroH8JUu8RcpF8fTB6E0aOwCkZoYPcDSQ==", "cpu": [ "arm64" ], @@ -1975,9 +2013,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.3.tgz", - "integrity": "sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.8.tgz", + "integrity": "sha512-PCSDQGXD2IyTEFrcgPyBM8jJuGmrbCMuoIOXdbEGVemruKACXoLQJrb+A45Z0L5t1RQkdfJprAYPkikbh7dzdA==", "cpu": [ "arm64" ], @@ -1992,9 +2030,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.3.tgz", - "integrity": "sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.8.tgz", + "integrity": "sha512-Uk7lRsGhPFHVX/sAUC6D5H9Ol30dFHd6iquokll2th3LpdJ3F5CzQB+7DHn0Ri2mG+U7k2zXiPHDrwZenXhwSA==", "cpu": [ "x64" ], @@ -2009,9 +2047,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.3.tgz", - "integrity": "sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.8.tgz", + "integrity": "sha512-DjszaTEVogPqA5bYzsEeqDCQxbcp2fexQwKcRspYji2yzR68fCf+e4fx6kBSRDwX5/brZaHw/hWS9+A/+/w9sQ==", "cpu": [ "x64" ], @@ -2026,9 +2064,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.3.tgz", - "integrity": "sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.8.tgz", + "integrity": "sha512-zmwa7FTmdzB6aaEEuuls18H6Ap5JmJPSoPTuXixeJZV6tG40SyLkApQtz1g8ptZtiEKqj9OM0oNLPh1AgvE31Q==", "cpu": [ "arm" ], @@ -2043,13 +2081,16 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.3.tgz", - "integrity": "sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.8.tgz", + "integrity": "sha512-KdYQDPHwJVnbFwdTGMgxsI9SqblBlz6STGM+w1We/d5B8OWWidYH0MwkU/uA1wM5fIpO2MkOVxXrNzzuZhw9ew==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2060,13 +2101,16 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.3.tgz", - "integrity": "sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.8.tgz", + "integrity": "sha512-jFJTifHnNPY+yzOoNZQfSIysrVyXzEQPhPnOUjmD1bcQGHH6s7c8cViKWar8YplQImE5N9JRqMCLrM2CdxOrZA==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2077,13 +2121,16 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.3.tgz", - "integrity": "sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.8.tgz", + "integrity": "sha512-FhiOziBDWPBjbcmRzfLyIJnaP7AVMFXT7YCXPjXxj7wKU3vx24RjrCNN/zjvVa+N2vVoHJwCoUBvsrN/DG3zIA==", "cpu": [ "ppc64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2094,13 +2141,16 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.3.tgz", - "integrity": "sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.8.tgz", + "integrity": "sha512-WnHfADMzOV2Y55wlx1hzzQnar/wDt/VdvWSD99r18Mz9ylNieIGOkRx3UV21h7m/eJvjySYJkO26VvGNFkwsIQ==", "cpu": [ "s390x" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2111,13 +2161,16 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.3.tgz", - "integrity": "sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.8.tgz", + "integrity": "sha512-H9tRr5ibfXFVLxbPOseVewewFpl28zcEdjRDt2FTUZU7odxP0gEv1ki4/kGmcGOh78oRwZuuQllGLZ9zTJp84g==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -2128,13 +2181,16 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.3.tgz", - "integrity": "sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.8.tgz", + "integrity": "sha512-UefiqfM3D6IVNlZ8tSGs9+Ejjud2T+oxO0IHADU45Y+lyEjD2dVFyZHbkfX0LUb5Zugo/oIv1eCO/KVYhgYJYA==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -2145,9 +2201,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.3.tgz", - "integrity": "sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.8.tgz", + "integrity": "sha512-637Ke4kWSy6rp9cxQ9gMOXlxPgIw/c1beASV4M//3+9I4uwBVOOl74G+e3zyU3u19U7RkRl/HuewixZ/Z6+Rjg==", "cpu": [ "arm64" ], @@ -2161,29 +2217,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.3.tgz", - "integrity": "sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.3.tgz", - "integrity": "sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.8.tgz", + "integrity": "sha512-xWBkPOF1Q9k/Gv1nQXnVdLxKu74jXppuOM4Z3mnypVUJJJwLsMl7hNJGRAUJoG8A5MgOI1ACKM+wBFxSJzKy4A==", "cpu": [ "arm64" ], @@ -2198,9 +2235,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.3.tgz", - "integrity": "sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.8.tgz", + "integrity": "sha512-uz2ZvfgXbxqNwijjjbxrnvALwpyODDcgc1T1N8N3rf/DXKQmaFwmB4LX4yyjggpwN2obdQLb2rgirX5ffCWYng==", "cpu": [ "x64" ], @@ -2236,13 +2273,13 @@ "license": "MIT" }, "node_modules/@swagger-api/apidom-ast": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.12.0.tgz", - "integrity": "sha512-C4Px0M/hNIBf2jFphrHlKe8rN5OuUaxNb3FNandzM8++Uyp9TKjdt0+FI6+sX4s8u3axvQ4c4jrjb0LW7r2jPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ast/-/apidom-ast-1.12.1.tgz", + "integrity": "sha512-h1wIHNZ+4eQ00aXgX5VsTFLyi/9JWywK2CNOfZ3xzEfi9Qh/sDNHB9i4pbaGdlE8oxZa8HwqPl7+6M0fLCXfbA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-error": "^1.12.0", + "@swagger-api/apidom-error": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2250,14 +2287,14 @@ } }, "node_modules/@swagger-api/apidom-core": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.12.0.tgz", - "integrity": "sha512-HXiJ6c7R/Sfpj1nz8Tgzy6jvaKE333b3FA4XTuKrwne/fgGq+ITksp6SaDMp7F/FbvP8iik2OFT9wJ3BRw1wjw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-core/-/apidom-core-1.12.1.tgz", + "integrity": "sha512-aBTAjJ0YzxFccXe5kB3nnVuHxRyPYEaE8eLEs/kJFmbv8UdMji1AVnNSk61MfJ4nodyoMYLfp6AoPa9fWXFgiQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.12.0", - "@swagger-api/apidom-error": "^1.12.0", + "@swagger-api/apidom-ast": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", "@types/ramda": "~0.30.0", "minim": "~0.23.8", "ramda": "~0.30.0", @@ -2267,35 +2304,35 @@ } }, "node_modules/@swagger-api/apidom-error": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.12.0.tgz", - "integrity": "sha512-mdQbyeolFyhyJiVchAJlfOUYntD4p10ORtpVRTLw0vFfqQZtDfr+uMVgiB/kmmyTZ27PoJPR51RDqaXB88aq2Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-error/-/apidom-error-1.12.1.tgz", + "integrity": "sha512-y44fOaleXZGIEX+MIUIksA704naPjhvpHEMfadWY/D9DW2JTdwv2edpyZEFjyK1jwchp/b3aQ+XG9MDvfwb8HQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.20.7" } }, "node_modules/@swagger-api/apidom-json-pointer": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.12.0.tgz", - "integrity": "sha512-L6JaaeNjG6J5Ros4MLd+Yb2ZS0RhfJ5fj8w5UtCyf1I0cnwJo7hrRExE5RWXVBtF5nl8mO3eIGUe959hC1DtVQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-json-pointer/-/apidom-json-pointer-1.12.1.tgz", + "integrity": "sha512-EZmwpku1eMsc7Lvdz0sm/XHkRAmj7FpMwfVm1MfoXiljhPrEVHH6FTZmM3QXaprkOeDMkBTDGtIv/LgYOq/b+w==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-error": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", "@swaggerexpert/json-pointer": "^2.10.1" } }, "node_modules/@swagger-api/apidom-ns-a2a-1": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-a2a-1/-/apidom-ns-a2a-1-1.12.0.tgz", - "integrity": "sha512-kYfltECH/D3+bT+7IxYtF7VGNrSeDqqDttiIjx7R3pBgPPbxNWAi/EA4Rx+c7qY56sDz0CdbtZNTH28bNi00og==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-a2a-1/-/apidom-ns-a2a-1-1.12.1.tgz", + "integrity": "sha512-/HjUqcV8XpUQET/P5fqVCsm9ZXpeYwHpKVJtv+pIPDF1Zk5thHCKgyC3qIM+/ZGBDqt6MVrhpyrYIvEHFyd3dQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2303,16 +2340,16 @@ } }, "node_modules/@swagger-api/apidom-ns-api-design-systems": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.12.0.tgz", - "integrity": "sha512-opXxaAZGxy/IDdUxqfTugtoGeKarb+pDchdVMOWNUD4NZH5weE519dcqCdLMqWtcHX2RL2m9UdcJjGLnAt+GQQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-api-design-systems/-/apidom-ns-api-design-systems-1.12.1.tgz", + "integrity": "sha512-Va3ljpxF8Ti/cMxD8/JdFtEdVg8hxwZ8/1TsUNwcE12qLu9o95hHsqmm8/OlKSqfSpO3KG/QT1TIKmQsl7cAsQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-error": "^1.12.0", - "@swagger-api/apidom-ns-openapi-3-1": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-1": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2320,15 +2357,15 @@ } }, "node_modules/@swagger-api/apidom-ns-arazzo-1": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.12.0.tgz", - "integrity": "sha512-xqtr7pZ5IQBsHZA6yWbSprVSTzpIbM5FtX40rY7lx4wsm4TyhIfJBxOf99+jFmELt7QHoKCUZ8zZQOdf+uOqLw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-arazzo-1/-/apidom-ns-arazzo-1-1.12.1.tgz", + "integrity": "sha512-0G+KnlXb9QVJGC/tJLjkv7oiFBl45xAd8CM9dwwvnG7vBFJZGOq04qs8S8oCuA94ugSvdmave88IA03SEM7FWg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2336,15 +2373,15 @@ } }, "node_modules/@swagger-api/apidom-ns-asyncapi-2": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.12.0.tgz", - "integrity": "sha512-xe3Y3PeRqohaOinEtKTqnUxPoMAopTYAPEnXew5qRcnH7wVWO99J3+XrbY+x9JEXhcAKHpKSWmuNx5o7oU0WdA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-2/-/apidom-ns-asyncapi-2-1.12.1.tgz", + "integrity": "sha512-GQUrBTz74usl88dFrrhRH1btc4sinJ0vb9bnFfBOuQBF0MYvVJ67Vsx1cz6iIfS4Y/2+x63WX5krJlmKavUQ9w==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2352,15 +2389,15 @@ } }, "node_modules/@swagger-api/apidom-ns-asyncapi-3": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-3/-/apidom-ns-asyncapi-3-1.12.0.tgz", - "integrity": "sha512-WZ/j/Hk8nsX0lkHiTUFfESkQgGGEba9dwiKMP9OvX9qLsoxJ04Dg1Z7E58WCrmwistEpynMHO+KY3qo2trWOUQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-asyncapi-3/-/apidom-ns-asyncapi-3-1.12.1.tgz", + "integrity": "sha512-lPJd/zXcCv2zBAjMfxHDbiC0xQD7cpztD403mh74unGsVN9Xj+aBfGMZ9qsh+UdMYhxk6Ad2C4esYkROB2Awqw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-asyncapi-2": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-asyncapi-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2368,15 +2405,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-2019-09": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.12.0.tgz", - "integrity": "sha512-fWRjOvOiOFqKp0vJgFJn1fm9i+H5eSOQ1J0xWldTnHJPHsYPQkYPLAQdpXcBbBiB5o0JYVeJe7PyWv3DvNxqSA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2019-09/-/apidom-ns-json-schema-2019-09-1.12.1.tgz", + "integrity": "sha512-HlzTVQZV1d2twOGcZd7h2LUm/KAaWy0il1Bcwy6pGkdyHcP3lm85xgSbeGuJgn0sE9j0IuZrMuMMwAzcqhMAGA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-error": "^1.12.0", - "@swagger-api/apidom-ns-json-schema-draft-7": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-draft-7": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2384,15 +2421,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-2020-12": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.12.0.tgz", - "integrity": "sha512-U0sv+7aD6njyxcvQOS9Lkpr4feJRowMn0/shiIlXrXY1ox3BDJBgipsgx/0IqfQNseP3Zj43Ec5kGk4PFmsjCg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-2020-12/-/apidom-ns-json-schema-2020-12-1.12.1.tgz", + "integrity": "sha512-0C5I+0MwE/fPueRoHnbFjUF2v1I85PRRUtlmifRM9NZgbCPJ6X/u5TDhllDmu0UDnvFjrSAGMvS/vw+i77qtdA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-error": "^1.12.0", - "@swagger-api/apidom-ns-json-schema-2019-09": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-2019-09": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2400,14 +2437,14 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-4": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.12.0.tgz", - "integrity": "sha512-c+NYp+DZvoZ0+3hFgKhQn507kba0HUv8C60cJEqQPCpIKqKpWvpZ6YF8GsKVhJoML4PAr6Zl6SWjFVvOnDUbBg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-4/-/apidom-ns-json-schema-draft-4-1.12.1.tgz", + "integrity": "sha512-szwBlRH0jey/FtJ25f8k3rVUuQFg66c9FyLozZzEkMu5MFFGcl/NK2AZ9TRATmcIrpNFuK8FSz9PaPmNEUbnMw==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.12.0", - "@swagger-api/apidom-core": "^1.12.0", + "@swagger-api/apidom-ast": "^1.12.1", + "@swagger-api/apidom-core": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2415,15 +2452,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-6": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.12.0.tgz", - "integrity": "sha512-O8aM7l/+K2ej3AH6f7NbEVADAuZhulLWmAGFFwRBHvE022mUeOQiDrcA1cd5q/s8fY+UFE+GIrfVAq0aBPLvxA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-6/-/apidom-ns-json-schema-draft-6-1.12.1.tgz", + "integrity": "sha512-HvV5NHiqGNLI4M3BS1RJcRyxVCK4jJd4T2UaSKhZOezy3MaKguGI8oDgwix8eyw+6OwhxuXNQpRMobYb+WaseQ==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-error": "^1.12.0", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2431,15 +2468,15 @@ } }, "node_modules/@swagger-api/apidom-ns-json-schema-draft-7": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.12.0.tgz", - "integrity": "sha512-gWTTBmz6CyBytc4v7tMcm0KJ/0xp8n0zyWE1VSBXvLjFylOfvlkzmPL/MD8sqiEqUCGXXSQAyUmyL7heU8uGzQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-json-schema-draft-7/-/apidom-ns-json-schema-draft-7-1.12.1.tgz", + "integrity": "sha512-t7LqogFYGN1ocxFTkJIXsqM4M66WAWIFW/yBbaGOO//OiuVuRe5wVXzpbJttT3cA2peotQbpKxlBL/GuvxWguA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-error": "^1.12.0", - "@swagger-api/apidom-ns-json-schema-draft-6": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-draft-6": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2447,16 +2484,16 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-2": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.12.0.tgz", - "integrity": "sha512-eISSf1rj7/HZAzOBGdZneUNp4M3FPwvqmKFL9ODBN+kpKFQ438TnYPdMVm60EoiinpvKa7hrKVKj/RubDfvcIQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-2/-/apidom-ns-openapi-2-1.12.1.tgz", + "integrity": "sha512-v93DUAk5hehbsp81kJKwbcJbWBVFXcdBqZy8G8Lbo6QeCar1/dP6CWItbn8xArZmG3PeYkZK77v903HEmLxghA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-error": "^1.12.0", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2464,15 +2501,15 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-0": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.12.0.tgz", - "integrity": "sha512-8DqRCkRTxQPtFjRjWiFo5F/IZcBqFFcqjmtoVWbxkUNGyJpgfZjx5Mne/QCB9ZV5vqNeBPF2IYfjQZEvgOBKvA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-0/-/apidom-ns-openapi-3-0-1.12.1.tgz", + "integrity": "sha512-EO2c552sMDtZXllLSQVI5u1+gpo654LW1apmi9YvblCrRek2Gyejoj3otBfo9IFdBEuczbt+Rll3hRnZx3aqeA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-error": "^1.12.0", - "@swagger-api/apidom-ns-json-schema-draft-4": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-draft-4": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2480,17 +2517,17 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-1": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.12.0.tgz", - "integrity": "sha512-6h4NJyCb/I9GkPYCma7SiEp3MlMNH9DFDntamb49AJDBNlibOG1VyR+y3R4+vzUlYOZayMDwe7Z1zC+qN0ulYw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-1/-/apidom-ns-openapi-3-1-1.12.1.tgz", + "integrity": "sha512-qDJ6rGUTMLQ5MHWqAQ+3/+VGBjS7je5pYkP3hiF2AeXTESh1/MOjPICxDWE6XDwcvkVOIcXX+xEDt7ulnzvrtA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.12.0", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-json-pointer": "^1.12.0", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.12.0", - "@swagger-api/apidom-ns-openapi-3-0": "^1.12.0", + "@swagger-api/apidom-ast": "^1.12.1", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-json-pointer": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-0": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2498,18 +2535,18 @@ } }, "node_modules/@swagger-api/apidom-ns-openapi-3-2": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-2/-/apidom-ns-openapi-3-2-1.12.0.tgz", - "integrity": "sha512-kkrXfvRPpiJTcK6qr0dB5Jf80kD3jgTo1DU9W6Q5/n06WcyGQhtKTofY7YRHQ52r2Nfpuh9JbxtoD0PIHE0STQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-ns-openapi-3-2/-/apidom-ns-openapi-3-2-1.12.1.tgz", + "integrity": "sha512-H0VmiegQhWc+53xypcxS3T7qUVcfJKX+DYmiPx9FZvvSOp77Ctvc2/RtztGQ5531oFWDWtPt0Ad0VwxmEcfL8w==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.12.0", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-json-pointer": "^1.12.0", - "@swagger-api/apidom-ns-json-schema-2020-12": "^1.12.0", - "@swagger-api/apidom-ns-openapi-3-0": "^1.12.0", - "@swagger-api/apidom-ns-openapi-3-1": "^1.12.0", + "@swagger-api/apidom-ast": "^1.12.1", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-json-pointer": "^1.12.1", + "@swagger-api/apidom-ns-json-schema-2020-12": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-0": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-1": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2517,176 +2554,176 @@ } }, "node_modules/@swagger-api/apidom-parser-adapter-a2a-json-1": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-a2a-json-1/-/apidom-parser-adapter-a2a-json-1-1.12.0.tgz", - "integrity": "sha512-RwUkRb92938NiTriueninR0MaeXYJRZKcZtYyEB5h2JRQ7nQGsCO6a6F1rNwehzLoPeRWLGMYr0wRWP1tTy7fw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-a2a-json-1/-/apidom-parser-adapter-a2a-json-1-1.12.1.tgz", + "integrity": "sha512-4Bp56QdMOmv6pkhmDExFlzHHjtB3CqW4rjyo+QcnhiWBmB3qbsS4/rHEQVGNlGtUC+ze0+LbAI4pycAnqF88dQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-a2a-1": "^1.12.0", - "@swagger-api/apidom-parser-adapter-json": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-a2a-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-a2a-yaml-1": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-a2a-yaml-1/-/apidom-parser-adapter-a2a-yaml-1-1.12.0.tgz", - "integrity": "sha512-G2L1mRcuAJQICU18cjYH6FIZshYVJOCAmz5JSNknriIL0LYXr8xlbQ7kStTC5cmM9YfxDfD3eLb92vQ+yvpbCA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-a2a-yaml-1/-/apidom-parser-adapter-a2a-yaml-1-1.12.1.tgz", + "integrity": "sha512-GsQogmK2vUQXOIImFFSoKnhiJDVOm2K4zxRAtIHrwCVgFqD4mwV+cSojE44dOi7tqH/3bp7yCdo4LilleeetRQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-a2a-1": "^1.12.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-a2a-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-json": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.12.0.tgz", - "integrity": "sha512-Co9BcoTlEAcrDIVTE/o0B6+HAlIuwB5hvKMs+w9+P+r6cSDRqx4NOi16iqBH6leCEtO6xU8H152ua0e8hKkQSQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-json/-/apidom-parser-adapter-api-design-systems-json-1.12.1.tgz", + "integrity": "sha512-xhUgAXs8Rxssfr3dEWpKhDheeycI9Vt6jtBVEwavcL9+ss8cY9jzVck3R7Ql7P9yBVhF41K4ZTUIO1QJVngYZA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-api-design-systems": "^1.12.0", - "@swagger-api/apidom-parser-adapter-json": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-api-design-systems": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-api-design-systems-yaml": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.12.0.tgz", - "integrity": "sha512-vBnmuMflgcxPkqQX8rXFIWU6GdC0OPMO73LU4iOOjG2kxycET6NTs0zu6mTKRwfCk7PmVR+MzaqLyORCkL3Rjw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-api-design-systems-yaml/-/apidom-parser-adapter-api-design-systems-yaml-1.12.1.tgz", + "integrity": "sha512-FPJ9Da6CChE3Xp5+vS8bXrsdmzy7+BrTxLt38SQrpYCpx1fRKsfs+xZqLTRHEhv01QG7Hj7MFG/xGEqK7rt8/w==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-api-design-systems": "^1.12.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-api-design-systems": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-arazzo-json-1": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.12.0.tgz", - "integrity": "sha512-5SHEWHdLXpbugsDN2NVYxqh87Sson4pDS+Yk9Zp00cJSl2dNtLZ+LHq3dtIgjFcKy9yOCnaiKjzqoZtpdQB1zQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-json-1/-/apidom-parser-adapter-arazzo-json-1-1.12.1.tgz", + "integrity": "sha512-nJB+UWnSU9wz615wsXJfPh5Ij180UOYsMN2icuVADVBKGAAxfEbafq3ATtPVvpBNZBg50eKeIwjAXjjC4OsLMg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-arazzo-1": "^1.12.0", - "@swagger-api/apidom-parser-adapter-json": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-arazzo-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-arazzo-yaml-1": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.12.0.tgz", - "integrity": "sha512-l0ocWS0IcWYx0ZFosEQguOS72dJXYnEC42KrQgYJMvZCfpMZPtP4HahAYryFxRZWiHZnhunkSChv8MRnBplcQA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-arazzo-yaml-1/-/apidom-parser-adapter-arazzo-yaml-1-1.12.1.tgz", + "integrity": "sha512-8lgMKvb0Lhl1C9uNtBYm9DR9Dljpk/u23dH1H/xGAD1A54zZaQYchbyC4VCAHuesmjVT+mWylGoIU0SIlAOcNQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-arazzo-1": "^1.12.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-arazzo-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-2": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.12.0.tgz", - "integrity": "sha512-oZt3H7qH4ttU+RILLQ8G8tgOLe+hRMQDh7q/W/Dfxc2xGGsLb6jYG4gl45ry/QHDpudCc2SKC3GxdXfQ3Dl4pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-2/-/apidom-parser-adapter-asyncapi-json-2-1.12.1.tgz", + "integrity": "sha512-HetDS5x6yHF/JeDokHiPNzX5lhm0GbVpy5MMVOcfH7zp9QSBFBGwhJTRPDEYm8PKfjkCMFLzCgiUKwqn73LV4g==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-asyncapi-2": "^1.12.0", - "@swagger-api/apidom-parser-adapter-json": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-asyncapi-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-json-3": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-3/-/apidom-parser-adapter-asyncapi-json-3-1.12.0.tgz", - "integrity": "sha512-O4osrUo/q0ErGPqmCHfYEdRpeH894Dix0AQwLwuovgIS5OxWMa2r6Z8mzz3emRoyVi9ucF+0//OFm7WeU7NcGg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-json-3/-/apidom-parser-adapter-asyncapi-json-3-1.12.1.tgz", + "integrity": "sha512-FzWH1uVNu3jWG6qB1OtbC76bQburCf3zoi3VPEQONSjT+i2vfcgc+WhAjVxaGQEwpjhbCkF2oo6WPC1hPbxARA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-asyncapi-3": "^1.12.0", - "@swagger-api/apidom-parser-adapter-json": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-asyncapi-3": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.12.0.tgz", - "integrity": "sha512-AfcdwWREQhBAEbVTwIVjFLvW/j5wTXmY8/VkKp1OmF7zXyyZDMA+xRAoGZlOlc+KNJ46O6yeN9CLfUaJ0IoRog==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-2/-/apidom-parser-adapter-asyncapi-yaml-2-1.12.1.tgz", + "integrity": "sha512-zkMaQZPbdJ1rg+754BxJsd+gOmFRBAGObJ2xGLSRf7OKqhwJhnJQVGlyYViaNNpzHPfrhc6KeEsiczVqGESDKA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-asyncapi-2": "^1.12.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-asyncapi-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3/-/apidom-parser-adapter-asyncapi-yaml-3-1.12.0.tgz", - "integrity": "sha512-+gAKV6dwr1neG3ngONPYWYRATrYD/ooRO+dY6kOgc2yy99YagtSZjtNNSosvoMdPL8vhI6OkZRyew41kyW+Vwg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-asyncapi-yaml-3/-/apidom-parser-adapter-asyncapi-yaml-3-1.12.1.tgz", + "integrity": "sha512-B2vVz0V+3WC+SBgZvHFYceF3RqGGghVOhXVQm5R9L6yUqT1zrmbu9RC+CFftKHs9mp3BX83dZZBhh+l4vHBuPw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-asyncapi-3": "^1.12.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-asyncapi-3": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-json": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.12.0.tgz", - "integrity": "sha512-Tftr63g71VwTsWtafYgI7xrmkp6lcs8p6hwo06UzZICTyEsfMrye6Hjvs2TM0KBO/e6Hw8cTdCIBVtEV10Knqw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-json/-/apidom-parser-adapter-json-1.12.1.tgz", + "integrity": "sha512-ImdTAC3+qTwEyjumBD19lcLp8UZ0WdB0T/iXNJOMvAw4oqZdGvsq2Zdthgbvxq5CnTr146YH5IzXuOYPfh47jw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.12.0", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-error": "^1.12.0", + "@swagger-api/apidom-ast": "^1.12.1", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0", @@ -2696,144 +2733,144 @@ } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-2": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.12.0.tgz", - "integrity": "sha512-2cMgq3NBAS7magAFqgtBZOoi3vRR7/txQOOA1nzEODiS4WV4ERbe2B59+uaQ7+yzJlkm0OPqzFhXy3IkOB6Z0g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-2/-/apidom-parser-adapter-openapi-json-2-1.12.1.tgz", + "integrity": "sha512-oo98u119nP05eLetyc/DPmDtDBfj+ZYeLRnq9pDa+7UOQs83NUvNWsfdWvJtSpgwOZZIqhR8+O7amULKJR+BdA==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-openapi-2": "^1.12.0", - "@swagger-api/apidom-parser-adapter-json": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-0": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.12.0.tgz", - "integrity": "sha512-ws5vsTv8KtrwzPPGwyeNUrEGYLlsRSByTWHFXH8hU8eGbSAcmmKsENhNeEjslimzD2Cev5vJzmdat5oWpKY4fA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-0/-/apidom-parser-adapter-openapi-json-3-0-1.12.1.tgz", + "integrity": "sha512-SA5PiAytwGuC56pS8FOCLZVeUdudHHrot2ms9SwFFZMF+sHGgeQ8+EoBiE0+H4L+M5otpMyV/slT+WwfGCCGsw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-openapi-3-0": "^1.12.0", - "@swagger-api/apidom-parser-adapter-json": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-0": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-1": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.12.0.tgz", - "integrity": "sha512-C2/oMuyGarGAPQj5Taob9MOI9Hme6D5Qm/ZyJkRgXBg50ZA3WeaFCr51St6dNU1lDhe8i++cZeWMsp4wegPllw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-1/-/apidom-parser-adapter-openapi-json-3-1-1.12.1.tgz", + "integrity": "sha512-cqJ/vvxI6+apG7NZHMugiqLpF/xquKcw1vVxrRraXetrzwNBGHHdfYh8pnW1BlVDXNoVplqMHxyJnANYrD13KQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-openapi-3-1": "^1.12.0", - "@swagger-api/apidom-parser-adapter-json": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-json-3-2": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-2/-/apidom-parser-adapter-openapi-json-3-2-1.12.0.tgz", - "integrity": "sha512-kuSIq/Tht5LQ2lezsz6O1x+PM1U5DWeZBQKqHkTgQokhsbxM9dmO6xmSW/aQUk+0jUWf8n6ROrGmscrw6AawWg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-json-3-2/-/apidom-parser-adapter-openapi-json-3-2-1.12.1.tgz", + "integrity": "sha512-BFrjyONcPrp8kFYC8YPIKO2mvJcJMp2Gc99MwnVdpbZY+PJ2GWNh8ZMDR+e90VAAATCn+ZaeYQXjKo788BtZ2w==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-openapi-3-2": "^1.12.0", - "@swagger-api/apidom-parser-adapter-json": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-2": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.12.0.tgz", - "integrity": "sha512-QR0XdBWzjN/8ZmgBrbswP+Bpj+BllUqFiJu43VZNm1M8u/AtbJnsdlTw3coXLVpVpV7ruAKjp0GtsqQyOKNA1w==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-2/-/apidom-parser-adapter-openapi-yaml-2-1.12.1.tgz", + "integrity": "sha512-1tZI8BYmqbgSYKBW3zQy0YtG0xDwVCdguBffSITb6qXUfhpzDrziJFKqetAe+aa1SysyuZzyr/VOXizmvuY5mg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-openapi-2": "^1.12.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.12.0.tgz", - "integrity": "sha512-2Mzft9tXXodoRBqEEXQ1p5MRLrzIDt7SCqZyXF9cBF5ukIdHfgq7vDoX7XUECELzhCf3mMRxLaxH+JcPC26izg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-0/-/apidom-parser-adapter-openapi-yaml-3-0-1.12.1.tgz", + "integrity": "sha512-tnzd433XQeW3h8n4IrHCDZtMi1/55DYwl5Keov+w6ozfuX+akYm9y+tdD7wjlxF5sIVj0qD0glU05m2L4JH0rQ==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-openapi-3-0": "^1.12.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-0": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.12.0.tgz", - "integrity": "sha512-dYrUHnD7r6uhsh2H+gMwxFTSaqSADFHmpG1tFi7b7m/aFbNFCppB63iJ7LYg9Ew6IBej9WrYkr2jXDLKBgsMaA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-1/-/apidom-parser-adapter-openapi-yaml-3-1-1.12.1.tgz", + "integrity": "sha512-1E6w/e9rOQ3tPoalI3WzUEbkxqtDWMeJvYqlTCKjESBxejz8LMr5PWbmSObG317Bd6E38LkWP6vEB9acXcO9Zg==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-openapi-3-1": "^1.12.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-openapi-yaml-3-2": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-2/-/apidom-parser-adapter-openapi-yaml-3-2-1.12.0.tgz", - "integrity": "sha512-KrNSQmsmp6iO2o+AxJ9jpwKd4lVmPIaDcWrbp4se5b1MnHUmtf7d7h9kvI5pXhGFGuyA59HMp6qQzNfuS5SMEA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-openapi-yaml-3-2/-/apidom-parser-adapter-openapi-yaml-3-2-1.12.1.tgz", + "integrity": "sha512-6wzxjBavlFghHmcNyqGxHLlOrRPndUjKOtz677YLjmiRz5TCDI7bSkqE6LaxktgsO4ygxUs9mkXNcEkAeJtfYw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-ns-openapi-3-2": "^1.12.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", "ramda-adjunct": "^5.0.0" } }, "node_modules/@swagger-api/apidom-parser-adapter-yaml-1-2": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.12.0.tgz", - "integrity": "sha512-vydWYSj1I0t4fsBeu7nAieivBKsW2A7KW9keS+osXLuyYWs1GLHdby5AXRHPv6ktR507vAq8RxQUXkODRxyRCg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-parser-adapter-yaml-1-2/-/apidom-parser-adapter-yaml-1-2-1.12.1.tgz", + "integrity": "sha512-AMIvD+XHtkjFnuXRfn0OJynitPCdi+ru9WEj4SrZ9KnSOV6tkhhuZqi+IB2LEdwPBAjI7WuuNNqLkMhCu1ZDGw==", "license": "Apache-2.0", "optional": true, "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-ast": "^1.12.0", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-error": "^1.12.0", + "@swagger-api/apidom-ast": "^1.12.1", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", "@tree-sitter-grammars/tree-sitter-yaml": "=0.7.1", "@types/ramda": "~0.30.0", "ramda": "~0.30.0", @@ -2875,14 +2912,14 @@ } }, "node_modules/@swagger-api/apidom-reference": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.12.0.tgz", - "integrity": "sha512-GApJUvwLROSyM2KfbdvuV/zC6ccb54khvhy2eJ7jPhAk5FU0zZE5Ijt0NmY5nSf97sET87MjrWgCCMszdqPXfw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@swagger-api/apidom-reference/-/apidom-reference-1.12.1.tgz", + "integrity": "sha512-2Au0z4AwwpqKia09p87xCTOWRHAoLuwgSY+082FOcyyOev8ICBUFd6vQXBL5wGKOgwsn6hShkvopj5dObGcKUA==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.26.10", - "@swagger-api/apidom-core": "^1.12.0", - "@swagger-api/apidom-error": "^1.12.0", + "@swagger-api/apidom-core": "^1.12.1", + "@swagger-api/apidom-error": "^1.12.1", "@types/ramda": "~0.30.0", "axios": "^1.18.0", "minimatch": "^10.2.6", @@ -2890,34 +2927,34 @@ "ramda-adjunct": "^5.0.0" }, "optionalDependencies": { - "@swagger-api/apidom-json-pointer": "^1.12.0", - "@swagger-api/apidom-ns-a2a-1": "^1.12.0", - "@swagger-api/apidom-ns-arazzo-1": "^1.12.0", - "@swagger-api/apidom-ns-asyncapi-2": "^1.12.0", - "@swagger-api/apidom-ns-openapi-2": "^1.12.0", - "@swagger-api/apidom-ns-openapi-3-0": "^1.12.0", - "@swagger-api/apidom-ns-openapi-3-1": "^1.12.0", - "@swagger-api/apidom-ns-openapi-3-2": "^1.12.0", - "@swagger-api/apidom-parser-adapter-a2a-json-1": "^1.12.0", - "@swagger-api/apidom-parser-adapter-a2a-yaml-1": "^1.12.0", - "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.12.0", - "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.12.0", - "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.12.0", - "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.12.0", - "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.12.0", - "@swagger-api/apidom-parser-adapter-asyncapi-json-3": "^1.12.0", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.12.0", - "@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": "^1.12.0", - "@swagger-api/apidom-parser-adapter-json": "^1.12.0", - "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.12.0", - "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.12.0", - "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.12.0", - "@swagger-api/apidom-parser-adapter-openapi-json-3-2": "^1.12.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.12.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.12.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.12.0", - "@swagger-api/apidom-parser-adapter-openapi-yaml-3-2": "^1.12.0", - "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.0" + "@swagger-api/apidom-json-pointer": "^1.12.1", + "@swagger-api/apidom-ns-a2a-1": "^1.12.1", + "@swagger-api/apidom-ns-arazzo-1": "^1.12.1", + "@swagger-api/apidom-ns-asyncapi-2": "^1.12.1", + "@swagger-api/apidom-ns-openapi-2": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-0": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-1": "^1.12.1", + "@swagger-api/apidom-ns-openapi-3-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-a2a-json-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-a2a-yaml-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-api-design-systems-json": "^1.12.1", + "@swagger-api/apidom-parser-adapter-api-design-systems-yaml": "^1.12.1", + "@swagger-api/apidom-parser-adapter-arazzo-json-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-arazzo-yaml-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-asyncapi-json-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-asyncapi-json-3": "^1.12.1", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-asyncapi-yaml-3": "^1.12.1", + "@swagger-api/apidom-parser-adapter-json": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-json-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-json-3-0": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-json-3-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-json-3-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-yaml-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-0": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-1": "^1.12.1", + "@swagger-api/apidom-parser-adapter-openapi-yaml-3-2": "^1.12.1", + "@swagger-api/apidom-parser-adapter-yaml-1-2": "^1.12.1" } }, "node_modules/@swaggerexpert/cookie": { @@ -2944,17 +2981,71 @@ "node": ">=12.20.0" } }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", - "optional": true, + "peer": true, "dependencies": { - "tslib": "^2.4.0" + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" } }, + "node_modules/@testing-library/jest-dom": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-7.0.1.tgz", + "integrity": "sha512-oMDTC3oA+6CXSO2JZnvOI7CA6oVub6kij5ggk9ohwye5slmkwxYDXcPOVxgMw/RQlticjtO0C1RZkR97HgrWMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=22", + "npm": ">=6", + "yarn": ">=1" + }, + "peerDependencies": { + "@testing-library/dom": ">=10 <11", + "vitest": ">= 0.32" + }, + "peerDependenciesMeta": { + "vitest": { + "optional": true + } + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -3019,28 +3110,28 @@ "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, "node_modules/@types/hast": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", - "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.5.tgz", + "integrity": "sha512-rp/ezSWaD1m44dPKICGhiskI13nVr7qTloFwDa/IYkhhf5nzwP+zIQcIJh3WIFSBOy/H1PzB40jPjMDksN4F+g==", "license": "MIT", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/node": { - "version": "25.3.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.3.tgz", - "integrity": "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==", + "version": "22.20.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.2.tgz", + "integrity": "sha512-xlvWf4Vs9n1PEVYwP1n4vvG07M6y8WgvJ2t0vbrWTmijsIHp1cS+uJ2kMIRdY3nHZK0nCYKrPeD171+SzF4/zw==", "license": "MIT", "dependencies": { - "undici-types": "~7.18.0" + "undici-types": "~6.21.0" } }, "node_modules/@types/prismjs": { @@ -3059,9 +3150,9 @@ } }, "node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.3.0.tgz", + "integrity": "sha512-N0rFCuH9YoxG9/m61l9MfpJKfmLOVU0em7ipIz6TRgSSkvReLB9vL85GB+yr8Bs5leqpvg96JSwF4ZS1s4viQg==", "devOptional": true, "license": "MIT", "dependencies": { @@ -3069,13 +3160,13 @@ } }, "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-ZI7bU42mZXXKHn/qNLEw2IrbiINU7X5+vfgdixBHkCNpYWXjKgfQ/P+uyGb5CjOLB9UcnTeg3rylQtV2hym44Q==", "dev": true, "license": "MIT", "peerDependencies": { - "@types/react": "^19.2.0" + "@types/react": "^19.3.0" } }, "node_modules/@types/swagger-ui-react": { @@ -3128,17 +3219,95 @@ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/@vitest/browser": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-4.1.11.tgz", + "integrity": "sha512-bwMovvAeuTFOK5kIFevw4VEf+1gVEICv4SYK4k3knJOxl6b1zEWud8mYKD73e1B0odAn174h1MofURy2TPWf3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@blazediff/core": "1.9.1", + "@vitest/mocker": "4.1.11", + "@vitest/utils": "4.1.11", + "magic-string": "^0.30.21", + "pngjs": "^7.0.0", + "sirv": "^3.0.2", + "tinyrainbow": "^3.1.0", + "ws": "^8.19.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "4.1.11" + } + }, + "node_modules/@vitest/browser-playwright": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/browser-playwright/-/browser-playwright-4.1.11.tgz", + "integrity": "sha512-riLBxPqwnJ0lWs2DN2WeUfYeKLoAjbP2Xx8cLQdSddzMi20sksIa6K2mPz79DyMZKKVKH2ksOC2yJvtNcZg8cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/browser": "4.1.11", + "@vitest/mocker": "4.1.11", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "playwright": "*", + "vitest": "4.1.11" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": false + } + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.11.tgz", + "integrity": "sha512-8MVGEFnJIcdGjcbfKmeq8z0pZHH0JlVtoVZH9Q/qwUp6wyFnEJUBMrw9DCaj+ra3vShGmhavjalMIhPNxZAUcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^1.0.2", + "@vitest/utils": "4.1.11", + "ast-v8-to-istanbul": "^1.0.0", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.2.0", + "magicast": "^0.5.2", + "obug": "^2.1.1", + "std-env": "^4.0.0-rc.1", + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "4.1.11", + "vitest": "4.1.11" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, "node_modules/@vitest/expect": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.8.tgz", - "integrity": "sha512-h3nDO677RDLEGlBxyQ5CW8RlMThSKSRLUePLOx09gNIWRL40edgA1GCZSZgf1W55MFAG6/Sw14KeaAnqv0NKdQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.11.tgz", + "integrity": "sha512-VX2x5vNJXET47KAFzwERI+KRMtTTCSWTfSMKsW7JsUsXV4psq++e3DvZpuTDOpHcxytiDs6p2nhVb2tVDiiUYw==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" }, @@ -3147,13 +3316,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.8.tgz", - "integrity": "sha512-LEiN/xe4OSIbKe9HQIp5OC24agGD9J5CnmMgsLohVVoOPWL9a2sBoR6VBx43jQZb7Kr1l4RCuyCJzcAa0+dojw==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.11.tgz", + "integrity": "sha512-2XJVD55d1o5AZous5CCGKS74g/riOj9odEt2bQpCVZeblHyHdnMeFl4jl0XjU21stf4mbjUkew2eXQZt65g5CQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.8", + "@vitest/spy": "4.1.11", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -3174,9 +3343,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.8.tgz", - "integrity": "sha512-9GasEBxpZ1VYIpqHf/0+YGg121uSNwCKOJqIrTwWP/TB7DmFCiaBpNl3aPZzoLWfWkuqhbH8vJIVobZkvdo2cA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.11.tgz", + "integrity": "sha512-yiZzPbGTS9Sr/JpFl8zHrcIkAofNbFV6k21vIgQN/cY/oxZeXhJv5sc/MBJ5jFKWmWs+oJHw0UXLZjmf931+Vw==", "dev": true, "license": "MIT", "dependencies": { @@ -3187,13 +3356,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.8.tgz", - "integrity": "sha512-EmVxeBAfMJvycdjd6Hm+RbFBbA9fKvo0Kx37hNpBYoYeavH3RNsBXWDooR1mgD52dCrxIIuP7UotpfiwOikvcg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.11.tgz", + "integrity": "sha512-LztvUgdwMNJMIkj3hQnnxiC2Xy1zNxq928W/xhjCLaNCzqTZOudjwbQf6v9IntZGPw132i2Lq2rgTRZHD3JHNw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.8", + "@vitest/utils": "4.1.11", "pathe": "^2.0.3" }, "funding": { @@ -3201,14 +3370,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.8.tgz", - "integrity": "sha512-acfZboRmAIf05DEKcBQy33VXojFJjtUdLyo7oOmV9kebb2xdU01UknNiPuPZoJZQyO7DF0gZdTGTpeAzET9QPQ==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.11.tgz", + "integrity": "sha512-pN7ikn1ON7h8ee4gIAp4AzyK+zBtJPzVbqOgu5LCEh4VaJVbPQcgYQYJIMGQPXVeJJq1fnfazis7a5pFNPahog==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.8", - "@vitest/utils": "4.1.8", + "@vitest/pretty-format": "4.1.11", + "@vitest/utils": "4.1.11", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -3217,9 +3386,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.8.tgz", - "integrity": "sha512-6EevtBp6OZOPF7bmz36HrGMeP3txgVSrgebWxHOafDXGkhIzfXK14f8KF6MuFfgXXUeHxmpD3BQxkV00/3s5mA==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.11.tgz", + "integrity": "sha512-apNa/prQy2qCeywhnixOHPRCgGNhvg7T4Dapfl1GahLp/R+uhBm5cPyFoNVyqsNd2h1nJxL6BqqdIjiABL60YA==", "dev": true, "license": "MIT", "funding": { @@ -3227,13 +3396,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.8.tgz", - "integrity": "sha512-uOJamYALNhfJ6iolExyQM40yIQwDqYnkKtQ5VCiSe17E33H0aQ/u+1GlRuz4LZBk6Mm3sg90G9hEbmEt37C1Zg==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.11.tgz", + "integrity": "sha512-zTCVGpyFsGWBhllOyKlTw/vnr6D9qxsfSDyfbyZmTyjHw5N/VuvzHpHoQjm2ZJzn4RJgx5w4r7V0er69CmLgPQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.8", + "@vitest/pretty-format": "4.1.11", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" }, @@ -3263,70 +3432,69 @@ } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, + "peer": true, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/antd": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/antd/-/antd-6.3.1.tgz", - "integrity": "sha512-8pRjvxitZFyrYAtgwml93Km7fCXjw9IeqlmzpIsusRsmO3eWFVrOMum6+0TsGCtR/WrXVnPwfsgrFg3ChzGCeA==", + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/antd/-/antd-6.6.3.tgz", + "integrity": "sha512-USnOxcOhWEQc65pHapSiCrZOijWef783XnqYZv8fuYIcYVoFxNxl6TsnsUhmoJyZheD/XwAx9CyO+hlyekDCQA==", "license": "MIT", "dependencies": { "@ant-design/colors": "^8.0.1", - "@ant-design/cssinjs": "^2.1.0", - "@ant-design/cssinjs-utils": "^2.1.1", + "@ant-design/cssinjs": "^2.1.2", + "@ant-design/cssinjs-utils": "^2.1.2", "@ant-design/fast-color": "^3.0.1", - "@ant-design/icons": "^6.1.0", + "@ant-design/icons": "^6.3.4", "@ant-design/react-slick": "~2.0.0", - "@babel/runtime": "^7.28.4", - "@rc-component/cascader": "~1.14.0", + "@babel/runtime": "^7.29.2", + "@rc-component/cascader": "~1.22.0", "@rc-component/checkbox": "~2.0.0", "@rc-component/collapse": "~1.2.0", - "@rc-component/color-picker": "~3.1.0", - "@rc-component/dialog": "~1.8.4", + "@rc-component/color-picker": "~3.1.1", + "@rc-component/dialog": "~1.10.0", "@rc-component/drawer": "~1.4.2", - "@rc-component/dropdown": "~1.0.2", - "@rc-component/form": "~1.6.2", - "@rc-component/image": "~1.6.0", - "@rc-component/input": "~1.1.2", + "@rc-component/dropdown": "~1.0.3", + "@rc-component/form": "~1.8.6", + "@rc-component/image": "~1.10.0", + "@rc-component/input": "~1.3.1", "@rc-component/input-number": "~1.6.2", - "@rc-component/mentions": "~1.6.0", - "@rc-component/menu": "~1.2.0", - "@rc-component/motion": "^1.3.1", + "@rc-component/listy": "~1.2.3", + "@rc-component/mentions": "~1.12.0", + "@rc-component/menu": "~1.5.0", + "@rc-component/motion": "^1.3.3", "@rc-component/mutate-observer": "^2.0.1", - "@rc-component/notification": "~1.2.0", - "@rc-component/pagination": "~1.2.0", - "@rc-component/picker": "~1.9.0", - "@rc-component/progress": "~1.0.2", - "@rc-component/qrcode": "~1.1.1", + "@rc-component/notification": "~2.0.8", + "@rc-component/pagination": "~1.4.0", + "@rc-component/picker": "~1.12.2", + "@rc-component/progress": "~1.0.3", + "@rc-component/qrcode": "~2.0.0", "@rc-component/rate": "~1.0.1", - "@rc-component/resize-observer": "^1.1.1", + "@rc-component/resize-observer": "^1.1.2", "@rc-component/segmented": "~1.3.0", - "@rc-component/select": "~1.6.12", - "@rc-component/slider": "~1.0.1", - "@rc-component/steps": "~1.2.2", + "@rc-component/select": "~1.10.1", + "@rc-component/slider": "~1.1.1", + "@rc-component/steps": "~1.2.3", "@rc-component/switch": "~1.0.3", - "@rc-component/table": "~1.9.1", - "@rc-component/tabs": "~1.7.0", - "@rc-component/textarea": "~1.1.2", - "@rc-component/tooltip": "~1.4.0", - "@rc-component/tour": "~2.3.0", - "@rc-component/tree": "~1.2.3", - "@rc-component/tree-select": "~1.8.0", - "@rc-component/trigger": "^3.9.0", - "@rc-component/upload": "~1.1.0", - "@rc-component/util": "^1.9.0", + "@rc-component/table": "~1.11.1", + "@rc-component/tabs": "~1.13.0", + "@rc-component/tooltip": "~1.5.2", + "@rc-component/tour": "~2.4.0", + "@rc-component/tree": "~1.4.0", + "@rc-component/tree-select": "~1.16.1", + "@rc-component/trigger": "^3.10.1", + "@rc-component/upload": "~1.1.1", + "@rc-component/util": "^1.13.0", "clsx": "^2.1.1", "dayjs": "^1.11.11", "scroll-into-view-if-needed": "^3.1.0", @@ -3353,6 +3521,16 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "license": "Python-2.0" }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -3363,6 +3541,25 @@ "node": ">=12" } }, + "node_modules/ast-v8-to-istanbul": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.6.tgz", + "integrity": "sha512-fvpl29helSO2w/z7utIbrkNXILdrLwDwAMH2I/zPKlGf5244+gf+B4cyS1sANcrPY2h+hWCGSgC8N61s/+AF9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^10.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -3435,9 +3632,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.11.20", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", - "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", + "version": "2.11.23", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.23.tgz", + "integrity": "sha512-le521dGVfxM7yRX0EikCoSz+rOK+hHzdDt/E7mG1jOJB/6WAAUuwVroLwaB7ApaUsz5Q0kFlDXLSA9MheUIfRQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -3460,9 +3657,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.8", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", - "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "version": "4.28.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.9.tgz", + "integrity": "sha512-EWazOblFYUvlGZcfGhPUPmYh3nikUxBVb+y9MJun5f3hBi812X+8MSQTujLBtgK3cf51fJWbWfOjyeO954d+Eg==", "dev": true, "funding": [ { @@ -3480,11 +3677,11 @@ ], "license": "MIT", "dependencies": { - "baseline-browser-mapping": "^2.11.12", - "caniuse-lite": "^1.0.30001809", - "electron-to-chromium": "^1.5.402", - "node-releases": "^2.0.53", - "update-browserslist-db": "^1.3.0" + "baseline-browser-mapping": "^2.11.20", + "caniuse-lite": "^1.0.30001810", + "electron-to-chromium": "^1.5.420", + "node-releases": "^2.0.54", + "update-browserslist-db": "^1.3.2" }, "bin": { "browserslist": "cli.js" @@ -3518,14 +3715,14 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" }, "engines": { @@ -3743,9 +3940,9 @@ "license": "MIT" }, "node_modules/dayjs": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "version": "1.11.23", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.23.tgz", + "integrity": "sha512-QDTCU0M0MxR3hQfnlDJfwekQiaanm1ubOD231u73WBckQ/fsamwRLiE2GBz6D3a/xF1NgfiDLJjXBa1hYOYTtQ==", "license": "MIT" }, "node_modules/debug": { @@ -3822,6 +4019,16 @@ "node": ">=0.4.0" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -3832,10 +4039,18 @@ "node": ">=8" } }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/dompurify": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.13.tgz", - "integrity": "sha512-2vmYIoqjze2d+kakP8S/nS5shfsl587kzwEjcGlTdiksUVgFHnFCsLYDVj/JNqJVOQZGSYBTmuycv0PodwmnMQ==", + "version": "3.4.15", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.15.tgz", + "integrity": "sha512-EUBjM+B+lkDE41iE82DDSCfkoPGfXx8IxFxPMjNzm/Uk4xDet77rTN9wqlxlVg71kK7XGuUMv6wUxJUwwv+Xyw==", "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { "@types/trusted-types": "^2.0.7" @@ -3865,9 +4080,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.420", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.420.tgz", - "integrity": "sha512-2yD6XreGusOfNV+dUcvipJEXc3n/n7fgr7996aszTG+YY5E4mqM4tOq/3uhP129cazL9YHbVWSpc79ePotWtPA==", + "version": "1.5.427", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.427.tgz", + "integrity": "sha512-n14zb3FdsChZ2BNobqNHAJMcP3ifFv4paox2LvCrfVAQcqGiSURgbJl+PfMpHVCNFkStnNc+RRVtPBTVW5PDgw==", "dev": true, "license": "ISC" }, @@ -3896,16 +4111,16 @@ } }, "node_modules/es-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz", - "integrity": "sha512-n27zTYMjYu1aj4MjCWzSP7G9r75utsaoc8m61weK+W8JMBGGQybd43GstCXZ3WNmSFtGT9wi59qQTW6mhTR5LQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.2.tgz", + "integrity": "sha512-poHGpORABojJJucnV9KbOavETW8lBVnphkW77ER5/BQ5Fz7oXSoCNek7IH3vR5nRjdsEz926ibFYX8KtLQmdyw==", "dev": true, "license": "MIT" }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -3949,9 +4164,9 @@ } }, "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz", + "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -4008,39 +4223,39 @@ } }, "node_modules/firebase": { - "version": "12.10.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-12.10.0.tgz", - "integrity": "sha512-tAjHnEirksqWpa+NKDUSUMjulOnsTcsPC1X1rQ+gwPtjlhJS572na91CwaBXQJHXharIrfj7sw/okDkXOsphjA==", + "version": "12.19.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-12.19.0.tgz", + "integrity": "sha512-kwXCLcI0ly2lkwygkbuRx6SsX3DSO96355YrWh9SWZ5ncsxK/y5cirn3sY6nZVSiBVE++2nL6Hchzu1EB8uohQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/ai": "2.9.0", - "@firebase/analytics": "0.10.20", - "@firebase/analytics-compat": "0.2.26", - "@firebase/app": "0.14.9", - "@firebase/app-check": "0.11.1", - "@firebase/app-check-compat": "0.4.1", - "@firebase/app-compat": "0.5.9", - "@firebase/app-types": "0.9.3", - "@firebase/auth": "1.12.1", - "@firebase/auth-compat": "0.6.3", - "@firebase/data-connect": "0.4.0", - "@firebase/database": "1.1.1", - "@firebase/database-compat": "2.1.1", - "@firebase/firestore": "4.12.0", - "@firebase/firestore-compat": "0.4.6", - "@firebase/functions": "0.13.2", - "@firebase/functions-compat": "0.4.2", - "@firebase/installations": "0.6.20", - "@firebase/installations-compat": "0.2.20", - "@firebase/messaging": "0.12.24", - "@firebase/messaging-compat": "0.2.24", - "@firebase/performance": "0.7.10", - "@firebase/performance-compat": "0.2.23", - "@firebase/remote-config": "0.8.1", - "@firebase/remote-config-compat": "0.2.22", - "@firebase/storage": "0.14.1", - "@firebase/storage-compat": "0.4.1", - "@firebase/util": "1.14.0" + "@firebase/ai": "2.16.0", + "@firebase/analytics": "0.10.25", + "@firebase/analytics-compat": "0.2.31", + "@firebase/app": "0.16.2", + "@firebase/app-check": "0.13.1", + "@firebase/app-check-compat": "0.4.7", + "@firebase/app-compat": "0.5.18", + "@firebase/app-types": "0.9.6", + "@firebase/auth": "1.13.6", + "@firebase/auth-compat": "0.6.11", + "@firebase/data-connect": "0.7.4", + "@firebase/database": "1.1.5", + "@firebase/database-compat": "2.1.7", + "@firebase/firestore": "4.17.2", + "@firebase/firestore-compat": "0.4.14", + "@firebase/functions": "0.14.0", + "@firebase/functions-compat": "0.5.0", + "@firebase/installations": "0.6.24", + "@firebase/installations-compat": "0.2.24", + "@firebase/messaging": "0.13.3", + "@firebase/messaging-compat": "0.2.30", + "@firebase/performance": "0.7.14", + "@firebase/performance-compat": "0.2.27", + "@firebase/remote-config": "0.9.2", + "@firebase/remote-config-compat": "0.2.29", + "@firebase/storage": "0.14.5", + "@firebase/storage-compat": "0.4.5", + "@firebase/util": "1.15.3" } }, "node_modules/follow-redirects": { @@ -4103,9 +4318,9 @@ } }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -4194,6 +4409,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", @@ -4290,6 +4515,13 @@ "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==", "license": "CC0-1.0" }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, "node_modules/http-parser-js": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", @@ -4336,11 +4568,21 @@ "license": "BSD-3-Clause" }, "node_modules/immutable": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.9.tgz", - "integrity": "sha512-ObHy4YN7ycwZOUCLI1/6svfyAFu7vL8RhAvVu/bh/RZW9EPlOyDaQ9jDQWCtdqzaXUjgXZCW1migtHE7YI7UGQ==", + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", + "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", "license": "MIT" }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -4448,6 +4690,45 @@ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "license": "MIT" }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/js-file-download": { "version": "0.4.12", "resolved": "https://registry.npmjs.org/js-file-download/-/js-file-download-0.4.12.tgz", @@ -4461,9 +4742,9 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", - "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", "funding": [ { "type": "github", @@ -4518,9 +4799,9 @@ } }, "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -4534,23 +4815,23 @@ "url": "https://opencollective.com/parcel" }, "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-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" } }, "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", "cpu": [ "arm64" ], @@ -4569,9 +4850,9 @@ } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", "cpu": [ "arm64" ], @@ -4590,9 +4871,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", "cpu": [ "x64" ], @@ -4611,9 +4892,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", "cpu": [ "x64" ], @@ -4632,9 +4913,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", "cpu": [ "arm" ], @@ -4653,13 +4934,16 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4674,13 +4958,16 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4695,13 +4982,16 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4716,13 +5006,16 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4737,9 +5030,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", "cpu": [ "arm64" ], @@ -4758,9 +5051,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", "cpu": [ "x64" ], @@ -4838,6 +5131,17 @@ "yallist": "^3.0.2" } }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, "node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", @@ -4848,6 +5152,47 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/magicast": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.5.tgz", + "integrity": "sha512-UicdXN8zQ3JHlxVq+28afMXPr1z7WNY6+7EJnzTdQWkTAlMLF5fNCCKxJHBQwGaNGR11581EiQmQzx73+MvszA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "source-map-js": "^1.2.1" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -4878,6 +5223,16 @@ "node": ">= 0.6" } }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/minim": { "version": "0.23.8", "resolved": "https://registry.npmjs.org/minim/-/minim-0.23.8.tgz", @@ -4905,6 +5260,16 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -4912,9 +5277,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.18", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", - "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "version": "3.3.19", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", "dev": true, "funding": [ { @@ -4968,9 +5333,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.54", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", - "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", + "version": "2.0.55", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.55.tgz", + "integrity": "sha512-mIrE/Cw9y+9Au6dS5vDKDhQza9YvG6w+ZrS6X+ZzA7yFW/soAeaups4Qzn1bL6g5FVy8WtP79+0j82oPIbqRjQ==", "dev": true, "license": "MIT", "engines": { @@ -4987,15 +5352,18 @@ } }, "node_modules/obug": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz", - "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/obug/-/obug-2.2.1.tgz", + "integrity": "sha512-XrsrhT5sybtKI6wakr2SPOlGZWWYbUXZ7a0jT8/QOeAPau+1X/bSegNe5YR75oJmEZQbKningirmGOEJCIk61Q==", "dev": true, "funding": [ "https://github.com/sponsors/sxzz", "https://opencollective.com/debug" ], - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } }, "node_modules/openapi-path-templating": { "version": "2.2.1", @@ -5061,9 +5429,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", "engines": { @@ -5074,35 +5442,42 @@ } }, "node_modules/playwright": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", - "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.63.0.tgz", + "integrity": "sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.2" + "playwright-core": "1.63.0" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "fsevents": "2.3.2" + "node": ">=20" } }, "node_modules/playwright-core": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", - "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "version": "1.63.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.63.0.tgz", + "integrity": "sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==", "dev": true, "license": "Apache-2.0", "bin": { "playwright-core": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=20" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" } }, "node_modules/possible-typed-array-names": { @@ -5115,9 +5490,9 @@ } }, "node_modules/postcss": { - "version": "8.5.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", - "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", + "version": "8.5.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", "dev": true, "funding": [ { @@ -5135,7 +5510,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.16", + "nanoid": "^3.3.18", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -5143,6 +5518,30 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", @@ -5170,9 +5569,9 @@ "license": "MIT" }, "node_modules/property-information": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", - "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.2.0.tgz", + "integrity": "sha512-IAtzIB6sUiWaJYrX9smp3V46pBGbBeLFRGdh25kg1334VcBlD8HzhPeNIWQH9zhGmo2itIe25EHt9dQP7G5hmg==", "license": "MIT", "funding": { "type": "github", @@ -5180,9 +5579,9 @@ } }, "node_modules/protobufjs": { - "version": "7.6.5", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.5.tgz", - "integrity": "sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw==", + "version": "7.6.6", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.6.6.tgz", + "integrity": "sha512-dYDWdjSl5RNb7SgPxGQcRU+GtvP7s2fpkrY0r432PcOIaZ0/rBcxEZnQN67iJhFuQiVw754JDoPruPCNdGsbjg==", "hasInstallScript": true, "license": "BSD-3-Clause", "dependencies": { @@ -5265,12 +5664,20 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/re2js": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/re2js/-/re2js-2.8.6.tgz", + "integrity": "sha512-xLgQil4kIUCrAzVk9fRSkxkFNwmygLFjVxXrLc65aE1F0+Zsb8rxumFBy4XKyvgMCTL6kilDq3EZ0piE2dP/Dg==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/react": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", - "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.3.0.tgz", + "integrity": "sha512-E8LUcbtBWt20bbl2YoHfx4ZDBdxVTfOKtCZn9cDSJ4l6/nuoApcpIBcj47t2wZoVX8g2ZHuMHbiShgCR1T5Sog==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -5289,16 +5696,15 @@ } }, "node_modules/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.3.0.tgz", + "integrity": "sha512-JDk8dgif51OjFoDE70+OT9ICyYr+69HlmihNwp1+Nsfbna3t5sIiCa9ZJktDmQ4/1b/rn26hIAR2uYXDMr5r0Q==", "license": "MIT", - "peer": true, "dependencies": { - "scheduler": "^0.27.0" + "scheduler": "^0.28.0" }, "peerDependencies": { - "react": "^19.2.4" + "react": "^19.3.0" } }, "node_modules/react-immutable-proptypes": { @@ -5325,9 +5731,9 @@ } }, "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.3.0.tgz", + "integrity": "sha512-UpMYezM4v5/18F28aC66AEsjXIgE02kyEMH6yLdgLXu/UTfa1Ntwck/nNLrbqJsEXW7gPb0coNO9FQse9WTovA==", "license": "MIT" }, "node_modules/react-redux": { @@ -5363,15 +5769,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-social-login-buttons": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/react-social-login-buttons/-/react-social-login-buttons-4.1.1.tgz", - "integrity": "sha512-GEFP+QmW9y9wSfEVrlvKDtfh1mMI4Nj1XO+Di727ND22h1+g1tYbQSydz26nNq6IKnHqe7bJiJ10sqBKm39DQg==", - "license": "ISC", - "peerDependencies": { - "react": "^16.0.0 || ^17.x || ^18.x || ^19.x" - } - }, "node_modules/react-syntax-highlighter": { "version": "16.1.1", "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-16.1.1.tgz", @@ -5392,21 +5789,26 @@ "react": ">= 0.14.0" } }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==", "license": "MIT" }, - "node_modules/redux-immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/redux-immutable/-/redux-immutable-4.0.0.tgz", - "integrity": "sha512-SchSn/DWfGb3oAejd+1hhHx01xUoxY+V7TeK0BKqpkLKiQPVFf7DYzEaKmrEVxsWxielKfSK9/Xq66YyxgR1cg==", - "license": "BSD-3-Clause", - "peerDependencies": { - "immutable": "^3.8.1 || ^4.0.0-rc.1" - } - }, "node_modules/refractor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/refractor/-/refractor-5.0.0.tgz", @@ -5473,9 +5875,9 @@ "license": "MIT" }, "node_modules/reselect": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz", - "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.3.0.tgz", + "integrity": "sha512-XGoLeRAVzUTcJ1qkxPQhDJyIZ5d6zzZD9nT7AEZOaaU9UbWclhycElmhO+VD5bFeLuzhPBaOV2oXC8uG35ZSpg==", "license": "MIT" }, "node_modules/ret": { @@ -5488,13 +5890,13 @@ } }, "node_modules/rolldown": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.3.tgz", - "integrity": "sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.8.tgz", + "integrity": "sha512-Z67nTmhZe7anqnM/EjI392w5i/ANUinjip7QYsOyN37oayduxt3ksdX0hf5OOamkAd53BiIHfbfSzfUmzKFQqQ==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.133.0", + "@oxc-project/types": "=0.149.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -5504,21 +5906,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.3", - "@rolldown/binding-darwin-arm64": "1.0.3", - "@rolldown/binding-darwin-x64": "1.0.3", - "@rolldown/binding-freebsd-x64": "1.0.3", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.3", - "@rolldown/binding-linux-arm64-gnu": "1.0.3", - "@rolldown/binding-linux-arm64-musl": "1.0.3", - "@rolldown/binding-linux-ppc64-gnu": "1.0.3", - "@rolldown/binding-linux-s390x-gnu": "1.0.3", - "@rolldown/binding-linux-x64-gnu": "1.0.3", - "@rolldown/binding-linux-x64-musl": "1.0.3", - "@rolldown/binding-openharmony-arm64": "1.0.3", - "@rolldown/binding-wasm32-wasi": "1.0.3", - "@rolldown/binding-win32-arm64-msvc": "1.0.3", - "@rolldown/binding-win32-x64-msvc": "1.0.3" + "@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" } }, "node_modules/rolldown/node_modules/@rolldown/pluginutils": { @@ -5549,11 +5951,10 @@ "license": "MIT" }, "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT", - "peer": true + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.28.0.tgz", + "integrity": "sha512-juorfCmIkIw8tT+p5BXSm6PJjQF/ycEYmKyzURCIt/RaZIhL+PulbQ9Yu2z1HdOJDdqDTlxA1+xKBmHXJsczAw==", + "license": "MIT" }, "node_modules/scroll-into-view-if-needed": { "version": "3.1.0", @@ -5643,6 +6044,21 @@ "dev": true, "license": "ISC" }, + "node_modules/sirv": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz", + "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -5677,9 +6093,9 @@ "license": "MIT" }, "node_modules/std-env": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.1.0.tgz", - "integrity": "sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", + "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", "dev": true, "license": "MIT" }, @@ -5715,12 +6131,38 @@ "node": ">=8" } }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/stylis": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", - "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", "license": "MIT" }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/swagger-client": { "version": "3.38.0", "resolved": "https://registry.npmjs.org/swagger-client/-/swagger-client-3.38.0.tgz", @@ -5774,9 +6216,9 @@ } }, "node_modules/swagger-ui-react": { - "version": "5.32.14", - "resolved": "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-5.32.14.tgz", - "integrity": "sha512-6LAVBeC78DplbJ7kutm/YeBYo22nPzGOca4bIZAvQG4w2eSetnYDdazaUfY0qzQUlg/H90HnYZX3rg67EmENOw==", + "version": "5.32.15", + "resolved": "https://registry.npmjs.org/swagger-ui-react/-/swagger-ui-react-5.32.15.tgz", + "integrity": "sha512-QyCcnHLE2KGE+mMZNSwMABU9jV70OUtSIs6UrYgTXzG2eUSm75CqumNWuwD3QBn3S4F7FhmDNPb3di9kAvcFAw==", "license": "Apache-2.0", "dependencies": { "@babel/runtime-corejs3": "^7.27.1", @@ -5788,7 +6230,7 @@ "deep-extend": "0.6.0", "dompurify": "^3.4.13", "ieee754": "^1.2.1", - "immutable": "^4.3.9", + "immutable": "^5.1.9", "js-file-download": "^0.4.12", "js-yaml": "=4.3.1", "lodash": "^4.18.1", @@ -5803,7 +6245,6 @@ "react-redux": "^9.3.0", "react-syntax-highlighter": "^16.0.0", "redux": "^5.0.1", - "redux-immutable": "^4.0.0", "remarkable": "^2.0.1", "reselect": "^5.1.1", "serialize-error": "^8.1.0", @@ -5819,6 +6260,28 @@ "react-dom": ">=16.8.0 <20" } }, + "node_modules/swagger-ui-react/node_modules/js-yaml": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/swagger-ui-react/node_modules/react-debounce-input": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/react-debounce-input/-/react-debounce-input-3.3.0.tgz", @@ -5858,9 +6321,9 @@ "license": "MIT" }, "node_modules/tinyexec": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", - "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", + "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", "dev": true, "license": "MIT", "engines": { @@ -5885,9 +6348,9 @@ } }, "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz", + "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==", "dev": true, "license": "MIT", "engines": { @@ -5914,6 +6377,16 @@ "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==", "license": "MIT" }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/tree-sitter": { "version": "0.21.1", "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.21.1.tgz", @@ -6014,9 +6487,9 @@ } }, "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", "license": "MIT" }, "node_modules/unraw": { @@ -6026,9 +6499,9 @@ "license": "MIT" }, "node_modules/update-browserslist-db": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", - "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.3.tgz", + "integrity": "sha512-pJ2sYawQS0R/WI928Gj5GlPhTGzbMelq0+4INtSYNDV9ErKJcX6xjGWkoG/VnB3dpUm00zALaqkrUD77pO5TDQ==", "dev": true, "funding": [ { @@ -6067,25 +6540,25 @@ } }, "node_modules/use-sync-external-store": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", - "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.7.0.tgz", + "integrity": "sha512-6L+EeigHMQhdaIPNIFUKwfWJSwWFQ8gJbJ2DLOs5sDIegTwR9fRxvnM3uciHKjIZhFz+KAv2emhWMRvDmMcY8A==", "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/vite": { - "version": "8.0.16", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.16.tgz", - "integrity": "sha512-h9bXPmJichP5fLmVQo3PyaGSDE2n3aPuomeAlVRm0JLmt4rY6zmPKd59HYI4LNW8oTK7tlTsuC7l/m7awx9Jcw==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.0.tgz", + "integrity": "sha512-lhZBVvEHefgE+HQZC9O7EBJgCU/nVzFNl7vkS4RE0APtWLP02/8QVIkQtzBxPquh7lq5/78NHipTj7ODQ6XuyQ==", "dev": true, "license": "MIT", "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.15", - "rolldown": "1.0.3", + "lightningcss": "^1.33.0", + "picomatch": "^4.0.7", + "postcss": "^8.5.28", + "rolldown": "~1.2.6", "tinyglobby": "^0.2.17" }, "bin": { @@ -6102,7 +6575,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.18", + "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -6153,35 +6626,20 @@ } } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/vitest": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.8.tgz", - "integrity": "sha512-flY6ScbCIt9HThs+C5HS7jvGOB560DJtk/Z15IQROTA6zEy49Nh8T/dofWTQL+n3vswqn87sbJNiuqw1SDp5Ig==", + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.11.tgz", + "integrity": "sha512-fhACrNXUidIbGSBr5FlbuBkO7VWC1ZyLl0DO4CU2DrQoAPxX84Ysxs+HeGQpii5lZWV1Q4gBZTTu49mF+A6Edw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.8", - "@vitest/mocker": "4.1.8", - "@vitest/pretty-format": "4.1.8", - "@vitest/runner": "4.1.8", - "@vitest/snapshot": "4.1.8", - "@vitest/spy": "4.1.8", - "@vitest/utils": "4.1.8", + "@vitest/expect": "4.1.11", + "@vitest/mocker": "4.1.11", + "@vitest/pretty-format": "4.1.11", + "@vitest/runner": "4.1.11", + "@vitest/snapshot": "4.1.11", + "@vitest/spy": "4.1.11", + "@vitest/utils": "4.1.11", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -6209,12 +6667,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.8", - "@vitest/browser-preview": "4.1.8", - "@vitest/browser-webdriverio": "4.1.8", - "@vitest/coverage-istanbul": "4.1.8", - "@vitest/coverage-v8": "4.1.8", - "@vitest/ui": "4.1.8", + "@vitest/browser-playwright": "4.1.11", + "@vitest/browser-preview": "4.1.11", + "@vitest/browser-webdriverio": "4.1.11", + "@vitest/coverage-istanbul": "4.1.11", + "@vitest/coverage-v8": "4.1.11", + "@vitest/ui": "4.1.11", "happy-dom": "*", "jsdom": "*", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -6259,9 +6717,9 @@ } }, "node_modules/vitest-browser-react": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/vitest-browser-react/-/vitest-browser-react-2.0.5.tgz", - "integrity": "sha512-YODQX8mHTJCyKNVYTWJrLEYrUtw+QfLl78owgvuE7C5ydgmGBq6v5s4jK2w6wdPhIZsN9PpV1rQbmAevWJjO9g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/vitest-browser-react/-/vitest-browser-react-2.3.0.tgz", + "integrity": "sha512-S5vdGHHA93j2Z6dbmIJI1wtxT3AXPTRlmC1Meo+ekG011yNnEutMAnHrwyj8qFlGhgBYA8ENGK6+o1Q+vnFz6A==", "dev": true, "license": "MIT", "funding": { @@ -6272,7 +6730,7 @@ "@types/react-dom": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0", - "vitest": "^4.0.0" + "vitest": "^4.0.0 || ^5.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -6320,13 +6778,13 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.20", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.20.tgz", - "integrity": "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==", + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", @@ -6374,6 +6832,43 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", @@ -6406,9 +6901,9 @@ "license": "ISC" }, "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", "license": "MIT", "dependencies": { "cliui": "^8.0.1", diff --git a/package.json b/package.json index ca35414..6ebcb83 100644 --- a/package.json +++ b/package.json @@ -3,15 +3,28 @@ "version": "0.1.0", "private": true, "dependencies": { + "@ant-design/icons": "^6.1.0", "antd": "^6.3.1", "firebase": "^12.10.0", - "react-social-login-buttons": "^4.1.1", - "swagger-ui-react": "^5.32.11" + "react": "^19.2.4", + "react-dom": "^19.2.4", + "swagger-ui-react": "^5.32.15" }, "scripts": { "dev": "vite", "build": "vite build", - "preview": "vite preview" + "preview": "vite preview", + "spec": "node ./scripts/downloadYML.js", + "predev": "node ./scripts/checkSpec.js && npm run lint", + "prebuild": "node ./scripts/checkSpec.js && npm run lint", + "verify": "npm run lint && npm run typecheck && npm run test:coverage", + "typecheck": "tsc -p tsconfig.app.json --noEmit", + "test": "vitest run --config vitetest.config.ts", + "test:watch": "vitest --config vitetest.config.ts", + "test:coverage": "vitest run --config vitetest.config.ts --coverage", + "lint:colors": "node ./scripts/checkColorTokens.js", + "lint:theme": "node ./scripts/checkThemeSource.js", + "lint": "npm run lint:colors && npm run lint:theme" }, "browserslist": { "production": [ @@ -26,10 +39,13 @@ ] }, "devDependencies": { + "@testing-library/jest-dom": "^7.0.1", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", "@types/swagger-ui-react": "^5.18.0", "@vitejs/plugin-react": "^5.2.0", + "@vitest/browser-playwright": "^4.1.8", + "@vitest/coverage-v8": "^4.1.11", "follow-redirects": "^1.16.0", "js-yaml": "^4.3.1", "playwright": "^1.58.2", @@ -37,5 +53,9 @@ "vite": "^8.0.16", "vitest": "^4.1.8", "vitest-browser-react": "^2.0.5" + }, + "engines": { + "node": "^22.12.0 || >=24.0.0", + "npm": ">=10.0.0" } } diff --git a/scripts/checkColorTokens.js b/scripts/checkColorTokens.js new file mode 100644 index 0000000..e14a1f9 --- /dev/null +++ b/scripts/checkColorTokens.js @@ -0,0 +1,68 @@ +#!/usr/bin/env node +/** + * Guard: colour literals belong in src/theme.ts and nowhere else. + * + * "Re-theming requires touching only the theme file" is not something you can + * assert by eye once a codebase grows. This makes it a build failure: any hex or + * rgb()/rgba() colour outside the theme module fails the check. + * + * Test files are exempt - they legitimately assert against specific colours and + * simulate re-theming with substitute values. + */ +const fs = require("node:fs"); +const path = require("node:path"); + +const SRC = path.join(__dirname, "..", "src"); +const ALLOWED = [ + path.join("src", "theme.ts").toLowerCase(), + path.join("src", "wcag.ts").toLowerCase(), +]; + +const COLOR_PATTERNS = [ + /#(?:[0-9a-f]{3}|[0-9a-f]{4}|[0-9a-f]{6}|[0-9a-f]{8})\b/gi, + /\brgba?\s*\(/gi, +]; + +function* walk(dir) { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) { + if (entry.name === "node_modules" || entry.name === "__screenshots__") continue; + yield* walk(full); + } else if (/\.(css|ts|tsx|js|jsx)$/.test(entry.name)) { + yield full; + } + } +} + +const violations = []; + +for (const file of walk(SRC)) { + const rel = path.relative(path.join(__dirname, ".."), file).toLowerCase(); + if (ALLOWED.includes(rel)) continue; + if (/\.test\.[cm]?[jt]sx?$/.test(rel)) continue; + + const lines = fs.readFileSync(file, "utf8").split(/\r?\n/); + lines.forEach((line, i) => { + for (const pattern of COLOR_PATTERNS) { + pattern.lastIndex = 0; + if (pattern.test(line)) { + violations.push(`${rel}:${i + 1}: ${line.trim()}`); + } + } + }); +} + +if (violations.length) { + console.error( + "\n[checkColorTokens] Hardcoded colour found outside the theme module.\n" + + "Brand/accent colours must come from src/theme.ts so re-theming stays a\n" + + "one-file change. Move the value into the palette and reference it via a\n" + + "CSS custom property or an antd token.\n\n", + ); + for (const v of violations) console.error(" " + v); + console.error(`\n ${violations.length} violation(s)\n`); + process.exit(1); +} + +console.log("[checkColorTokens] OK - no colour literals outside src/theme.ts"); diff --git a/scripts/checkSpec.js b/scripts/checkSpec.js new file mode 100644 index 0000000..38dfed5 --- /dev/null +++ b/scripts/checkSpec.js @@ -0,0 +1,45 @@ +#!/usr/bin/env node +/** + * Pre-flight check for the generated OpenAPI spec. + * + * `src/swagger_spec.json` is git-ignored but imported by `src/App.tsx`. Without it, + * Vite fails with a bare "Could not resolve ./swagger_spec.json" that tells a new + * contributor nothing about the actual fix. This script runs as the `prebuild` / + * `predev` hook so the failure names the remedy instead. + */ +const fs = require("fs"); +const path = require("path"); + +const SPEC_PATH = path.join(__dirname, "..", "src", "swagger_spec.json"); +const HOW_TO_FIX = "Run `npm run spec` to generate it (see README.md)."; + +function fail(problem) { + console.error(`\n✗ Missing required build input: src/swagger_spec.json`); + console.error(` ${problem}`); + console.error(` ${HOW_TO_FIX}\n`); + process.exit(1); +} + +if (!fs.existsSync(SPEC_PATH)) { + fail("The file does not exist. It is generated, not committed."); +} + +const raw = fs.readFileSync(SPEC_PATH, "utf8"); +if (raw.trim() === "") { + fail("The file is empty — the previous generation probably failed."); +} + +let spec; +try { + spec = JSON.parse(raw); +} catch (error) { + fail(`The file is not valid JSON: ${error.message}`); +} + +if (!spec || typeof spec !== "object" || Object.keys(spec.paths || {}).length === 0) { + fail('The file parses but contains no "paths" — it is not a usable OpenAPI document.'); +} + +console.log( + `✓ src/swagger_spec.json present (${Object.keys(spec.paths).length} paths, ${raw.length} bytes).`, +); diff --git a/scripts/checkThemeSource.js b/scripts/checkThemeSource.js new file mode 100644 index 0000000..051dbbb --- /dev/null +++ b/scripts/checkThemeSource.js @@ -0,0 +1,77 @@ +#!/usr/bin/env node +/** + * Guard: the browser's theme preference is read in exactly one place. + * + * `src/theme.ts` owns `localStorage` and `matchMedia` access for theme purposes. + * Everywhere else must take the already-resolved mode as a value. + * + * Why this needs a guard rather than a convention: index.tsx and App.tsx used to + * each resolve the mode independently, and each wrapped the read differently + * (`globalThis.localStorage?.getItem` vs `typeof localStorage === "undefined" ? + * ... : ...`). Both worked, so nothing signalled the duplication - but the two + * results feed different things (CSS custom properties vs the antd header/menu + * scheme), so editing one and not the other produces a theme that half-updates. + * That is a nasty class of bug to diagnose and a cheap one to forbid. + * + * Test files are exempt: they legitimately stub storage to drive both branches. + * readThemeMode takes its environment as an argument specifically so tests do not + * have to touch real globals. + */ +const fs = require("node:fs"); +const path = require("node:path"); + +const SRC = path.join(__dirname, "..", "src"); +const ALLOWED = ["theme.ts"]; + +const FORBIDDEN = [ + { pattern: /\blocalStorage\b/, name: "localStorage" }, + { pattern: /\bsessionStorage\b/, name: "sessionStorage" }, + { pattern: /\bmatchMedia\b/, name: "matchMedia" }, +]; + +function* walk(dir) { + for (const entry of fs.readdirSync(dir, { withFileTypes: true })) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) { + if (entry.name === "node_modules" || entry.name === "__screenshots__") continue; + yield* walk(full); + } else if (/\.(css|ts|tsx|js|jsx)$/.test(entry.name)) { + yield full; + } + } +} + +const violations = []; + +for (const file of walk(SRC)) { + const base = path.basename(file).toLowerCase(); + if (ALLOWED.includes(base)) continue; + if (/\.test\.[cm]?[jt]sx?$/.test(base)) continue; + + const rel = path.relative(path.join(__dirname, ".."), file); + const lines = fs.readFileSync(file, "utf8").split(/\r?\n/); + lines.forEach((line, i) => { + for (const { pattern, name } of FORBIDDEN) { + if (pattern.test(line)) { + violations.push(`${rel}:${i + 1}: ${name} -> ${line.trim()}`); + } + } + }); +} + +if (violations.length) { + console.error( + "\n[checkThemeSource] Browser storage/system-preference access outside src/theme.ts.\n\n" + + "The theme mode must be read once, in src/theme.ts (readThemeMode), and passed\n" + + "down as a value. Two components resolving it independently can drift apart:\n" + + "they feed different sinks (CSS custom properties vs antd tokens), so a\n" + + "half-updated theme looks like a styling bug rather than a wiring bug.\n\n", + ); + for (const v of violations) console.error(" " + v); + console.error(`\n ${violations.length} violation(s)\n`); + process.exit(1); +} + +console.log( + "[checkThemeSource] OK - browser theme reads confined to src/theme.ts", +); diff --git a/scripts/downloadYML.js b/scripts/downloadYML.js index c8c6244..c4295ef 100644 --- a/scripts/downloadYML.js +++ b/scripts/downloadYML.js @@ -1,43 +1,141 @@ +#!/usr/bin/env node +/** + * Bootstrap the OpenAPI spec this app renders. + * + * `src/swagger_spec.json` is a GENERATED artifact and is git-ignored, yet `src/App.tsx` + * imports it. A fresh clone therefore cannot build until this script has been run once: + * + * npm run spec + * + * It downloads `openapi_gcp.yml` from the latest release of + * `realoptions/option_price_faas`, converts it to JSON, and writes it to + * `src/swagger_spec.json`. + * + * A GitHub token is OPTIONAL — it is only needed if the source repo is private or the + * anonymous API rate limit is being hit: + * + * ACCESS_TOKEN=ghp_xxx npm run spec + * + * `scripts/releases.json` (also git-ignored) is fetched automatically when absent, so + * no manual `curl` step is required. + */ +const fs = require("fs"); const path = require("path"); const { https } = require("follow-redirects"); -const fs = require("fs"); -const process = require("process"); -const cwd = process.cwd(); -const releasePath = path.join(cwd, "scripts", "releases.json"); -const { assets } = require(releasePath); -const { access_token } = process.env; -const assetName = "openapi_gcp.yml"; const yaml = require("js-yaml"); -const asset = assets.find((val) => val.name === assetName); -const writePath = path.join(cwd, assetName); -const jsonPath = path.join(cwd, "src", "swagger_spec.json"); -const file = fs.createWriteStream(writePath); -https - .get( - asset.browser_download_url, - { - headers: { - Authorization: `token ${access_token}`, - }, - }, - (response, err) => { - if (err) { - return console.log(err); - } - response.pipe(file); - file.on("finish", () => { - file.close(); - const jsobj = yaml.load(fs.readFileSync(writePath, "utf8")); - fs.writeFile(jsonPath, JSON.stringify(jsobj), "utf8", (err) => { - if (err) console.log(err); - fs.unlink(writePath, () => console.log("done")); - }); - }); - }, - ) - .on("error", function (err) { - // Handle errors - fs.unlink(writePath, () => console.log("deleted")); // Delete the file async. (But we don't check the result) - console.log(err); +const ROOT = path.resolve(__dirname, ".."); +const RELEASES_PATH = path.join(__dirname, "releases.json"); +const SPEC_PATH = path.join(ROOT, "src", "swagger_spec.json"); + +const RELEASE_REPO = "realoptions/option_price_faas"; +const RELEASE_API = `https://api.github.com/repos/${RELEASE_REPO}/releases/latest`; +const ASSET_NAME = "openapi_gcp.yml"; +const USER_AGENT = "developer_site-spec-bootstrap"; + +const accessToken = process.env.ACCESS_TOKEN || process.env.access_token; + +const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); + +function get(url) { + return new Promise((resolve, reject) => { + const headers = { "User-Agent": USER_AGENT }; + if (accessToken) headers.Authorization = `token ${accessToken}`; + https + .get(url, { headers }, (res) => { + const chunks = []; + res.on("data", (chunk) => chunks.push(chunk)); + res.on("end", () => + resolve({ + status: res.statusCode, + body: Buffer.concat(chunks).toString("utf8"), + }), + ); + }) + .on("error", reject); }); +} + +async function getWithRetry(url, attempts = 3) { + let lastError; + for (let attempt = 1; attempt <= attempts; attempt += 1) { + try { + const response = await get(url); + if (response.status >= 200 && response.status < 300) return response; + const hint = + response.status === 401 && accessToken + ? " — ACCESS_TOKEN was rejected." + : response.status === 403 && !accessToken + ? " — GitHub rate-limits unauthenticated requests; set ACCESS_TOKEN and retry." + : response.status === 404 + ? ` — is ${RELEASE_REPO} reachable, and does it have a release?` + : ""; + lastError = new Error(`HTTP ${response.status} for ${url}${hint}`); + } catch (error) { + lastError = error; + } + if (attempt < attempts) await sleep(1000 * attempt); + } + throw lastError; +} + +/** Load the cached release metadata, fetching it if it is missing or unreadable. */ +async function loadRelease() { + if (fs.existsSync(RELEASES_PATH)) { + try { + const cached = JSON.parse(fs.readFileSync(RELEASES_PATH, "utf8")); + if (cached && Array.isArray(cached.assets)) { + console.log(`Using cached release metadata: ${cached.tag_name}`); + return cached; + } + } catch { + console.log("Cached scripts/releases.json is unreadable; re-fetching."); + } + } + console.log(`Fetching latest release metadata from ${RELEASE_REPO}...`); + const response = await getWithRetry(RELEASE_API); + const release = JSON.parse(response.body); + fs.writeFileSync(RELEASES_PATH, response.body, "utf8"); + return release; +} + +async function main() { + const release = await loadRelease(); + const asset = (release.assets || []).find((item) => item.name === ASSET_NAME); + if (!asset) { + throw new Error( + `Release asset "${ASSET_NAME}" not found on ${release.tag_name}. ` + + `Available: ${(release.assets || []).map((a) => a.name).join(", ") || "none"}`, + ); + } + + console.log(`Downloading ${ASSET_NAME} (${asset.size} bytes) from ${release.tag_name}...`); + const download = await getWithRetry(asset.browser_download_url); + + let parsed; + try { + parsed = yaml.load(download.body); + } catch (error) { + throw new Error( + `Failed to parse ${ASSET_NAME} as YAML: ${error.message}. ` + + `The release asset may be corrupt or truncated.`, + ); + } + if (!parsed || typeof parsed !== "object" || !parsed.paths) { + throw new Error( + `Parsed ${ASSET_NAME} has no "paths" section — this does not look like an OpenAPI document.`, + ); + } + + fs.writeFileSync(SPEC_PATH, JSON.stringify(parsed), "utf8"); + console.log( + `Wrote ${SPEC_PATH} (${Object.keys(parsed.paths).length} paths, ` + + `${fs.statSync(SPEC_PATH).size} bytes). You can now run \`npm run dev\` or \`npm run build\`.`, + ); +} + +main().catch((error) => { + console.error(`\n✗ ${error.message}`); + console.error(" See the header of scripts/downloadYML.js or README.md for details."); + process.exitCode = 1; +}); diff --git a/src/App.css b/src/App.css index ffdfee4..0d76601 100644 --- a/src/App.css +++ b/src/App.css @@ -1,13 +1,131 @@ -.App { +/* + * App shell layout. + * + * Flexbox throughout. The previous version relied on CSS floats for both the + * logo (floated leading) and the header menu (floated trailing), which took + * them out of normal flow: nothing contained the floats, so the logo needed a + * hand-computed `paddingTop: (64 - 50) / 2` to look vertically centred, and + * the trailing menu could collide with the brand instead of being pushed away + * from it. + * + * All dimensions come from the tokens declared in src/index.css. + */ + +/* + * Brand mark colour. The value comes from src/theme.ts, applied to the document + * element by src/index.tsx - there is deliberately no fallback hex here, so a + * missing token shows up as a visibly wrong colour instead of quietly keeping the + * old one and letting a hardcoded value survive outside the theme file. + */ +.logo-primary { + fill: var(--brand-accent); +} + +/* + * antd applies border-box to its own components, but there is no global reset in + * this project, so our own elements would fall back to content-box: width 100% + * plus any horizontal padding would overflow the viewport. Scoped to our classes + * on purpose - a global `*` reset would reach into Swagger UI, whose layout we do + * not own. + */ +.app-shell, +.app-header, +.app-logo, +.app-menu, +.app-content, +.app-footer, +.login-panel, +.login-provider-list, +.login-provider-button, +.auth-loading, +.config-error { + box-sizing: border-box; +} + +.app-shell { + /* dvh tracks the real viewport on mobile browsers whose chrome shrinks on + scroll; vh overflows there. */ + min-height: 100vh; + min-height: 100dvh; +} + +.app-header { + display: flex; + align-items: center; + gap: var(--space-md); + height: var(--header-height); + padding-inline: var(--gutter); + background: var(--header-bg); + color: var(--header-text); +} + +.app-logo { + /* Never squeezed by the menu; the logo keeps its square aspect. */ + flex: none; + inline-size: var(--logo-size); + block-size: var(--logo-size); + display: block; +} + +/* + * margin-inline-start:auto is what replaces the trailing float. It absorbs the + * remaining space, so the menu sits at the trailing edge and can never overlap + * the brand. min-width:0 lets it shrink (and let antd's own overflow menu kick + * in) rather than pushing the header wider than the viewport. + */ +.app-menu { + margin-inline-start: auto; + min-width: 0; + line-height: var(--header-height); +} + +.app-content { + padding-inline: var(--gutter); +} + +.app-footer { + padding-inline: var(--gutter); text-align: center; } -.logo-primary { - fill: #eb2f96 +/* Space the auth notice and auth error away from whatever sits above them. */ +.token-notice, +.auth-alert { + margin-block-start: var(--space-lg); +} + +/* + * Sign-in block: horizontally centred with a width cap, so it stays readable on a + * wide screen and usable on a narrow one. Replaces three empty spacer s that + * faked centring via the grid and only worked at the md breakpoint and above. + */ +.login-panel { + display: flex; + flex-direction: column; + align-items: center; + gap: var(--space-lg); + inline-size: 100%; + max-inline-size: var(--login-max-width); + margin-inline: auto; + padding-block: var(--space-3xl); +} + +.login-provider-list { + display: flex; + flex-direction: column; + gap: var(--space-sm); + inline-size: 100%; } -.logo { - width: 50px; - height: 50px; - float: left; -} \ No newline at end of file +.login-provider-button { + inline-size: 100%; +} + +.auth-loading { + padding-block: var(--space-4xl); + text-align: center; +} + +.auth-loading-status { + margin-block-start: var(--space-md); +} diff --git a/src/App.tsx b/src/App.tsx index 489c7b6..b27487e 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,117 +1,61 @@ -import { useState, useEffect } from "react"; -import { Layout, Menu, Button, message, Alert } from "antd"; +import { Alert, Layout } from "antd"; import "./App.css"; -import { initializeApp } from "firebase/app"; -import { getAuth, onAuthStateChanged, signOut, type User } from "firebase/auth"; -import LoginButton from "./FirebaseLogin.tsx"; -import { CopyOutlined as Copy } from "@ant-design/icons"; -import type { MenuProps } from "antd"; -import SwaggerUI from "swagger-ui-react"; -import "swagger-ui-react/swagger-ui.css"; -import Logo from "./Logo.tsx"; -import { menuHeight, logoHeight, paddingTop } from "./styles.tsx"; -import { copyToClipboard } from "./copyToClipboard.tsx"; -type MenuItem = Required["items"][number]; -import apiSpec from "./swagger_spec.json"; -import config from "./config.json"; -const { Header, Content, Footer } = Layout; -const firebase = initializeApp({ - ...config, - apiKey: import.meta.env.VITE_FirebaseAPIKey, // process.env.REACT_APP_FirebaseAPIKey, -}); -const auth = getAuth(firebase); -const info = () => { - message.info("Token copied"); -}; -const Description = ({ token }: { token: string }) => ( -
-

- The API uses tokens provided through OAUTH2 Providers. To authenticate the - API, copy the token and paste it into the "JWT (apiKey)" box. -

- -
-); - -const explanationStyle = { marginTop: 15 }; -const Explanation = ({ token }: { token: string }) => ( - } - type="info" - style={explanationStyle} - /> -); +import ApiDocs from "./components/ApiDocs.tsx"; +import AppFooter from "./components/AppFooter.tsx"; +import AppHeader from "./components/AppHeader.tsx"; +import AuthLoading from "./components/AuthLoading.tsx"; +import LoginPanel from "./components/LoginPanel.tsx"; +import TokenNotice from "./components/TokenNotice.tsx"; +import { useAuth } from "./hooks/useAuth.ts"; +import { headerMenuTheme } from "./theme.ts"; +import type { ThemeMode } from "./theme.ts"; -const menuItems: MenuItem[] = [{ key: "1", label: "Log Out" }]; +const { Content } = Layout; -//onClick={() => signOut(auth)} style={{ float: 'right' }}>Log Out +interface AppProps { + /** + * Resolved once in src/index.tsx and passed down. Doing the resolution here too + * is what let the CSS custom properties and the antd header/menu scheme drift + * apart; the component takes the answer rather than deriving it. + */ + themeMode: ThemeMode; +} -const DevHome = () => { - const [user, setUser] = useState(null); - const [token, setToken] = useState(""); +/** + * Composition only. Auth state lives in `useAuth`, presentation in + * `src/components/*`; no Firebase call, observer or token handling appears here. + */ +const DevHome = ({ themeMode }: AppProps) => { + const { status, token, error, signOut, signIn, pendingProvider } = useAuth(); - useEffect(() => { - const unregisterAuthObserver = onAuthStateChanged(auth, (user) => { - if (user) { - user - .getIdToken(true) - .then(setToken) - .catch((err) => console.log(err)); - } else { - setToken(""); - } - setUser(user); - }); - return () => unregisterAuthObserver(); // Make sure we un-register Firebase observers when the component unmounts. - }, []); - const isSignedIn = !!user; return ( - -
-
- + void signOut()} + menuTheme={headerMenuTheme(themeMode)} + /> + + {error && ( + -
- signOut(auth)} - /> -
- - {isSignedIn ? ( + )} + {status === "loading" && } + {status === "authenticated" && ( <> - - + + - ) : ( - + )} + {status === "signed-out" && ( + )} -
Finside
+
); }; diff --git a/src/FirebaseLogin.tsx b/src/FirebaseLogin.tsx deleted file mode 100644 index 46c1105..0000000 --- a/src/FirebaseLogin.tsx +++ /dev/null @@ -1,54 +0,0 @@ -import { - GoogleLoginButton, - FacebookLoginButton, - GithubLoginButton, -} from "react-social-login-buttons"; -import { - GoogleAuthProvider, - FacebookAuthProvider, - GithubAuthProvider, - signInWithPopup, - type Auth, -} from "firebase/auth"; -import { Col, Row } from "antd"; -const googleProvider = new GoogleAuthProvider(); -const facebookProvider = new FacebookAuthProvider(); -const githubProvider = new GithubAuthProvider(); - -export const LoginButton = ({ auth }: { auth: Auth }) => { - return ( - <> - - - - { - signInWithPopup(auth, googleProvider); - }} - /> - - - - - - { - signInWithPopup(auth, facebookProvider); - }} - /> - - - - - - { - signInWithPopup(auth, githubProvider); - }} - /> - - - - ); -}; -export default LoginButton; diff --git a/src/authErrors.ts b/src/authErrors.ts new file mode 100644 index 0000000..1b17c5b --- /dev/null +++ b/src/authErrors.ts @@ -0,0 +1,50 @@ +/** + * Firebase auth error codes translated into something a user can act on. + * + * Sign-in failures used to vanish entirely — `signInWithPopup(...)` was called + * without a `catch`, so a closed popup, a blocked popup, a denied permission or a + * network failure all produced a screen that simply did nothing. + * + * Kept separate from src/authProviders.ts so hooks/useAuth.ts can use it without + * that module's icon imports entering the hook's runtime graph. + */ +const ERROR_MESSAGES: Record = { + "auth/popup-closed-by-user": + "The sign-in window was closed before it finished. Try again.", + "auth/cancelled-popup-request": + "Sign-in was cancelled. Close the previous prompt and try again.", + "auth/popup-blocked": + "Your browser blocked the sign-in popup. Allow popups for this site and try again.", + "auth/unauthorized-domain": + "This site's domain is not authorised in the Firebase console for that provider.", + "auth/account-exists-with-different-credential": + "That email is already registered with a different sign-in provider.", + "auth/invalid-credential": + "That sign-in was rejected. Check the provider account and try again.", + "auth/network-request-failed": + "Network error reaching the sign-in provider. Check your connection and try again.", + "auth/user-disabled": "This account has been disabled.", + "auth/too-many-requests": "Too many attempts. Wait a moment and try again.", +}; + +/** + * Turn an unknown sign-in failure into a user-facing sentence. + * + * Falls back to the Firebase message when the code is unrecognised: Firebase's own + * strings are developer-grade, but still better than swallowing the failure. + */ +export function describeSignInError(cause: unknown): string { + const wrapper = cause as { code?: unknown; message?: unknown } | null; + const code = wrapper?.code; + if (typeof code === "string" && ERROR_MESSAGES[code]) { + return ERROR_MESSAGES[code]; + } + // Read `message` structurally rather than via `instanceof Error`: a thrown + // object literal (or a cross-realm FirebaseError) still carries a useful + // message, whereas String(cause) would collapse it to "[object Object]". + const detail = + typeof wrapper?.message === "string" && wrapper.message + ? wrapper.message + : String(cause); + return `Sign-in failed: ${detail}`; +} diff --git a/src/authProviders.ts b/src/authProviders.ts new file mode 100644 index 0000000..1123d01 --- /dev/null +++ b/src/authProviders.ts @@ -0,0 +1,59 @@ +import type { ComponentType, CSSProperties } from "react"; +import { + FacebookAuthProvider, + GithubAuthProvider, + GoogleAuthProvider, + type AuthProvider, +} from "firebase/auth"; +import { + FacebookFilled, + GithubFilled, + GoogleOutlined, +} from "@ant-design/icons"; + +/** + * A sign-in option rendered by the login screen. + * + * Adding a provider means appending ONE entry to `PROVIDERS` below. No component, + * no JSX, no layout change: the login panel maps over this array, so the markup is + * written once and never grows with the number of providers. Previously each + * provider had its own hand-written `` block, which meant copy-pasting + * markup (and its three empty spacer columns) for every new provider. + */ +export interface ProviderConfig { + /** Stable identity for React keys and pending-state tracking. */ + readonly key: string; + readonly label: string; + readonly Icon: ComponentType<{ style?: CSSProperties }>; + /** + * Build the Firebase provider at sign-in time. + * + * A factory, not an instance: the old module constructed all three + * `*AuthProvider`s at import time, so merely importing the login screen + * allocated Firebase objects. Keeping this lazy also gives each sign-in attempt a + * fresh provider, so a cancelled popup cannot leave stale scope/parameter state + * behind for the next attempt. + */ + readonly create: () => AuthProvider; +} + +export const PROVIDERS: readonly ProviderConfig[] = [ + { + key: "google", + label: "Continue with Google", + Icon: GoogleOutlined, + create: () => new GoogleAuthProvider(), + }, + { + key: "facebook", + label: "Continue with Facebook", + Icon: FacebookFilled, + create: () => new FacebookAuthProvider(), + }, + { + key: "github", + label: "Continue with GitHub", + Icon: GithubFilled, + create: () => new GithubAuthProvider(), + }, +]; diff --git a/src/components/ApiDocs.tsx b/src/components/ApiDocs.tsx new file mode 100644 index 0000000..cf044a2 --- /dev/null +++ b/src/components/ApiDocs.tsx @@ -0,0 +1,14 @@ +import SwaggerUI from "swagger-ui-react"; +import "swagger-ui-react/swagger-ui.css"; +import apiSpec from "../swagger_spec.json"; + +/** The OpenAPI browser. The spec is generated at build time (see `npm run spec`). */ +const ApiDocs = () => ( + +); + +export default ApiDocs; diff --git a/src/components/AppFooter.tsx b/src/components/AppFooter.tsx new file mode 100644 index 0000000..b3b571c --- /dev/null +++ b/src/components/AppFooter.tsx @@ -0,0 +1,15 @@ +import { Layout } from "antd"; +import { appTag } from "../env.ts"; + +const { Footer } = Layout; + +const AppFooter = () => ( +
+ {/* CI stamps VITE_TAG on every deploy; previously nothing read it, so the + version never reached the page. */} + Finside {" "} + · {appTag} +
+); + +export default AppFooter; diff --git a/src/components/AppHeader.test.tsx b/src/components/AppHeader.test.tsx new file mode 100644 index 0000000..1cf7c26 --- /dev/null +++ b/src/components/AppHeader.test.tsx @@ -0,0 +1,98 @@ +import { describe, expect, it, vi } from "vitest"; +import { page } from "vitest/browser"; +import { render } from "vitest-browser-react"; +import AppHeader from "./AppHeader.tsx"; +import "../index.css"; +import "../App.css"; + +const menuItems = () => + [ + ...document.querySelectorAll(".app-menu .ant-menu-item"), + ] as HTMLLIElement[]; + +const clickMenu = (label: string) => { + const item = menuItems().find((el) => el.textContent?.includes(label)); + if (!item) throw new Error(`no menu item labelled ${label}`); + item.click(); +}; + +describe("brand", () => { + it("renders the logo in the leading slot", async () => { + await render(); + expect(document.querySelector(".app-logo svg")).toBeTruthy(); + // Logo applies the theme hook to its inner (whose fill the paths + // inherit), not to the element itself. + expect(document.querySelector(".app-logo .logo-primary")).toBeTruthy(); + }); +}); + +describe("the sign-out control tracks session state", () => { + it("offers Log Out once there is a session to end", async () => { + await render(); + const items = menuItems(); + expect(items).toHaveLength(1); + expect(items[0].textContent).toContain("Log Out"); + }); + + it("offers no menu item when nobody is signed in", async () => { + await render(); + // Nothing to sign out of: an empty menu is not the same as a hidden one. + expect(menuItems()).toHaveLength(0); + }); + + it("invokes onSignOut exactly once per click", async () => { + const onSignOut = vi.fn(); + await render(); + await clickMenu("Log Out"); + await vi.waitFor(() => expect(onSignOut).toHaveBeenCalledTimes(1)); + }); + + it("clicking with no session cannot fire onSignOut", async () => { + const onSignOut = vi.fn(); + await render(); + expect(menuItems()).toHaveLength(0); + await new Promise((r) => setTimeout(r, 30)); + expect(onSignOut).not.toHaveBeenCalled(); + }); +}); + +describe("header geometry (signed-in, the wider case)", () => { + for (const vw of [320, 768, 1920]) { + it(`stays inside the viewport at ${vw}px`, async () => { + await page.viewport(vw, 900); + const { unmount } = await render( + , + ); + + const header = document.querySelector(".app-header")!; + const logo = document.querySelector(".app-logo")!; + const menu = document.querySelector(".app-menu")!; + const h = header.getBoundingClientRect(); + const l = logo.getBoundingClientRect(); + const m = menu.getBoundingClientRect(); + + // Brand leads, menu trails: no overlap regardless of antd's overflow handling. + expect(l.right).toBeLessThanOrEqual(m.left + 1); + // The whole band is on screen. + expect(h.left).toBeGreaterThanOrEqual(-1); + expect(h.right).toBeLessThanOrEqual(vw + 1); + unmount(); + }); + } + + it("keeps the header band at the --header-height token", async () => { + await page.viewport(1440, 900); + const { unmount } = await render( + , + ); + const header = document.querySelector(".app-header")!; + const token = + parseFloat( + getComputedStyle(document.documentElement).getPropertyValue( + "--header-height", + ), + ) || 64; + expect(header.getBoundingClientRect().height).toBeCloseTo(token, 0); + unmount(); + }); +}); diff --git a/src/components/AppHeader.tsx b/src/components/AppHeader.tsx new file mode 100644 index 0000000..6f2944f --- /dev/null +++ b/src/components/AppHeader.tsx @@ -0,0 +1,43 @@ +import { Layout, Menu } from "antd"; +import type { MenuProps } from "antd"; +import Logo from "./Logo.tsx"; + +const { Header } = Layout; + +type MenuItem = Required["items"][number]; + +const menuItems: MenuItem[] = [{ key: "sign-out", label: "Log Out" }]; + +interface AppHeaderProps { + /** The menu item only exists once there is a session to end. */ + showSignOut: boolean; + onSignOut: () => void; + /** + * Menu colour scheme. Passed in rather than written as a literal here so the + * component holds no colour decision: the value comes from the theme module. + */ + menuTheme: "light" | "dark"; +} + +/** + * Flex header: brand at the leading edge, menu pushed to the trailing edge by + * `margin-inline-start: auto` (see .app-menu in App.css). Vertical centring is + * `align-items: center`, which replaces the old `paddingTop` that had to be + * derived from the logo and header heights to fake it. + */ +const AppHeader = ({ showSignOut, onSignOut, menuTheme }: AppHeaderProps) => ( +
+
+ + + + +); + +export default AppHeader; diff --git a/src/components/AuthLoading.tsx b/src/components/AuthLoading.tsx new file mode 100644 index 0000000..2c3340a --- /dev/null +++ b/src/components/AuthLoading.tsx @@ -0,0 +1,16 @@ +import { Spin } from "antd"; + +/** + * Shown while Firebase resolves the persisted session. + * + * Without it, a returning user with a valid session is briefly classified as + * signed out and sees the login buttons before the docs appear. + */ +const AuthLoading = () => ( +
+ +
Checking your session...
+
+); + +export default AuthLoading; diff --git a/src/components/LoginPanel.test.tsx b/src/components/LoginPanel.test.tsx new file mode 100644 index 0000000..0402d0b --- /dev/null +++ b/src/components/LoginPanel.test.tsx @@ -0,0 +1,199 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { page } from "vitest/browser"; +import { render } from "vitest-browser-react"; +import { Layout } from "antd"; +import { AppleOutlined } from "@ant-design/icons"; +import LoginPanel from "./LoginPanel.tsx"; +import { PROVIDERS, type ProviderConfig } from "../authProviders.ts"; +import type { AuthProvider } from "firebase/auth"; +import { describeSignInError } from "../authErrors.ts"; +import "../index.css"; +import "../App.css"; + +const { Content } = Layout; + +const StubIcon = AppleOutlined as unknown as React.ComponentType<{ + style?: React.CSSProperties; +}>; + +const buttons = () => + [...document.querySelectorAll(".login-provider-button")] as HTMLButtonElement[]; + +const stub = (key: string, label: string) => ({ + key, + label, + Icon: StubIcon, + create: vi.fn(() => ({ providerId: key }) as AuthProvider), +}); + +const px = (el: Element, prop: string) => + parseFloat(getComputedStyle(el).getPropertyValue(prop)) || 0; + +describe("AC1: adding a provider is a config entry, not markup", () => { + it("renders exactly one button for a one-entry array", async () => { + await render( + , + ); + const b = buttons(); + expect(b).toHaveLength(1); + expect(b[0].textContent).toContain("Continue with X"); + }); + + it("renders one button per entry, for any count", async () => { + const five = Array.from({ length: 5 }, (_, i) => stub(`p${i}`, `Provider ${i}`)); + await render( + , + ); + expect(buttons().map((b) => b.textContent?.trim())).toEqual( + Array.from({ length: 5 }, (_, i) => `Provider ${i}`), + ); + }); + + it("the shipped config renders all three real providers", async () => { + await render(); + expect(buttons()).toHaveLength(3); + expect(PROVIDERS.map((p) => p.key)).toEqual(["google", "facebook", "github"]); + }); + + it("passes the whole config entry to signIn, not a fragment", async () => { + const signIn = vi.fn(async (_p: unknown) => {}); + const p: ProviderConfig = stub("x", "Continue with X"); + await render( + , + ); + buttons()[0].click(); + await vi.waitFor(() => expect(signIn).toHaveBeenCalledTimes(1)); + expect(signIn.mock.calls[0][0]).toBe(p); + }); +}); + +describe("AC4: providers constructed on demand, not at import time", () => { + it("rendering does not construct a provider", async () => { + const p = stub("lazy", "Lazy"); + await render( + , + ); + expect(p.create).not.toHaveBeenCalled(); + }); + + it("the shipped factories return a FRESH instance per call (no module singletons)", () => { + for (const p of PROVIDERS) { + expect(typeof p.create).toBe("function"); + expect(p.create()).not.toBe(p.create()); + } + }); +}); + +describe("AC2: sign-in failures produce real, actionable text", () => { + it("closed popup", () => { + expect( + describeSignInError( + Object.assign(new Error("closed"), { code: "auth/popup-closed-by-user" }), + ), + ).toContain("closed before it finished"); + }); + + it("blocked popup", () => { + expect(describeSignInError({ code: "auth/popup-blocked" })).toContain( + "blocked", + ); + }); + + it("network failure", () => { + expect(describeSignInError({ code: "auth/network-request-failed" })).toContain( + "Network", + ); + }); + + it("unknown code still surfaces the underlying message", () => { + const msg = describeSignInError({ + code: "auth/brand-new-code", + message: "surprise", + }); + expect(msg).toContain("Sign-in failed"); + expect(msg).toContain("surprise"); + expect(msg).not.toContain("[object Object]"); + }); + + it("non-Error throws do not crash or stringify to [object Object]", () => { + expect(describeSignInError("just a string")).toContain("just a string"); + expect(describeSignInError(null)).toContain("null"); + }); +}); + +describe("pending state guards concurrent popups", () => { + it("disables every other provider while one is in flight", async () => { + await render(); + const b = buttons(); + expect(b.map((x) => x.disabled)).toEqual([true, false, true]); + }); + + it("all enabled when nothing is pending", async () => { + await render(); + expect(buttons().every((b) => !b.disabled)).toBe(true); + }); +}); + +describe("AC3: centred and usable at 320px and 1920px", () => { + for (const vw of [320, 375, 768, 1920]) { + it(`centres inside the content box at ${vw}px`, async () => { + await page.viewport(vw, 900); + const { unmount } = await render( + + + + + , + ); + + expect(document.documentElement.clientWidth).toBe(vw); + + const content = document.querySelector(".app-content")!; + const panel = document.querySelector(".login-panel")!; + const pad = px(content, "padding-left") + px(content, "padding-right"); + const inner = content.clientWidth - pad; + + const c = content.getBoundingClientRect(); + const p = panel.getBoundingClientRect(); + + // Centred: gap on the left equals the gap on the right. + const leftGap = p.left - (c.left + px(content, "padding-left")); + const rightGap = c.right - px(content, "padding-right") - p.right; + expect( + Math.abs(leftGap - rightGap), + `centre gaps ${leftGap.toFixed(1)} / ${rightGap.toFixed(1)}`, + ).toBeLessThanOrEqual(1); + + // Width capped by the token on wide screens, fluid on narrow ones. + const cap = 352; // 22rem + const expected = Math.min(inner, cap); + expect( + Math.abs(p.width - expected), + `panel ${p.width.toFixed(1)} vs expected ${expected.toFixed(1)}`, + ).toBeLessThanOrEqual(1); + + const bs = buttons(); + expect(bs).toHaveLength(3); + for (const b of bs) { + const r = b.getBoundingClientRect(); + expect(r.left).toBeGreaterThanOrEqual(-1); + expect(r.right).toBeLessThanOrEqual(vw + 1); + expect(r.width).toBeGreaterThanOrEqual(p.width - 1); + expect(r.height).toBeGreaterThanOrEqual(40); // tappable + expect(b.disabled).toBe(false); + } + + const de = document.documentElement; + expect(de.scrollWidth).toBeLessThanOrEqual(de.clientWidth + 1); + unmount(); + }); + } +}); + +beforeEach(() => { + document.body.innerHTML = ""; +}); diff --git a/src/components/LoginPanel.tsx b/src/components/LoginPanel.tsx new file mode 100644 index 0000000..eba33ae --- /dev/null +++ b/src/components/LoginPanel.tsx @@ -0,0 +1,55 @@ +import { Button } from "antd"; +import { PROVIDERS, type ProviderConfig } from "../authProviders.ts"; + +interface LoginPanelProps { + /** Starts a popup sign-in. Owned by useAuth so this stays presentational. */ + signIn: (provider: ProviderConfig) => Promise; + /** Key of the provider whose popup is open; disables the others. */ + pendingProvider: string | null; + providers?: readonly ProviderConfig[]; +} + +/** + * Sign-in options, rendered from the PROVIDERS config array. + * + * Three things were wrong with the previous version: + * + * 1. Each provider had its own hand-written block, so adding one meant + * copying markup - including a pair of empty spacer s used to fake + * centring. Adding a provider now means appending one entry to PROVIDERS. + * 2. signInWithPopup was called without a catch, so every failure - closed popup, + * blocked popup, denied permission, network error - was silent. The screen just + * didn't do anything and the user had no idea why. Failures now land in + * useAuth.error and App renders them immediately above this list. + * 3. All three AuthProvider instances were constructed at module scope, so + * importing the login screen allocated Firebase objects as a side effect. + * Providers are now built lazily inside signIn. + * + * Centring uses flexbox and the shared spacing tokens rather than empty grid + * columns, so it behaves at 320px instead of depending on a breakpoint hack. + */ +const LoginPanel = ({ + signIn, + pendingProvider, + providers = PROVIDERS, +}: LoginPanelProps) => ( +
+
+ {providers.map((provider) => ( + + ))} +
+
+); + +export default LoginPanel; diff --git a/src/Logo.tsx b/src/components/Logo.tsx similarity index 82% rename from src/Logo.tsx rename to src/components/Logo.tsx index 4bb4e6a..d82301b 100644 --- a/src/Logo.tsx +++ b/src/components/Logo.tsx @@ -1,9 +1,15 @@ -import React from 'react' +// The react-jsx runtime supplies JSX, so no React import is needed here. +type LogoProps = { + height?: string | number; + width?: string | number; + className?: string; +} + const Logo = ({ height = '1em', width = '1em', className = 'logo-primary' -}: { height: string | number, width: string | number, className: string }) => ( +}: LogoProps) => ( ({ copy: vi.fn(async () => {}) })); +vi.mock("../copyToClipboard.ts", async (io) => { + const a = await io(); + return { ...a, copyToClipboard: h.copy }; +}); +const { default: TokenNotice } = await import("./TokenNotice.tsx"); + +const msgs = () => + [...document.querySelectorAll(".ant-message-notice-content, .ant-message-notice")] + .map((e) => e.textContent ?? "") + .join(" | "); + +async function clickCopy() { + const btn = [...document.querySelectorAll("button")].find((b) => + b.textContent?.includes("Copy Token"), + )!; + btn.click(); +} + +describe("TokenNotice copy feedback", () => { + beforeEach(async () => { + // antd's message API renders into its own portal that outlives unmount(), so a + // leftover toast could make a later assertion pass vacuously. Clear it, and + // PROVE each test starts clean. + // Don't wipe innerHTML: antd caches its message container and a foreign wipe + // leaves later toasts rendering into a detached node. Use antd's own teardown. + antdMessage.destroy(); + await expect.poll(() => msgs(), { timeout: 2000 }).toBe(""); + }); + + it("tells the user when the token was copied", async () => { + h.copy.mockResolvedValue(undefined); + const { unmount } = await render(); + await clickCopy(); + await expect.poll(() => msgs()).toContain("Token copied"); + unmount(); + }); + + it("tells the user to copy manually when the clipboard is unavailable", async () => { + h.copy.mockRejectedValue(new ClipboardUnsupportedError("no clipboard")); + const { unmount } = await render(); + await clickCopy(); + await expect.poll(() => msgs()).toContain("Clipboard unavailable"); + unmount(); + }); + + it("distinguishes a blocked clipboard from no clipboard at all", async () => { + h.copy.mockRejectedValue(new Error("NotAllowedError")); + const { unmount } = await render(); + await clickCopy(); + await expect.poll(() => msgs()).toContain("clipboard access was blocked"); + unmount(); + }); +}); diff --git a/src/components/TokenNotice.tsx b/src/components/TokenNotice.tsx new file mode 100644 index 0000000..b57b656 --- /dev/null +++ b/src/components/TokenNotice.tsx @@ -0,0 +1,44 @@ +import { Alert, Button, message } from "antd"; +import { CopyOutlined as Copy } from "@ant-design/icons"; +import { copyToClipboard, ClipboardUnsupportedError } from "../copyToClipboard.ts"; + +const copyToken = (token: string) => { + void copyToClipboard(token) + .then(() => message.success("Token copied")) + .catch((error: unknown) => { + // Log the original error (NotAllowedError, missing user gesture, etc.) for + // diagnosis, while the user gets an actionable message. + console.error("copyToClipboard failed", error); + message.error( + error instanceof ClipboardUnsupportedError + ? "Clipboard unavailable in this context - please copy the token manually." + : "Copy failed - clipboard access was blocked. Please copy the token manually.", + ); + }); +}; + +interface TokenNoticeProps { + token: string; +} + +/** Explains the OAuth token flow and offers the copy action. */ +const TokenNotice = ({ token }: TokenNoticeProps) => ( + +

+ The API uses tokens provided through OAUTH2 Providers. To authenticate + the API, copy the token and paste it into the "JWT (apiKey)" box. +

+ + + } + type="info" + className="token-notice" + /> +); + +export default TokenNotice; diff --git a/src/copyToClipboard.test.ts b/src/copyToClipboard.test.ts new file mode 100644 index 0000000..3e2685b --- /dev/null +++ b/src/copyToClipboard.test.ts @@ -0,0 +1,76 @@ +import { afterEach, describe, expect, it, vi } from "vitest"; +import { ClipboardUnsupportedError, copyToClipboard } from "./copyToClipboard.ts"; + +// `clipboard` normally lives on Navigator.prototype, so defining it as an own +// property shadows it for the test and deleting it restores the real lookup. +const setClipboard = (value: unknown) => { + Object.defineProperty(navigator, "clipboard", { + configurable: true, + writable: true, + value, + }); +}; + +afterEach(() => { + Reflect.deleteProperty(navigator, "clipboard"); + Reflect.deleteProperty(document, "execCommand"); +}); + +describe("copyToClipboard", () => { + it("writes the text through the async Clipboard API and resolves", async () => { + const writeText = vi.fn(async () => undefined); + setClipboard({ writeText }); + + await expect(copyToClipboard("token-123")).resolves.toBeUndefined(); + + expect(writeText).toHaveBeenCalledTimes(1); + expect(writeText).toHaveBeenCalledWith("token-123"); + }); + + it("rejects when the write is refused, so the caller can report failure", async () => { + const writeText = vi.fn(async () => { + throw new DOMException("Permission denied", "NotAllowedError"); + }); + setClipboard({ writeText }); + + await expect(copyToClipboard("token-123")).rejects.toThrow(/Permission denied/); + + expect(writeText).toHaveBeenCalledTimes(1); + }); + + it("rejects with ClipboardUnsupportedError when there is no clipboard API", async () => { + setClipboard(undefined); + + await expect(copyToClipboard("token-123")).rejects.toBeInstanceOf( + ClipboardUnsupportedError, + ); + }); + + it("does not fall back to the deprecated document.execCommand", async () => { + // Replace execCommand rather than spy on it, so this does not depend on the + // browser still exposing the deprecated method. + const execCommand = vi.fn(() => true); + Object.defineProperty(document, "execCommand", { + configurable: true, + writable: true, + value: execCommand, + }); + setClipboard({ writeText: vi.fn(async () => undefined) }); + + await copyToClipboard("token-123"); + + expect(execCommand).not.toHaveBeenCalled(); + }); + + it("does not inject a hidden textarea to perform the copy", async () => { + const createElement = vi.spyOn(document, "createElement"); + setClipboard({ writeText: vi.fn(async () => undefined) }); + + await copyToClipboard("token-123"); + + const injectedTextareas = createElement.mock.calls.filter( + ([tag]) => tag === "textarea", + ); + expect(injectedTextareas).toHaveLength(0); + }); +}); diff --git a/src/copyToClipboard.ts b/src/copyToClipboard.ts new file mode 100644 index 0000000..0f04dc1 --- /dev/null +++ b/src/copyToClipboard.ts @@ -0,0 +1,50 @@ +/** + * Copy text to the clipboard via the async Clipboard API. + * + * This replaces a vendored gist built on the deprecated `document.execCommand('copy')`. + * That approach had to inject a hidden