diff --git a/apps/site/docs/en/integrate-with-rstest.mdx b/apps/site/docs/en/integrate-with-rstest.mdx new file mode 100644 index 0000000000..0d59195228 --- /dev/null +++ b/apps/site/docs/en/integrate-with-rstest.mdx @@ -0,0 +1,396 @@ +import SetupEnv from './common/setup-env.mdx'; +import { PackageManagerTabs } from '@theme'; + +# Integrate with Rstest + +[Rstest](https://github.com/web-infra-dev/rstest) is a fast Rspack-based testing framework. With `@midscene/rstest` you can write AI-driven end-to-end tests as plain rstest fixtures — Midscene takes care of launching the browser, creating an Agent per test, and producing an HTML report at the end of every test file. + +```ts +import { test as base } from '@midscene/rstest/playwright'; +import { expect } from '@rstest/core'; + +const test = base.extend({ url: 'http://localhost:5173/' }); + +test('adds a todo', async ({ agent }) => { + await agent.aiAct("type 'Study AI' in the input and press Enter"); + await agent.aiAssert('the list contains exactly one item: "Study AI"'); +}); +``` + +What you get out of the box: + +- Typed fixtures — destructure `agent`, `page`, `browser`, `agentForPage` directly from the test context. No `ctx.` indirection, no "only valid inside `it(...)`" runtime errors. +- Lazy browser lifecycle — if no test in a file destructures anything that depends on `browser`, no browser is launched. Files mixing AI tests and pure unit tests pay the AI cost only for the AI tests. +- Composable — `test.extend({ ... })` to override the URL, options, or any individual fixture (e.g. a `page` that injects routes, or a second `adminAgent` persona). +- A merged Midscene HTML report per test file, with the path printed to the console after the file finishes. + +Two browser providers ship in the package, behind separate subpath exports: + +- `@midscene/rstest/playwright` — backed by `chromium.launch()`. +- `@midscene/rstest/puppeteer` — backed by `puppeteer.launch()`. + + + +:::info Example Project + +A runnable example lives at [https://github.com/web-infra-dev/midscene/tree/main/packages/rstest/demo](https://github.com/web-infra-dev/midscene/tree/main/packages/rstest/demo). + +::: + +## Step 1: Install dependencies + +Pick the provider you want to use and install it together with `@midscene/web`, `@rstest/core`, and `@midscene/rstest`. + +With Playwright: + + + +Or with Puppeteer: + + + +## Step 2: Configure Rstest + +Create `rstest.config.ts` in the root of your test project: + +```ts title="rstest.config.ts" +import 'dotenv/config'; // load model env vars from .env +import MidsceneReporter from '@midscene/rstest/reporter'; +import { defineConfig } from '@rstest/core'; + +export default defineConfig({ + include: ['e2e/**/*.test.ts'], + // AI calls are slow — leave plenty of headroom for both tests and hooks. + testTimeout: 1_800_000, + hookTimeout: 60_000, + reporters: ['default', new MidsceneReporter()], +}); +``` + +`MidsceneReporter` prints a line like `Midscene report: midscene_run/report/.html` after each test file. Open it in your browser to replay every AI step with screenshots. + +## Step 3: Write a test + +```ts title="e2e/todo-list.test.ts" +import { test as base } from '@midscene/rstest/playwright'; +import { expect } from '@rstest/core'; + +const test = base.extend({ url: 'http://localhost:5173/' }); + +test('adds and completes a todo', async ({ agent }) => { + await agent.aiAct("type 'Study AI' in the input and press Enter"); + await agent.aiAct('click the checkbox of the first item'); + + const list = await agent.aiQuery( + 'string[], the complete task list', + ); + expect(list).toHaveLength(1); + + await agent.aiAssert('the only item is marked as done'); +}); +``` + +The `test` exported from `@midscene/rstest/playwright` is an rstest test pre-wired with midscene fixtures. Destructure what you need from the test context — the fixture engine resolves dependencies and runs setup/teardown around each test. + +The available fixtures are: + +- **`agent`** — the midscene `PlaywrightAgent` (or `PuppeteerAgent`) bound to the primary page. Default tool for AI actions and assertions. +- **`page`** — raw Playwright / Puppeteer `Page`. Escape hatch for things `agent` can't or shouldn't do: `page.route(...)` network mocking, `page.evaluate(...)`, `page.context().cookies()`, etc. +- **`browser`** — the file-scoped `Browser`. Use it to spin up extra contexts or pages mid-test (multi-user, cross-session scenarios). +- **`context`** _(Playwright only)_ — the test-scoped `BrowserContext` the primary `page` is created from. Override via `test.extend` if you need a custom context per test. +- **`agentForPage(page, opts?)`** — build a midscene agent for another page (popup, manually-created page). Its report is merged with the primary's; destroy is automatic. +- **`url`** / **`midsceneOptions`** — configuration fixtures. See [Project-wide defaults](#project-wide-defaults-optional) and [Custom page setup](#custom-page-setup). + +```ts +test('mocks the API and verifies the UI', async ({ agent, page }) => { + await page.route('**/api/contacts', (route) => + route.fulfill({ json: [{ name: 'Fake Alice' }] }), + ); + await agent.aiAssert('the contact list shows "Fake Alice"'); +}); + +test('drives a popup with a second agent', async ({ + agent, + page, + agentForPage, +}) => { + await agent.aiTap("the 'View details' button"); + const popup = await page.waitForEvent('popup'); + + const popupAgent = await agentForPage(popup); + await popupAgent.aiAssert('the popup shows order details'); +}); + +test('runs two isolated user sessions in one test', async ({ + browser, + agentForPage, +}) => { + const sessionB = await browser.newContext({ storageState: 'user-b.json' }); + const pageB = await sessionB.newPage(); + await pageB.goto('http://localhost:5173/'); + const agentB = await agentForPage(pageB); + + await agentB.aiAct('send a message to user A'); +}); +``` + +To use Puppeteer instead, change a single import: + +```ts +import { test as base } from '@midscene/rstest/puppeteer'; +``` + +The `agent` API is identical. The Puppeteer provider exposes the same fixtures except `context` (Puppeteer doesn't use a context-as-class — override the `page` fixture if you need one via `browser.createBrowserContext()`). + +## Step 4: Run the tests + +```bash +npx rstest run + +# or, while iterating: +npx rstest watch +``` + +After each file finishes you'll see something like: + +```text +Midscene report: midscene_run/report/.html +``` + +Reports are written to `midscene_run/report/`. See [Consume report files](./consume-report-file) for programmatic access. + +## Project-wide defaults (optional) + +For options that should apply to every file, call `defineMidsceneDefaults` from a setup file and register it via rstest's `setupFiles`: + +```ts title="midscene.setup.ts" +import { defineMidsceneDefaults } from '@midscene/rstest/playwright'; + +defineMidsceneDefaults({ + viewport: { width: 1280, height: 720 }, + contextOptions: { locale: 'en-US' }, +}); +``` + +```ts title="rstest.config.ts" +export default defineConfig({ + // ...other config + setupFiles: ['./midscene.setup.ts'], +}); +``` + +:::warning Must be called from a `setupFiles` entry + +Each test file runs in its own isolated module graph (rstest's default `isolate: true`). `defineMidsceneDefaults` populates a module-scoped store, so it only takes effect when called from a file that rstest loads as part of every test file's setup chain. Calling it inside a single test file only affects that file. + +::: + +`defineMidsceneDefaults` is read by the `midsceneOptions` fixture at test time. To override per file, extend the test: + +```ts +const test = base.extend({ + url: 'http://localhost:5173/', + midsceneOptions: { + headless: false, + viewport: { width: 375, height: 667 }, + agentOptions: { cache: true }, // auto-derived cache id from test name + }, +}); +``` + +Nested resolver fields like `launchOptions` and `contextOptions` are **deep-merged** over the package defaults, and arrays concatenate. Use the function form of a resolver (`(defaults) => ...`) when you need to remove a default value or take full control. The Puppeteer provider exposes the same `defineMidsceneDefaults` from `@midscene/rstest/puppeteer`. + +## Configure midscene + +Midscene reads configuration from four channels — pick the one that matches the scope you want. + +1. **Environment variables** (model endpoint, API key, vision-family flags, cache dir, report dir, debug toggles): set them however you usually set env vars (`.env`, CI secrets, shell exports). They flow into the midscene runtime automatically — nothing extra to wire up. The full list lives in the [model configuration reference](./model-and-provider). Quick sample: + + ```bash + MIDSCENE_MODEL_BASE_URL=https://api.openai.com/v1 + MIDSCENE_MODEL_API_KEY=sk-... + MIDSCENE_MODEL_NAME=gpt-4o + MIDSCENE_DEBUG_MODEL_RESPONSE=1 # dump raw model responses to disk + MIDSCENE_RUN_DIR=./midscene_run # where reports + cache live + ``` + +2. **`midsceneOptions.agentOptions`** — for anything you set per agent. Accepts the full `AgentOpt` surface (`modelConfig`, `aiActionContext`, `cache`, `replanningCycleLimit`, `waitAfterAction`, `screenshotShrinkFactor`, `onTaskStartTip`, `onOpenAIClientCreated`, …). `groupName` and `reportFileName` are reserved by the lifecycle. + + ```ts + const test = base.extend({ + url: 'http://localhost:5173/', + midsceneOptions: { + agentOptions: { + aiActionContext: 'You are testing a multilingual checkout flow.', + cache: { strategy: 'read-write' }, + waitAfterAction: 500, + }, + }, + }); + ``` + +3. **`overrideAIConfig(...)`** in a setup file — for programmatic global overrides that env vars can't express, or for swapping config between test runs. Re-exported from both provider entry points. + + ```ts title="midscene.setup.ts" + import { overrideAIConfig } from '@midscene/rstest/playwright'; + + overrideAIConfig({ + MIDSCENE_MODEL_NAME: process.env.CI ? 'gpt-4o' : 'gpt-4o-mini', + }); + ``` + +4. **Debug logs** — `@midscene/rstest` uses the `debug` package; turn on what you want via the `DEBUG` env var. + + ```bash + DEBUG=midscene:*,rstest:* npx rstest run + ``` + +## Options + +`midsceneOptions` carries every per-file knob. Set it via `defineMidsceneDefaults` for repo-wide defaults, or via `test.extend({ midsceneOptions: {...} })` for per-file overrides. + +### Playwright (`@midscene/rstest/playwright`) + +| Field | Type | Default | Description | +| --- | --- | --- | --- | +| `headless` | `boolean` | `true` in CI, `false` locally | Convenience for `launchOptions.headless`. | +| `viewport` | `{ width, height }` | `1920×1080` | Convenience for `contextOptions.viewport`. | +| `launchOptions` | `LaunchOptions \| (defaults) => LaunchOptions` | — | Forwarded to `chromium.launch(...)`. | +| `contextOptions` | `BrowserContextOptions \| (defaults) => BrowserContextOptions` | — | Forwarded to `browser.newContext(...)`. | +| `gotoOptions` | `Parameters[1]` | — | Forwarded to `page.goto(url, ...)`. | +| `agentOptions` | `WebPageAgentOpt` | — | Forwarded to `PlaywrightAgent` (e.g. `aiActionContext`, `modelConfig`). `groupName` and `reportFileName` are managed by the lifecycle. `cache` accepts `true \| false \| { strategy?, id? }` — when `cache: true` or `id` is omitted, a stable id is auto-derived from the test file name and test name so re-runs hit the same cache namespace. | + +### Puppeteer (`@midscene/rstest/puppeteer`) + +| Field | Type | Default | Description | +| --- | --- | --- | --- | +| `headless` | `boolean` | `true` in CI, `false` locally | Convenience for `launchOptions.headless`. | +| `viewport` | `{ width, height }` | `1920×1080` | Convenience for `launchOptions.defaultViewport`. | +| `launchOptions` | `LaunchOptions \| (defaults) => LaunchOptions` | — | Forwarded to `puppeteer.launch(...)`. | +| `gotoOptions` | `GoToOptions` | — | Forwarded to `page.goto(url, ...)`. | +| `agentOptions` | `WebPageAgentOpt` | — | Forwarded to `PuppeteerAgent`. Same `cache` shorthand as the Playwright provider — `cache: true` auto-derives the id. | + +Resolver fields (`launchOptions`, `contextOptions`) accept either an object — deep-merged over midscene's defaults, with arrays concatenated — or a function `(defaults) => options` (sync or async) that takes full control. An array of either is also accepted and applied left-to-right. + +### Examples + +Add a launch arg without losing midscene's CI-critical defaults: + +```ts +const test = base.extend({ + url: 'http://localhost:5173/', + midsceneOptions: { + // Final `args` is ['--no-sandbox', '--ignore-certificate-errors', '--start-fullscreen']. + launchOptions: { args: ['--start-fullscreen'] }, + }, +}); +``` + +Tweak a single nested field without erasing siblings: + +```ts +const test = base.extend({ + url: 'http://localhost:5173/', + midsceneOptions: { + // Final viewport is { width: 1440, height: 1080 } — `height` is kept. + contextOptions: { viewport: { width: 1440 } }, + }, +}); +``` + +Use the function form when deep-merge isn't enough — typically when you need to **remove** something from defaults, run async logic, or fully replace the options: + +```ts +const test = base.extend({ + url: 'http://localhost:5173/', + midsceneOptions: { + launchOptions: (defaults) => ({ + ...defaults, + args: defaults.args?.filter((a) => a !== '--no-sandbox'), + }), + }, +}); +``` + +Configure the context (Playwright): + +```ts +const test = base.extend({ + url: 'http://localhost:5173/', + midsceneOptions: { + contextOptions: { + locale: 'zh-CN', + storageState: 'auth.json', + recordVideo: { dir: 'midscene_run/video' }, + }, + }, +}); +``` + +## Custom page setup + +For lifecycles the defaults don't cover — persistent context, CDP connect, custom trace orchestration, per-test storage state — override the `page` fixture. Code before `await use(page)` is setup; code after is teardown. + +```ts +import { test as base } from '@midscene/rstest/playwright'; +import { mkdirSync } from 'node:fs'; +import { join } from 'node:path'; + +const test = base.extend({ + url: 'https://example.com', + page: async ({ context, url, task }, use) => { + await context.tracing.start({ screenshots: true, snapshots: true }); + const page = await context.newPage(); + await page.goto(url); + + await use(page); + + const passed = task.result?.status === 'pass'; + if (passed) { + await context.tracing.stop(); + } else { + mkdirSync('midscene_run/trace', { recursive: true }); + await context.tracing.stop({ + path: join('midscene_run/trace', `${task.name}.zip`), + }); + } + }, +}); +``` + +Teardown of the `page` fixture runs **after** `agent.destroy()` — the page is still alive at that point, exactly the window you want for stopping traces, saving videos, or dumping cookies. The shared `browser` and the default-built `context` are still open; only your custom teardown decides when to close anything you opened yourself. + +For deeper customization (e.g. a persistent context from scratch), override `context` instead — it depends only on `browser` and `midsceneOptions`, and the default `page` will pick up whatever context you produce. + +## Personas and composed fixtures + +`test.extend` composes — you can layer fixtures the same way you'd layer options: + +```ts +const test = base.extend<{ + adminAgent: PlaywrightAgent; +}>({ + url: 'http://localhost:5173/', + adminAgent: async ({ browser }, use) => { + const context = await browser.newContext({ storageState: 'admin.json' }); + const page = await context.newPage(); + await page.goto('http://localhost:5173/'); + const agent = new PlaywrightAgent(page); + await use(agent); + await agent.destroy(); + await context.close(); + }, +}); + +test('only admin can delete', async ({ agent, adminAgent }) => { + await agent.aiAssert('no Delete button is visible'); + await adminAgent.aiAssert('a Delete button is visible'); +}); +``` + +This is the recommended pattern for multi-persona tests, mock-server fixtures, database seeding, and anything else you'd otherwise reach for `beforeEach` to do — fixtures compose by dependency graph and tear down in reverse, so ordering is explicit and correct. + +## More + +- All Agent methods: [API Reference](./api#interaction-methods). +- Working example: [https://github.com/web-infra-dev/midscene/tree/main/packages/rstest/demo](https://github.com/web-infra-dev/midscene/tree/main/packages/rstest/demo). diff --git a/apps/site/docs/zh/integrate-with-rstest.mdx b/apps/site/docs/zh/integrate-with-rstest.mdx new file mode 100644 index 0000000000..6c85f76d75 --- /dev/null +++ b/apps/site/docs/zh/integrate-with-rstest.mdx @@ -0,0 +1,396 @@ +import SetupEnv from './common/setup-env.mdx'; +import { PackageManagerTabs } from '@theme'; + +# 集成到 Rstest + +[Rstest](https://github.com/web-infra-dev/rstest) 是基于 Rspack 的高性能测试框架。`@midscene/rstest` 把 midscene 暴露成原生 rstest fixtures —— 浏览器启动、Agent 创建、HTML 报告生成都由 Midscene 自动处理。 + +```ts +import { test as base } from '@midscene/rstest/playwright'; +import { expect } from '@rstest/core'; + +const test = base.extend({ url: 'http://localhost:5173/' }); + +test('adds a todo', async ({ agent }) => { + await agent.aiAct("type 'Study AI' in the input and press Enter"); + await agent.aiAssert('the list contains exactly one item: "Study AI"'); +}); +``` + +开箱即用的能力: + +- **类型化 fixtures** —— `agent`、`page`、`browser`、`agentForPage` 直接从 test context 解构,不需要 `ctx.` 间接对象,也没有 "只能在 `it(...)` 里访问" 的运行时错误。 +- **Lazy 浏览器生命周期** —— 一个文件里如果没有 test 解构 `browser`(或它的下游 fixture),浏览器根本不会被启动。AI 测试和纯 unit test 同文件混写时,AI 成本只针对真正用到 agent 的 test。 +- **可组合** —— 用 `test.extend({ ... })` 覆盖 URL、options,或任何单独的 fixture(比如注入 route 的 `page`,或者第二个 `adminAgent` persona)。 +- **每个文件一份合并后的 HTML 报告**,路径在文件结束时打印到控制台。 + +包内自带 Playwright 与 Puppeteer 两套 provider,通过 subpath export 区分: + +- `@midscene/rstest/playwright` —— 基于 `chromium.launch()`。 +- `@midscene/rstest/puppeteer` —— 基于 `puppeteer.launch()`。 + + + +:::info 样例项目 + +可运行的样例:[https://github.com/web-infra-dev/midscene/tree/main/packages/rstest/demo](https://github.com/web-infra-dev/midscene/tree/main/packages/rstest/demo)。 + +::: + +## 第一步:安装依赖 + +按需选择 Playwright 或 Puppeteer,与 `@midscene/web`、`@rstest/core`、`@midscene/rstest` 一起安装。 + +使用 Playwright: + + + +或者使用 Puppeteer: + + + +## 第二步:配置 Rstest + +在测试项目根目录新建 `rstest.config.ts`: + +```ts title="rstest.config.ts" +import 'dotenv/config'; // 从 .env 加载模型相关环境变量 +import MidsceneReporter from '@midscene/rstest/reporter'; +import { defineConfig } from '@rstest/core'; + +export default defineConfig({ + include: ['e2e/**/*.test.ts'], + // AI 调用较慢,testTimeout 与 hookTimeout 都留足。 + testTimeout: 1_800_000, + hookTimeout: 60_000, + reporters: ['default', new MidsceneReporter()], +}); +``` + +`MidsceneReporter` 会在每个测试文件结束时打印形如 `Midscene report: midscene_run/report/.html` 的一行。在浏览器中打开这个 HTML,即可逐步回放每个 AI 步骤与对应截图。 + +## 第三步:编写测试 + +```ts title="e2e/todo-list.test.ts" +import { test as base } from '@midscene/rstest/playwright'; +import { expect } from '@rstest/core'; + +const test = base.extend({ url: 'http://localhost:5173/' }); + +test('adds and completes a todo', async ({ agent }) => { + await agent.aiAct("type 'Study AI' in the input and press Enter"); + await agent.aiAct('click the checkbox of the first item'); + + const list = await agent.aiQuery( + 'string[], the complete task list', + ); + expect(list).toHaveLength(1); + + await agent.aiAssert('the only item is marked as done'); +}); +``` + +`@midscene/rstest/playwright` 导出的 `test` 是预先挂好了 midscene fixtures 的 rstest test。直接从 test context 解构需要的 fixture,fixture 引擎会按依赖关系拓扑展开 setup 与 teardown。 + +可用的 fixtures: + +- **`agent`** —— 绑定到主 page 上的 midscene `PlaywrightAgent`(或 `PuppeteerAgent`)。AI action 和 assertion 的默认入口。 +- **`page`** —— 底层的 Playwright / Puppeteer `Page`。`agent` 做不到或不该做的事的 escape hatch:`page.route(...)` network mock、`page.evaluate(...)`、`page.context().cookies()` 等。 +- **`browser`** —— file-scoped 的 `Browser`。在测试中开新 context / 新 page(多用户、跨会话场景)用。 +- **`context`** _(仅 Playwright)_ —— 创建主 `page` 的 test-scoped `BrowserContext`。需要自定义 context 时通过 `test.extend` 覆盖。 +- **`agentForPage(page, opts?)`** —— 为另一个 page(popup、手动开的 page)构造一个 midscene agent。报告会和主 agent 合并,销毁自动完成。 +- **`url`** / **`midsceneOptions`** —— 配置 fixtures。详见 [项目级默认配置](#项目级默认配置可选) 与 [自定义 page 设置](#自定义-page-设置)。 + +```ts +test('mocks the API and verifies the UI', async ({ agent, page }) => { + await page.route('**/api/contacts', (route) => + route.fulfill({ json: [{ name: 'Fake Alice' }] }), + ); + await agent.aiAssert('the contact list shows "Fake Alice"'); +}); + +test('drives a popup with a second agent', async ({ + agent, + page, + agentForPage, +}) => { + await agent.aiTap("the 'View details' button"); + const popup = await page.waitForEvent('popup'); + + const popupAgent = await agentForPage(popup); + await popupAgent.aiAssert('the popup shows order details'); +}); + +test('runs two isolated user sessions in one test', async ({ + browser, + agentForPage, +}) => { + const sessionB = await browser.newContext({ storageState: 'user-b.json' }); + const pageB = await sessionB.newPage(); + await pageB.goto('http://localhost:5173/'); + const agentB = await agentForPage(pageB); + + await agentB.aiAct('send a message to user A'); +}); +``` + +如果想换成 Puppeteer,只需改一行 import: + +```ts +import { test as base } from '@midscene/rstest/puppeteer'; +``` + +`agent` 的 API 完全一致。Puppeteer provider 暴露的 fixtures 与 Playwright 一致,但没有 `context`(puppeteer 不使用 context-as-class —— 需要的话覆盖 `page` fixture 并调用 `browser.createBrowserContext()`)。 + +## 第四步:运行测试 + +```bash +npx rstest run + +# 调试时也可以用 watch 模式: +npx rstest watch +``` + +每个文件运行完后会输出: + +```text +Midscene report: midscene_run/report/.html +``` + +报告默认输出到 `midscene_run/report/`。详见[消费报告文件](./consume-report-file)。 + +## 项目级默认配置(可选) + +如果希望所有文件共享同一份配置,把 `defineMidsceneDefaults` 写到一个 setup 文件里,通过 rstest 的 `setupFiles` 注册: + +```ts title="midscene.setup.ts" +import { defineMidsceneDefaults } from '@midscene/rstest/playwright'; + +defineMidsceneDefaults({ + viewport: { width: 1280, height: 720 }, + contextOptions: { locale: 'zh-CN' }, +}); +``` + +```ts title="rstest.config.ts" +export default defineConfig({ + // ...其他配置 + setupFiles: ['./midscene.setup.ts'], +}); +``` + +:::warning 必须从 `setupFiles` 里调用 + +每个 test file 在 rstest 默认的 `isolate: true` 模式下都有自己独立的 module graph,`defineMidsceneDefaults` 写入的是一个 module-scoped store——所以必须从被 rstest 当作每个 test file 启动链路一部分的 setup file 中调用。在某个单一 test file 内部调用只会影响该文件本身。 + +::: + +`defineMidsceneDefaults` 写入的值会在测试运行时由 `midsceneOptions` fixture 读取。需要在某个文件里覆盖时,扩展 test: + +```ts +const test = base.extend({ + url: 'http://localhost:5173/', + midsceneOptions: { + headless: false, + viewport: { width: 375, height: 667 }, + agentOptions: { cache: true }, // 自动从 test 名派生 cache id + }, +}); +``` + +`launchOptions`、`contextOptions` 这类 resolver 字段会在 midscene 默认值之上做**深度合并**,数组自动拼接。需要从默认值里去掉某个字段、或完全接管,用 resolver 的函数形式 `(defaults) => ...`。Puppeteer provider 在 `@midscene/rstest/puppeteer` 提供同名 `defineMidsceneDefaults`。 + +## 配置 midscene + +midscene 从四个渠道读取配置,按你想影响的作用域选一个。 + +1. **环境变量**(模型端点、API Key、vision-family 开关、cache 目录、report 目录、debug 开关):用你平时设环境变量的方式即可(`.env`、CI secret、shell export)。midscene runtime 会自动读取,不用额外接线。完整列表见 [model 配置参考](./model-and-provider)。示例: + + ```bash + MIDSCENE_MODEL_BASE_URL=https://api.openai.com/v1 + MIDSCENE_MODEL_API_KEY=sk-... + MIDSCENE_MODEL_NAME=gpt-4o + MIDSCENE_DEBUG_MODEL_RESPONSE=1 # 把模型原始响应 dump 到磁盘 + MIDSCENE_RUN_DIR=./midscene_run # 报告 + 缓存的根目录 + ``` + +2. **`midsceneOptions.agentOptions`** —— 每个文件可独立配置,针对 per-agent 配置。接收完整 `AgentOpt`(`modelConfig`、`aiActionContext`、`cache`、`replanningCycleLimit`、`waitAfterAction`、`screenshotShrinkFactor`、`onTaskStartTip`、`onOpenAIClientCreated` 等)。`groupName` 和 `reportFileName` 由 lifecycle 保留。 + + ```ts + const test = base.extend({ + url: 'http://localhost:5173/', + midsceneOptions: { + agentOptions: { + aiActionContext: 'You are testing a multilingual checkout flow.', + cache: { strategy: 'read-write' }, + waitAfterAction: 500, + }, + }, + }); + ``` + +3. **`overrideAIConfig(...)`** —— 在 setup file 里用,做环境变量表达不了的运行时全局覆盖(比如根据是否 CI 切模型)。两个 provider 入口都 re-export 了。 + + ```ts title="midscene.setup.ts" + import { overrideAIConfig } from '@midscene/rstest/playwright'; + + overrideAIConfig({ + MIDSCENE_MODEL_NAME: process.env.CI ? 'gpt-4o' : 'gpt-4o-mini', + }); + ``` + +4. **Debug 日志** —— `@midscene/rstest` 用 `debug` 包,按需通过 `DEBUG` 环境变量打开 topic: + + ```bash + DEBUG=midscene:*,rstest:* npx rstest run + ``` + +## 选项 + +`midsceneOptions` 集中承载所有 per-file 配置。可以通过 `defineMidsceneDefaults` 设仓库级默认,或通过 `test.extend({ midsceneOptions: {...} })` 在单个文件覆盖。 + +### Playwright (`@midscene/rstest/playwright`) + +| 字段 | 类型 | 默认值 | 说明 | +| --- | --- | --- | --- | +| `headless` | `boolean` | CI 中 `true`,本地 `false` | `launchOptions.headless` 的便捷写法。 | +| `viewport` | `{ width, height }` | `1920×1080` | `contextOptions.viewport` 的便捷写法。 | +| `launchOptions` | `LaunchOptions \| (defaults) => LaunchOptions` | — | 透传到 `chromium.launch(...)`。 | +| `contextOptions` | `BrowserContextOptions \| (defaults) => BrowserContextOptions` | — | 透传到 `browser.newContext(...)`。 | +| `gotoOptions` | `Parameters[1]` | — | 透传到 `page.goto(url, ...)`。 | +| `agentOptions` | `WebPageAgentOpt` | — | 透传给 `PlaywrightAgent`(如 `aiActionContext`、`modelConfig`)。`groupName` 与 `reportFileName` 由 lifecycle 管理。`cache` 接受 `true \| false \| { strategy?, id? }`——当 `cache: true` 或 `id` 缺省时,会自动从测试文件名 + test 名派生一个稳定 id,让重复跑同一个测试复用同一个 cache namespace。 | + +### Puppeteer (`@midscene/rstest/puppeteer`) + +| 字段 | 类型 | 默认值 | 说明 | +| --- | --- | --- | --- | +| `headless` | `boolean` | CI 中 `true`,本地 `false` | `launchOptions.headless` 的便捷写法。 | +| `viewport` | `{ width, height }` | `1920×1080` | `launchOptions.defaultViewport` 的便捷写法。 | +| `launchOptions` | `LaunchOptions \| (defaults) => LaunchOptions` | — | 透传到 `puppeteer.launch(...)`。 | +| `gotoOptions` | `GoToOptions` | — | 透传到 `page.goto(url, ...)`。 | +| `agentOptions` | `WebPageAgentOpt` | — | 透传给 `PuppeteerAgent`。`cache` 简写同 Playwright provider——`cache: true` 自动派生 id。 | + +`launchOptions`、`contextOptions` 这类 resolver 字段同时接受对象、函数 `(defaults) => options`(同步或异步)、以及它们组成的数组——对象形态会和 midscene 默认值做**深度合并**、数组自动拼接,函数形态则可以完全接管。 + +### 示例 + +加一个 launch flag,同时保留 midscene 在 CI 上必需的默认 args: + +```ts +const test = base.extend({ + url: 'http://localhost:5173/', + midsceneOptions: { + // 最终 `args` 为 ['--no-sandbox', '--ignore-certificate-errors', '--start-fullscreen']。 + launchOptions: { args: ['--start-fullscreen'] }, + }, +}); +``` + +只改动一个嵌套字段,兄弟字段不丢: + +```ts +const test = base.extend({ + url: 'http://localhost:5173/', + midsceneOptions: { + // 最终 viewport 为 { width: 1440, height: 1080 }——height 仍然保留。 + contextOptions: { viewport: { width: 1440 } }, + }, +}); +``` + +深度合并解决不了的场景用函数形式——通常是想从默认值里**去掉**某些字段、写异步逻辑、或者完全替换: + +```ts +const test = base.extend({ + url: 'http://localhost:5173/', + midsceneOptions: { + launchOptions: (defaults) => ({ + ...defaults, + args: defaults.args?.filter((a) => a !== '--no-sandbox'), + }), + }, +}); +``` + +配置 context(Playwright): + +```ts +const test = base.extend({ + url: 'http://localhost:5173/', + midsceneOptions: { + contextOptions: { + locale: 'zh-CN', + storageState: 'auth.json', + recordVideo: { dir: 'midscene_run/video' }, + }, + }, +}); +``` + +## 自定义 page 设置 + +默认 lifecycle 无法满足的场景 —— persistent context、CDP connect、自定义 trace 编排、per-test storage state —— 直接覆盖 `page` fixture。`await use(page)` 之前是 setup,之后是 teardown。 + +```ts +import { test as base } from '@midscene/rstest/playwright'; +import { mkdirSync } from 'node:fs'; +import { join } from 'node:path'; + +const test = base.extend({ + url: 'https://example.com', + page: async ({ context, url, task }, use) => { + await context.tracing.start({ screenshots: true, snapshots: true }); + const page = await context.newPage(); + await page.goto(url); + + await use(page); + + const passed = task.result?.status === 'pass'; + if (passed) { + await context.tracing.stop(); + } else { + mkdirSync('midscene_run/trace', { recursive: true }); + await context.tracing.stop({ + path: join('midscene_run/trace', `${task.name}.zip`), + }); + } + }, +}); +``` + +`page` fixture 的 teardown 在 `agent.destroy()` **之后**触发,此时 page 仍然存活 —— 这正是停 trace、保存录屏、dump cookies 等操作的窗口期。共享的 `browser` 和默认构造的 `context` 也都还活着;只有你自己开的资源由你自己的 teardown 决定何时关闭。 + +如果需要更深层定制(比如完全自建一个 persistent context),覆盖 `context` fixture —— 它只依赖 `browser` 与 `midsceneOptions`,默认的 `page` 会自动复用你产出的 context。 + +## 多 Persona 与组合 fixtures + +`test.extend` 是可组合的 —— 像叠 options 一样叠 fixtures: + +```ts +const test = base.extend<{ + adminAgent: PlaywrightAgent; +}>({ + url: 'http://localhost:5173/', + adminAgent: async ({ browser }, use) => { + const context = await browser.newContext({ storageState: 'admin.json' }); + const page = await context.newPage(); + await page.goto('http://localhost:5173/'); + const agent = new PlaywrightAgent(page); + await use(agent); + await agent.destroy(); + await context.close(); + }, +}); + +test('only admin can delete', async ({ agent, adminAgent }) => { + await agent.aiAssert('no Delete button is visible'); + await adminAgent.aiAssert('a Delete button is visible'); +}); +``` + +这是多 persona 测试、mock server fixture、数据库 seed 以及其它你过去写在 `beforeEach` 里的东西的推荐写法 —— fixtures 按依赖图组合,按反向顺序 teardown,顺序显式且确定。 + +## 更多 + +- 所有 Agent 方法:[API Reference](./api#interaction-methods)。 +- 样例项目:[https://github.com/web-infra-dev/midscene/tree/main/packages/rstest/demo](https://github.com/web-infra-dev/midscene/tree/main/packages/rstest/demo)。 diff --git a/apps/site/rspress.config.ts b/apps/site/rspress.config.ts index 07fb03b593..ce7b6668cf 100644 --- a/apps/site/rspress.config.ts +++ b/apps/site/rspress.config.ts @@ -101,6 +101,10 @@ export default defineConfig({ text: 'Integrate with Puppeteer', link: '/integrate-with-puppeteer', }, + { + text: 'Integrate with Rstest', + link: '/integrate-with-rstest', + }, { text: 'Bridge to the desktop Chrome', link: '/bridge-mode', @@ -281,6 +285,10 @@ export default defineConfig({ text: '集成到 Puppeteer', link: '/zh/integrate-with-puppeteer', }, + { + text: '集成到 Rstest', + link: '/zh/integrate-with-rstest', + }, { text: '桥接到桌面 Chrome', link: '/zh/bridge-mode', diff --git a/package.json b/package.json index ab5524d442..8034921d85 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "build": "nx run-many --target=build --exclude=doc --verbose", "build:packages": "pnpm -r --filter './packages/**' --if-present run build", "build:skip-cache": "npm run clean && nx run-many --target=build --exclude=doc --verbose --skip-nx-cache", - "test": "nx run-many --target=test --projects=@midscene/core,@midscene/shared,@midscene/visualizer,@midscene/web,@midscene/cli,@midscene/android,@midscene/ios,@midscene/computer,@midscene/android-mcp,@midscene/ios-mcp,@midscene/web-bridge-mcp,@midscene/playground,studio --verbose", + "test": "nx run-many --target=test --projects=@midscene/core,@midscene/shared,@midscene/visualizer,@midscene/web,@midscene/cli,@midscene/android,@midscene/ios,@midscene/computer,@midscene/android-mcp,@midscene/ios-mcp,@midscene/web-bridge-mcp,@midscene/playground,@midscene/rstest,studio --verbose", "test:ai": "nx run-many --target=test:ai --projects=@midscene/core,@midscene/web,@midscene/cli,@midscene/computer --verbose", "e2e": "nx run @midscene/web:e2e --verbose --exclude-task-dependencies", "e2e:cache": "nx run @midscene/web:e2e:cache --verbose --exclude-task-dependencies", diff --git a/packages/rstest/README.md b/packages/rstest/README.md new file mode 100644 index 0000000000..8eb1023dc8 --- /dev/null +++ b/packages/rstest/README.md @@ -0,0 +1,5 @@ +# @midscene/rstest + +Run Midscene AI browser agents as [Rstest](https://rstest.rsbuild.dev/) tests. Provides Playwright and Puppeteer providers plus an Rstest reporter that surfaces Midscene reports. + +- **Integration guide**: diff --git a/packages/rstest/demo/playground.test.ts b/packages/rstest/demo/playground.test.ts new file mode 100644 index 0000000000..23d8dc147c --- /dev/null +++ b/packages/rstest/demo/playground.test.ts @@ -0,0 +1,91 @@ +import { test as base } from '@midscene/rstest/playwright'; +import { describe, expect } from '@rstest/core'; + +const PAGE_URL = + 'https://lf3-static.bytednsdoc.com/obj/eden-cn/nupipfups/Midscene/contacts3.html'; + +// Per-file URL override. The `page` fixture navigates here for every test. +const test = base.extend({ url: PAGE_URL }); + +describe('Contacts page', () => { + // Pattern: semantic UI check via `aiAssert`. + test('renders the smart contacts header and grid', async ({ agent }) => { + await agent.aiAssert( + 'the page header reads "Smart Contacts" with a grid of contact cards below it, each card showing an avatar, name, position, and contact details', + ); + }); + + // Pattern: structured data extraction via `aiQuery` + deterministic + // comparison via rstest `expect`. + test('lists every contact with the expected fields', async ({ agent }) => { + const contacts = await agent.aiQuery< + { name: string; position: string; email: string }[] + >( + 'Array<{name: string, position: string, email: string}>, the name (heading), position (line under the name) and email address shown on every contact card', + ); + + expect(contacts).toHaveLength(5); + const byName = Object.fromEntries(contacts.map((c) => [c.name, c])); + expect(byName['Alice Johnson']).toEqual({ + name: 'Alice Johnson', + position: 'Senior Software Engineer', + email: 'alice.johnson@techcorp.com', + }); + }); + + // Pattern: AI interaction (`aiRightClick`) + AI synchronization (`aiWaitFor`) + // + AI extraction (`aiQuery`) chained together. + test('opens the custom context menu on right-click', async ({ agent }) => { + await agent.aiRightClick("Alice Johnson's contact card"); + await agent.aiWaitFor( + 'a context menu is visible with the items "Call Contact", "Send Email", "Send Message", "Edit Contact", "Copy Info" and "Delete Contact"', + { timeoutMs: 10_000 }, + ); + + const items = await agent.aiQuery( + 'string[], the visible text of every item inside the open context menu, in order', + ); + expect(items).toEqual([ + 'Call Contact', + 'Send Email', + 'Send Message', + 'Edit Contact', + 'Copy Info', + 'Delete Contact', + ]); + }); + + // Escape hatch: raw Playwright `Page` for browser-primitive checks that + // don't need the AI. Destructure only `page` — the `agent` fixture is not + // created, but `page` still pulls in `browser`/`context`/auto-navigation. + test('inspects raw page state via the Playwright page escape hatch', async ({ + page, + }) => { + expect(page.url()).toBe(PAGE_URL); + + const viewport = page.viewportSize(); + expect(viewport?.width).toBeGreaterThan(0); + expect(viewport?.height).toBeGreaterThan(0); + + const title = await page.title(); + expect(title.length).toBeGreaterThan(0); + }); + + // Multi-session: open a second isolated browser context (think "another + // user") and drive it with a separate midscene agent via `agentForPage`. + // The secondary's report is merged alongside the primary's at fixture + // teardown; destroy is automatic. + test('drives a second isolated session via browser + agentForPage', async ({ + browser, + agentForPage, + }) => { + const sessionB = await browser.newContext(); + const pageB = await sessionB.newPage(); + await pageB.goto(PAGE_URL); + + const agentB = await agentForPage(pageB); + await agentB.aiAssert( + 'the contact grid is visible and contains "Alice Johnson"', + ); + }); +}); diff --git a/packages/rstest/demo/rstest.config.ts b/packages/rstest/demo/rstest.config.ts new file mode 100644 index 0000000000..0067f04718 --- /dev/null +++ b/packages/rstest/demo/rstest.config.ts @@ -0,0 +1,12 @@ +import MidsceneReporter from '@midscene/rstest/reporter'; +import { defineConfig } from '@rstest/core'; +import dotenv from 'dotenv'; + +dotenv.config({ path: '../../.env' }); + +export default defineConfig({ + include: ['*.test.ts'], + testTimeout: 1_800_000, + hookTimeout: 60_000, + reporters: ['default', new MidsceneReporter()], +}); diff --git a/packages/rstest/package.json b/packages/rstest/package.json new file mode 100644 index 0000000000..dcd1fbe180 --- /dev/null +++ b/packages/rstest/package.json @@ -0,0 +1,91 @@ +{ + "name": "@midscene/rstest", + "description": "Run Midscene AI browser agents as Rstest tests. Provides Playwright and Puppeteer providers plus a Rstest reporter that surfaces Midscene reports.", + "keywords": [ + "rstest", + "midscene", + "AI testing", + "AI UI automation", + "Browser use", + "playwright", + "puppeteer" + ], + "version": "1.7.9", + "repository": "https://github.com/web-infra-dev/midscene", + "homepage": "https://midscenejs.com/", + "type": "module", + "sideEffects": false, + "files": ["dist", "README.md"], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js" + }, + "./reporter": { + "types": "./dist/reporter.d.ts", + "import": "./dist/reporter.js" + }, + "./playwright": { + "types": "./dist/playwright.d.ts", + "import": "./dist/playwright.js" + }, + "./puppeteer": { + "types": "./dist/puppeteer.d.ts", + "import": "./dist/puppeteer.js" + } + }, + "scripts": { + "dev": "npm run build:watch", + "build": "rslib build", + "build:watch": "rslib build --watch --no-clean", + "test": "rstest run", + "test:demo": "rstest run --config rstest.config.ts --root demo", + "test:watch": "rstest watch", + "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@midscene/shared": "workspace:*" + }, + "peerDependencies": { + "@midscene/core": "workspace:*", + "@midscene/web": "workspace:*", + "@playwright/test": "^1.45.0", + "@rstest/core": ">=0.9.0", + "playwright": "^1.45.0", + "puppeteer": ">=20.0.0" + }, + "peerDependenciesMeta": { + "@playwright/test": { + "optional": true + }, + "playwright": { + "optional": true + }, + "puppeteer": { + "optional": true + } + }, + "devDependencies": { + "@midscene/core": "workspace:*", + "@midscene/web": "workspace:*", + "@playwright/test": "^1.45.0", + "@rslib/core": "^0.18.3", + "@rstest/core": "^0.9.9", + "@types/node": "^18.0.0", + "deepmerge": "^4.3.1", + "dotenv": "^16.4.5", + "playwright": "^1.45.0", + "puppeteer": "24.6.0", + "reduce-configs": "^1.1.2", + "std-env": "^4.1.0", + "typescript": "^5.8.3" + }, + "engines": { + "node": ">=18.19.0" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org" + }, + "license": "MIT" +} diff --git a/packages/rstest/rslib.config.ts b/packages/rstest/rslib.config.ts new file mode 100644 index 0000000000..f463c73d7e --- /dev/null +++ b/packages/rstest/rslib.config.ts @@ -0,0 +1,23 @@ +import { defineConfig } from '@rslib/core'; + +export default defineConfig({ + lib: [ + { + source: { + entry: { + index: './src/index.ts', + reporter: './src/reporter.ts', + playwright: './src/playwright.ts', + puppeteer: './src/puppeteer.ts', + }, + }, + format: 'esm', + syntax: 'es2022', + dts: { bundle: false }, + }, + ], + output: { + target: 'node', + sourceMap: true, + }, +}); diff --git a/packages/rstest/rstest.config.ts b/packages/rstest/rstest.config.ts new file mode 100644 index 0000000000..d381135fbd --- /dev/null +++ b/packages/rstest/rstest.config.ts @@ -0,0 +1,5 @@ +import { defineConfig } from '@rstest/core'; + +export default defineConfig({ + include: ['tests/unit-test/**/*.test.ts'], +}); diff --git a/packages/rstest/src/index.ts b/packages/rstest/src/index.ts new file mode 100644 index 0000000000..79b5ec5da8 --- /dev/null +++ b/packages/rstest/src/index.ts @@ -0,0 +1 @@ +export type { Resolver } from './resolve'; diff --git a/packages/rstest/src/playwright.ts b/packages/rstest/src/playwright.ts new file mode 100644 index 0000000000..e5bf7e77a3 --- /dev/null +++ b/packages/rstest/src/playwright.ts @@ -0,0 +1,258 @@ +import type { Cache } from '@midscene/core'; +import { processCacheConfig } from '@midscene/core/utils'; +import { getDebug } from '@midscene/shared/logger'; +import { + PlaywrightAgent, + type WebPageAgentOpt, + overrideAIConfig, +} from '@midscene/web/playwright'; +import { afterAll, test as baseTest, beforeAll } from '@rstest/core'; +import { + type Browser, + type BrowserContext, + type BrowserContextOptions, + type LaunchOptions, + type Page, + chromium, +} from 'playwright'; +import { isCI } from 'std-env'; +import { + DEFAULT_BROWSER_ARGS, + DEFAULT_VIEWPORT, + createDefaultsStore, +} from './provider-shared'; +import { + ReportHelper, + type ReportMeta, + buildReportMeta, +} from './report-helper'; +import { type Resolver, applyResolver } from './resolve'; +import type { TestApi } from './test-api-types'; + +type GoToOptions = NonNullable[1]>; + +/** + * Cache configuration shape exposed to rstest users. `id` is optional — when + * omitted (or when `cache: true`), the package fills in a stable id derived + * from the test's file basename and name, so re-runs of the same test reuse + * the same cache namespace without the user having to manage id strings. + */ +export type RstestCache = + | false + | true + | { strategy?: 'read-only' | 'read-write' | 'write-only'; id?: string }; + +type AgentOptions = Omit< + WebPageAgentOpt, + 'groupName' | 'reportFileName' | 'cache' +> & { + cache?: RstestCache; +}; + +export type { Resolver }; +export { overrideAIConfig }; +export type { WebPageAgentOpt }; + +const debug = getDebug('rstest:playwright', { console: true }); + +export interface MidsceneOptions { + /** Default: `true` in CI, `false` locally. */ + headless?: boolean; + /** + * Default: 1920×1080. Routed into the default `contextOptions.viewport`. + * Nested fields in `contextOptions.viewport` override this — e.g. passing + * `viewport: { width: 1440, height: 900 }` together with + * `contextOptions: { viewport: { width: 1920 } }` yields a final viewport of + * `{ width: 1920, height: 900 }`. + */ + viewport?: { width: number; height: number }; + launchOptions?: Resolver; + contextOptions?: Resolver; + gotoOptions?: GoToOptions; + agentOptions?: AgentOptions; +} + +export type AgentForPage = ( + page: Page, + opts?: AgentOptions, +) => Promise; + +export interface MidsceneFixtures { + midsceneOptions: MidsceneOptions; + /** + * Target URL the default `page` fixture navigates to. Empty string disables + * auto-navigation (page stays on `about:blank`). + */ + url: string; + /** + * File-scoped Playwright `Browser`. Launched lazily — if no test in the file + * destructures anything that depends on `browser`, no browser is started. + */ + browser: Browser; + context: BrowserContext; + page: Page; + agent: PlaywrightAgent; + /** + * Factory for secondary agents bound to popups / extra contexts. Reports are + * merged alongside the primary's. Destroy is automatic in fixture teardown. + */ + agentForPage: AgentForPage; +} + +// Private fixture — shared meta + startTime so primary and secondaries get +// the same timestamp in their reportFileName. Hidden from the public type via +// the cast at the bottom. +interface InternalFixtures extends MidsceneFixtures { + __reportMeta: { meta: ReportMeta; startTime: number }; +} + +const defaultsStore = createDefaultsStore(); + +/** + * Set repo-wide `midsceneOptions` defaults that every test file picks up via + * the `midsceneOptions` fixture. + * + * **Must be called from a file referenced in rstest's `setupFiles` config** — + * each test file runs in its own isolated module graph, so the store is + * populated per file at setup time. Calling this inside a single test file + * only affects that file. + * + * Multiple calls shallow-merge: later calls overwrite previously-set top-level + * keys but keep untouched ones. Per-file overrides go via + * `test.extend({ midsceneOptions: { ... } })`. + */ +export const defineMidsceneDefaults = defaultsStore.define; + +// rstest's default `isolate: true` gives each test file a fresh module graph, +// so these vars start clean per file. +let _filepath = ''; +let _browserPromise: Promise | null = null; +const _reportHelper = new ReportHelper(); + +beforeAll(async (suite: { filepath: string }) => { + if (_filepath && _filepath !== suite.filepath) { + throw new Error( + `@midscene/rstest requires test isolation but detected module-graph reuse across files (${_filepath} -> ${suite.filepath}). Remove \`isolate: false\` from your rstest config.`, + ); + } + _filepath = suite.filepath; +}); + +afterAll(async () => { + _reportHelper.mergeReports(_filepath); + if (_browserPromise) { + try { + await (await _browserPromise).close(); + } catch (err) { + debug('browser close failed:', err); + } + _browserPromise = null; + } +}); + +function acquireBrowser(opts: MidsceneOptions): Promise { + if (!_browserPromise) { + _browserPromise = applyResolver(opts.launchOptions, { + headless: opts.headless ?? isCI, + args: DEFAULT_BROWSER_ARGS, + }).then((launchOptions) => chromium.launch(launchOptions)); + } + return _browserPromise; +} + +// rstest 0.9.9 doesn't export the type of `extend`'s return value; cast via the +// hand-rolled `TestApi` (see `test-api-types.ts`). +export const test = baseTest.extend({ + midsceneOptions: async (_ctx, use) => { + await use(defaultsStore.get()); + }, + + url: '', + + __reportMeta: async ({ task }, use) => { + await use({ + meta: buildReportMeta({ task }, _filepath), + startTime: performance.now(), + }); + }, + + browser: async ({ midsceneOptions }, use) => { + await use(await acquireBrowser(midsceneOptions)); + }, + + context: async ({ browser, midsceneOptions }, use) => { + const contextOptions = await applyResolver(midsceneOptions.contextOptions, { + viewport: midsceneOptions.viewport ?? DEFAULT_VIEWPORT, + }); + const context = await browser.newContext(contextOptions); + await use(context); + try { + await context.close(); + } catch (err) { + debug('context close failed:', err); + } + }, + + page: async ({ context, url, midsceneOptions }, use) => { + const page = await context.newPage(); + if (url) { + await page.goto(url, midsceneOptions.gotoOptions); + } + await use(page); + }, + + agent: async ({ page, midsceneOptions, __reportMeta, task }, use) => { + const { cache: rawCache, ...rest } = midsceneOptions.agentOptions ?? {}; + const cache = processCacheConfig( + rawCache as Cache | undefined, + __reportMeta.meta.cacheId, + ); + const agent = new PlaywrightAgent(page, { + ...rest, + cache, + groupName: __reportMeta.meta.groupName, + reportFileName: __reportMeta.meta.reportFileName, + }); + await use(agent); + await _reportHelper.collectReport(agent, __reportMeta.startTime, { task }); + }, + + // Depends on `agent` so its teardown runs BEFORE the primary's — secondaries + // are collected while their pages are still alive. + agentForPage: async ({ agent, midsceneOptions, __reportMeta, task }, use) => { + const secondaries: PlaywrightAgent[] = []; + let counter = 0; + + const helper: AgentForPage = async (secondaryPage, opts) => { + counter += 1; + const { cache: optsCache, ...optsRest } = opts ?? {}; + const { cache: fixtureCache, ...fixtureRest } = + midsceneOptions.agentOptions ?? {}; + const cache = processCacheConfig( + (optsCache ?? fixtureCache) as Cache | undefined, + __reportMeta.meta.cacheId, + ); + const secondary = new PlaywrightAgent(secondaryPage, { + ...fixtureRest, + ...optsRest, + cache, + groupName: __reportMeta.meta.groupName, + reportFileName: `${__reportMeta.meta.reportFileName}-page${counter}`, + }); + secondaries.push(secondary); + return secondary; + }; + await use(helper); + + for (const secondary of secondaries) { + try { + await _reportHelper.collectReport(secondary, __reportMeta.startTime, { + task, + }); + } catch (err) { + debug('secondary agent report failed:', err); + } + } + void agent; + }, +}) as unknown as TestApi; diff --git a/packages/rstest/src/provider-shared.ts b/packages/rstest/src/provider-shared.ts new file mode 100644 index 0000000000..5f45e21a7d --- /dev/null +++ b/packages/rstest/src/provider-shared.ts @@ -0,0 +1,16 @@ +export const DEFAULT_BROWSER_ARGS = [ + '--no-sandbox', + '--ignore-certificate-errors', +]; + +export const DEFAULT_VIEWPORT = { width: 1920, height: 1080 } as const; + +export function createDefaultsStore() { + let defaults: T = {} as T; + return { + get: (): T => defaults, + define: (next: T): void => { + defaults = { ...defaults, ...next }; + }, + }; +} diff --git a/packages/rstest/src/puppeteer.ts b/packages/rstest/src/puppeteer.ts new file mode 100644 index 0000000000..755c538ee5 --- /dev/null +++ b/packages/rstest/src/puppeteer.ts @@ -0,0 +1,238 @@ +import type { Cache } from '@midscene/core'; +import { processCacheConfig } from '@midscene/core/utils'; +import { getDebug } from '@midscene/shared/logger'; +import { + PuppeteerAgent, + type WebPageAgentOpt, + overrideAIConfig, +} from '@midscene/web/puppeteer'; +import { afterAll, test as baseTest, beforeAll } from '@rstest/core'; +import puppeteer, { + type Browser, + type GoToOptions, + type LaunchOptions, + type Page, +} from 'puppeteer'; +import { isCI } from 'std-env'; +import { + DEFAULT_BROWSER_ARGS, + DEFAULT_VIEWPORT, + createDefaultsStore, +} from './provider-shared'; +import { + ReportHelper, + type ReportMeta, + buildReportMeta, +} from './report-helper'; +import { type Resolver, applyResolver } from './resolve'; +import type { TestApi } from './test-api-types'; + +/** + * Cache configuration shape exposed to rstest users. `id` is optional — when + * omitted (or when `cache: true`), the package fills in a stable id derived + * from the test's file basename and name, so re-runs of the same test reuse + * the same cache namespace without the user having to manage id strings. + */ +export type RstestCache = + | false + | true + | { strategy?: 'read-only' | 'read-write' | 'write-only'; id?: string }; + +type AgentOptions = Omit< + WebPageAgentOpt, + 'groupName' | 'reportFileName' | 'cache' +> & { + cache?: RstestCache; +}; + +export type { Resolver }; +export { overrideAIConfig }; +export type { WebPageAgentOpt }; + +const debug = getDebug('rstest:puppeteer', { console: true }); + +export interface MidsceneOptions { + /** Default: `true` in CI, `false` locally. */ + headless?: boolean; + /** + * Default: 1920×1080. Routed into the default `launchOptions.defaultViewport`. + * Nested fields in `launchOptions.defaultViewport` override this — e.g. + * passing `viewport: { width: 1440, height: 900 }` together with + * `launchOptions: { defaultViewport: { width: 1920 } }` yields a final + * default viewport of `{ width: 1920, height: 900 }`. + */ + viewport?: { width: number; height: number }; + launchOptions?: Resolver; + gotoOptions?: GoToOptions; + agentOptions?: AgentOptions; +} + +export type AgentForPage = ( + page: Page, + opts?: AgentOptions, +) => Promise; + +export interface MidsceneFixtures { + midsceneOptions: MidsceneOptions; + /** + * Target URL the default `page` fixture navigates to. Empty string disables + * auto-navigation. + */ + url: string; + /** + * File-scoped Puppeteer `Browser`. Launched lazily — if no test in the file + * destructures anything that depends on `browser`, no browser is started. + */ + browser: Browser; + page: Page; + agent: PuppeteerAgent; + /** + * Factory for secondary agents bound to popups / extra pages. Reports are + * merged alongside the primary's. Destroy is automatic in fixture teardown. + */ + agentForPage: AgentForPage; +} + +// Private fixture (see playwright.ts). +interface InternalFixtures extends MidsceneFixtures { + __reportMeta: { meta: ReportMeta; startTime: number }; +} + +const defaultsStore = createDefaultsStore(); + +/** + * Set repo-wide `midsceneOptions` defaults that every test file picks up via + * the `midsceneOptions` fixture. + * + * **Must be called from a file referenced in rstest's `setupFiles` config** — + * each test file runs in its own isolated module graph, so the store is + * populated per file at setup time. Calling this inside a single test file + * only affects that file. + * + * Multiple calls shallow-merge: later calls overwrite previously-set top-level + * keys but keep untouched ones. Per-file overrides go via + * `test.extend({ midsceneOptions: { ... } })`. + */ +export const defineMidsceneDefaults = defaultsStore.define; + +let _filepath = ''; +let _browserPromise: Promise | null = null; +const _reportHelper = new ReportHelper(); + +beforeAll(async (suite: { filepath: string }) => { + if (_filepath && _filepath !== suite.filepath) { + throw new Error( + `@midscene/rstest requires test isolation but detected module-graph reuse across files (${_filepath} -> ${suite.filepath}). Remove \`isolate: false\` from your rstest config.`, + ); + } + _filepath = suite.filepath; +}); + +afterAll(async () => { + _reportHelper.mergeReports(_filepath); + if (_browserPromise) { + try { + await (await _browserPromise).close(); + } catch (err) { + debug('browser close failed:', err); + } + _browserPromise = null; + } +}); + +function acquireBrowser(opts: MidsceneOptions): Promise { + if (!_browserPromise) { + _browserPromise = applyResolver(opts.launchOptions, { + headless: opts.headless ?? isCI, + args: DEFAULT_BROWSER_ARGS, + defaultViewport: opts.viewport ?? DEFAULT_VIEWPORT, + }).then((launchOptions) => puppeteer.launch(launchOptions)); + } + return _browserPromise; +} + +export const test = baseTest.extend({ + midsceneOptions: async (_ctx, use) => { + await use(defaultsStore.get()); + }, + + url: '', + + __reportMeta: async ({ task }, use) => { + await use({ + meta: buildReportMeta({ task }, _filepath), + startTime: performance.now(), + }); + }, + + browser: async ({ midsceneOptions }, use) => { + await use(await acquireBrowser(midsceneOptions)); + }, + + page: async ({ browser, url, midsceneOptions }, use) => { + const page = await browser.newPage(); + if (url) { + await page.goto(url, midsceneOptions.gotoOptions); + } + await use(page); + try { + await page.close(); + } catch (err) { + debug('page close failed:', err); + } + }, + + agent: async ({ page, midsceneOptions, __reportMeta, task }, use) => { + const { cache: rawCache, ...rest } = midsceneOptions.agentOptions ?? {}; + const cache = processCacheConfig( + rawCache as Cache | undefined, + __reportMeta.meta.cacheId, + ); + const agent = new PuppeteerAgent(page, { + ...rest, + cache, + groupName: __reportMeta.meta.groupName, + reportFileName: __reportMeta.meta.reportFileName, + }); + await use(agent); + await _reportHelper.collectReport(agent, __reportMeta.startTime, { task }); + }, + + // Depends on `agent` so its teardown runs BEFORE the primary's. + agentForPage: async ({ agent, midsceneOptions, __reportMeta, task }, use) => { + const secondaries: PuppeteerAgent[] = []; + let counter = 0; + + const helper: AgentForPage = async (secondaryPage, opts) => { + counter += 1; + const { cache: optsCache, ...optsRest } = opts ?? {}; + const { cache: fixtureCache, ...fixtureRest } = + midsceneOptions.agentOptions ?? {}; + const cache = processCacheConfig( + (optsCache ?? fixtureCache) as Cache | undefined, + __reportMeta.meta.cacheId, + ); + const secondary = new PuppeteerAgent(secondaryPage, { + ...fixtureRest, + ...optsRest, + cache, + groupName: __reportMeta.meta.groupName, + reportFileName: `${__reportMeta.meta.reportFileName}-page${counter}`, + }); + secondaries.push(secondary); + return secondary; + }; + await use(helper); + + for (const secondary of secondaries) { + try { + await _reportHelper.collectReport(secondary, __reportMeta.startTime, { + task, + }); + } catch (err) { + debug('secondary agent report failed:', err); + } + } + void agent; + }, +}) as unknown as TestApi; diff --git a/packages/rstest/src/report-helper.ts b/packages/rstest/src/report-helper.ts new file mode 100644 index 0000000000..42af17ca55 --- /dev/null +++ b/packages/rstest/src/report-helper.ts @@ -0,0 +1,113 @@ +import { mkdirSync, writeFileSync } from 'node:fs'; +import { basename, extname, join } from 'node:path'; +import type { TestStatus } from '@midscene/core'; +import { ReportMergingTool } from '@midscene/core/report'; +import { replaceIllegalPathCharsAndSpace } from '@midscene/shared/utils'; +import { MANIFEST_DIR, generateTimestamp, manifestKey } from './utils'; + +export interface RstestTestContext { + task: { + id: string; + name: string; + result?: { + status: 'pass' | 'fail' | 'skip' | 'todo'; + errors?: Array<{ message?: string }>; + }; + }; +} + +export interface AgentLike { + reportFile?: string | null; + destroy(): Promise; +} + +export interface ReportMeta { + groupName: string; + reportFileName: string; + /** + * Stable cache id derived from `${file}(${task.name})`. Unlike + * `reportFileName` this carries no timestamp, so retries and re-runs of the + * same test reuse the same cache namespace. + */ + cacheId: string; +} + +const STATUS_MAP: Record = { + pass: 'passed', + fail: 'failed', +}; + +function deriveStatus(result: RstestTestContext['task']['result']): TestStatus { + // TODO: rstest may eventually surface a structured timeout flag — until then + // we substring-match the error message the way Vitest does. + if (result?.errors?.[0]?.message?.includes('timed out')) return 'timedOut'; + return STATUS_MAP[result?.status ?? ''] ?? 'passed'; +} + +export class ReportHelper { + private reportTool = new ReportMergingTool(); + private firstReport: string | null = null; + + async collectReport( + agent: AgentLike | undefined, + startTime: number | undefined, + testCtx: RstestTestContext, + ): Promise { + const status = deriveStatus(testCtx.task.result); + + await agent?.destroy(); + + const reportFile = agent?.reportFile; + if (!reportFile) return; + + this.reportTool.append({ + reportFilePath: reportFile, + reportAttributes: { + testId: testCtx.task.id, + testTitle: testCtx.task.name, + testDescription: '', + testDuration: + startTime !== undefined + ? Math.round(performance.now() - startTime) + : 0, + testStatus: status, + }, + }); + this.firstReport ??= reportFile; + } + + mergeReports(filepath: string): string | null { + const base = basename(filepath, extname(filepath)) || 'MergedReport'; + const finalReportName = `E2E-${base}-${generateTimestamp()}`; + + const merged = this.reportTool.mergeReports(finalReportName); + const report = merged ?? this.firstReport; + + if (report) { + mkdirSync(MANIFEST_DIR, { recursive: true }); + writeFileSync(join(MANIFEST_DIR, `${manifestKey(filepath)}.txt`), report); + } + + this.firstReport = null; + return merged; + } +} + +/** + * Rstest doesn't expose the surrounding `describe` name in the test context, + * so we derive `groupName` from the file basename. + */ +export function buildReportMeta( + testCtx: RstestTestContext, + filepath: string, +): ReportMeta { + const base = basename(filepath, extname(filepath)) || 'UnnamedGroup'; + const taskName = testCtx.task.name; + return { + groupName: `E2E: ${base}`, + reportFileName: `E2E-${base}-${taskName}-${generateTimestamp()}`, + cacheId: replaceIllegalPathCharsAndSpace(`${base}(${taskName})`), + }; +} + +export { deriveStatus }; diff --git a/packages/rstest/src/reporter.ts b/packages/rstest/src/reporter.ts new file mode 100644 index 0000000000..cfb161b2ab --- /dev/null +++ b/packages/rstest/src/reporter.ts @@ -0,0 +1,30 @@ +import { readFileSync, rmSync } from 'node:fs'; +import { join } from 'node:path'; +import type { Reporter, TestFileResult } from '@rstest/core'; +import { MANIFEST_DIR, manifestKey } from './utils'; + +// node:util.styleText was added in Node 20; use a raw ANSI escape so the +// Node 18.19+ floor declared in `engines` keeps working. +const cyan = (text: string): string => `\x1b[36m${text}\x1b[0m`; + +export default class MidsceneReporter implements Reporter { + onTestRunStart(): void { + // Pre-clean in case a previous run crashed mid-flight. + rmSync(MANIFEST_DIR, { recursive: true, force: true }); + } + + onTestFileResult(file: TestFileResult): void { + const manifestFile = join( + MANIFEST_DIR, + `${manifestKey(file.testPath)}.txt`, + ); + let report: string; + try { + report = readFileSync(manifestFile, 'utf8').trim(); + } catch { + return; + } + if (!report) return; + console.log(` ${cyan(`Midscene report: ${report}`)}`); + } +} diff --git a/packages/rstest/src/resolve.ts b/packages/rstest/src/resolve.ts new file mode 100644 index 0000000000..1b9c269f8b --- /dev/null +++ b/packages/rstest/src/resolve.ts @@ -0,0 +1,39 @@ +import deepmerge from 'deepmerge'; +import { + type ConfigChainAsyncWithContext, + reduceConfigsAsyncWithContext, +} from 'reduce-configs'; + +/** + * An options "resolver". Accepts: + * - an object — deep-merged over the resolved defaults; arrays concatenate, + * - a function `(defaults) => value` (sync or async) that takes full control, or + * - an array of either, applied left-to-right. + * + * Deep-merge keeps sibling fields: passing `{ viewport: { width: 1440 } }` over + * a base of `{ viewport: { width: 1920, height: 1080 } }` produces + * `{ viewport: { width: 1440, height: 1080 } }`. Arrays concatenate, so + * `{ args: ['--start-fullscreen'] }` appends to the package's default browser + * args rather than replacing them. To fully replace, use the function form: + * `(defaults) => ({ ...defaults, args: ['--only-this'] })`. + */ +// Inlined from reduce-configs so the generated .d.ts doesn't reference a +// devDependency. `reduce-configs` is bundled by rslib at build time but isn't +// shipped as a runtime dep, so consumers must not see it in our type surface. +// The runtime supports `void`-returning mutate-in-place functions too, but +// they're an antipattern — we only advertise the return-new-value form. +export type Resolver = + | T + | ((config: T) => T | Promise) + | ReadonlyArray T | Promise)>; + +export function applyResolver( + input: Resolver | undefined, + base: T, +): Promise { + return reduceConfigsAsyncWithContext({ + initial: base, + config: input as ConfigChainAsyncWithContext, + mergeFn: deepmerge as unknown as typeof Object.assign, + }); +} diff --git a/packages/rstest/src/test-api-types.ts b/packages/rstest/src/test-api-types.ts new file mode 100644 index 0000000000..887ea39db2 --- /dev/null +++ b/packages/rstest/src/test-api-types.ts @@ -0,0 +1,85 @@ +/** + * rstest 0.9.9 doesn't `export` its internal `TestAPIs` / `TestContext` / + * `FixtureOptions` types — they're `declare`d only. That makes the type of + * `baseTest.extend(...)` unnameable from outside the module, which + * crashes `tsc --declaration` with TS4023 the moment we try to re-export it. + * + * The interfaces below mirror the public surface users actually touch + * (call signature + variants + `extend` chain + `each` / `for`), built only + * from public types so the emitted `.d.ts` doesn't reference any unexported + * rstest internals. + * + * If a future rstest release exports these types directly, delete this file + * and use them straight from `@rstest/core`. + */ + +import type { Expect } from '@rstest/core'; + +type MaybePromise = T | Promise; + +export interface TestTaskInfo { + id: string; + name: string; + result?: { + status: 'pass' | 'fail' | 'skip' | 'todo'; + errors?: Array<{ message?: string }>; + }; +} + +export interface BaseTestContext { + task: TestTaskInfo; + expect: Expect; + onTestFinished: (fn: (ctx: BaseTestContext) => MaybePromise) => void; + onTestFailed: (fn: (ctx: BaseTestContext) => MaybePromise) => void; +} + +export type TestCallback = ( + ctx: BaseTestContext & Extra, +) => MaybePromise; + +export type FixtureFn = ( + ctx: BaseTestContext & Extra, + use: (value: Value) => Promise, +) => Promise; + +export type FixtureDecl = + | Value + | FixtureFn + | [FixtureFn, { auto?: boolean }]; + +export type FixturesDecl = { + [K in keyof T]: FixtureDecl>; +}; + +export interface TestApi { + (description: string, fn?: TestCallback, timeout?: number): void; + + skip: TestApi; + only: TestApi; + todo: TestApi; + fails: TestApi; + concurrent: TestApi; + sequential: TestApi; + runIf: (condition: boolean) => TestApi; + skipIf: (condition: boolean) => TestApi; + + extend>( + fixtures: FixturesDecl, + ): TestApi; + + each: ( + cases: readonly T[], + ) => ( + description: string, + fn?: (param: T, ctx: BaseTestContext & Extra) => MaybePromise, + timeout?: number, + ) => void; + + for: ( + cases: readonly T[], + ) => ( + description: string, + fn?: (param: T, ctx: BaseTestContext & Extra) => MaybePromise, + timeout?: number, + ) => void; +} diff --git a/packages/rstest/src/utils.ts b/packages/rstest/src/utils.ts new file mode 100644 index 0000000000..fde17494ce --- /dev/null +++ b/packages/rstest/src/utils.ts @@ -0,0 +1,17 @@ +import { createHash } from 'node:crypto'; + +export const MANIFEST_DIR = 'midscene_run/.rstest-manifest'; + +export function generateTimestamp(): string { + const now = new Date(); + const pad = (n: number, w = 2) => String(n).padStart(w, '0'); + return ( + `${now.getFullYear()}${pad(now.getMonth() + 1)}${pad(now.getDate())}` + + `-${pad(now.getHours())}${pad(now.getMinutes())}${pad(now.getSeconds())}` + + `${pad(now.getMilliseconds(), 3)}` + ); +} + +export function manifestKey(testPath: string): string { + return createHash('sha1').update(testPath).digest('hex').slice(0, 16); +} diff --git a/packages/rstest/tests/tsconfig.json b/packages/rstest/tests/tsconfig.json new file mode 100644 index 0000000000..c5c98286ad --- /dev/null +++ b/packages/rstest/tests/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "baseUrl": "../", + "rootDir": "../" + }, + "include": ["**/*", "../src", "../rslib.config.ts", "../rstest.config.ts"], + "exclude": ["**/node_modules"] +} diff --git a/packages/rstest/tests/unit-test/report-helper.test.ts b/packages/rstest/tests/unit-test/report-helper.test.ts new file mode 100644 index 0000000000..2131c0c8c8 --- /dev/null +++ b/packages/rstest/tests/unit-test/report-helper.test.ts @@ -0,0 +1,63 @@ +import { describe, expect, it } from '@rstest/core'; +import { + type RstestTestContext, + buildReportMeta, + deriveStatus, +} from '../../src/report-helper'; + +function ctx( + name: string, + result?: RstestTestContext['task']['result'], +): RstestTestContext { + return { task: { id: 't1', name, result } }; +} + +describe('deriveStatus', () => { + it('maps pass → passed', () => { + expect(deriveStatus({ status: 'pass' })).toBe('passed'); + }); + + it('maps fail → failed', () => { + expect(deriveStatus({ status: 'fail' })).toBe('failed'); + }); + + it('detects timeout from error message substring', () => { + expect( + deriveStatus({ + status: 'fail', + errors: [{ message: 'hook timed out in 60000ms' }], + }), + ).toBe('timedOut'); + }); + + it('falls back to passed when result is missing', () => { + expect(deriveStatus(undefined)).toBe('passed'); + }); + + it('treats skip/todo as passed (no dedicated mapping)', () => { + expect(deriveStatus({ status: 'skip' })).toBe('passed'); + expect(deriveStatus({ status: 'todo' })).toBe('passed'); + }); +}); + +describe('buildReportMeta', () => { + it('derives groupName from file basename without extension', () => { + const meta = buildReportMeta( + ctx('adds a todo'), + '/repo/e2e/todo-list.test.ts', + ); + expect(meta.groupName).toBe('E2E: todo-list.test'); + }); + + it('falls back when filepath has no basename', () => { + const meta = buildReportMeta(ctx('case'), ''); + expect(meta.groupName).toBe('E2E: UnnamedGroup'); + }); + + it('reportFileName embeds basename and task name', () => { + const meta = buildReportMeta(ctx('case A'), '/x/foo.test.ts'); + expect(meta.reportFileName.startsWith('E2E-foo.test-case A-')).toBe(true); + // trailing timestamp + expect(meta.reportFileName).toMatch(/-\d{8}-\d{9}$/); + }); +}); diff --git a/packages/rstest/tests/unit-test/resolve.test.ts b/packages/rstest/tests/unit-test/resolve.test.ts new file mode 100644 index 0000000000..1b8e9e1e23 --- /dev/null +++ b/packages/rstest/tests/unit-test/resolve.test.ts @@ -0,0 +1,78 @@ +import { describe, expect, it } from '@rstest/core'; +import { applyResolver } from '../../src/resolve'; + +describe('applyResolver', () => { + it('returns base when input is undefined', async () => { + const base = { a: 1, b: 2 }; + expect(await applyResolver(undefined, base)).toEqual(base); + }); + + it('deep-merges object input over base', async () => { + const base = { a: 1, b: 2, c: 3 }; + expect(await applyResolver({ b: 20 }, base)).toEqual({ a: 1, b: 20, c: 3 }); + }); + + it('preserves sibling fields in nested objects', async () => { + const base = { viewport: { width: 1920, height: 1080 } }; + expect( + await applyResolver( + { viewport: { width: 1440 } } as Partial, + base, + ), + ).toEqual({ viewport: { width: 1440, height: 1080 } }); + }); + + it('concatenates arrays instead of replacing them', async () => { + const base = { + args: ['--no-sandbox', '--ignore-certificate-errors'] as string[], + }; + expect(await applyResolver({ args: ['--start-fullscreen'] }, base)).toEqual( + { + args: [ + '--no-sandbox', + '--ignore-certificate-errors', + '--start-fullscreen', + ], + }, + ); + }); + + it('calls function with resolved defaults and returns its result', async () => { + const base = { headless: false, args: ['--no-sandbox'] as string[] }; + const result = await applyResolver( + (defaults) => ({ + ...defaults, + args: [...defaults.args, '--disable-gpu'], + }), + base, + ); + expect(result).toEqual({ + headless: false, + args: ['--no-sandbox', '--disable-gpu'], + }); + }); + + it('awaits async resolver functions', async () => { + const base = { a: 1 }; + const result = await applyResolver( + async (defaults) => ({ ...defaults, a: defaults.a + 10 }), + base, + ); + expect(result).toEqual({ a: 11 }); + }); + + it('lets the function fully replace defaults', async () => { + const base = { a: 1, b: 2 }; + const result = await applyResolver(() => ({ a: 99, b: 99 }), base); + expect(result).toEqual({ a: 99, b: 99 }); + }); + + it('applies an array of overrides left-to-right', async () => { + const base = { a: 1, b: 2, args: ['x'] as string[] }; + const result = await applyResolver( + [{ a: 10 }, (d) => ({ ...d, b: d.b + 100 }), { args: ['y'] }], + base, + ); + expect(result).toEqual({ a: 10, b: 102, args: ['x', 'y'] }); + }); +}); diff --git a/packages/rstest/tests/unit-test/utils.test.ts b/packages/rstest/tests/unit-test/utils.test.ts new file mode 100644 index 0000000000..89e223f974 --- /dev/null +++ b/packages/rstest/tests/unit-test/utils.test.ts @@ -0,0 +1,26 @@ +import { describe, expect, it } from '@rstest/core'; +import { MANIFEST_DIR, generateTimestamp, manifestKey } from '../../src/utils'; + +describe('utils', () => { + it('MANIFEST_DIR points under midscene_run', () => { + expect(MANIFEST_DIR).toBe('midscene_run/.rstest-manifest'); + }); + + it('manifestKey is deterministic and 16-char hex', () => { + const a = manifestKey('/abs/path/to/foo.test.ts'); + const b = manifestKey('/abs/path/to/foo.test.ts'); + expect(a).toBe(b); + expect(a).toMatch(/^[0-9a-f]{16}$/); + }); + + it('manifestKey changes with input', () => { + const a = manifestKey('/a.test.ts'); + const b = manifestKey('/b.test.ts'); + expect(a).not.toBe(b); + }); + + it('generateTimestamp formats as YYYYMMDD-HHmmssSSS', () => { + const ts = generateTimestamp(); + expect(ts).toMatch(/^\d{8}-\d{9}$/); + }); +}); diff --git a/packages/rstest/tsconfig.json b/packages/rstest/tsconfig.json new file mode 100644 index 0000000000..c670106a2f --- /dev/null +++ b/packages/rstest/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../shared/tsconfig.base.json", + "compilerOptions": { + "baseUrl": ".", + "rootDir": "./src", + "target": "es2022", + "types": ["node"] + }, + "include": ["src"], + "references": [ + { + "path": "../core" + }, + { + "path": "../shared" + }, + { + "path": "../web-integration" + } + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0ef4037615..cce475fea0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,7 +16,7 @@ importers: version: 2.24.1 '@commitlint/cli': specifier: 19.8.0 - version: 19.8.0(@types/node@25.5.2)(typescript@5.8.3) + version: 19.8.0(@types/node@25.6.0)(typescript@5.8.3) '@commitlint/config-conventional': specifier: 19.8.0 version: 19.8.0 @@ -34,7 +34,7 @@ importers: version: 4.1.1 commitizen: specifier: 4.2.5 - version: 4.2.5(@types/node@25.5.2)(typescript@5.8.3) + version: 4.2.5(@types/node@25.6.0)(typescript@5.8.3) cspell-ban-words: specifier: ^0.0.3 version: 0.0.3 @@ -222,7 +222,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@25.5.2)(jsdom@29.0.2)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@25.6.0)(jsdom@29.0.2)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) web-ext: specifier: 9.0.0 version: 9.0.0(body-parser@1.20.3)(express@4.21.2) @@ -417,7 +417,7 @@ importers: version: 1.4.1(@rsbuild/core@1.6.15) '@rsbuild/plugin-type-check': specifier: ^1.3.2 - version: 1.3.2(@rsbuild/core@1.6.15)(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(typescript@5.8.3) + version: 1.3.2(@rsbuild/core@1.6.15)(@rspack/core@2.0.1(@swc/helpers@0.5.21))(typescript@5.8.3) '@types/chrome': specifier: 0.0.279 version: 0.0.279 @@ -448,7 +448,7 @@ importers: version: 1.2.2(@rsbuild/core@1.6.15)(typescript@5.8.3) '@rsdoctor/rspack-plugin': specifier: 1.0.2 - version: 1.0.2(@rsbuild/core@1.6.15)(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5) + version: 1.0.2(@rsbuild/core@1.6.15)(@rspack/core@2.0.1(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5) '@types/react': specifier: ^18.3.1 version: 18.3.23 @@ -466,7 +466,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@25.5.2)(jsdom@29.0.2)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@25.6.0)(jsdom@29.0.2)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) apps/site: dependencies: @@ -485,16 +485,16 @@ importers: devDependencies: '@rspress/core': specifier: 2.0.8 - version: 2.0.8(@types/mdast@4.0.4)(@types/react@19.1.5)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2) + version: 2.0.8(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2) '@rspress/plugin-client-redirects': specifier: 2.0.8 - version: 2.0.8(@rspress/core@2.0.8(@types/mdast@4.0.4)(@types/react@19.1.5)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2)) + version: 2.0.8(@rspress/core@2.0.8(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2)) '@rspress/plugin-llms': specifier: 2.0.8 - version: 2.0.8(@rspress/core@2.0.8(@types/mdast@4.0.4)(@types/react@19.1.5)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2)) + version: 2.0.8(@rspress/core@2.0.8(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2)) '@rspress/plugin-sitemap': specifier: 2.0.8 - version: 2.0.8(@rspress/core@2.0.8(@types/mdast@4.0.4)(@types/react@19.1.5)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2)) + version: 2.0.8(@rspress/core@2.0.8(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2)) '@tailwindcss/postcss': specifier: 4.1.11 version: 4.1.11 @@ -625,7 +625,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.130)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.130)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) packages/android: dependencies: @@ -684,7 +684,7 @@ importers: version: 6.22.0 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.62)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.62)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) zod: specifier: ^3.25.1 version: 3.25.76 @@ -721,7 +721,7 @@ importers: version: link:../shared '@modelcontextprotocol/inspector': specifier: ^0.16.3 - version: 0.16.3(@types/node@18.19.118)(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@6.0.5) + version: 0.16.3(@types/node@18.19.118)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@6.0.5) '@modelcontextprotocol/sdk': specifier: 1.10.2 version: 1.10.2 @@ -742,7 +742,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) packages/android-playground: dependencies: @@ -882,7 +882,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.62)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.62)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) yargs: specifier: 17.7.2 version: 17.7.2 @@ -929,7 +929,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) packages/computer-linux: dependencies: @@ -998,7 +998,7 @@ importers: version: link:../shared '@modelcontextprotocol/inspector': specifier: ^0.16.3 - version: 0.16.3(@types/node@18.19.118)(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@6.0.5) + version: 0.16.3(@types/node@18.19.118)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@6.0.5) '@modelcontextprotocol/sdk': specifier: 1.10.2 version: 1.10.2 @@ -1019,7 +1019,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) packages/computer-playground: dependencies: @@ -1136,7 +1136,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.62)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.62)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) packages/evaluation: dependencies: @@ -1152,7 +1152,7 @@ importers: devDependencies: '@playwright/test': specifier: ^1.45.0 - version: 1.58.1 + version: 1.59.1 cli-progress: specifier: 3.12.0 version: 3.12.0 @@ -1161,7 +1161,7 @@ importers: version: 16.4.5 playwright: specifier: ^1.45.0 - version: 1.58.1 + version: 1.59.1 sharp: specifier: ^0.34.3 version: 0.34.3 @@ -1170,7 +1170,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@25.5.2)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@25.6.0)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) packages/harmony: dependencies: @@ -1204,7 +1204,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) zod: specifier: ^3.25.1 version: 3.25.76 @@ -1225,7 +1225,7 @@ importers: version: link:../shared '@modelcontextprotocol/inspector': specifier: ^0.16.3 - version: 0.16.3(@types/node@18.19.118)(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@6.0.5) + version: 0.16.3(@types/node@18.19.118)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@6.0.5) '@modelcontextprotocol/sdk': specifier: 1.10.2 version: 1.10.2 @@ -1299,7 +1299,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) zod: specifier: ^3.25.1 version: 3.25.76 @@ -1336,7 +1336,7 @@ importers: version: link:../shared '@modelcontextprotocol/inspector': specifier: ^0.16.3 - version: 0.16.3(@types/node@18.19.118)(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@6.0.5) + version: 0.16.3(@types/node@18.19.118)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@6.0.5) '@modelcontextprotocol/sdk': specifier: 1.10.2 version: 1.10.2 @@ -1357,7 +1357,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) packages/ios-playground: dependencies: @@ -1394,7 +1394,7 @@ importers: version: link:../web-integration '@modelcontextprotocol/inspector': specifier: ^0.16.3 - version: 0.16.3(@types/node@18.19.62)(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(typescript@5.8.3) + version: 0.16.3(@types/node@18.19.62)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(typescript@5.8.3) '@modelcontextprotocol/sdk': specifier: 1.10.2 version: 1.10.2 @@ -1452,7 +1452,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) packages/playground-app: dependencies: @@ -1483,16 +1483,16 @@ importers: devDependencies: '@rsbuild/plugin-less': specifier: ^1.5.0 - version: 1.5.0(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0)) + version: 1.5.0(@rsbuild/core@2.0.3(core-js@3.47.0)) '@rsbuild/plugin-node-polyfill': specifier: 1.4.2 - version: 1.4.2(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0)) + version: 1.4.2(@rsbuild/core@2.0.3(core-js@3.47.0)) '@rsbuild/plugin-react': specifier: ^1.4.1 - version: 1.4.5(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0)) + version: 1.4.5(@rsbuild/core@2.0.3(core-js@3.47.0)) '@rsbuild/plugin-svgr': specifier: ^1.2.2 - version: 1.2.2(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0))(typescript@5.8.3) + version: 1.2.2(@rsbuild/core@2.0.3(core-js@3.47.0))(typescript@5.8.3) '@rslib/core': specifier: ^0.18.3 version: 0.18.3(@microsoft/api-extractor@7.52.10(@types/node@18.19.118))(typescript@5.8.3) @@ -1519,7 +1519,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) packages/recorder: dependencies: @@ -1541,10 +1541,10 @@ importers: devDependencies: '@rsbuild/plugin-react': specifier: ^1.4.1 - version: 1.4.1(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0)) + version: 1.4.1(@rsbuild/core@2.0.3(core-js@3.47.0)) '@rslib/core': specifier: ^0.18.3 - version: 0.18.3(@microsoft/api-extractor@7.52.10(@types/node@25.5.2))(typescript@5.8.3) + version: 0.18.3(@microsoft/api-extractor@7.52.10(@types/node@25.6.0))(typescript@5.8.3) '@types/react': specifier: ^18.3.1 version: 18.3.23 @@ -1555,6 +1555,52 @@ importers: specifier: ^5.8.3 version: 5.8.3 + packages/rstest: + dependencies: + '@midscene/shared': + specifier: workspace:* + version: link:../shared + devDependencies: + '@midscene/core': + specifier: workspace:* + version: link:../core + '@midscene/web': + specifier: workspace:* + version: link:../web-integration + '@playwright/test': + specifier: ^1.45.0 + version: 1.59.1 + '@rslib/core': + specifier: ^0.18.3 + version: 0.18.3(@microsoft/api-extractor@7.52.10(@types/node@18.19.130))(typescript@5.8.3) + '@rstest/core': + specifier: ^0.9.9 + version: 0.9.9(core-js@3.47.0)(jsdom@29.0.2) + '@types/node': + specifier: ^18.0.0 + version: 18.19.130 + deepmerge: + specifier: ^4.3.1 + version: 4.3.1 + dotenv: + specifier: ^16.4.5 + version: 16.4.7 + playwright: + specifier: ^1.45.0 + version: 1.59.1 + puppeteer: + specifier: 24.6.0 + version: 24.6.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@6.0.5) + reduce-configs: + specifier: ^1.1.2 + version: 1.1.2 + std-env: + specifier: ^4.1.0 + version: 4.1.0 + typescript: + specifier: ^5.8.3 + version: 5.8.3 + packages/shared: dependencies: '@modelcontextprotocol/sdk': @@ -1614,7 +1660,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.62)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.62)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) packages/visualizer: dependencies: @@ -1645,16 +1691,16 @@ importers: devDependencies: '@rsbuild/plugin-less': specifier: ^1.5.0 - version: 1.5.0(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0)) + version: 1.5.0(@rsbuild/core@2.0.3(core-js@3.47.0)) '@rsbuild/plugin-node-polyfill': specifier: 1.4.2 - version: 1.4.2(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0)) + version: 1.4.2(@rsbuild/core@2.0.3(core-js@3.47.0)) '@rsbuild/plugin-react': specifier: ^1.4.1 - version: 1.4.1(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0)) + version: 1.4.1(@rsbuild/core@2.0.3(core-js@3.47.0)) '@rsbuild/plugin-svgr': specifier: ^1.2.2 - version: 1.2.2(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0))(typescript@5.8.3) + version: 1.2.2(@rsbuild/core@2.0.3(core-js@3.47.0))(typescript@5.8.3) '@rslib/core': specifier: ^0.18.3 version: 0.18.3(@microsoft/api-extractor@7.52.10(@types/node@18.19.62))(typescript@5.8.3) @@ -1699,7 +1745,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.62)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.62)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) zustand: specifier: 4.5.2 version: 4.5.2(@types/react@18.3.23)(immer@10.1.1)(react@18.3.1) @@ -1736,7 +1782,7 @@ importers: version: link:../web-integration '@modelcontextprotocol/inspector': specifier: ^0.16.3 - version: 0.16.3(@types/node@18.19.118)(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@6.0.5) + version: 0.16.3(@types/node@18.19.118)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@6.0.5) '@modelcontextprotocol/sdk': specifier: 1.10.2 version: 1.10.2 @@ -1760,7 +1806,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) packages/web-integration: dependencies: @@ -1803,7 +1849,7 @@ importers: devDependencies: '@playwright/test': specifier: ^1.45.0 - version: 1.58.1 + version: 1.59.1 '@rslib/core': specifier: ^0.18.3 version: 0.18.3(@microsoft/api-extractor@7.52.10(@types/node@18.19.62))(typescript@5.8.3) @@ -1836,7 +1882,7 @@ importers: version: 4.1.0 playwright: specifier: ^1.45.0 - version: 1.58.1 + version: 1.59.1 puppeteer: specifier: 24.6.0 version: 24.6.0(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@6.0.5) @@ -1848,7 +1894,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.62)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.62)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) packages/webdriver: dependencies: @@ -1870,7 +1916,7 @@ importers: version: 5.8.3 vitest: specifier: 3.0.5 - version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + version: 3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) packages: @@ -2141,8 +2187,8 @@ packages: resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==} hasBin: true - '@bufbuild/protobuf@2.11.0': - resolution: {integrity: sha512-sBXGT13cpmPR5BMgHE6UEEfEaShh5Ror6rfN3yEK5si7QVrtZg8LEPQb0VVhiLRUslD2yLnXtnRzG035J/mZXQ==} + '@bufbuild/protobuf@2.12.0': + resolution: {integrity: sha512-B/XlCaFIP8LOwzo+bz5uFzATYokcwCKQcghqnlfwSmM5eX/qTkvDBnDPs+gXtX/RyjxJ4DRikECcPJbyALA8FA==} '@changesets/apply-release-plan@6.1.4': resolution: {integrity: sha512-FMpKF1fRlJyCZVYHr3CbinpZZ+6MwvOtWUuO8uo+svcATEoc1zRDcj23pAurJ2TZ/uVz1wFHH6K3NlACy0PLew==} @@ -2300,19 +2346,16 @@ packages: '@computer-use/libnut-darwin@2.7.1': resolution: {integrity: sha512-7B/aPcIYS4a4S7D3IYIHSpZ4B4m8Z3CjlYq0efTr+/JYmEu+LlO67ZhPvisLKifhagxf7goqEfnphg1F4jq5jw==} engines: {node: '>=10.15.3'} - cpu: [x64, arm64] os: [darwin, linux, win32] '@computer-use/libnut-linux@2.7.1': resolution: {integrity: sha512-QJD5URTFJ/2+JwBwRyajRF2BB+3eXpd4+t5btGeRVeiRQLKQ4lgorbMHySo6IrfAbSfnU1OVOrxAUygGxj0cFg==} engines: {node: '>=10.15.3'} - cpu: [x64, arm64] os: [darwin, linux, win32] '@computer-use/libnut-win32@2.7.1': resolution: {integrity: sha512-nDvH5kP1zoO2cBtFYWV0om9xtTu523cc1LIk8r/wizqPrIAm0wCizTU+odF3Fi42zcKJWT6J+Pguy8fKrZyIuA==} engines: {node: '>=10.15.3'} - cpu: [x64, arm64] os: [darwin, linux, win32] '@computer-use/libnut@4.2.0': @@ -2438,15 +2481,24 @@ packages: engines: {node: '>=22.12.0'} hasBin: true + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.7.1': resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.7.1': resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emotion/hash@0.8.0': resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} @@ -3593,6 +3645,12 @@ packages: '@napi-rs/wasm-runtime@1.1.1': resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -3719,8 +3777,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.58.1': - resolution: {integrity: sha512-6LdVIUERWxQMmUSSQi0I53GgCBYgM2RpGngCPY7hSeju+VrKjq3lvs7HpJoPbDiY5QM5EYRtRX5fvrinnMAz3w==} + '@playwright/test@1.59.1': + resolution: {integrity: sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==} engines: {node: '>=18'} hasBin: true @@ -3745,8 +3803,8 @@ packages: '@protobufjs/base64@1.1.2': resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} - '@protobufjs/codegen@2.0.4': - resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + '@protobufjs/codegen@2.0.5': + resolution: {integrity: sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==} '@protobufjs/eventemitter@1.1.0': resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} @@ -3757,8 +3815,8 @@ packages: '@protobufjs/float@1.0.2': resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} - '@protobufjs/inquire@1.1.0': - resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + '@protobufjs/inquire@1.1.1': + resolution: {integrity: sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==} '@protobufjs/path@1.1.2': resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} @@ -3766,8 +3824,8 @@ packages: '@protobufjs/pool@1.1.0': resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} - '@protobufjs/utf8@1.1.0': - resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + '@protobufjs/utf8@1.1.1': + resolution: {integrity: sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==} '@puppeteer/browsers@2.9.0': resolution: {integrity: sha512-8+xM+cFydYET4X/5/3yZMHs7sjS6c9I6H5I3xJdb6cinzxWUT/I2QVw4avxCQ8QDndwdHkG/FiSZIrCjAbaKvQ==} @@ -4308,6 +4366,16 @@ packages: core-js: optional: true + '@rsbuild/core@2.0.3': + resolution: {integrity: sha512-2myp7jUgGen50saxW8OJD/eMVKp7HnuBN5MUzwRb6mDbRZZVpoorfI4LQqiGSBNjGLB6jltvx/R2yHmcmnchwg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + core-js: '>= 3.0.0' + peerDependenciesMeta: + core-js: + optional: true + '@rsbuild/plugin-check-syntax@1.3.0': resolution: {integrity: sha512-lHrd6hToPFVOGWr0U/Ox7pudHWdhPSFsr2riWpjNRlUuwiXdU2SYMROaVUCrLJvYFzJyEMsFOi1w59rBQCG2HQ==} peerDependencies: @@ -4422,6 +4490,11 @@ packages: cpu: [arm64] os: [darwin] + '@rspack/binding-darwin-arm64@2.0.1': + resolution: {integrity: sha512-CGFO5zmajD1Itch1lxAI7+gvKiagzyqXopHv/jHG9Su2WWQ2/Nhn2/rkSpdp6ptE9ri6+6tCOOahf099/v/Xog==} + cpu: [arm64] + os: [darwin] + '@rspack/binding-darwin-x64@1.6.6': resolution: {integrity: sha512-IcdEG2kOmbPPO70Zl7gDnowDjK7d7C1hWew2vU7dPltr2t1JalRIMnS051lhiur0ULkSxV3cW1zXqv0Oi8AnOg==} cpu: [x64] @@ -4437,6 +4510,11 @@ packages: cpu: [x64] os: [darwin] + '@rspack/binding-darwin-x64@2.0.1': + resolution: {integrity: sha512-2vvBNBoS09/PurupBwSrlTZd8283o00B8v20ncsNUdEff41uCR/hzIrYoTIVWnVST+Gt5O1+cfcfORp397lajg==} + cpu: [x64] + os: [darwin] + '@rspack/binding-linux-arm64-gnu@1.6.6': resolution: {integrity: sha512-rIguCCtlTcwoFlwheDiUgdImk27spuCRn43zGJogARpM/ZYRFKIuSwFDGUtJT2g0TSLUAHUhWAUqC36NwvrbMQ==} cpu: [arm64] @@ -4452,6 +4530,11 @@ packages: cpu: [arm64] os: [linux] + '@rspack/binding-linux-arm64-gnu@2.0.1': + resolution: {integrity: sha512-uvNXk6ahE3AH3h2avnd1Mgno68YQpS4cfX1OkOGWIC/roL+NrOP2XVXV4yfVAoydPALDO7AfbIfN0QdmBK3rsA==} + cpu: [arm64] + os: [linux] + '@rspack/binding-linux-arm64-musl@1.6.6': resolution: {integrity: sha512-x6X6Gr0fUw6qrJGxZt3Rb6oIX+jd9pdcyp0VbtofcLaqGVQbzustYsYnuLATPOys0q4J/4kWnmEhkjLJHwkhpQ==} cpu: [arm64] @@ -4467,6 +4550,11 @@ packages: cpu: [arm64] os: [linux] + '@rspack/binding-linux-arm64-musl@2.0.1': + resolution: {integrity: sha512-S/a6uN9PiZ5O/PjSqyIXhuRC1lVzeJkJV69NeLk5sIEUiDQ/aQGZG97uN+tluwpbo1tPbLJkdHYETfjspOX4Pg==} + cpu: [arm64] + os: [linux] + '@rspack/binding-linux-x64-gnu@1.6.6': resolution: {integrity: sha512-gSlVdASszWHosQKn+nzYOInBijdQboUnmNMGgW9/PijVg3433IvQjzviUuJFno8CMGgrACV9yw+ZFDuK0J57VA==} cpu: [x64] @@ -4482,6 +4570,11 @@ packages: cpu: [x64] os: [linux] + '@rspack/binding-linux-x64-gnu@2.0.1': + resolution: {integrity: sha512-C13Kk0OkZiocZVj187Sf753UH6pDXnuEu6vzUvi3qv9ltibG1ki0H2Y8isXBYL2cHQOV+hk0g1S6/4z3TTB97A==} + cpu: [x64] + os: [linux] + '@rspack/binding-linux-x64-musl@1.6.6': resolution: {integrity: sha512-TZaqVkh7memsTK/hxkOBrbpdzbmBUMea1YnYt++7QjMgco1kWFvAQ+YhAWtIaOaEg8s6C07Lt0Zp8izM2Dja0g==} cpu: [x64] @@ -4497,6 +4590,11 @@ packages: cpu: [x64] os: [linux] + '@rspack/binding-linux-x64-musl@2.0.1': + resolution: {integrity: sha512-TQsiBFpEDGkuvK9tNdGj/Uc+AIytzqhxXH/1jKU6M24cWB1DTw/Cx7DdrkCBDyq3129K3POLdujvbWCGqBzQUw==} + cpu: [x64] + os: [linux] + '@rspack/binding-wasm32-wasi@1.6.6': resolution: {integrity: sha512-W4mWdlLnYrbUaktyHOGNfATblxMTbgF7CBfDw8PhbDtjd2l8e/TnaHgIDkwITHXAOMEF/QEKfo9FtusbcQJNKw==} cpu: [wasm32] @@ -4509,6 +4607,10 @@ packages: resolution: {integrity: sha512-Vl7aDAt7DCqtZ/RJd8hLFjQqufX+efL/XZG3qADsagl/SspH1ItJ7N6X1S8o50eKoshy27Jr7mQYZEdufX9qhQ==} cpu: [wasm32] + '@rspack/binding-wasm32-wasi@2.0.1': + resolution: {integrity: sha512-wk3gyUgBW/ayP49bI54bkY8+EQnfBHxdoe9dz3oobSTZQc8AOWwmUUDEPltW8rUvPOM6dfHECTOUMnfaf2f5yA==} + cpu: [wasm32] + '@rspack/binding-win32-arm64-msvc@1.6.6': resolution: {integrity: sha512-cw5OgxqoDwjoZlk0L3vGEwcjPZsOVFYLwr2ssiC05rsTbhBwxj8coLpAJdvUvbf6C2TTmCB7iPe2sPq1KWD37g==} cpu: [arm64] @@ -4524,6 +4626,11 @@ packages: cpu: [arm64] os: [win32] + '@rspack/binding-win32-arm64-msvc@2.0.1': + resolution: {integrity: sha512-rHjLcy3VcAC3+x+PxH+gwhwv6tPe0JdXTNT5eAOs9wgZIM6T9p4wre49+K4Qy98+Fb7TTbLX0ObUitlOkGwTSA==} + cpu: [arm64] + os: [win32] + '@rspack/binding-win32-ia32-msvc@1.6.6': resolution: {integrity: sha512-M4ruR+VZ59iy+mPjy6FQPT27cOgeytf3wFBrt7e0suKeNLYGxrNyI9YhgpCTY++SMJsAMgRLGDHoI3ZgWulw1Q==} cpu: [ia32] @@ -4539,6 +4646,11 @@ packages: cpu: [ia32] os: [win32] + '@rspack/binding-win32-ia32-msvc@2.0.1': + resolution: {integrity: sha512-Ad1vVqMBBnd4T8rsORngu9sl2kyRTlS4kMlvFudjzl1X2UFArEDBe0YVGNN7ZvahM12CErUx2WiN8Sd8pb+qXQ==} + cpu: [ia32] + os: [win32] + '@rspack/binding-win32-x64-msvc@1.6.6': resolution: {integrity: sha512-q5QTvdhPUh+CA93cQG5zWKRIHMIWPzw+ftFDEwBw52zYdvNAoLniqD8o5Mi8CT0pndhulXgR5aw0Sjd3eMah+A==} cpu: [x64] @@ -4554,6 +4666,11 @@ packages: cpu: [x64] os: [win32] + '@rspack/binding-win32-x64-msvc@2.0.1': + resolution: {integrity: sha512-oPM2Jtm7HOlmxl/aBfleAVlL6t9VeHx6WvEets7BBJMInemFXAQd4CErRqybf7rXutACzLeUWBOue4Jpd1/ykw==} + cpu: [x64] + os: [win32] + '@rspack/binding@1.6.6': resolution: {integrity: sha512-noiV+qhyBTVpvG2M4bnOwKk2Ynl6G47Wf7wpCjPCFr87qr3txNwTTnhkEJEU59yj+VvIhbRD2rf5+9TLoT0Wxg==} @@ -4563,6 +4680,9 @@ packages: '@rspack/binding@2.0.0-beta.9': resolution: {integrity: sha512-QgkOvzl6BJc4Vg5eaY9r7MkHNfXvVZPgTIeYkdBEOYPowdyCLhlG9vH7QltqLKP9KDNel70YIeMyUrpTqez01w==} + '@rspack/binding@2.0.1': + resolution: {integrity: sha512-ynV1gw4KqFtQ0P+ZZh76SUj49wBb2FuHW3zSmHverHWuxBhzvrZS6/dZ+fCFQG8bTTPtrPz0RQUTN3uEDbPVBQ==} + '@rspack/core@1.6.6': resolution: {integrity: sha512-2mR+2YBydlgZ7Q0Rpd6bCC3MBnV9TS0x857K0zIhbDj4BQOqaWVy1n7fx/B3MrS8TR0QCuzKfyDAjNz+XTyJVQ==} engines: {node: '>=18.12.0'} @@ -4593,6 +4713,18 @@ packages: '@swc/helpers': optional: true + '@rspack/core@2.0.1': + resolution: {integrity: sha512-lgfZiExh8kDR/3obgi3RQKwKG5av1Xf5qDN1aVde777W9pbmx0Pqvrww1qtNvJ+gobEjbrrn5HEZWYGe0VLmcA==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + '@module-federation/runtime-tools': ^0.24.1 || ^2.0.0 + '@swc/helpers': '>=0.5.1' + peerDependenciesMeta: + '@module-federation/runtime-tools': + optional: true + '@swc/helpers': + optional: true + '@rspack/lite-tapable@1.1.0': resolution: {integrity: sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==} @@ -4658,6 +4790,19 @@ packages: '@rspress/shared@2.0.8': resolution: {integrity: sha512-kvfBUvMvWcn/7PJHqZxPeu1yblzvAuB1/gk/1orp5KsYu3wbZ7X3Hsm9smDJVs5Plw1iPt67t9fOYNSM0+VjUA==} + '@rstest/core@0.9.9': + resolution: {integrity: sha512-AdlRgvyitoenjBTxlnYHr4rf71as96abmqVjmPXnfc0MyYk563AKMagHoWW5YMQKGCjRcrZx92dDRIUI0Z8Lyg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + happy-dom: ^20.8.3 + jsdom: '*' + peerDependenciesMeta: + happy-dom: + optional: true + jsdom: + optional: true + '@rushstack/node-core-library@5.14.0': resolution: {integrity: sha512-eRong84/rwQUlATGFW3TMTYVyqL1vfW9Lf10PH+mVGfIb9HzU3h5AASNIw+axnBLjnD0n3rT5uQBwu9fvzATrg==} peerDependencies: @@ -4951,6 +5096,9 @@ packages: '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + '@types/chrome@0.0.279': resolution: {integrity: sha512-wl0IxQ2OQiMazPZM5LimHQ7Jwd72/O8UvvzyptplXT2S4eUqXH5C0n8S+v8PtKhyX89p0igCPpNy3Bwksyk57g==} @@ -4969,6 +5117,9 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/eslint-scope@3.7.7': resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} @@ -5080,8 +5231,8 @@ packages: '@types/node@24.12.2': resolution: {integrity: sha512-A1sre26ke7HDIuY/M23nd9gfB+nrmhtYyMINbjI1zHJxYteKR6qSMX56FsmjMcDb3SMcjJg5BiRRgOCC/yBD0g==} - '@types/node@25.5.2': - resolution: {integrity: sha512-tO4ZIRKNC+MDWV4qKVZe3Ql/woTnmHDr5JD8UI5hn2pwBrHEwOEMZK7WlNb5RKB6EoJ02gwmQS9OrjuFnZYdpg==} + '@types/node@25.6.0': + resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -5103,16 +5254,16 @@ packages: peerDependencies: '@types/react': ^18.0.0 - '@types/react-dom@19.1.5': - resolution: {integrity: sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: - '@types/react': ^19.0.0 + '@types/react': ^19.2.0 '@types/react@18.3.23': resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} - '@types/react@19.1.5': - resolution: {integrity: sha512-piErsCVVbpMMT2r7wbawdZsq4xMvIAhQuac2gedQHysu1TZYEigE6pnFfgZT+/jQnrRuF5r+SHzuehFjfRjr4g==} + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -5422,8 +5573,8 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} - ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} @@ -6440,9 +6591,6 @@ packages: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - csstype@3.2.3: resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} @@ -6816,6 +6964,10 @@ packages: resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} engines: {node: '>=10.13.0'} + enhanced-resolve@5.21.0: + resolution: {integrity: sha512-otxSQPw4lkOZWkHpB3zaEQs6gWYEsmX4xQF68ElXC/TWvGxGMSGOvoNbaLXm6/cS/fSfHtsEdw90y20PCd+sCA==} + engines: {node: '>=10.13.0'} + enquirer@2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} @@ -7298,6 +7450,15 @@ packages: debug: optional: true + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -8538,8 +8699,8 @@ packages: resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} engines: {node: '>=6'} - loader-runner@4.3.1: - resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} + loader-runner@4.3.2: + resolution: {integrity: sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==} engines: {node: '>=6.11.5'} loader-utils@3.3.1: @@ -9715,13 +9876,13 @@ packages: resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} engines: {node: '>=10'} - playwright-core@1.58.1: - resolution: {integrity: sha512-bcWzOaTxcW+VOOGBCQgnaKToLJ65d6AqfLVKEWvexyS3AS6rbXl+xdpYRMGSRBClPvyj44njOWoxjNdL/H9UNg==} + playwright-core@1.59.1: + resolution: {integrity: sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==} engines: {node: '>=18'} hasBin: true - playwright@1.58.1: - resolution: {integrity: sha512-+2uTZHxSCcxjvGc5C891LrS1/NlxglGxzrC4seZiVjcYVQfUa87wBL6rTDqzGjuoWNjnBzRqKmF6zRYGMvQUaQ==} + playwright@1.59.1: + resolution: {integrity: sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==} engines: {node: '>=18'} hasBin: true @@ -10350,8 +10511,8 @@ packages: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} - reduce-configs@1.1.1: - resolution: {integrity: sha512-EYtsVGAQarE8daT54cnaY1PIknF2VB78ug6Zre2rs36EsJfC40EG6hmTU2A2P1ZuXnKAt2KI0fzOGHcX7wzdPw==} + reduce-configs@1.1.2: + resolution: {integrity: sha512-AgBP55V8FC7NaqoOP2RCbTpu6LE+YuX3LUZkNAoitcfyS3/PIC8Obg/TJrBzTkJ+lDvZv0TTAeDpLkzjTtYlbw==} reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} @@ -10485,6 +10646,11 @@ packages: engines: {node: '>= 0.4'} hasBin: true + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} @@ -11079,6 +11245,9 @@ packages: std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + std-env@4.1.0: + resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -11297,6 +11466,10 @@ packages: resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} engines: {node: '>=6'} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} + engines: {node: '>=6'} + tar-fs@3.1.1: resolution: {integrity: sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==} @@ -11324,8 +11497,8 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - terser-webpack-plugin@5.4.0: - resolution: {integrity: sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==} + terser-webpack-plugin@5.5.0: + resolution: {integrity: sha512-UYhptBwhWvfIjKd/UuFo6D8uq9xpGLDK+z8EDsj/zWhrTaH34cKEbrkMKfV5YWqGBvAYA3tlzZbs2R+qYrbQJA==} engines: {node: '>= 10.13.0'} peerDependencies: '@swc/core': '*' @@ -11340,8 +11513,8 @@ packages: uglify-js: optional: true - terser@5.46.1: - resolution: {integrity: sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==} + terser@5.46.2: + resolution: {integrity: sha512-uxfo9fPcSgLDYob/w1FuL0c99MWiJDnv+5qXSQc5+Ki5NjVNsYi66INnMFBjf6uFz6OnX12piJQPF4IpjJTNTw==} engines: {node: '>=10'} hasBin: true @@ -11408,6 +11581,10 @@ packages: resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} engines: {node: ^18.0.0 || >=20.0.0} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + tinyrainbow@2.0.0: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} @@ -11631,8 +11808,8 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici-types@7.18.2: - resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + undici-types@7.19.2: + resolution: {integrity: sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==} undici@6.22.0: resolution: {integrity: sha512-hU/10obOIu62MGYjdskASR3CUAiYaFTtC9Pa6vHyf//mAipSvSQg6od2CnJswq7fvzNS3zJhxoRkgNVaHurWKw==} @@ -11921,8 +12098,8 @@ packages: engines: {node: '>= 10.13.0'} hasBin: true - webpack-sources@3.3.4: - resolution: {integrity: sha512-7tP1PdV4vF+lYPnkMR0jMY5/la2ub5Fc/8VQrrU+lXkiM6C4TjVfGw7iKfyhnTQOsD+6Q/iKw0eFciziRgD58Q==} + webpack-sources@3.4.0: + resolution: {integrity: sha512-gHwIe1cgBvvfLeu1Yz/dcFpmHfKDVxxyqI+kzqmuxZED81z2ChxpyqPaWcNqigPywhaEke7AjSGga+kxY55gjQ==} engines: {node: '>=10.13.0'} webpack@5.99.5: @@ -12284,7 +12461,7 @@ snapshots: '@emotion/hash': 0.8.0 '@emotion/unitless': 0.7.5 classnames: 2.5.1 - csstype: 3.1.3 + csstype: 3.2.3 rc-util: 5.43.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) @@ -12587,7 +12764,7 @@ snapshots: dependencies: css-tree: 3.2.1 - '@bufbuild/protobuf@2.11.0': + '@bufbuild/protobuf@2.12.0': optional: true '@changesets/apply-release-plan@6.1.4': @@ -12750,11 +12927,11 @@ snapshots: '@colors/colors@1.6.0': {} - '@commitlint/cli@19.8.0(@types/node@25.5.2)(typescript@5.8.3)': + '@commitlint/cli@19.8.0(@types/node@25.6.0)(typescript@5.8.3)': dependencies: '@commitlint/format': 19.8.1 '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@25.5.2)(typescript@5.8.3) + '@commitlint/load': 19.8.1(@types/node@25.6.0)(typescript@5.8.3) '@commitlint/read': 19.8.1 '@commitlint/types': 19.8.1 tinyexec: 0.3.2 @@ -12810,7 +12987,7 @@ snapshots: '@commitlint/rules': 19.8.1 '@commitlint/types': 19.8.1 - '@commitlint/load@19.8.1(@types/node@25.5.2)(typescript@5.8.3)': + '@commitlint/load@19.8.1(@types/node@25.6.0)(typescript@5.8.3)': dependencies: '@commitlint/config-validator': 19.8.1 '@commitlint/execute-rule': 19.8.1 @@ -12818,7 +12995,7 @@ snapshots: '@commitlint/types': 19.8.1 chalk: 5.6.2 cosmiconfig: 9.0.0(typescript@5.8.3) - cosmiconfig-typescript-loader: 6.2.0(@types/node@25.5.2)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) + cosmiconfig-typescript-loader: 6.2.0(@types/node@25.6.0)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -12826,7 +13003,7 @@ snapshots: - '@types/node' - typescript - '@commitlint/load@20.1.0(@types/node@25.5.2)(typescript@5.8.3)': + '@commitlint/load@20.1.0(@types/node@25.6.0)(typescript@5.8.3)': dependencies: '@commitlint/config-validator': 20.0.0 '@commitlint/execute-rule': 20.0.0 @@ -12834,7 +13011,7 @@ snapshots: '@commitlint/types': 20.0.0 chalk: 5.6.2 cosmiconfig: 9.0.0(typescript@5.8.3) - cosmiconfig-typescript-loader: 6.2.0(@types/node@25.5.2)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) + cosmiconfig-typescript-loader: 6.2.0(@types/node@25.6.0)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -13113,11 +13290,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + '@emnapi/core@1.7.1': dependencies: '@emnapi/wasi-threads': 1.1.0 tslib: 2.8.1 + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.7.1': dependencies: tslib: 2.8.1 @@ -13126,6 +13314,11 @@ snapshots: dependencies: tslib: 2.8.1 + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + '@emotion/hash@0.8.0': {} '@emotion/unitless@0.7.5': {} @@ -14192,10 +14385,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@mdx-js/react@3.1.1(@types/react@19.1.5)(react@19.2.4)': + '@mdx-js/react@3.1.1(@types/react@19.2.14)(react@19.2.4)': dependencies: '@types/mdx': 2.0.13 - '@types/react': 19.1.5 + '@types/react': 19.2.14 react: 19.2.4 '@microsoft/api-extractor-model@7.30.7(@types/node@18.19.118)': @@ -14207,6 +14400,15 @@ snapshots: - '@types/node' optional: true + '@microsoft/api-extractor-model@7.30.7(@types/node@18.19.130)': + dependencies: + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.14.0(@types/node@18.19.130) + transitivePeerDependencies: + - '@types/node' + optional: true + '@microsoft/api-extractor-model@7.30.7(@types/node@18.19.62)': dependencies: '@microsoft/tsdoc': 0.15.1 @@ -14216,11 +14418,11 @@ snapshots: - '@types/node' optional: true - '@microsoft/api-extractor-model@7.30.7(@types/node@25.5.2)': + '@microsoft/api-extractor-model@7.30.7(@types/node@25.6.0)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.14.0(@types/node@25.5.2) + '@rushstack/node-core-library': 5.14.0(@types/node@25.6.0) transitivePeerDependencies: - '@types/node' optional: true @@ -14236,7 +14438,26 @@ snapshots: '@rushstack/ts-command-line': 5.0.2(@types/node@18.19.118) lodash: 4.17.23 minimatch: 10.0.3 - resolve: 1.22.11 + resolve: 1.22.12 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.8.2 + transitivePeerDependencies: + - '@types/node' + optional: true + + '@microsoft/api-extractor@7.52.10(@types/node@18.19.130)': + dependencies: + '@microsoft/api-extractor-model': 7.30.7(@types/node@18.19.130) + '@microsoft/tsdoc': 0.15.1 + '@microsoft/tsdoc-config': 0.17.1 + '@rushstack/node-core-library': 5.14.0(@types/node@18.19.130) + '@rushstack/rig-package': 0.5.3 + '@rushstack/terminal': 0.15.4(@types/node@18.19.130) + '@rushstack/ts-command-line': 5.0.2(@types/node@18.19.130) + lodash: 4.17.23 + minimatch: 10.0.3 + resolve: 1.22.12 semver: 7.5.4 source-map: 0.6.1 typescript: 5.8.2 @@ -14255,7 +14476,7 @@ snapshots: '@rushstack/ts-command-line': 5.0.2(@types/node@18.19.62) lodash: 4.17.23 minimatch: 10.0.3 - resolve: 1.22.11 + resolve: 1.22.12 semver: 7.5.4 source-map: 0.6.1 typescript: 5.8.2 @@ -14263,18 +14484,18 @@ snapshots: - '@types/node' optional: true - '@microsoft/api-extractor@7.52.10(@types/node@25.5.2)': + '@microsoft/api-extractor@7.52.10(@types/node@25.6.0)': dependencies: - '@microsoft/api-extractor-model': 7.30.7(@types/node@25.5.2) + '@microsoft/api-extractor-model': 7.30.7(@types/node@25.6.0) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.14.0(@types/node@25.5.2) + '@rushstack/node-core-library': 5.14.0(@types/node@25.6.0) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.4(@types/node@25.5.2) - '@rushstack/ts-command-line': 5.0.2(@types/node@25.5.2) + '@rushstack/terminal': 0.15.4(@types/node@25.6.0) + '@rushstack/ts-command-line': 5.0.2(@types/node@25.6.0) lodash: 4.17.23 minimatch: 10.0.3 - resolve: 1.22.11 + resolve: 1.22.12 semver: 7.5.4 source-map: 0.6.1 typescript: 5.8.2 @@ -14287,7 +14508,7 @@ snapshots: '@microsoft/tsdoc': 0.15.1 ajv: 8.12.0 jju: 1.4.0 - resolve: 1.22.11 + resolve: 1.22.12 optional: true '@microsoft/tsdoc@0.15.1': @@ -14301,23 +14522,23 @@ snapshots: transitivePeerDependencies: - supports-color - '@modelcontextprotocol/inspector-client@0.16.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)': + '@modelcontextprotocol/inspector-client@0.16.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)': dependencies: '@modelcontextprotocol/sdk': 1.17.2 - '@radix-ui/react-checkbox': 1.3.2(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-dialog': 1.1.14(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-checkbox': 1.3.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-dialog': 1.1.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-icons': 1.3.2(react@18.3.1) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-popover': 1.1.14(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-select': 2.2.5(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-tabs': 1.1.12(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-toast': 1.2.14(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-tooltip': 1.2.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-popover': 1.1.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-select': 2.2.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-tabs': 1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-toast': 1.2.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-tooltip': 1.2.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) ajv: 6.12.6 class-variance-authority: 0.7.1 clsx: 2.1.1 - cmdk: 1.1.1(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + cmdk: 1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) lucide-react: 0.523.0(react@18.3.1) pkce-challenge: 4.1.0 prismjs: 1.30.0 @@ -14346,10 +14567,10 @@ snapshots: - supports-color - utf-8-validate - '@modelcontextprotocol/inspector@0.16.3(@types/node@18.19.118)(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@6.0.5)': + '@modelcontextprotocol/inspector@0.16.3(@types/node@18.19.118)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@6.0.5)': dependencies: '@modelcontextprotocol/inspector-cli': 0.16.3 - '@modelcontextprotocol/inspector-client': 0.16.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5) + '@modelcontextprotocol/inspector-client': 0.16.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14) '@modelcontextprotocol/inspector-server': 0.16.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) '@modelcontextprotocol/sdk': 1.17.2 concurrently: 9.2.0 @@ -14370,10 +14591,10 @@ snapshots: - typescript - utf-8-validate - '@modelcontextprotocol/inspector@0.16.3(@types/node@18.19.62)(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(typescript@5.8.3)': + '@modelcontextprotocol/inspector@0.16.3(@types/node@18.19.62)(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(typescript@5.8.3)': dependencies: '@modelcontextprotocol/inspector-cli': 0.16.3 - '@modelcontextprotocol/inspector-client': 0.16.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5) + '@modelcontextprotocol/inspector-client': 0.16.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14) '@modelcontextprotocol/inspector-server': 0.16.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) '@modelcontextprotocol/sdk': 1.17.2 concurrently: 9.2.0 @@ -14471,6 +14692,13 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.1 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -14592,9 +14820,9 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.58.1': + '@playwright/test@1.59.1': dependencies: - playwright: 1.58.1 + playwright: 1.59.1 '@pnpm/config.env-replace@1.1.0': {} @@ -14616,7 +14844,7 @@ snapshots: '@protobufjs/base64@1.1.2': optional: true - '@protobufjs/codegen@2.0.4': + '@protobufjs/codegen@2.0.5': optional: true '@protobufjs/eventemitter@1.1.0': @@ -14625,13 +14853,13 @@ snapshots: '@protobufjs/fetch@1.1.0': dependencies: '@protobufjs/aspromise': 1.1.2 - '@protobufjs/inquire': 1.1.0 + '@protobufjs/inquire': 1.1.1 optional: true '@protobufjs/float@1.0.2': optional: true - '@protobufjs/inquire@1.1.0': + '@protobufjs/inquire@1.1.1': optional: true '@protobufjs/path@1.1.2': @@ -14640,7 +14868,7 @@ snapshots: '@protobufjs/pool@1.1.0': optional: true - '@protobufjs/utf8@1.1.0': + '@protobufjs/utf8@1.1.1': optional: true '@puppeteer/browsers@2.9.0': @@ -14662,374 +14890,374 @@ snapshots: '@radix-ui/primitive@1.1.2': {} - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-checkbox@1.3.2(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-checkbox@1.3.2(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.5)(react@18.3.1)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - '@radix-ui/react-context@1.1.2(@types/react@19.1.5)(react@18.3.1)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.14)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - '@radix-ui/react-dialog@1.1.14(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dialog@1.1.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@18.3.1) aria-hidden: 1.2.6 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.1(@types/react@19.1.5)(react@18.3.1) + react-remove-scroll: 2.7.1(@types/react@19.2.14)(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-direction@1.1.1(@types/react@19.1.5)(react@18.3.1)': + '@radix-ui/react-direction@1.1.1(@types/react@19.2.14)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.5)(react@18.3.1)': + '@radix-ui/react-focus-guards@1.1.2(@types/react@19.2.14)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) '@radix-ui/react-icons@1.3.2(react@18.3.1)': dependencies: react: 18.3.1 - '@radix-ui/react-id@1.1.1(@types/react@19.1.5)(react@18.3.1)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.14)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - '@radix-ui/react-label@2.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-popover@1.1.14(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popover@1.1.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@18.3.1) aria-hidden: 1.2.6 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.1(@types/react@19.1.5)(react@18.3.1) + react-remove-scroll: 2.7.1(@types/react@19.2.14)(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-popper@1.2.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-popper@1.2.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@floating-ui/react-dom': 2.1.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.14)(react@18.3.1) '@radix-ui/rect': 1.1.1 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-presence@1.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-roving-focus@1.1.10(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-roving-focus@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-select@2.2.5(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-select@2.2.5(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) aria-hidden: 1.2.6 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-remove-scroll: 2.7.1(@types/react@19.1.5)(react@18.3.1) + react-remove-scroll: 2.7.1(@types/react@19.2.14)(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-slot@1.2.3(@types/react@19.1.5)(react@18.3.1)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@18.3.1)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - '@radix-ui/react-tabs@1.1.12(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tabs@1.1.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-roving-focus': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-toast@1.2.14(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-toast@1.2.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-tooltip@1.2.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-tooltip@1.2.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.5)(react@18.3.1)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.14)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.5)(react@18.3.1)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@18.3.1)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.5)(react@18.3.1)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.5)(react@18.3.1)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.14)(react@18.3.1)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.5)(react@18.3.1)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.5)(react@18.3.1)': + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.14)(react@18.3.1)': dependencies: react: 18.3.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.5)(react@18.3.1)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.14)(react@18.3.1)': dependencies: '@radix-ui/rect': 1.1.1 react: 18.3.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - '@radix-ui/react-use-size@1.1.1(@types/react@19.1.5)(react@18.3.1)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.14)(react@18.3.1)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.5)(react@18.3.1) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@18.3.1) react: 18.3.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 - '@types/react-dom': 19.1.5(@types/react@19.1.5) + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) '@radix-ui/rect@1.1.1': {} @@ -15173,6 +15401,15 @@ snapshots: transitivePeerDependencies: - '@module-federation/runtime-tools' + '@rsbuild/core@2.0.3(core-js@3.47.0)': + dependencies: + '@rspack/core': 2.0.1(@swc/helpers@0.5.21) + '@swc/helpers': 0.5.21 + optionalDependencies: + core-js: 3.47.0 + transitivePeerDependencies: + - '@module-federation/runtime-tools' + '@rsbuild/plugin-check-syntax@1.3.0(@rsbuild/core@1.6.15)': dependencies: acorn: 8.15.0 @@ -15187,13 +15424,13 @@ snapshots: dependencies: '@rsbuild/core': 1.6.15 deepmerge: 4.3.1 - reduce-configs: 1.1.1 + reduce-configs: 1.1.2 - '@rsbuild/plugin-less@1.5.0(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0))': + '@rsbuild/plugin-less@1.5.0(@rsbuild/core@2.0.3(core-js@3.47.0))': dependencies: - '@rsbuild/core': 2.0.0-beta.11(core-js@3.47.0) + '@rsbuild/core': 2.0.3(core-js@3.47.0) deepmerge: 4.3.1 - reduce-configs: 1.1.1 + reduce-configs: 1.1.2 '@rsbuild/plugin-node-polyfill@1.4.2(@rsbuild/core@1.6.15)': dependencies: @@ -15223,7 +15460,7 @@ snapshots: optionalDependencies: '@rsbuild/core': 1.6.15 - '@rsbuild/plugin-node-polyfill@1.4.2(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0))': + '@rsbuild/plugin-node-polyfill@1.4.2(@rsbuild/core@2.0.3(core-js@3.47.0))': dependencies: assert: 2.1.0 browserify-zlib: 0.2.0 @@ -15249,7 +15486,7 @@ snapshots: util: 0.12.5 vm-browserify: 1.1.2 optionalDependencies: - '@rsbuild/core': 2.0.0-beta.11(core-js@3.47.0) + '@rsbuild/core': 2.0.3(core-js@3.47.0) '@rsbuild/plugin-react@1.4.1(@rsbuild/core@1.6.15)': dependencies: @@ -15259,9 +15496,9 @@ snapshots: transitivePeerDependencies: - webpack-hot-middleware - '@rsbuild/plugin-react@1.4.1(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0))': + '@rsbuild/plugin-react@1.4.1(@rsbuild/core@2.0.3(core-js@3.47.0))': dependencies: - '@rsbuild/core': 2.0.0-beta.11(core-js@3.47.0) + '@rsbuild/core': 2.0.3(core-js@3.47.0) '@rspack/plugin-react-refresh': 1.5.1(react-refresh@0.17.0) react-refresh: 0.17.0 transitivePeerDependencies: @@ -15275,9 +15512,9 @@ snapshots: transitivePeerDependencies: - webpack-hot-middleware - '@rsbuild/plugin-react@1.4.5(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0))': + '@rsbuild/plugin-react@1.4.5(@rsbuild/core@2.0.3(core-js@3.47.0))': dependencies: - '@rsbuild/core': 2.0.0-beta.11(core-js@3.47.0) + '@rsbuild/core': 2.0.3(core-js@3.47.0) '@rspack/plugin-react-refresh': 1.6.0(react-refresh@0.18.0) react-refresh: 0.18.0 transitivePeerDependencies: @@ -15315,10 +15552,10 @@ snapshots: - typescript - webpack-hot-middleware - '@rsbuild/plugin-svgr@1.2.2(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0))(typescript@5.8.3)': + '@rsbuild/plugin-svgr@1.2.2(@rsbuild/core@2.0.3(core-js@3.47.0))(typescript@5.8.3)': dependencies: - '@rsbuild/core': 2.0.0-beta.11(core-js@3.47.0) - '@rsbuild/plugin-react': 1.4.1(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0)) + '@rsbuild/core': 2.0.3(core-js@3.47.0) + '@rsbuild/plugin-react': 1.4.1(@rsbuild/core@2.0.3(core-js@3.47.0)) '@svgr/core': 8.1.0(typescript@5.8.3) '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3)) '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.8.3))(typescript@5.8.3) @@ -15333,7 +15570,7 @@ snapshots: dependencies: deepmerge: 4.3.1 json5: 2.2.3 - reduce-configs: 1.1.1 + reduce-configs: 1.1.2 ts-checker-rspack-plugin: 1.2.2(@rspack/core@1.6.8(@swc/helpers@0.5.21))(typescript@5.8.3) optionalDependencies: '@rsbuild/core': 1.6.15 @@ -15341,12 +15578,12 @@ snapshots: - '@rspack/core' - typescript - '@rsbuild/plugin-type-check@1.3.2(@rsbuild/core@1.6.15)(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(typescript@5.8.3)': + '@rsbuild/plugin-type-check@1.3.2(@rsbuild/core@1.6.15)(@rspack/core@2.0.1(@swc/helpers@0.5.21))(typescript@5.8.3)': dependencies: deepmerge: 4.3.1 json5: 2.2.3 - reduce-configs: 1.1.1 - ts-checker-rspack-plugin: 1.2.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(typescript@5.8.3) + reduce-configs: 1.1.2 + ts-checker-rspack-plugin: 1.2.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(typescript@5.8.3) optionalDependencies: '@rsbuild/core': 1.6.15 transitivePeerDependencies: @@ -15355,13 +15592,13 @@ snapshots: '@rsdoctor/client@1.0.2': {} - '@rsdoctor/core@1.0.2(@rsbuild/core@1.6.15)(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5)': + '@rsdoctor/core@1.0.2(@rsbuild/core@1.6.15)(@rspack/core@2.0.1(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5)': dependencies: '@rsbuild/plugin-check-syntax': 1.3.0(@rsbuild/core@1.6.15) - '@rsdoctor/graph': 1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5) - '@rsdoctor/sdk': 1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5) - '@rsdoctor/types': 1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(webpack@5.99.5) - '@rsdoctor/utils': 1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(webpack@5.99.5) + '@rsdoctor/graph': 1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5) + '@rsdoctor/sdk': 1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5) + '@rsdoctor/types': 1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(webpack@5.99.5) + '@rsdoctor/utils': 1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(webpack@5.99.5) axios: 1.9.0 browserslist-load-config: 1.0.0 enhanced-resolve: 5.12.0 @@ -15381,10 +15618,10 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/graph@1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5)': + '@rsdoctor/graph@1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5)': dependencies: - '@rsdoctor/types': 1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(webpack@5.99.5) - '@rsdoctor/utils': 1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(webpack@5.99.5) + '@rsdoctor/types': 1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(webpack@5.99.5) + '@rsdoctor/utils': 1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(webpack@5.99.5) lodash.unionby: 4.8.0 socket.io: 4.8.1(bufferutil@4.0.9)(utf-8-validate@6.0.5) source-map: 0.7.6 @@ -15395,14 +15632,14 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/rspack-plugin@1.0.2(@rsbuild/core@1.6.15)(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5)': + '@rsdoctor/rspack-plugin@1.0.2(@rsbuild/core@1.6.15)(@rspack/core@2.0.1(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5)': dependencies: - '@rsdoctor/core': 1.0.2(@rsbuild/core@1.6.15)(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5) - '@rsdoctor/graph': 1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5) - '@rsdoctor/sdk': 1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5) - '@rsdoctor/types': 1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(webpack@5.99.5) - '@rsdoctor/utils': 1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(webpack@5.99.5) - '@rspack/core': 2.0.0-beta.9(@swc/helpers@0.5.21) + '@rsdoctor/core': 1.0.2(@rsbuild/core@1.6.15)(@rspack/core@2.0.1(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5) + '@rsdoctor/graph': 1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5) + '@rsdoctor/sdk': 1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5) + '@rsdoctor/types': 1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(webpack@5.99.5) + '@rsdoctor/utils': 1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(webpack@5.99.5) + '@rspack/core': 2.0.1(@swc/helpers@0.5.21) lodash: 4.17.21 transitivePeerDependencies: - '@rsbuild/core' @@ -15412,12 +15649,12 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/sdk@1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5)': + '@rsdoctor/sdk@1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5)': dependencies: '@rsdoctor/client': 1.0.2 - '@rsdoctor/graph': 1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5) - '@rsdoctor/types': 1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(webpack@5.99.5) - '@rsdoctor/utils': 1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(webpack@5.99.5) + '@rsdoctor/graph': 1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(bufferutil@4.0.9)(webpack@5.99.5) + '@rsdoctor/types': 1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(webpack@5.99.5) + '@rsdoctor/utils': 1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(webpack@5.99.5) '@types/fs-extra': 11.0.4 body-parser: 1.20.3 cors: 2.8.5 @@ -15437,7 +15674,7 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/types@1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(webpack@5.99.5)': + '@rsdoctor/types@1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(webpack@5.99.5)': dependencies: '@types/connect': 3.4.38 '@types/estree': 1.0.5 @@ -15445,12 +15682,12 @@ snapshots: source-map: 0.7.6 webpack: 5.99.5 optionalDependencies: - '@rspack/core': 2.0.0-beta.9(@swc/helpers@0.5.21) + '@rspack/core': 2.0.1(@swc/helpers@0.5.21) - '@rsdoctor/utils@1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(webpack@5.99.5)': + '@rsdoctor/utils@1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(webpack@5.99.5)': dependencies: '@babel/code-frame': 7.26.2 - '@rsdoctor/types': 1.0.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(webpack@5.99.5) + '@rsdoctor/types': 1.0.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(webpack@5.99.5) '@types/estree': 1.0.5 acorn: 8.15.0 acorn-import-attributes: 1.9.5(acorn@8.15.0) @@ -15480,6 +15717,16 @@ snapshots: transitivePeerDependencies: - '@typescript/native-preview' + '@rslib/core@0.18.3(@microsoft/api-extractor@7.52.10(@types/node@18.19.130))(typescript@5.8.3)': + dependencies: + '@rsbuild/core': 1.6.15 + rsbuild-plugin-dts: 0.18.3(@microsoft/api-extractor@7.52.10(@types/node@18.19.130))(@rsbuild/core@1.6.15)(typescript@5.8.3) + optionalDependencies: + '@microsoft/api-extractor': 7.52.10(@types/node@18.19.130) + typescript: 5.8.3 + transitivePeerDependencies: + - '@typescript/native-preview' + '@rslib/core@0.18.3(@microsoft/api-extractor@7.52.10(@types/node@18.19.62))(typescript@5.8.3)': dependencies: '@rsbuild/core': 1.6.15 @@ -15490,12 +15737,12 @@ snapshots: transitivePeerDependencies: - '@typescript/native-preview' - '@rslib/core@0.18.3(@microsoft/api-extractor@7.52.10(@types/node@25.5.2))(typescript@5.8.3)': + '@rslib/core@0.18.3(@microsoft/api-extractor@7.52.10(@types/node@25.6.0))(typescript@5.8.3)': dependencies: '@rsbuild/core': 1.6.15 - rsbuild-plugin-dts: 0.18.3(@microsoft/api-extractor@7.52.10(@types/node@25.5.2))(@rsbuild/core@1.6.15)(typescript@5.8.3) + rsbuild-plugin-dts: 0.18.3(@microsoft/api-extractor@7.52.10(@types/node@25.6.0))(@rsbuild/core@1.6.15)(typescript@5.8.3) optionalDependencies: - '@microsoft/api-extractor': 7.52.10(@types/node@25.5.2) + '@microsoft/api-extractor': 7.52.10(@types/node@25.6.0) typescript: 5.8.3 transitivePeerDependencies: - '@typescript/native-preview' @@ -15509,6 +15756,9 @@ snapshots: '@rspack/binding-darwin-arm64@2.0.0-beta.9': optional: true + '@rspack/binding-darwin-arm64@2.0.1': + optional: true + '@rspack/binding-darwin-x64@1.6.6': optional: true @@ -15518,6 +15768,9 @@ snapshots: '@rspack/binding-darwin-x64@2.0.0-beta.9': optional: true + '@rspack/binding-darwin-x64@2.0.1': + optional: true + '@rspack/binding-linux-arm64-gnu@1.6.6': optional: true @@ -15527,6 +15780,9 @@ snapshots: '@rspack/binding-linux-arm64-gnu@2.0.0-beta.9': optional: true + '@rspack/binding-linux-arm64-gnu@2.0.1': + optional: true + '@rspack/binding-linux-arm64-musl@1.6.6': optional: true @@ -15536,6 +15792,9 @@ snapshots: '@rspack/binding-linux-arm64-musl@2.0.0-beta.9': optional: true + '@rspack/binding-linux-arm64-musl@2.0.1': + optional: true + '@rspack/binding-linux-x64-gnu@1.6.6': optional: true @@ -15545,6 +15804,9 @@ snapshots: '@rspack/binding-linux-x64-gnu@2.0.0-beta.9': optional: true + '@rspack/binding-linux-x64-gnu@2.0.1': + optional: true + '@rspack/binding-linux-x64-musl@1.6.6': optional: true @@ -15554,6 +15816,9 @@ snapshots: '@rspack/binding-linux-x64-musl@2.0.0-beta.9': optional: true + '@rspack/binding-linux-x64-musl@2.0.1': + optional: true + '@rspack/binding-wasm32-wasi@1.6.6': dependencies: '@napi-rs/wasm-runtime': 1.0.7 @@ -15569,6 +15834,13 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.1 optional: true + '@rspack/binding-wasm32-wasi@2.0.1': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + '@rspack/binding-win32-arm64-msvc@1.6.6': optional: true @@ -15578,6 +15850,9 @@ snapshots: '@rspack/binding-win32-arm64-msvc@2.0.0-beta.9': optional: true + '@rspack/binding-win32-arm64-msvc@2.0.1': + optional: true + '@rspack/binding-win32-ia32-msvc@1.6.6': optional: true @@ -15587,6 +15862,9 @@ snapshots: '@rspack/binding-win32-ia32-msvc@2.0.0-beta.9': optional: true + '@rspack/binding-win32-ia32-msvc@2.0.1': + optional: true + '@rspack/binding-win32-x64-msvc@1.6.6': optional: true @@ -15596,6 +15874,9 @@ snapshots: '@rspack/binding-win32-x64-msvc@2.0.0-beta.9': optional: true + '@rspack/binding-win32-x64-msvc@2.0.1': + optional: true + '@rspack/binding@1.6.6': optionalDependencies: '@rspack/binding-darwin-arm64': 1.6.6 @@ -15635,6 +15916,19 @@ snapshots: '@rspack/binding-win32-ia32-msvc': 2.0.0-beta.9 '@rspack/binding-win32-x64-msvc': 2.0.0-beta.9 + '@rspack/binding@2.0.1': + optionalDependencies: + '@rspack/binding-darwin-arm64': 2.0.1 + '@rspack/binding-darwin-x64': 2.0.1 + '@rspack/binding-linux-arm64-gnu': 2.0.1 + '@rspack/binding-linux-arm64-musl': 2.0.1 + '@rspack/binding-linux-x64-gnu': 2.0.1 + '@rspack/binding-linux-x64-musl': 2.0.1 + '@rspack/binding-wasm32-wasi': 2.0.1 + '@rspack/binding-win32-arm64-msvc': 2.0.1 + '@rspack/binding-win32-ia32-msvc': 2.0.1 + '@rspack/binding-win32-x64-msvc': 2.0.1 + '@rspack/core@1.6.6(@swc/helpers@0.5.21)': dependencies: '@module-federation/runtime-tools': 0.21.6 @@ -15657,6 +15951,12 @@ snapshots: optionalDependencies: '@swc/helpers': 0.5.21 + '@rspack/core@2.0.1(@swc/helpers@0.5.21)': + dependencies: + '@rspack/binding': 2.0.1 + optionalDependencies: + '@swc/helpers': 0.5.21 + '@rspack/lite-tapable@1.1.0': {} '@rspack/plugin-react-refresh@1.5.1(react-refresh@0.17.0)': @@ -15682,10 +15982,10 @@ snapshots: error-stack-parser: 2.1.4 react-refresh: 0.18.0 - '@rspress/core@2.0.8(@types/mdast@4.0.4)(@types/react@19.1.5)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2)': + '@rspress/core@2.0.8(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2)': dependencies: '@mdx-js/mdx': 3.1.1 - '@mdx-js/react': 3.1.1(@types/react@19.1.5)(react@19.2.4) + '@mdx-js/react': 3.1.1(@types/react@19.2.14)(react@19.2.4) '@rsbuild/core': 2.0.0-beta.11(core-js@3.47.0) '@rsbuild/plugin-react': 1.4.6(@rsbuild/core@2.0.0-beta.11(core-js@3.47.0)) '@rspress/shared': 2.0.8(core-js@3.47.0) @@ -15739,13 +16039,13 @@ snapshots: - supports-color - webpack-hot-middleware - '@rspress/plugin-client-redirects@2.0.8(@rspress/core@2.0.8(@types/mdast@4.0.4)(@types/react@19.1.5)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2))': + '@rspress/plugin-client-redirects@2.0.8(@rspress/core@2.0.8(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2))': dependencies: - '@rspress/core': 2.0.8(@types/mdast@4.0.4)(@types/react@19.1.5)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2) + '@rspress/core': 2.0.8(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2) - '@rspress/plugin-llms@2.0.8(@rspress/core@2.0.8(@types/mdast@4.0.4)(@types/react@19.1.5)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2))': + '@rspress/plugin-llms@2.0.8(@rspress/core@2.0.8(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2))': dependencies: - '@rspress/core': 2.0.8(@types/mdast@4.0.4)(@types/react@19.1.5)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2) + '@rspress/core': 2.0.8(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2) remark-mdx: 3.1.1 remark-parse: 11.0.0 remark-stringify: 11.0.0 @@ -15754,9 +16054,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@rspress/plugin-sitemap@2.0.8(@rspress/core@2.0.8(@types/mdast@4.0.4)(@types/react@19.1.5)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2))': + '@rspress/plugin-sitemap@2.0.8(@rspress/core@2.0.8(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2))': dependencies: - '@rspress/core': 2.0.8(@types/mdast@4.0.4)(@types/react@19.1.5)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2) + '@rspress/core': 2.0.8(@types/mdast@4.0.4)(@types/react@19.2.14)(core-js@3.47.0)(micromark-util-types@2.0.2)(micromark@4.0.2) '@rspress/shared@2.0.8(core-js@3.47.0)': dependencies: @@ -15769,6 +16069,17 @@ snapshots: - '@module-federation/runtime-tools' - core-js + '@rstest/core@0.9.9(core-js@3.47.0)(jsdom@29.0.2)': + dependencies: + '@rsbuild/core': 2.0.3(core-js@3.47.0) + '@types/chai': 5.2.3 + tinypool: 2.1.0 + optionalDependencies: + jsdom: 29.0.2 + transitivePeerDependencies: + - '@module-federation/runtime-tools' + - core-js + '@rushstack/node-core-library@5.14.0(@types/node@18.19.118)': dependencies: ajv: 8.13.0 @@ -15777,12 +16088,26 @@ snapshots: fs-extra: 11.3.4 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.11 + resolve: 1.22.12 semver: 7.5.4 optionalDependencies: '@types/node': 18.19.118 optional: true + '@rushstack/node-core-library@5.14.0(@types/node@18.19.130)': + dependencies: + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 11.3.4 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.12 + semver: 7.5.4 + optionalDependencies: + '@types/node': 18.19.130 + optional: true + '@rushstack/node-core-library@5.14.0(@types/node@18.19.62)': dependencies: ajv: 8.13.0 @@ -15791,13 +16116,13 @@ snapshots: fs-extra: 11.3.4 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.11 + resolve: 1.22.12 semver: 7.5.4 optionalDependencies: '@types/node': 18.19.62 optional: true - '@rushstack/node-core-library@5.14.0(@types/node@25.5.2)': + '@rushstack/node-core-library@5.14.0(@types/node@25.6.0)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -15805,15 +16130,15 @@ snapshots: fs-extra: 11.3.4 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.22.11 + resolve: 1.22.12 semver: 7.5.4 optionalDependencies: - '@types/node': 25.5.2 + '@types/node': 25.6.0 optional: true '@rushstack/rig-package@0.5.3': dependencies: - resolve: 1.22.11 + resolve: 1.22.12 strip-json-comments: 3.1.1 optional: true @@ -15825,6 +16150,14 @@ snapshots: '@types/node': 18.19.118 optional: true + '@rushstack/terminal@0.15.4(@types/node@18.19.130)': + dependencies: + '@rushstack/node-core-library': 5.14.0(@types/node@18.19.130) + supports-color: 8.1.1 + optionalDependencies: + '@types/node': 18.19.130 + optional: true + '@rushstack/terminal@0.15.4(@types/node@18.19.62)': dependencies: '@rushstack/node-core-library': 5.14.0(@types/node@18.19.62) @@ -15833,12 +16166,12 @@ snapshots: '@types/node': 18.19.62 optional: true - '@rushstack/terminal@0.15.4(@types/node@25.5.2)': + '@rushstack/terminal@0.15.4(@types/node@25.6.0)': dependencies: - '@rushstack/node-core-library': 5.14.0(@types/node@25.5.2) + '@rushstack/node-core-library': 5.14.0(@types/node@25.6.0) supports-color: 8.1.1 optionalDependencies: - '@types/node': 25.5.2 + '@types/node': 25.6.0 optional: true '@rushstack/ts-command-line@5.0.2(@types/node@18.19.118)': @@ -15851,6 +16184,16 @@ snapshots: - '@types/node' optional: true + '@rushstack/ts-command-line@5.0.2(@types/node@18.19.130)': + dependencies: + '@rushstack/terminal': 0.15.4(@types/node@18.19.130) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + optional: true + '@rushstack/ts-command-line@5.0.2(@types/node@18.19.62)': dependencies: '@rushstack/terminal': 0.15.4(@types/node@18.19.62) @@ -15861,9 +16204,9 @@ snapshots: - '@types/node' optional: true - '@rushstack/ts-command-line@5.0.2(@types/node@25.5.2)': + '@rushstack/ts-command-line@5.0.2(@types/node@25.6.0)': dependencies: - '@rushstack/terminal': 0.15.4(@types/node@25.5.2) + '@rushstack/terminal': 0.15.4(@types/node@25.6.0) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -16135,6 +16478,11 @@ snapshots: '@types/node': 18.19.130 '@types/responselike': 1.0.3 + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + '@types/chrome@0.0.279': dependencies: '@types/filesystem': 0.0.36 @@ -16158,6 +16506,8 @@ snapshots: dependencies: '@types/ms': 0.7.34 + '@types/deep-eql@4.0.2': {} + '@types/eslint-scope@3.7.7': dependencies: '@types/eslint': 9.6.1 @@ -16280,9 +16630,9 @@ snapshots: dependencies: undici-types: 7.16.0 - '@types/node@25.5.2': + '@types/node@25.6.0': dependencies: - undici-types: 7.18.2 + undici-types: 7.19.2 '@types/normalize-package-data@2.4.4': {} @@ -16298,9 +16648,9 @@ snapshots: dependencies: '@types/react': 18.3.23 - '@types/react-dom@19.1.5(@types/react@19.1.5)': + '@types/react-dom@19.2.3(@types/react@19.2.14)': dependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 optional: true '@types/react@18.3.23': @@ -16308,7 +16658,7 @@ snapshots: '@types/prop-types': 15.7.13 csstype: 3.2.3 - '@types/react@19.1.5': + '@types/react@19.2.14': dependencies: csstype: 3.2.3 @@ -16384,45 +16734,45 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.5(vite@5.4.10(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1))': + '@vitest/mocker@3.0.5(vite@5.4.10(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2))': dependencies: '@vitest/spy': 3.0.5 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.10(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) - '@vitest/mocker@3.0.5(vite@5.4.10(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1))': + '@vitest/mocker@3.0.5(vite@5.4.10(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2))': dependencies: '@vitest/spy': 3.0.5 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.10(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) - '@vitest/mocker@3.0.5(vite@5.4.10(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1))': + '@vitest/mocker@3.0.5(vite@5.4.10(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2))': dependencies: '@vitest/spy': 3.0.5 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.10(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) - '@vitest/mocker@3.0.5(vite@5.4.10(@types/node@25.5.2)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1))': + '@vitest/mocker@3.0.5(vite@5.4.10(@types/node@25.6.0)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2))': dependencies: '@vitest/spy': 3.0.5 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.10(@types/node@25.5.2)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@25.6.0)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) - '@vitest/mocker@3.0.5(vite@5.4.10(@types/node@25.5.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1))': + '@vitest/mocker@3.0.5(vite@5.4.10(@types/node@25.6.0)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2))': dependencies: '@vitest/spy': 3.0.5 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.10(@types/node@25.5.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@25.6.0)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) '@vitest/pretty-format@3.0.5': dependencies: @@ -16710,18 +17060,18 @@ snapshots: ajv: 8.13.0 optional: true - ajv-formats@2.1.1(ajv@8.18.0): + ajv-formats@2.1.1(ajv@8.20.0): optionalDependencies: - ajv: 8.18.0 + ajv: 8.20.0 ajv-formats@3.0.1(ajv@8.13.0): optionalDependencies: ajv: 8.13.0 optional: true - ajv-keywords@5.1.0(ajv@8.18.0): + ajv-keywords@5.1.0(ajv@8.20.0): dependencies: - ajv: 8.18.0 + ajv: 8.20.0 fast-deep-equal: 3.1.3 ajv@6.12.6: @@ -16754,7 +17104,7 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - ajv@8.18.0: + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 fast-uri: 3.1.0 @@ -17444,7 +17794,7 @@ snapshots: centra@2.7.0: dependencies: - follow-redirects: 1.15.11 + follow-redirects: 1.16.0 transitivePeerDependencies: - debug @@ -17619,12 +17969,12 @@ snapshots: clsx@2.1.1: {} - cmdk@1.1.1(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + cmdk@1.1.1(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-dialog': 1.1.14(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.5)(react@18.3.1) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.5))(@types/react@19.1.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-dialog': 1.1.14(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.14)(react@18.3.1) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) transitivePeerDependencies: @@ -17693,10 +18043,10 @@ snapshots: commander@9.5.0: {} - commitizen@4.2.5(@types/node@25.5.2)(typescript@5.8.3): + commitizen@4.2.5(@types/node@25.6.0)(typescript@5.8.3): dependencies: cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0(@types/node@25.5.2)(typescript@5.8.3) + cz-conventional-changelog: 3.3.0(@types/node@25.6.0)(typescript@5.8.3) dedent: 0.7.0 detect-indent: 6.1.0 find-node-modules: 2.1.3 @@ -17857,9 +18207,9 @@ snapshots: corser@2.0.1: {} - cosmiconfig-typescript-loader@6.2.0(@types/node@25.5.2)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): + cosmiconfig-typescript-loader@6.2.0(@types/node@25.6.0)(cosmiconfig@9.0.0(typescript@5.8.3))(typescript@5.8.3): dependencies: - '@types/node': 25.5.2 + '@types/node': 25.6.0 cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 2.6.1 typescript: 5.8.3 @@ -17877,7 +18227,7 @@ snapshots: dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 - js-yaml: 4.1.1 + js-yaml: 4.1.0 parse-json: 5.2.0 optionalDependencies: typescript: 5.8.3 @@ -17990,8 +18340,6 @@ snapshots: dependencies: css-tree: 2.2.1 - csstype@3.1.3: {} - csstype@3.2.3: {} csv-generate@3.4.3: {} @@ -18007,16 +18355,16 @@ snapshots: csv-stringify: 5.6.5 stream-transform: 2.1.3 - cz-conventional-changelog@3.3.0(@types/node@25.5.2)(typescript@5.8.3): + cz-conventional-changelog@3.3.0(@types/node@25.6.0)(typescript@5.8.3): dependencies: chalk: 2.4.2 - commitizen: 4.2.5(@types/node@25.5.2)(typescript@5.8.3) + commitizen: 4.2.5(@types/node@25.6.0)(typescript@5.8.3) conventional-commit-types: 3.0.0 lodash.map: 4.6.0 longest: 2.0.1 word-wrap: 1.2.5 optionalDependencies: - '@commitlint/load': 20.1.0(@types/node@25.5.2)(typescript@5.8.3) + '@commitlint/load': 20.1.0(@types/node@25.6.0)(typescript@5.8.3) transitivePeerDependencies: - '@types/node' - typescript @@ -18379,6 +18727,11 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.2 + enhanced-resolve@5.21.0: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.3 + enquirer@2.3.6: dependencies: ansi-colors: 4.1.3 @@ -19082,6 +19435,8 @@ snapshots: follow-redirects@1.15.9: {} + follow-redirects@1.16.0: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -20483,7 +20838,7 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - loader-runner@4.3.1: {} + loader-runner@4.3.2: {} loader-utils@3.3.1: {} @@ -21889,11 +22244,11 @@ snapshots: dependencies: find-up: 5.0.0 - playwright-core@1.58.1: {} + playwright-core@1.59.1: {} - playwright@1.58.1: + playwright@1.59.1: dependencies: - playwright-core: 1.58.1 + playwright-core: 1.59.1 optionalDependencies: fsevents: 2.3.2 @@ -21993,14 +22348,14 @@ snapshots: dependencies: '@protobufjs/aspromise': 1.1.2 '@protobufjs/base64': 1.1.2 - '@protobufjs/codegen': 2.0.4 + '@protobufjs/codegen': 2.0.5 '@protobufjs/eventemitter': 1.1.0 '@protobufjs/fetch': 1.1.0 '@protobufjs/float': 1.0.2 - '@protobufjs/inquire': 1.1.0 + '@protobufjs/inquire': 1.1.1 '@protobufjs/path': 1.1.2 '@protobufjs/pool': 1.1.0 - '@protobufjs/utf8': 1.1.0 + '@protobufjs/utf8': 1.1.1 '@types/node': 18.19.130 long: 5.3.2 optional: true @@ -22506,24 +22861,24 @@ snapshots: react-refresh@0.18.0: {} - react-remove-scroll-bar@2.3.8(@types/react@19.1.5)(react@18.3.1): + react-remove-scroll-bar@2.3.8(@types/react@19.2.14)(react@18.3.1): dependencies: react: 18.3.1 - react-style-singleton: 2.2.3(@types/react@19.1.5)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@18.3.1) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - react-remove-scroll@2.7.1(@types/react@19.1.5)(react@18.3.1): + react-remove-scroll@2.7.1(@types/react@19.2.14)(react@18.3.1): dependencies: react: 18.3.1 - react-remove-scroll-bar: 2.3.8(@types/react@19.1.5)(react@18.3.1) - react-style-singleton: 2.2.3(@types/react@19.1.5)(react@18.3.1) + react-remove-scroll-bar: 2.3.8(@types/react@19.2.14)(react@18.3.1) + react-style-singleton: 2.2.3(@types/react@19.2.14)(react@18.3.1) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.1.5)(react@18.3.1) - use-sidecar: 1.1.3(@types/react@19.1.5)(react@18.3.1) + use-callback-ref: 1.3.3(@types/react@19.2.14)(react@18.3.1) + use-sidecar: 1.1.3(@types/react@19.2.14)(react@18.3.1) optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 react-render-to-markdown@19.0.1(react@19.2.4): dependencies: @@ -22554,13 +22909,13 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-style-singleton@2.2.3(@types/react@19.1.5)(react@18.3.1): + react-style-singleton@2.2.3(@types/react@19.2.14)(react@18.3.1): dependencies: get-nonce: 1.0.1 react: 18.3.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 react@18.3.1: dependencies: @@ -22679,7 +23034,7 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 - reduce-configs@1.1.1: {} + reduce-configs@1.1.2: {} reflect.getprototypeof@1.0.10: dependencies: @@ -22851,6 +23206,14 @@ snapshots: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + optional: true + responselike@2.0.1: dependencies: lowercase-keys: 2.0.0 @@ -22944,6 +23307,14 @@ snapshots: '@microsoft/api-extractor': 7.52.10(@types/node@18.19.118) typescript: 5.8.3 + rsbuild-plugin-dts@0.18.3(@microsoft/api-extractor@7.52.10(@types/node@18.19.130))(@rsbuild/core@1.6.15)(typescript@5.8.3): + dependencies: + '@ast-grep/napi': 0.37.0 + '@rsbuild/core': 1.6.15 + optionalDependencies: + '@microsoft/api-extractor': 7.52.10(@types/node@18.19.130) + typescript: 5.8.3 + rsbuild-plugin-dts@0.18.3(@microsoft/api-extractor@7.52.10(@types/node@18.19.62))(@rsbuild/core@1.6.15)(typescript@5.8.3): dependencies: '@ast-grep/napi': 0.37.0 @@ -22952,12 +23323,12 @@ snapshots: '@microsoft/api-extractor': 7.52.10(@types/node@18.19.62) typescript: 5.8.3 - rsbuild-plugin-dts@0.18.3(@microsoft/api-extractor@7.52.10(@types/node@25.5.2))(@rsbuild/core@1.6.15)(typescript@5.8.3): + rsbuild-plugin-dts@0.18.3(@microsoft/api-extractor@7.52.10(@types/node@25.6.0))(@rsbuild/core@1.6.15)(typescript@5.8.3): dependencies: '@ast-grep/napi': 0.37.0 '@rsbuild/core': 1.6.15 optionalDependencies: - '@microsoft/api-extractor': 7.52.10(@types/node@25.5.2) + '@microsoft/api-extractor': 7.52.10(@types/node@25.6.0) typescript: 5.8.3 rsbuild-plugin-workspace-dev@0.0.1(@rsbuild/core@1.6.15): @@ -23082,7 +23453,7 @@ snapshots: sass-embedded@1.86.3: dependencies: - '@bufbuild/protobuf': 2.11.0 + '@bufbuild/protobuf': 2.12.0 buffer-builder: 0.2.0 colorjs.io: 0.5.2 immutable: 5.1.5 @@ -23130,9 +23501,9 @@ snapshots: schema-utils@4.3.3: dependencies: '@types/json-schema': 7.0.15 - ajv: 8.18.0 - ajv-formats: 2.1.1(ajv@8.18.0) - ajv-keywords: 5.1.0(ajv@8.18.0) + ajv: 8.20.0 + ajv-formats: 2.1.1(ajv@8.20.0) + ajv-keywords: 5.1.0(ajv@8.20.0) screenshot-desktop@1.15.3: dependencies: @@ -23566,6 +23937,8 @@ snapshots: std-env@3.9.0: {} + std-env@4.1.0: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -23798,6 +24171,8 @@ snapshots: tapable@2.3.2: {} + tapable@2.3.3: {} + tar-fs@3.1.1: dependencies: pump: 3.0.4 @@ -23847,15 +24222,15 @@ snapshots: term-size@2.2.1: {} - terser-webpack-plugin@5.4.0(webpack@5.99.5): + terser-webpack-plugin@5.5.0(webpack@5.99.5): dependencies: '@jridgewell/trace-mapping': 0.3.31 jest-worker: 27.5.1 schema-utils: 4.3.3 - terser: 5.46.1 + terser: 5.46.2 webpack: 5.99.5 - terser@5.46.1: + terser@5.46.2: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.16.0 @@ -23912,6 +24287,8 @@ snapshots: tinypool@1.1.1: {} + tinypool@2.1.0: {} + tinyrainbow@2.0.0: {} tinyspy@3.0.2: {} @@ -23990,7 +24367,7 @@ snapshots: optionalDependencies: '@rspack/core': 1.6.8(@swc/helpers@0.5.21) - ts-checker-rspack-plugin@1.2.2(@rspack/core@2.0.0-beta.9(@swc/helpers@0.5.21))(typescript@5.8.3): + ts-checker-rspack-plugin@1.2.2(@rspack/core@2.0.1(@swc/helpers@0.5.21))(typescript@5.8.3): dependencies: '@babel/code-frame': 7.27.1 '@rspack/lite-tapable': 1.1.0 @@ -24001,7 +24378,7 @@ snapshots: picocolors: 1.1.1 typescript: 5.8.3 optionalDependencies: - '@rspack/core': 2.0.0-beta.9(@swc/helpers@0.5.21) + '@rspack/core': 2.0.1(@swc/helpers@0.5.21) ts-node@10.9.2(@types/node@18.19.118)(typescript@5.8.3): dependencies: @@ -24156,7 +24533,7 @@ snapshots: undici-types@7.16.0: {} - undici-types@7.18.2: {} + undici-types@7.19.2: {} undici@6.22.0: {} @@ -24267,20 +24644,20 @@ snapshots: punycode: 1.4.1 qs: 6.14.0 - use-callback-ref@1.3.3(@types/react@19.1.5)(react@18.3.1): + use-callback-ref@1.3.3(@types/react@19.2.14)(react@18.3.1): dependencies: react: 18.3.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 - use-sidecar@1.1.3(@types/react@19.1.5)(react@18.3.1): + use-sidecar@1.1.3(@types/react@19.2.14)(react@18.3.1): dependencies: detect-node-es: 1.1.0 react: 18.3.1 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.1.5 + '@types/react': 19.2.14 use-sync-external-store@1.2.0(react@18.3.1): dependencies: @@ -24341,13 +24718,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.0.5(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vite-node@3.0.5(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.10(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) transitivePeerDependencies: - '@types/node' - less @@ -24359,13 +24736,13 @@ snapshots: - supports-color - terser - vite-node@3.0.5(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vite-node@3.0.5(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.10(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) transitivePeerDependencies: - '@types/node' - less @@ -24377,13 +24754,13 @@ snapshots: - supports-color - terser - vite-node@3.0.5(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vite-node@3.0.5(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.10(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) transitivePeerDependencies: - '@types/node' - less @@ -24395,13 +24772,13 @@ snapshots: - supports-color - terser - vite-node@3.0.5(@types/node@25.5.2)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vite-node@3.0.5(@types/node@25.6.0)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.10(@types/node@25.5.2)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@25.6.0)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) transitivePeerDependencies: - '@types/node' - less @@ -24413,13 +24790,13 @@ snapshots: - supports-color - terser - vite-node@3.0.5(@types/node@25.5.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vite-node@3.0.5(@types/node@25.6.0)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.10(@types/node@25.5.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@25.6.0)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) transitivePeerDependencies: - '@types/node' - less @@ -24431,7 +24808,7 @@ snapshots: - supports-color - terser - vite@5.4.10(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vite@5.4.10(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -24442,9 +24819,9 @@ snapshots: less: 4.3.0 lightningcss: 1.30.1 sass-embedded: 1.86.3 - terser: 5.46.1 + terser: 5.46.2 - vite@5.4.10(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vite@5.4.10(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -24455,9 +24832,9 @@ snapshots: less: 4.3.0 lightningcss: 1.30.1 sass-embedded: 1.86.3 - terser: 5.46.1 + terser: 5.46.2 - vite@5.4.10(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vite@5.4.10(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: esbuild: 0.21.5 postcss: 8.5.6 @@ -24468,38 +24845,38 @@ snapshots: less: 4.3.0 lightningcss: 1.30.1 sass-embedded: 1.86.3 - terser: 5.46.1 + terser: 5.46.2 - vite@5.4.10(@types/node@25.5.2)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vite@5.4.10(@types/node@25.6.0)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: esbuild: 0.21.5 postcss: 8.5.6 rollup: 4.24.3 optionalDependencies: - '@types/node': 25.5.2 + '@types/node': 25.6.0 fsevents: 2.3.3 less: 4.2.2 lightningcss: 1.30.1 sass-embedded: 1.86.3 - terser: 5.46.1 + terser: 5.46.2 - vite@5.4.10(@types/node@25.5.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vite@5.4.10(@types/node@25.6.0)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: esbuild: 0.21.5 postcss: 8.5.6 rollup: 4.24.3 optionalDependencies: - '@types/node': 25.5.2 + '@types/node': 25.6.0 fsevents: 2.3.3 less: 4.3.0 lightningcss: 1.30.1 sass-embedded: 1.86.3 - terser: 5.46.1 + terser: 5.46.2 - vitest@3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vitest@3.0.5(@types/debug@4.1.12)(@types/node@18.19.118)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: '@vitest/expect': 3.0.5 - '@vitest/mocker': 3.0.5(vite@5.4.10(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1)) + '@vitest/mocker': 3.0.5(vite@5.4.10(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.0.5 '@vitest/snapshot': 3.0.5 @@ -24515,8 +24892,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.10(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) - vite-node: 3.0.5(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) + vite-node: 3.0.5(@types/node@18.19.118)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -24533,10 +24910,10 @@ snapshots: - supports-color - terser - vitest@3.0.5(@types/debug@4.1.12)(@types/node@18.19.130)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vitest@3.0.5(@types/debug@4.1.12)(@types/node@18.19.130)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: '@vitest/expect': 3.0.5 - '@vitest/mocker': 3.0.5(vite@5.4.10(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1)) + '@vitest/mocker': 3.0.5(vite@5.4.10(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.0.5 '@vitest/snapshot': 3.0.5 @@ -24552,8 +24929,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.10(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) - vite-node: 3.0.5(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) + vite-node: 3.0.5(@types/node@18.19.130)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -24570,10 +24947,10 @@ snapshots: - supports-color - terser - vitest@3.0.5(@types/debug@4.1.12)(@types/node@18.19.62)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vitest@3.0.5(@types/debug@4.1.12)(@types/node@18.19.62)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: '@vitest/expect': 3.0.5 - '@vitest/mocker': 3.0.5(vite@5.4.10(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1)) + '@vitest/mocker': 3.0.5(vite@5.4.10(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.0.5 '@vitest/snapshot': 3.0.5 @@ -24589,8 +24966,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.10(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) - vite-node: 3.0.5(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) + vite-node: 3.0.5(@types/node@18.19.62)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -24607,10 +24984,10 @@ snapshots: - supports-color - terser - vitest@3.0.5(@types/debug@4.1.12)(@types/node@25.5.2)(jsdom@29.0.2)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vitest@3.0.5(@types/debug@4.1.12)(@types/node@25.6.0)(jsdom@29.0.2)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: '@vitest/expect': 3.0.5 - '@vitest/mocker': 3.0.5(vite@5.4.10(@types/node@25.5.2)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1)) + '@vitest/mocker': 3.0.5(vite@5.4.10(@types/node@25.6.0)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.0.5 '@vitest/snapshot': 3.0.5 @@ -24626,12 +25003,12 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.10(@types/node@25.5.2)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) - vite-node: 3.0.5(@types/node@25.5.2)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@25.6.0)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) + vite-node: 3.0.5(@types/node@25.6.0)(less@4.2.2)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 25.5.2 + '@types/node': 25.6.0 jsdom: 29.0.2 transitivePeerDependencies: - less @@ -24644,10 +25021,10 @@ snapshots: - supports-color - terser - vitest@3.0.5(@types/debug@4.1.12)(@types/node@25.5.2)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1): + vitest@3.0.5(@types/debug@4.1.12)(@types/node@25.6.0)(jsdom@29.0.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2): dependencies: '@vitest/expect': 3.0.5 - '@vitest/mocker': 3.0.5(vite@5.4.10(@types/node@25.5.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1)) + '@vitest/mocker': 3.0.5(vite@5.4.10(@types/node@25.6.0)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.0.5 '@vitest/snapshot': 3.0.5 @@ -24663,12 +25040,12 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.10(@types/node@25.5.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) - vite-node: 3.0.5(@types/node@25.5.2)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.1) + vite: 5.4.10(@types/node@25.6.0)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) + vite-node: 3.0.5(@types/node@25.6.0)(less@4.3.0)(lightningcss@1.30.1)(sass-embedded@1.86.3)(terser@5.46.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 25.5.2 + '@types/node': 25.6.0 jsdom: 29.0.2 transitivePeerDependencies: - less @@ -24767,7 +25144,7 @@ snapshots: - bufferutil - utf-8-validate - webpack-sources@3.3.4: {} + webpack-sources@3.4.0: {} webpack@5.99.5: dependencies: @@ -24779,21 +25156,21 @@ snapshots: acorn: 8.16.0 browserslist: 4.28.0 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.20.1 + enhanced-resolve: 5.21.0 es-module-lexer: 1.7.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.1 + loader-runner: 4.3.2 mime-types: 2.1.35 neo-async: 2.6.2 schema-utils: 4.3.3 - tapable: 2.3.2 - terser-webpack-plugin: 5.4.0(webpack@5.99.5) + tapable: 2.3.3 + terser-webpack-plugin: 5.5.0(webpack@5.99.5) watchpack: 2.5.1 - webpack-sources: 3.3.4 + webpack-sources: 3.4.0 transitivePeerDependencies: - '@swc/core' - esbuild