From 3b3aab09863176e3f30af876d9e7adadcd86d05e Mon Sep 17 00:00:00 2001 From: 9aoy Date: Mon, 21 Jul 2025 17:14:08 +0800 Subject: [PATCH 01/16] docs(deps): update @rstack-dev/doc-ui to 1.10.8 (#404) --- pnpm-lock.yaml | 10 +++++----- website/package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 124a60e8..94c9450f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -431,8 +431,8 @@ importers: specifier: 2.0.0-beta.21 version: 2.0.0-beta.21(rspress@2.0.0-beta.21(@types/react@19.1.8)(acorn@8.14.1)(webpack@5.99.9)) '@rstack-dev/doc-ui': - specifier: 1.10.7 - version: 1.10.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + specifier: 1.10.8 + version: 1.10.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@rstest/tsconfig': specifier: workspace:* version: link:../scripts/tsconfig @@ -1289,8 +1289,8 @@ packages: resolution: {integrity: sha512-G+yJiAZW0oiAB7FyMFWrEI5B/Lg3z2IdxegbGo3a9q2tYo24bd35YuuXOQOIPuE/0+hWxCtB1vxDYH6WyZwMIQ==} engines: {node: '>=18.0.0'} - '@rstack-dev/doc-ui@1.10.7': - resolution: {integrity: sha512-WanOXuqt5AFUd+B04g65Dv7om+tmGcKnyZowYwRCOGMGX0i7PDxiqiHbQgw2taz2eNai3PIQyZAVNoqf20zeRA==} + '@rstack-dev/doc-ui@1.10.8': + resolution: {integrity: sha512-F/v0XzRI1ZIAzBBLx91um4TLMIUWw3LiQsPXtZe8ZAF6wQUVk47YPK/kB1VPkLLaD214JrwWq+L6P7UnD8MT7A==} '@rushstack/node-core-library@5.13.1': resolution: {integrity: sha512-5yXhzPFGEkVc9Fu92wsNJ9jlvdwz4RNb2bMso+/+TH0nMm1jDDDsOIf4l8GAkPxGuwPw5DH24RliWVfSPhlW/Q==} @@ -5558,7 +5558,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@rstack-dev/doc-ui@1.10.7(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + '@rstack-dev/doc-ui@1.10.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: framer-motion: 12.23.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) transitivePeerDependencies: diff --git a/website/package.json b/website/package.json index 489f5e20..8366ce89 100644 --- a/website/package.json +++ b/website/package.json @@ -11,7 +11,7 @@ "devDependencies": { "@rsbuild/plugin-sass": "^1.3.3", "@rspress/plugin-llms": "2.0.0-beta.21", - "@rstack-dev/doc-ui": "1.10.7", + "@rstack-dev/doc-ui": "1.10.8", "@rstest/tsconfig": "workspace:*", "@types/node": "^22.13.8", "@types/react": "^19.1.8", From 6299ad0fc7228b2a48da1a4cc00a5f0af6b2b32a Mon Sep 17 00:00:00 2001 From: 9aoy Date: Mon, 21 Jul 2025 21:38:55 +0800 Subject: [PATCH 02/16] feat: set callerName as `rstest` (#407) --- packages/core/src/core/rsbuild.ts | 1 + tests/build/fixtures/plugin/rstest.config.ts | 5 +++++ .../docs/en/guide/basic/configure-rstest.mdx | 19 +++++++++++++++++++ .../docs/zh/guide/basic/configure-rstest.mdx | 19 +++++++++++++++++++ 4 files changed, 44 insertions(+) diff --git a/packages/core/src/core/rsbuild.ts b/packages/core/src/core/rsbuild.ts index d581c987..4efa09bf 100644 --- a/packages/core/src/core/rsbuild.ts +++ b/packages/core/src/core/rsbuild.ts @@ -133,6 +133,7 @@ export const prepareRsbuild = async ( const writeToDisk = dev.writeToDisk || debugMode; const rsbuildInstance = await createRsbuild({ + callerName: 'rstest', rsbuildConfig: { tools, plugins, diff --git a/tests/build/fixtures/plugin/rstest.config.ts b/tests/build/fixtures/plugin/rstest.config.ts index f88e4fdf..abe55dcd 100644 --- a/tests/build/fixtures/plugin/rstest.config.ts +++ b/tests/build/fixtures/plugin/rstest.config.ts @@ -8,6 +8,11 @@ export default defineConfig({ { name: 'plugin', setup(api) { + if (api.context.callerName !== 'rstest') { + throw new Error( + 'This plugin should only be used in Rstest, please check your configuration.', + ); + } api.transform({ test: /a.ts$/ }, ({ code }) => { return code.replace('count = 1', 'count = 2'); }); diff --git a/website/docs/en/guide/basic/configure-rstest.mdx b/website/docs/en/guide/basic/configure-rstest.mdx index 02f89ce7..7cdea4cc 100644 --- a/website/docs/en/guide/basic/configure-rstest.mdx +++ b/website/docs/en/guide/basic/configure-rstest.mdx @@ -40,3 +40,22 @@ You can also abbreviate the `--config` option to `-c`: ```bash rstest -c scripts/rstest.config.mjs ``` + +## Detect Rstest environment + +If you are developing the Rsbuild plugin, you can use [api.context.callerName](https://rsbuild.rs/api/javascript-api/instance#contextcallername) to determine the current plugin is being called. + +```ts +export const myPlugin = { + name: 'my-plugin', + setup(api) { + const { callerName } = api.context; + + if (callerName === 'rstest') { + // ... + } else if (callerName === 'rsbuild') { + // ... + } + }, +}; +``` diff --git a/website/docs/zh/guide/basic/configure-rstest.mdx b/website/docs/zh/guide/basic/configure-rstest.mdx index 96ee1119..aaedf93a 100644 --- a/website/docs/zh/guide/basic/configure-rstest.mdx +++ b/website/docs/zh/guide/basic/configure-rstest.mdx @@ -40,3 +40,22 @@ Rstest CLI 通过 `--config` 选项来指定配置文件,可以设置为相对 ```bash rstest -c scripts/rstest.config.mjs ``` + +## 检测 Rstest 环境 + +如果你正在开发 Rsbuild 插件,你可以使用 [api.context.callerName](https://rsbuild.rs/zh/api/javascript-api/instance#contextcallername) 来判断当前插件被调用的环境。 + +```ts +export const myPlugin = { + name: 'my-plugin', + setup(api) { + const { callerName } = api.context; + + if (callerName === 'rstest') { + // ... + } else if (callerName === 'rsbuild') { + // ... + } + }, +}; +``` From 4871714e50ee4f4ae5ac35d4d0cd4ebd80ee79b6 Mon Sep 17 00:00:00 2001 From: 9aoy Date: Tue, 22 Jul 2025 11:01:27 +0800 Subject: [PATCH 03/16] fix: should throw error when specified config not found (#406) --- packages/core/src/cli/commands.ts | 65 ++++++++++---------- packages/core/src/config.ts | 5 +- tests/cli/config.test.ts | 75 +++++++++++++++++++++++ tests/cli/fixtures/plugin.error.config.ts | 12 ++++ 4 files changed, 122 insertions(+), 35 deletions(-) create mode 100644 tests/cli/config.test.ts create mode 100644 tests/cli/fixtures/plugin.error.config.ts diff --git a/packages/core/src/cli/commands.ts b/packages/core/src/cli/commands.ts index 01e7c2d2..8400a78c 100644 --- a/packages/core/src/cli/commands.ts +++ b/packages/core/src/cli/commands.ts @@ -3,7 +3,12 @@ import cac, { type CAC } from 'cac'; import { normalize } from 'pathe'; import { isCI } from 'std-env'; import { loadConfig } from '../config'; -import type { ListCommandOptions, RstestConfig } from '../types'; +import type { + ListCommandOptions, + RstestCommand, + RstestConfig, + RstestInstance, +} from '../types'; import { castArray, formatError, getAbsolutePath } from '../utils/helper'; import { logger } from '../utils/logger'; import { showRstest } from './prepare'; @@ -167,50 +172,46 @@ export function setupCommands(): void { .command('[...filters]', 'run tests') .action(async (filters: string[], options: CommonOptions) => { showRstest(); - try { - const { config } = await initCli(options); - const { createRstest } = await import('../core'); - if (isCI) { - const rstest = createRstest(config, 'run', filters.map(normalize)); - await rstest.runTests(); - } else { - const rstest = createRstest(config, 'watch', filters.map(normalize)); - await rstest.runTests(); - } - } catch (err) { - logger.error('Failed to run Rstest.'); - logger.error(err); - process.exit(1); + if (isCI) { + await runRest(options, filters, 'run'); + } else { + await runRest(options, filters, 'watch'); } }); + const runRest = async ( + options: CommonOptions, + filters: string[], + command: RstestCommand, + ) => { + let rstest: RstestInstance | undefined; + try { + const { config } = await initCli(options); + const { createRstest } = await import('../core'); + rstest = createRstest(config, command, filters.map(normalize)); + await rstest.runTests(); + } catch (err) { + for (const reporter of rstest?.context.reporters || []) { + reporter.onExit?.(); + } + logger.error('Failed to run Rstest.'); + logger.error(formatError(err)); + process.exit(1); + } + }; + cli .command('run [...filters]', 'run tests without watch mode') .action(async (filters: string[], options: CommonOptions) => { showRstest(); - const { config } = await initCli(options); - const { createRstest } = await import('../core'); - const rstest = createRstest(config, 'run', filters.map(normalize)); - try { - await rstest.runTests(); - } catch (err) { - for (const reporter of rstest.context.reporters) { - reporter.onExit?.(); - } - logger.error('Failed to run Rstest.'); - logger.error(formatError(err)); - process.exit(1); - } + await runRest(options, filters, 'run'); }); cli .command('watch [...filters]', 'run tests in watch mode') .action(async (filters: string[], options: CommonOptions) => { showRstest(); - const { config } = await initCli(options); - const { createRstest } = await import('../core'); - const rstest = createRstest(config, 'watch', filters.map(normalize)); - await rstest.runTests(); + await runRest(options, filters, 'watch'); }); cli diff --git a/packages/core/src/config.ts b/packages/core/src/config.ts index fbd7cc01..dcd18e70 100644 --- a/packages/core/src/config.ts +++ b/packages/core/src/config.ts @@ -28,8 +28,7 @@ const resolveConfigPath = (root: string, customConfig?: string) => { if (fs.existsSync(customConfigPath)) { return customConfigPath; } - logger.warn(`Cannot find config file: ${color.dim(customConfigPath)}`); - logger.log(''); + throw `Cannot find config file: ${color.dim(customConfigPath)}`; } const configFilePath = findConfig(join(root, DEFAULT_CONFIG_NAME)); @@ -58,7 +57,7 @@ export async function loadConfig({ const configFilePath = resolveConfigPath(cwd, path); if (!configFilePath) { - logger.debug('no config file found'); + logger.debug('no rstest config file found'); return { content: {}, filePath: configFilePath, diff --git a/tests/cli/config.test.ts b/tests/cli/config.test.ts new file mode 100644 index 00000000..06387a6d --- /dev/null +++ b/tests/cli/config.test.ts @@ -0,0 +1,75 @@ +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { describe, expect, it } from '@rstest/core'; +import { runRstestCli } from '../scripts/'; + +const __filename = fileURLToPath(import.meta.url); + +const __dirname = dirname(__filename); + +describe('test config load', () => { + it('should throw error when custom test config not found', async () => { + const { cli } = await runRstestCli({ + command: 'rstest', + args: ['run', 'success.test.ts', '-c', 'a.config.ts'], + options: { + nodeOptions: { + cwd: __dirname, + }, + }, + }); + await cli.exec; + expect(cli.exec.process?.exitCode).toBe(1); + + const logs = cli.stdout.split('\n').filter(Boolean); + + expect( + logs.find((log) => log.includes('Cannot find config file')), + ).toBeDefined(); + }); + + it('should throw error when plugin setup error', async () => { + const { cli } = await runRstestCli({ + command: 'rstest', + args: ['run', 'success.test.ts', '-c', 'fixtures/plugin.error.config.ts'], + options: { + nodeOptions: { + cwd: __dirname, + }, + }, + }); + await cli.exec; + expect(cli.exec.process?.exitCode).toBe(1); + + const logs = cli.stdout.split('\n').filter(Boolean); + + expect( + logs.find((log) => log.includes('plugin setup error')), + ).toBeDefined(); + }); + + it('should throw error when plugin setup error in watch mode', async () => { + const { cli } = await runRstestCli({ + command: 'rstest', + args: [ + 'watch', + 'success.test.ts', + '-c', + 'fixtures/plugin.error.config.ts', + ], + options: { + nodeOptions: { + cwd: __dirname, + }, + }, + }); + await cli.exec; + expect(cli.exec.process?.exitCode).toBe(1); + + const logs = cli.stdout.split('\n').filter(Boolean); + + expect( + logs.find((log) => log.includes('plugin setup error')), + ).toBeDefined(); + }); +}); diff --git a/tests/cli/fixtures/plugin.error.config.ts b/tests/cli/fixtures/plugin.error.config.ts new file mode 100644 index 00000000..c86182e5 --- /dev/null +++ b/tests/cli/fixtures/plugin.error.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from '@rstest/core'; + +export default defineConfig({ + plugins: [ + { + name: 'test', + setup: (_api) => { + throw new Error('plugin setup error'); + }, + }, + ], +}); From 5b12f70f53ce901c30da976d472b1affd546c7b5 Mon Sep 17 00:00:00 2001 From: 9aoy Date: Tue, 22 Jul 2025 14:03:20 +0800 Subject: [PATCH 04/16] docs: add some notes (#408) --- website/docs/en/config/build/source.mdx | 2 ++ website/docs/en/guide/basic/test-filter.mdx | 4 ++++ website/docs/zh/config/build/source.mdx | 2 ++ website/docs/zh/guide/basic/test-filter.mdx | 4 ++++ 4 files changed, 12 insertions(+) diff --git a/website/docs/en/config/build/source.mdx b/website/docs/en/config/build/source.mdx index dab80757..51de732e 100644 --- a/website/docs/en/config/build/source.mdx +++ b/website/docs/en/config/build/source.mdx @@ -8,6 +8,8 @@ Options for input source code. Used to configure the decorators syntax. +If you are using TypeScript's [experimentalDecorators](https://www.typescriptlang.org/tsconfig/#experimentalDecorators), you should set `source.decorators.version` to `legacy` in this case. + ## source.define Replaces variables in your code with other values or expressions at compile time. This can be useful for injecting env variables and other information to the code during build time. diff --git a/website/docs/en/guide/basic/test-filter.mdx b/website/docs/en/guide/basic/test-filter.mdx index 03ec1a24..e8c5bd27 100644 --- a/website/docs/en/guide/basic/test-filter.mdx +++ b/website/docs/en/guide/basic/test-filter.mdx @@ -109,6 +109,10 @@ test('case B', () => { }); ``` +:::note +It should be noted that the `.only` flag only applies to the current test file. If you want to execute specific test cases within a specific file, you can use a combination of "filter by file name" and "filter via test API". +::: + Use `.skip` or `.todo` to skip certain test suites or cases. ```ts diff --git a/website/docs/zh/config/build/source.mdx b/website/docs/zh/config/build/source.mdx index 32ae00a0..406a31a0 100644 --- a/website/docs/zh/config/build/source.mdx +++ b/website/docs/zh/config/build/source.mdx @@ -8,6 +8,8 @@ import { RsbuildDocBadge } from '@components/RsbuildDocBadge'; 用于配置装饰器语法。 +如果你使用了 TypeScript 的 [experimentalDecorators](https://www.typescriptlang.org/tsconfig/#experimentalDecorators),此处应将 `source.decorators.version` 设置为 legacy。 + ## source.define 构建时将代码中的变量替换成其它值或者表达式,可以用于在构建时向代码注入环境变量等信息。 diff --git a/website/docs/zh/guide/basic/test-filter.mdx b/website/docs/zh/guide/basic/test-filter.mdx index 5a029937..b6f0774c 100644 --- a/website/docs/zh/guide/basic/test-filter.mdx +++ b/website/docs/zh/guide/basic/test-filter.mdx @@ -109,6 +109,10 @@ test('case B', () => { }); ``` +:::note +需要注意的是,`.only` 标记仅对当前测试文件生效。如果你希望仅执行某个特定文件内的特定用例,可使用 `根据文件名过滤` + `通过测试 API 过滤` 的组合方式。 +::: + 使用 `.skip` 或 `.todo` 标记将跳过某些测试套件或用例。 ```ts From 8fc95a28404f073e74446aa3977e421d6a7b3d6b Mon Sep 17 00:00:00 2001 From: 9aoy Date: Tue, 22 Jul 2025 14:03:43 +0800 Subject: [PATCH 05/16] feat: add `RSTEST` flag (#405) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/core/src/cli/prepare.ts | 1 + tests/basic/test/index.test.ts | 4 ++++ tests/cli/fixtures/flag.config.ts | 9 ++++++++ tests/cli/index.test.ts | 20 ++++++++++++++++ website/docs/en/config/test/includeSource.mdx | 2 +- .../docs/en/guide/basic/configure-rstest.mdx | 23 +++++++++++++++++++ website/docs/zh/config/test/includeSource.mdx | 2 +- .../docs/zh/guide/basic/configure-rstest.mdx | 23 +++++++++++++++++++ 8 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 tests/cli/fixtures/flag.config.ts diff --git a/packages/core/src/cli/prepare.ts b/packages/core/src/cli/prepare.ts index afb3a58c..59c0b469 100644 --- a/packages/core/src/cli/prepare.ts +++ b/packages/core/src/cli/prepare.ts @@ -8,6 +8,7 @@ function initNodeEnv() { export function prepareCli(): void { initNodeEnv(); + process.env.RSTEST = 'true'; // Print a blank line to keep the greet log nice. // Some package managers automatically output a blank line, some do not. diff --git a/tests/basic/test/index.test.ts b/tests/basic/test/index.test.ts index 42a1acf6..acc0c215 100644 --- a/tests/basic/test/index.test.ts +++ b/tests/basic/test/index.test.ts @@ -11,6 +11,10 @@ describe('Index', () => { expect(sayHi()).toBe('hi'); }); + it('should get RSTEST flag correctly', () => { + expect(process.env.RSTEST).toBe('true'); + }); + it('should use node API correctly', async () => { expect( pathe diff --git a/tests/cli/fixtures/flag.config.ts b/tests/cli/fixtures/flag.config.ts new file mode 100644 index 00000000..ac2ce2bf --- /dev/null +++ b/tests/cli/fixtures/flag.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from '@rstest/core'; + +if (!process.env.RSTEST) { + throw new Error('load config failed'); +} + +console.log('load config success'); + +export default defineConfig({}); diff --git a/tests/cli/index.test.ts b/tests/cli/index.test.ts index c8ccbecc..48dc648a 100644 --- a/tests/cli/index.test.ts +++ b/tests/cli/index.test.ts @@ -55,4 +55,24 @@ describe.concurrent('test exit code', () => { logs.find((log) => log.includes('Invalid pool configuration')), ).toBeDefined(); }); + + it('should get RSTEST flag correctly in config', async () => { + const { expectExecSuccess, cli } = await runRstestCli({ + command: 'rstest', + args: ['run', 'success.test.ts', '-c', 'fixtures/flag.config.ts'], + options: { + nodeOptions: { + cwd: __dirname, + }, + }, + }); + + await expectExecSuccess(); + + const logs = cli.stdout.split('\n').filter(Boolean); + + expect( + logs.find((log) => log.includes('load config success')), + ).toBeDefined(); + }); }); diff --git a/website/docs/en/config/test/includeSource.mdx b/website/docs/en/config/test/includeSource.mdx index 6d1d05b3..96c48a27 100644 --- a/website/docs/en/config/test/includeSource.mdx +++ b/website/docs/en/config/test/includeSource.mdx @@ -38,7 +38,7 @@ if (import.meta.rstest) { ### For production -Put the test code inside the `if (import.meta.rstest)` block, and define `import.meta.rstest` as `undefined` in your build configuration (e.g., `rsbuild.config.ts`), which will help the bundler eliminate dead code. +Put the test code inside the `if (import.meta.rstest)` block, and define `import.meta.rstest` as `false` in your build configuration (e.g., `rsbuild.config.ts`), which will help the bundler eliminate dead code. ```diff title=rsbuild.config.ts import { defineConfig } from '@rsbuild/core'; diff --git a/website/docs/en/guide/basic/configure-rstest.mdx b/website/docs/en/guide/basic/configure-rstest.mdx index 7cdea4cc..2a1e2cf1 100644 --- a/website/docs/en/guide/basic/configure-rstest.mdx +++ b/website/docs/en/guide/basic/configure-rstest.mdx @@ -43,6 +43,29 @@ rstest -c scripts/rstest.config.mjs ## Detect Rstest environment +You can use `process.env.RSTEST` to detect whether it is an Rstest test environment to apply different configurations/codes in your tests. + +```ts +if (process.env.RSTEST) { + // 'true' will be returned in the rstest environment + // do something... +} +``` + +It should be noted that if you use `process.env.RSTEST` in your source code, define `process.env.RSTEST` as `false` in your build configuration (such as `rsbuild.config.ts`) during production builds, this will help the bundler eliminate dead code. + +```diff title=rsbuild.config.ts +import { defineConfig } from '@rsbuild/core'; + +export default defineConfig({ + source: { + define: { ++ 'process.env.RSTEST': false, + }, + }, +}); +``` + If you are developing the Rsbuild plugin, you can use [api.context.callerName](https://rsbuild.rs/api/javascript-api/instance#contextcallername) to determine the current plugin is being called. ```ts diff --git a/website/docs/zh/config/test/includeSource.mdx b/website/docs/zh/config/test/includeSource.mdx index ea2c31bd..cfc1a0b3 100644 --- a/website/docs/zh/config/test/includeSource.mdx +++ b/website/docs/zh/config/test/includeSource.mdx @@ -38,7 +38,7 @@ if (import.meta.rstest) { ### 生产环境构建 -将测试代码写在 `if (import.meta.rstest)` 代码块内,并在你的构建配置(如 `rsbuild.config.ts`)中将 `import.meta.rstest` 定义为 `undefined`,这样将有助于打包工具消除无用代码。 +将测试代码写在 `if (import.meta.rstest)` 代码块内,并在你的构建配置(如 `rsbuild.config.ts`)中将 `import.meta.rstest` 定义为 `false`,这样将有助于打包工具消除无用代码。 ```diff title=rsbuild.config.ts import { defineConfig } from '@rsbuild/core'; diff --git a/website/docs/zh/guide/basic/configure-rstest.mdx b/website/docs/zh/guide/basic/configure-rstest.mdx index aaedf93a..9e11c036 100644 --- a/website/docs/zh/guide/basic/configure-rstest.mdx +++ b/website/docs/zh/guide/basic/configure-rstest.mdx @@ -43,6 +43,29 @@ rstest -c scripts/rstest.config.mjs ## 检测 Rstest 环境 +你可以使用 `process.env.RSTEST` 来检测是否是 Rstest 测试环境以应用不同的配置 / 代码在你的测试中。 + +```ts +if (process.env.RSTEST) { + // 在 rstest 环境下将会返回 'true' + // do something... +} +``` + +需要注意的是,如果你使用 `process.env.RSTEST` 在你的源码中,在生产环境构建时,在你的构建配置(如 `rsbuild.config.ts`)中将 `process.env.RSTEST` 定义为 `false`,这样将有助于打包工具消除无用代码。 + +```diff title=rsbuild.config.ts +import { defineConfig } from '@rsbuild/core'; + +export default defineConfig({ + source: { + define: { ++ 'process.env.RSTEST': false, + }, + }, +}); +``` + 如果你正在开发 Rsbuild 插件,你可以使用 [api.context.callerName](https://rsbuild.rs/zh/api/javascript-api/instance#contextcallername) 来判断当前插件被调用的环境。 ```ts From 8ff2bc3d17179e552597f5d386b3f738cd14d96e Mon Sep 17 00:00:00 2001 From: neverland Date: Tue, 22 Jul 2025 22:22:34 +0800 Subject: [PATCH 06/16] chore(deps): update Rspress to 2.0.0-beta.22 (#411) --- pnpm-lock.yaml | 161 +++++++++---------- website/package.json | 4 +- website/rspress.config.ts | 2 +- website/theme/components/Hero.tsx | 2 +- website/theme/components/Overview.tsx | 2 +- website/theme/components/RsbuildDocBadge.tsx | 2 +- website/theme/components/Step.tsx | 2 +- website/theme/components/ToolStack.tsx | 2 +- website/theme/components/utils.ts | 2 +- website/theme/index.tsx | 4 +- 10 files changed, 84 insertions(+), 99 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 94c9450f..ccfce1d4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -427,9 +427,12 @@ importers: '@rsbuild/plugin-sass': specifier: ^1.3.3 version: 1.3.3(@rsbuild/core@1.4.8) + '@rspress/core': + specifier: ^2.0.0-beta.22 + version: 2.0.0-beta.22(@types/react@19.1.8)(acorn@8.14.1)(webpack@5.99.9) '@rspress/plugin-llms': - specifier: 2.0.0-beta.21 - version: 2.0.0-beta.21(rspress@2.0.0-beta.21(@types/react@19.1.8)(acorn@8.14.1)(webpack@5.99.9)) + specifier: 2.0.0-beta.22 + version: 2.0.0-beta.22(@rspress/core@2.0.0-beta.22(@types/react@19.1.8)(acorn@8.14.1)(webpack@5.99.9)) '@rstack-dev/doc-ui': specifier: 1.10.8 version: 1.10.8(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -457,9 +460,6 @@ importers: rsbuild-plugin-open-graph: specifier: ^1.0.2 version: 1.0.2(@rsbuild/core@1.4.8) - rspress: - specifier: ^2.0.0-beta.21 - version: 2.0.0-beta.21(@types/react@19.1.8)(acorn@8.14.1)(webpack@5.99.9) rspress-plugin-font-open-sans: specifier: ^1.0.0 version: 1.0.0 @@ -1216,9 +1216,10 @@ packages: webpack-hot-middleware: optional: true - '@rspress/core@2.0.0-beta.21': - resolution: {integrity: sha512-dBAvUi2CWw0cyEKE2vafHylzEuZxKcQ+nysLr/cIjrau6s7p3ghajEXYT+nLrpzv2bBeUDURmRYKSuPch+bWzA==} + '@rspress/core@2.0.0-beta.22': + resolution: {integrity: sha512-rzFNwUuctoS0yvdo/5yJV7QfrFhTTB0o7QkJYkrsNG5L50fvPxOYkxPxn52L83q76anoEdNlVrQGxKOX5f32Bg==} engines: {node: '>=18.0.0'} + hasBin: true '@rspress/mdx-rs-darwin-arm64@0.6.6': resolution: {integrity: sha512-fsuhUko2VJin9oZvGDEM8FWIisbhTe+ki8SiiVMqtl6OUtga9wB8F3JmsjVNg615lHp7FiT66Mvfbxweo+jjTQ==} @@ -1272,21 +1273,21 @@ packages: resolution: {integrity: sha512-NpNhTKBIlV3O6ADhoZkgHvBFvXMW2TYlIWmIT1ysJESUBqDpaN9H3Teve5fugjU2pQ2ORBZO6SQGKliMw/8m/Q==} engines: {node: '>= 10'} - '@rspress/plugin-llms@2.0.0-beta.21': - resolution: {integrity: sha512-Uv8jF7qrV4UIJA4tE1ZN9gEOdE9LUfScC9sUXQHK882++qC12ETYz5/tBM2Jt5klEjlOSR2Bhy9Qq4igs4GsWQ==} + '@rspress/plugin-llms@2.0.0-beta.22': + resolution: {integrity: sha512-eEMb60CuA1mbu3qUKl+np/Ic8nHFFAchLEfhqOYbeq/8e3GSb2gYBxRNEJ+x4TINI6wgpqP36klf59a+2pxlTw==} engines: {node: '>=18.0.0'} peerDependencies: - rspress: ^2.0.0-beta.21 + '@rspress/core': ^2.0.0-beta.22 - '@rspress/runtime@2.0.0-beta.21': - resolution: {integrity: sha512-uYCqzaHTwglSdgoKh1jDAjj73bIup7END/pVDTh+ILrhwkHyEbTXpuRn4km3QwqnPjEN80hVjpuzSzbWx80DjA==} + '@rspress/runtime@2.0.0-beta.22': + resolution: {integrity: sha512-Z/lharbTJ6vP+ITw1mhuJHk9MMNBU7He3c2C+qe8HcaSIuN0iVUiZJSM9tatSJhCkylyEvY2B6smc1e3I43RBg==} engines: {node: '>=18.0.0'} - '@rspress/shared@2.0.0-beta.21': - resolution: {integrity: sha512-Q/yjGH/afdkJY0AJ7FwxnvilD21kFmLhcCsMDzMEnW0U9LGnD+T+J3JoBhHvetTSHfrqg9rKl9YnJ5oreq89vQ==} + '@rspress/shared@2.0.0-beta.22': + resolution: {integrity: sha512-JLVda5YBoeABoeJukUp3AX6+qNY52sv8HPKZHNytLnmpr/kTpSS1dANp1UODMVK0aluVu3t6VnrcoICSIyOC3g==} - '@rspress/theme-default@2.0.0-beta.21': - resolution: {integrity: sha512-G+yJiAZW0oiAB7FyMFWrEI5B/Lg3z2IdxegbGo3a9q2tYo24bd35YuuXOQOIPuE/0+hWxCtB1vxDYH6WyZwMIQ==} + '@rspress/theme-default@2.0.0-beta.22': + resolution: {integrity: sha512-hRPITak6Ncoxg3BB/dpSJfKADVgW4E5P00eaZbor30/Qky9E9utekJiv3m+7OEunlGFoz9mfpTCHV8L0/aDBBw==} engines: {node: '>=18.0.0'} '@rstack-dev/doc-ui@1.10.8': @@ -1317,26 +1318,26 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} - '@shikijs/core@3.4.2': - resolution: {integrity: sha512-AG8vnSi1W2pbgR2B911EfGqtLE9c4hQBYkv/x7Z+Kt0VxhgQKcW7UNDVYsu9YxwV6u+OJrvdJrMq6DNWoBjihQ==} + '@shikijs/core@3.8.1': + resolution: {integrity: sha512-uTSXzUBQ/IgFcUa6gmGShCHr4tMdR3pxUiiWKDm8pd42UKJdYhkAYsAmHX5mTwybQ5VyGDgTjW4qKSsRvGSang==} - '@shikijs/engine-javascript@3.4.2': - resolution: {integrity: sha512-1/adJbSMBOkpScCE/SB6XkjJU17ANln3Wky7lOmrnpl+zBdQ1qXUJg2GXTYVHRq+2j3hd1DesmElTXYDgtfSOQ==} + '@shikijs/engine-javascript@3.8.1': + resolution: {integrity: sha512-rZRp3BM1llrHkuBPAdYAzjlF7OqlM0rm/7EWASeCcY7cRYZIrOnGIHE9qsLz5TCjGefxBFnwgIECzBs2vmOyKA==} - '@shikijs/engine-oniguruma@3.4.2': - resolution: {integrity: sha512-zcZKMnNndgRa3ORja6Iemsr3DrLtkX3cAF7lTJkdMB6v9alhlBsX9uNiCpqofNrXOvpA3h6lHcLJxgCIhVOU5Q==} + '@shikijs/engine-oniguruma@3.8.1': + resolution: {integrity: sha512-KGQJZHlNY7c656qPFEQpIoqOuC4LrxjyNndRdzk5WKB/Ie87+NJCF1xo9KkOUxwxylk7rT6nhlZyTGTC4fCe1g==} - '@shikijs/langs@3.4.2': - resolution: {integrity: sha512-H6azIAM+OXD98yztIfs/KH5H4PU39t+SREhmM8LaNXyUrqj2mx+zVkr8MWYqjceSjDw9I1jawm1WdFqU806rMA==} + '@shikijs/langs@3.8.1': + resolution: {integrity: sha512-TjOFg2Wp1w07oKnXjs0AUMb4kJvujML+fJ1C5cmEj45lhjbUXtziT1x2bPQb9Db6kmPhkG5NI2tgYW1/DzhUuQ==} - '@shikijs/rehype@3.4.2': - resolution: {integrity: sha512-atbsrT3UKs25OdKVbNoHyKO9ZP7KEBPlo1oanPGMkvUL0fLictpxMPz6vPE2YTeHhpwz7EMrA4K4FHRY8XAReg==} + '@shikijs/rehype@3.8.1': + resolution: {integrity: sha512-ERs9IUaORBY8vu3OQfmB1L0nwGey0qhJi3NVSLwl22H+FPIg3dDyi2bHULY7pcyKC2qo5b1yiu5Vf3jp3ZkPvA==} - '@shikijs/themes@3.4.2': - resolution: {integrity: sha512-qAEuAQh+brd8Jyej2UDDf+b4V2g1Rm8aBIdvt32XhDPrHvDkEnpb7Kzc9hSuHUxz0Iuflmq7elaDuQAP9bHIhg==} + '@shikijs/themes@3.8.1': + resolution: {integrity: sha512-Vu3t3BBLifc0GB0UPg2Pox1naTemrrvyZv2lkiSw3QayVV60me1ujFQwPZGgUTmwXl1yhCPW8Lieesm0CYruLQ==} - '@shikijs/types@3.4.2': - resolution: {integrity: sha512-zHC1l7L+eQlDXLnxvM9R91Efh2V4+rN3oMVS2swCBssbj2U/FBwybD1eeLaq8yl/iwT+zih8iUbTBCgGZOYlVg==} + '@shikijs/types@3.8.1': + resolution: {integrity: sha512-5C39Q8/8r1I26suLh+5TPk1DTrbY/kn3IdWA5HdizR0FhlhD05zx5nKCqhzSfDHH3p4S0ZefxWd77DLV+8FhGg==} '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} @@ -3656,10 +3657,6 @@ packages: rspress-plugin-sitemap@1.2.0: resolution: {integrity: sha512-fX5i0GLvrxRibKbL9rcBXA8PFDkhoB51bNrFpAuW0mkHg39Ji92SFzzURKvROpuwaGLZ+EP039zJNhx3kYYezA==} - rspress@2.0.0-beta.21: - resolution: {integrity: sha512-dgporOEoGogsxI4y/xAgnmENL8S/YIUi8c8JkJqmyNQET+eyZ9jF83WopP7YaxyDGY1j43cXiFf0bhUMVB8i8w==} - hasBin: true - run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3823,8 +3820,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki@3.4.2: - resolution: {integrity: sha512-wuxzZzQG8kvZndD7nustrNFIKYJ1jJoWIPaBpVe2+KHSvtzMi4SBjOxrigs8qeqce/l3U0cwiC+VAkLKSunHQQ==} + shiki@3.8.1: + resolution: {integrity: sha512-+MYIyjwGPCaegbpBeFN9+oOifI8CKiKG3awI/6h3JeT85c//H2wDW/xCJEGuQ5jPqtbboKNqNy+JyX9PYpGwNg==} side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} @@ -5432,7 +5429,7 @@ snapshots: html-entities: 2.6.0 react-refresh: 0.17.0 - '@rspress/core@2.0.0-beta.21(@types/react@19.1.8)(acorn@8.14.1)(webpack@5.99.9)': + '@rspress/core@2.0.0-beta.22(@types/react@19.1.8)(acorn@8.14.1)(webpack@5.99.9)': dependencies: '@mdx-js/loader': 3.1.0(acorn@8.14.1)(webpack@5.99.9) '@mdx-js/mdx': 3.1.0(acorn@8.14.1) @@ -5440,12 +5437,14 @@ snapshots: '@rsbuild/core': 1.4.8 '@rsbuild/plugin-react': 1.3.4(@rsbuild/core@1.4.8) '@rspress/mdx-rs': 0.6.6 - '@rspress/runtime': 2.0.0-beta.21 - '@rspress/shared': 2.0.0-beta.21 - '@rspress/theme-default': 2.0.0-beta.21 - '@shikijs/rehype': 3.4.2 + '@rspress/runtime': 2.0.0-beta.22 + '@rspress/shared': 2.0.0-beta.22 + '@rspress/theme-default': 2.0.0-beta.22 + '@shikijs/rehype': 3.8.1 '@types/unist': 3.0.3 '@unhead/react': 2.0.12(react@19.1.0) + cac: 6.7.14 + chokidar: 3.6.0 enhanced-resolve: 5.18.2 github-slugger: 2.0.0 hast-util-from-html: 2.0.3 @@ -5464,8 +5463,9 @@ snapshots: remark: 15.0.1 remark-gfm: 4.0.1 rspack-plugin-virtual-module: 1.0.1 - shiki: 3.4.2 + shiki: 3.8.1 tinyglobby: 0.2.14 + tinypool: 1.1.1 unified: 11.0.5 unist-util-visit: 5.0.0 unist-util-visit-children: 3.0.0 @@ -5511,39 +5511,39 @@ snapshots: '@rspress/mdx-rs-win32-arm64-msvc': 0.6.6 '@rspress/mdx-rs-win32-x64-msvc': 0.6.6 - '@rspress/plugin-llms@2.0.0-beta.21(rspress@2.0.0-beta.21(@types/react@19.1.8)(acorn@8.14.1)(webpack@5.99.9))': + '@rspress/plugin-llms@2.0.0-beta.22(@rspress/core@2.0.0-beta.22(@types/react@19.1.8)(acorn@8.14.1)(webpack@5.99.9))': dependencies: + '@rspress/core': 2.0.0-beta.22(@types/react@19.1.8)(acorn@8.14.1)(webpack@5.99.9) remark-mdx: 3.1.0 remark-parse: 11.0.0 remark-stringify: 11.0.0 - rspress: 2.0.0-beta.21(@types/react@19.1.8)(acorn@8.14.1)(webpack@5.99.9) unified: 11.0.5 unist-util-visit: 5.0.0 unist-util-visit-children: 3.0.0 transitivePeerDependencies: - supports-color - '@rspress/runtime@2.0.0-beta.21': + '@rspress/runtime@2.0.0-beta.22': dependencies: - '@rspress/shared': 2.0.0-beta.21 + '@rspress/shared': 2.0.0-beta.22 '@unhead/react': 2.0.12(react@19.1.0) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) react-router-dom: 6.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@rspress/shared@2.0.0-beta.21': + '@rspress/shared@2.0.0-beta.22': dependencies: '@rsbuild/core': 1.4.8 - '@shikijs/rehype': 3.4.2 + '@shikijs/rehype': 3.8.1 gray-matter: 4.0.3 lodash-es: 4.17.21 unified: 11.0.5 - '@rspress/theme-default@2.0.0-beta.21': + '@rspress/theme-default@2.0.0-beta.22': dependencies: '@mdx-js/react': 2.3.0(react@19.1.0) - '@rspress/runtime': 2.0.0-beta.21 - '@rspress/shared': 2.0.0-beta.21 + '@rspress/runtime': 2.0.0-beta.22 + '@rspress/shared': 2.0.0-beta.22 '@unhead/react': 2.0.12(react@19.1.0) body-scroll-lock: 4.0.0-beta.0 copy-to-clipboard: 3.3.3 @@ -5554,7 +5554,7 @@ snapshots: nprogress: 0.2.0 react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - shiki: 3.4.2 + shiki: 3.8.1 transitivePeerDependencies: - supports-color @@ -5605,42 +5605,42 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 - '@shikijs/core@3.4.2': + '@shikijs/core@3.8.1': dependencies: - '@shikijs/types': 3.4.2 + '@shikijs/types': 3.8.1 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 hast-util-to-html: 9.0.5 - '@shikijs/engine-javascript@3.4.2': + '@shikijs/engine-javascript@3.8.1': dependencies: - '@shikijs/types': 3.4.2 + '@shikijs/types': 3.8.1 '@shikijs/vscode-textmate': 10.0.2 oniguruma-to-es: 4.3.3 - '@shikijs/engine-oniguruma@3.4.2': + '@shikijs/engine-oniguruma@3.8.1': dependencies: - '@shikijs/types': 3.4.2 + '@shikijs/types': 3.8.1 '@shikijs/vscode-textmate': 10.0.2 - '@shikijs/langs@3.4.2': + '@shikijs/langs@3.8.1': dependencies: - '@shikijs/types': 3.4.2 + '@shikijs/types': 3.8.1 - '@shikijs/rehype@3.4.2': + '@shikijs/rehype@3.8.1': dependencies: - '@shikijs/types': 3.4.2 + '@shikijs/types': 3.8.1 '@types/hast': 3.0.4 hast-util-to-string: 3.0.1 - shiki: 3.4.2 + shiki: 3.8.1 unified: 11.0.5 unist-util-visit: 5.0.0 - '@shikijs/themes@3.4.2': + '@shikijs/themes@3.8.1': dependencies: - '@shikijs/types': 3.4.2 + '@shikijs/types': 3.8.1 - '@shikijs/types@3.4.2': + '@shikijs/types@3.8.1': dependencies: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 @@ -8433,21 +8433,6 @@ snapshots: rspress-plugin-sitemap@1.2.0: {} - rspress@2.0.0-beta.21(@types/react@19.1.8)(acorn@8.14.1)(webpack@5.99.9): - dependencies: - '@rsbuild/core': 1.4.8 - '@rspress/core': 2.0.0-beta.21(@types/react@19.1.8)(acorn@8.14.1)(webpack@5.99.9) - '@rspress/shared': 2.0.0-beta.21 - cac: 6.7.14 - chokidar: 3.6.0 - picocolors: 1.1.1 - transitivePeerDependencies: - - '@types/react' - - acorn - - supports-color - - webpack - - webpack-hot-middleware - run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -8583,14 +8568,14 @@ snapshots: shebang-regex@3.0.0: {} - shiki@3.4.2: + shiki@3.8.1: dependencies: - '@shikijs/core': 3.4.2 - '@shikijs/engine-javascript': 3.4.2 - '@shikijs/engine-oniguruma': 3.4.2 - '@shikijs/langs': 3.4.2 - '@shikijs/themes': 3.4.2 - '@shikijs/types': 3.4.2 + '@shikijs/core': 3.8.1 + '@shikijs/engine-javascript': 3.8.1 + '@shikijs/engine-oniguruma': 3.8.1 + '@shikijs/langs': 3.8.1 + '@shikijs/themes': 3.8.1 + '@shikijs/types': 3.8.1 '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 diff --git a/website/package.json b/website/package.json index 8366ce89..877f1831 100644 --- a/website/package.json +++ b/website/package.json @@ -10,7 +10,8 @@ }, "devDependencies": { "@rsbuild/plugin-sass": "^1.3.3", - "@rspress/plugin-llms": "2.0.0-beta.21", + "@rspress/core": "^2.0.0-beta.22", + "@rspress/plugin-llms": "2.0.0-beta.22", "@rstack-dev/doc-ui": "1.10.8", "@rstest/tsconfig": "workspace:*", "@types/node": "^22.13.8", @@ -20,7 +21,6 @@ "react-dom": "^19.1.0", "rsbuild-plugin-google-analytics": "^1.0.3", "rsbuild-plugin-open-graph": "^1.0.2", - "rspress": "^2.0.0-beta.21", "rspress-plugin-font-open-sans": "^1.0.0", "rspress-plugin-sitemap": "^1.2.0", "typescript": "^5.8.3" diff --git a/website/rspress.config.ts b/website/rspress.config.ts index dcd61bbe..3e763ca4 100644 --- a/website/rspress.config.ts +++ b/website/rspress.config.ts @@ -1,9 +1,9 @@ import * as path from 'node:path'; import { pluginSass } from '@rsbuild/plugin-sass'; +import { defineConfig } from '@rspress/core'; import { pluginLlms } from '@rspress/plugin-llms'; import { pluginGoogleAnalytics } from 'rsbuild-plugin-google-analytics'; import { pluginOpenGraph } from 'rsbuild-plugin-open-graph'; -import { defineConfig } from 'rspress/config'; import { pluginFontOpenSans } from 'rspress-plugin-font-open-sans'; import pluginSitemap from 'rspress-plugin-sitemap'; diff --git a/website/theme/components/Hero.tsx b/website/theme/components/Hero.tsx index 88e273a4..f4988576 100644 --- a/website/theme/components/Hero.tsx +++ b/website/theme/components/Hero.tsx @@ -1,5 +1,5 @@ +import { useI18n, useNavigate } from '@rspress/core/runtime'; import { Hero as BaseHero } from '@rstack-dev/doc-ui/hero'; -import { useI18n, useNavigate } from 'rspress/runtime'; import { useI18nUrl } from './utils'; import './Hero.module.scss'; diff --git a/website/theme/components/Overview.tsx b/website/theme/components/Overview.tsx index 313e535a..a200f3ee 100644 --- a/website/theme/components/Overview.tsx +++ b/website/theme/components/Overview.tsx @@ -1,4 +1,4 @@ -import { Link } from 'rspress/theme'; +import { Link } from '@rspress/core/theme'; import styles from './Overview.module.scss'; import { useUrl } from './utils'; diff --git a/website/theme/components/RsbuildDocBadge.tsx b/website/theme/components/RsbuildDocBadge.tsx index 590afa72..6ce243f9 100644 --- a/website/theme/components/RsbuildDocBadge.tsx +++ b/website/theme/components/RsbuildDocBadge.tsx @@ -1,5 +1,5 @@ +import { useLang } from '@rspress/core/runtime'; import { Badge, Link } from '@theme'; -import { useLang } from 'rspress/runtime'; type Props = { /** Rsbuild doc URL pathname, i18n prefix stripped. */ diff --git a/website/theme/components/Step.tsx b/website/theme/components/Step.tsx index 799f4924..90d2983b 100644 --- a/website/theme/components/Step.tsx +++ b/website/theme/components/Step.tsx @@ -1,4 +1,4 @@ -import { Link } from 'rspress/theme'; +import { Link } from '@rspress/core/theme'; import styles from './Step.module.scss'; import { useUrl } from './utils'; diff --git a/website/theme/components/ToolStack.tsx b/website/theme/components/ToolStack.tsx index 1edc6de2..990a2969 100644 --- a/website/theme/components/ToolStack.tsx +++ b/website/theme/components/ToolStack.tsx @@ -1,6 +1,6 @@ +import { useLang } from '@rspress/core/runtime'; import { containerStyle } from '@rstack-dev/doc-ui/section-style'; import { ToolStack as BaseToolStack } from '@rstack-dev/doc-ui/tool-stack'; -import { useLang } from 'rspress/runtime'; export function ToolStack() { const lang = useLang(); diff --git a/website/theme/components/utils.ts b/website/theme/components/utils.ts index 41a0d71e..68152884 100644 --- a/website/theme/components/utils.ts +++ b/website/theme/components/utils.ts @@ -1,5 +1,5 @@ +import { useLang, usePageData, withBase } from '@rspress/core/runtime'; import { useCallback } from 'react'; -import { useLang, usePageData, withBase } from 'rspress/runtime'; export function useUrl(url: string) { const lang = useLang(); diff --git a/website/theme/index.tsx b/website/theme/index.tsx index fa058b13..6066a6d3 100644 --- a/website/theme/index.tsx +++ b/website/theme/index.tsx @@ -1,5 +1,5 @@ +import { Layout as BaseLayout } from '@rspress/core/theme'; import { NavIcon } from '@rstack-dev/doc-ui/nav-icon'; -import { Layout as BaseLayout } from 'rspress/theme'; import { HomeLayout } from './pages'; import './index.scss'; @@ -9,4 +9,4 @@ const Layout = () => { export { Layout, HomeLayout }; -export * from 'rspress/theme'; +export * from '@rspress/core/theme'; From 2de2d45afdfb38139bc9ba02c57d32e9c0fcbeaf Mon Sep 17 00:00:00 2001 From: 9aoy Date: Wed, 23 Jul 2025 11:04:40 +0800 Subject: [PATCH 07/16] perf: avoid creating unused workers (#410) --- packages/core/src/pool/index.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/core/src/pool/index.ts b/packages/core/src/pool/index.ts index 09ff33bf..abddbcfe 100644 --- a/packages/core/src/pool/index.ts +++ b/packages/core/src/pool/index.ts @@ -81,15 +81,21 @@ export const createPool = async ({ ? Math.max(Math.floor(numCpus / 2), 1) : Math.max(numCpus - 1, 1); + // Avoid creating unused workers when the number of tests is less than the default thread count. + const recommendCount = + context.command === 'watch' + ? threadsCount + : Math.min(Object.keys(entries).length, threadsCount); + const maxWorkers = poolOptions.maxWorkers ? parseWorkers(poolOptions.maxWorkers) - : threadsCount; + : recommendCount; const minWorkers = poolOptions.minWorkers ? parseWorkers(poolOptions.minWorkers) - : maxWorkers < threadsCount + : maxWorkers < recommendCount ? maxWorkers - : threadsCount; + : recommendCount; if (maxWorkers < minWorkers) { throw `Invalid pool configuration: maxWorkers(${maxWorkers}) cannot be less than minWorkers(${minWorkers}).`; From 1334857530f30f35b747c9be821dacaad72abcaf Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 23 Jul 2025 11:27:40 +0800 Subject: [PATCH 08/16] chore(deps): update dependency @rslib/core to v0.11.0 (#413) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/core/package.json | 2 +- pnpm-lock.yaml | 22 +++++++++++----------- tests/package.json | 2 +- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/core/package.json b/packages/core/package.json index a27c4369..7e3d3dea 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -68,7 +68,7 @@ "@babel/code-frame": "^7.27.1", "@jridgewell/trace-mapping": "0.3.29", "@microsoft/api-extractor": "^7.52.8", - "@rslib/core": "0.10.6", + "@rslib/core": "0.11.0", "@rstest/tsconfig": "workspace:*", "@sinonjs/fake-timers": "^14.0.0", "@types/babel__code-frame": "^7.0.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ccfce1d4..4e7ebeac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -151,8 +151,8 @@ importers: specifier: ^7.52.8 version: 7.52.8(@types/node@22.13.8) '@rslib/core': - specifier: 0.10.6 - version: 0.10.6(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(typescript@5.8.3) + specifier: 0.11.0 + version: 0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(typescript@5.8.3) '@rstest/tsconfig': specifier: workspace:* version: link:../../scripts/tsconfig @@ -213,8 +213,8 @@ importers: specifier: 1.4.8 version: 1.4.8 '@rslib/core': - specifier: 0.10.6 - version: 0.10.6(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(typescript@5.8.3) + specifier: 0.11.0 + version: 0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(typescript@5.8.3) '@rstest/core': specifier: workspace:* version: link:../packages/core @@ -1129,8 +1129,8 @@ packages: '@rsdoctor/utils@1.1.8': resolution: {integrity: sha512-t8OWc9cDJHaiHDWunWBYjAJnBBZ+q0XgQfWkHJHRtF+MPf4RpZCQtNiu7WwZOXquKNu+3fY+otOJtnHnlRtvww==} - '@rslib/core@0.10.6': - resolution: {integrity: sha512-7OLdmmQbY116gNAAsY9baCid9REr+z11qfAzwVVFw+Q8avCE6YqpcBLfrBXlfmpBikfshDmHH8EpRrQwz8gZJQ==} + '@rslib/core@0.11.0': + resolution: {integrity: sha512-ku5Qs3sSBZSmUVRQHM0JG2ZHXmw7aGvxmf0fseUjYWCAWzuBvTeXcthO2eCYKlYvYOIZBQH4QO1eVgz6fWfPkw==} engines: {node: '>=16.7.0'} hasBin: true peerDependencies: @@ -3616,8 +3616,8 @@ packages: rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} - rsbuild-plugin-dts@0.10.6: - resolution: {integrity: sha512-rVP82fFMDHW0GirhYx+w2bER1HhkOKJ8e/bAAF2OkMUP2k2fviMpl/gsnbO8KI9vcSqsQE2QXHkj781m6W84Ow==} + rsbuild-plugin-dts@0.11.0: + resolution: {integrity: sha512-z2ltq3wgHL622Q0b2r/6QKRY6sAzkgP5xnyOtOuYfVyKyrlw/R/ES7x4/3dsYWPVt1rTuIebxX6zMfBwKQRIzw==} engines: {node: '>=16.7.0'} peerDependencies: '@microsoft/api-extractor': ^7 @@ -5359,10 +5359,10 @@ snapshots: - supports-color - webpack - '@rslib/core@0.10.6(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(typescript@5.8.3)': + '@rslib/core@0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(typescript@5.8.3)': dependencies: '@rsbuild/core': 1.4.8 - rsbuild-plugin-dts: 0.10.6(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(@rsbuild/core@1.4.8)(typescript@5.8.3) + rsbuild-plugin-dts: 0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(@rsbuild/core@1.4.8)(typescript@5.8.3) tinyglobby: 0.2.14 optionalDependencies: '@microsoft/api-extractor': 7.52.8(@types/node@22.13.8) @@ -8403,7 +8403,7 @@ snapshots: rrweb-cssom@0.8.0: {} - rsbuild-plugin-dts@0.10.6(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(@rsbuild/core@1.4.8)(typescript@5.8.3): + rsbuild-plugin-dts@0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(@rsbuild/core@1.4.8)(typescript@5.8.3): dependencies: '@ast-grep/napi': 0.37.0 '@rsbuild/core': 1.4.8 diff --git a/tests/package.json b/tests/package.json index 5090f7bc..8389b826 100644 --- a/tests/package.json +++ b/tests/package.json @@ -8,7 +8,7 @@ }, "devDependencies": { "@rsbuild/core": "1.4.8", - "@rslib/core": "0.10.6", + "@rslib/core": "0.11.0", "@rstest/core": "workspace:*", "@rstest/tsconfig": "workspace:*", "@types/jest-image-snapshot": "^6.4.0", From 092465c7cd5a5f37de31a25e8d92a5854311f704 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 11:03:40 +0800 Subject: [PATCH 09/16] chore(deps): update dependency axios to v1.11.0 [security] (#415) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e7ebeac..20d7e85a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -226,7 +226,7 @@ importers: version: 6.4.0 axios: specifier: ^1.10.0 - version: 1.10.0 + version: 1.11.0 jest-image-snapshot: specifier: ^6.5.1 version: 6.5.1 @@ -1785,8 +1785,8 @@ packages: asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - axios@1.10.0: - resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} + axios@1.11.0: + resolution: {integrity: sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==} babel-plugin-vue-jsx-hmr@1.0.0: resolution: {integrity: sha512-XRq+XTD4bub6HkavELMhihvLX2++JkSBAxRXlqQK32b+Tb0S9PEqxrDSMpOEZ1iGyOaJZj9Y0uU/FzICdyL9MA==} @@ -2414,8 +2414,8 @@ packages: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - form-data@4.0.2: - resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + form-data@4.0.4: + resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} engines: {node: '>= 6'} framer-motion@12.23.6: @@ -5249,7 +5249,7 @@ snapshots: '@rsdoctor/sdk': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) '@rsdoctor/types': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) '@rsdoctor/utils': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) - axios: 1.10.0 + axios: 1.11.0 browserslist-load-config: 1.0.0 enhanced-resolve: 5.12.0 filesize: 10.1.6 @@ -6185,10 +6185,10 @@ snapshots: asynckit@0.4.0: {} - axios@1.10.0: + axios@1.11.0: dependencies: follow-redirects: 1.15.9 - form-data: 4.0.2 + form-data: 4.0.4 proxy-from-env: 1.1.0 transitivePeerDependencies: - debug @@ -6803,11 +6803,12 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - form-data@4.0.2: + form-data@4.0.4: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 + hasown: 2.0.2 mime-types: 2.1.35 framer-motion@12.23.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): @@ -7970,7 +7971,7 @@ snapshots: '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.2 '@zkochan/js-yaml': 0.0.7 - axios: 1.10.0 + axios: 1.11.0 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 From 104f76505fb6475074bcf65eb4423eaf24948518 Mon Sep 17 00:00:00 2001 From: 9aoy Date: Thu, 24 Jul 2025 11:15:53 +0800 Subject: [PATCH 10/16] chore: extract rsbuild / rspack config modify into rsbuild plugin (#414) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/core/src/core/plugins/basic.ts | 103 ++++++++++ packages/core/src/core/plugins/external.ts | 109 +++++++++++ packages/core/src/core/rsbuild.ts | 218 ++------------------- tests/snapshot/file.test.ts | 4 +- website/docs/en/api/test-api/expect.mdx | 4 + website/docs/zh/api/test-api/expect.mdx | 4 + 6 files changed, 241 insertions(+), 201 deletions(-) create mode 100644 packages/core/src/core/plugins/basic.ts create mode 100644 packages/core/src/core/plugins/external.ts diff --git a/packages/core/src/core/plugins/basic.ts b/packages/core/src/core/plugins/basic.ts new file mode 100644 index 00000000..0fc75299 --- /dev/null +++ b/packages/core/src/core/plugins/basic.ts @@ -0,0 +1,103 @@ +import type { RsbuildPlugin } from '@rsbuild/core'; +import path from 'pathe'; +import type { RstestContext } from '../../types'; +import { TEMP_RSTEST_OUTPUT_DIR } from '../../utils'; + +export const pluginBasic: (context: RstestContext) => RsbuildPlugin = ( + context, +) => ({ + name: 'rstest:basic', + setup: (api) => { + api.modifyRsbuildConfig(async (config) => { + config.environments = { + [context.normalizedConfig.name]: { + output: { + target: 'node', + }, + }, + }; + }); + api.modifyEnvironmentConfig(async (config, { mergeEnvironmentConfig }) => { + return mergeEnvironmentConfig(config, { + source: { + define: { + 'import.meta.rstest': "global['@rstest/core']", + }, + }, + output: { + // Pass resources to the worker on demand according to entry + manifest: true, + sourceMap: { + js: 'source-map', + }, + distPath: { + root: TEMP_RSTEST_OUTPUT_DIR, + }, + }, + tools: { + rspack: (config, { isProd, rspack }) => { + // treat `test` as development mode + config.mode = isProd ? 'production' : 'development'; + config.output ??= {}; + config.output.iife = false; + // polyfill interop + config.output.importFunctionName = '__rstest_dynamic_import__'; + config.output.devtoolModuleFilenameTemplate = + '[absolute-resource-path]'; + config.plugins.push( + new rspack.experiments.RstestPlugin({ + injectModulePathName: true, + importMetaPathName: true, + hoistMockModule: true, + manualMockRoot: path.resolve(context.rootPath, '__mocks__'), + }), + ); + + config.module.parser ??= {}; + config.module.parser.javascript = { + // Keep dynamic import expressions. + // eg. (modulePath) => import(modulePath) + importDynamic: false, + // Keep dynamic require expressions. + // eg. (modulePath) => require(modulePath) + requireDynamic: false, + requireAsExpression: false, + // Keep require.resolve expressions. + requireResolve: false, + ...(config.module.parser.javascript || {}), + }; + + config.resolve ??= {}; + config.resolve.extensions ??= []; + config.resolve.extensions.push('.cjs'); + + if (context.normalizedConfig.testEnvironment === 'node') { + // skip `module` field in Node.js environment. + // ESM module resolved by module field is not always a native ESM module + config.resolve.mainFields = config.resolve.mainFields?.filter( + (filed) => filed !== 'module', + ) || ['main']; + } + + config.resolve.byDependency ??= {}; + config.resolve.byDependency.commonjs ??= {}; + // skip `module` field when commonjs require + // By default, rspack resolves the "module" field for commonjs first, but this is not always returned synchronously in esm + config.resolve.byDependency.commonjs.mainFields = ['main', '...']; + + config.optimization = { + moduleIds: 'named', + chunkIds: 'named', + nodeEnv: false, + ...(config.optimization || {}), + // make sure setup file and test file share the runtime + runtimeChunk: { + name: 'runtime', + }, + }; + }, + }, + }); + }); + }, +}); diff --git a/packages/core/src/core/plugins/external.ts b/packages/core/src/core/plugins/external.ts new file mode 100644 index 00000000..6153a160 --- /dev/null +++ b/packages/core/src/core/plugins/external.ts @@ -0,0 +1,109 @@ +import type { RsbuildPlugin, Rspack } from '@rsbuild/core'; +import type { NormalizedConfig } from '../../types'; +import { castArray, NODE_BUILTINS } from '../../utils'; + +const autoExternalNodeModules: ( + data: Rspack.ExternalItemFunctionData, + callback: ( + err?: Error, + result?: Rspack.ExternalItemValue, + type?: Rspack.ExternalsType, + ) => void, +) => void = ({ context, request, dependencyType, getResolve }, callback) => { + if (!request) { + return callback(); + } + + if (request.startsWith('@swc/helpers/')) { + // @swc/helper is a special case (Load by require but resolve to esm) + return callback(); + } + + const doExternal = (externalPath: string = request) => { + callback( + undefined, + externalPath, + dependencyType === 'commonjs' ? 'commonjs' : 'import', + ); + }; + + const resolver = getResolve?.(); + + if (!resolver) { + return callback(); + } + + resolver(context!, request, (err, resolvePath) => { + if (err) { + // ignore resolve error + return callback(); + } + + if (resolvePath && /node_modules/.test(resolvePath)) { + return doExternal(resolvePath); + } + return callback(); + }); +}; + +function autoExternalNodeBuiltin( + { request, dependencyType }: Rspack.ExternalItemFunctionData, + callback: ( + err?: Error, + result?: Rspack.ExternalItemValue, + type?: Rspack.ExternalsType, + ) => void, +): void { + if (!request) { + callback(); + return; + } + + const isNodeBuiltin = NODE_BUILTINS.some((builtin) => { + if (typeof builtin === 'string') { + return builtin === request; + } + + return builtin.test(request); + }); + + if (isNodeBuiltin) { + callback( + undefined, + request, + dependencyType === 'commonjs' ? 'commonjs' : 'module-import', + ); + } else { + callback(); + } +} + +export const pluginExternal: ( + testEnvironment: NormalizedConfig['testEnvironment'], +) => RsbuildPlugin = (testEnvironment) => ({ + name: 'rstest:external', + setup: (api) => { + api.modifyRsbuildConfig(async (config, { mergeRsbuildConfig }) => { + return mergeRsbuildConfig(config, { + output: { + externals: + testEnvironment === 'node' ? [autoExternalNodeModules] : undefined, + }, + tools: { + rspack: (config) => { + // Make sure that externals configuration is not modified by users + config.externals = castArray(config.externals) || []; + + config.externals.unshift({ + '@rstest/core': 'global @rstest/core', + }); + + config.externalsPresets ??= {}; + config.externalsPresets.node = false; + config.externals.push(autoExternalNodeBuiltin); + }, + }, + }); + }); + }, +}); diff --git a/packages/core/src/core/rsbuild.ts b/packages/core/src/core/rsbuild.ts index 4efa09bf..59bb5898 100644 --- a/packages/core/src/core/rsbuild.ts +++ b/packages/core/src/core/rsbuild.ts @@ -6,18 +6,14 @@ import { logger as RsbuildLogger, type RsbuildPlugin, type Rspack, - rspack, } from '@rsbuild/core'; import path from 'pathe'; import type { EntryInfo, RstestContext, SourceMapInput } from '../types'; -import { - castArray, - isDebug, - NODE_BUILTINS, - TEMP_RSTEST_OUTPUT_DIR, -} from '../utils'; +import { isDebug } from '../utils'; +import { pluginBasic } from './plugins/basic'; import { pluginCSSFilter } from './plugins/css-filter'; import { pluginEntryWatch } from './plugins/entry'; +import { pluginExternal } from './plugins/external'; import { pluginIgnoreResolveError } from './plugins/ignoreResolveError'; import { pluginMockRuntime } from './plugins/mockRuntime'; import { pluginCacheControl } from './plugins/moduleCacheControl'; @@ -31,82 +27,6 @@ const isMultiCompiler = < return 'compilers' in compiler && Array.isArray(compiler.compilers); }; -const autoExternalNodeModules: ( - data: Rspack.ExternalItemFunctionData, - callback: ( - err?: Error, - result?: Rspack.ExternalItemValue, - type?: Rspack.ExternalsType, - ) => void, -) => void = ({ context, request, dependencyType, getResolve }, callback) => { - if (!request) { - return callback(); - } - - if (request.startsWith('@swc/helpers/')) { - // @swc/helper is a special case (Load by require but resolve to esm) - return callback(); - } - - const doExternal = (externalPath: string = request) => { - callback( - undefined, - externalPath, - dependencyType === 'commonjs' ? 'commonjs' : 'import', - ); - }; - - const resolver = getResolve?.(); - - if (!resolver) { - return callback(); - } - - resolver(context!, request, (err, resolvePath) => { - if (err) { - // ignore resolve error - return callback(); - } - - if (resolvePath && /node_modules/.test(resolvePath)) { - return doExternal(resolvePath); - } - return callback(); - }); -}; - -function autoExternalNodeBuiltin( - { request, dependencyType }: Rspack.ExternalItemFunctionData, - callback: ( - err?: Error, - result?: Rspack.ExternalItemValue, - type?: Rspack.ExternalsType, - ) => void, -): void { - if (!request) { - callback(); - return; - } - - const isNodeBuiltin = NODE_BUILTINS.some((builtin) => { - if (typeof builtin === 'string') { - return builtin === request; - } - - return builtin.test(request); - }); - - if (isNodeBuiltin) { - callback( - undefined, - request, - dependencyType === 'commonjs' ? 'commonjs' : 'module-import', - ); - } else { - callback(); - } -} - export const prepareRsbuild = async ( context: RstestContext, globTestSourceEntries: () => Promise>, @@ -116,7 +36,6 @@ export const prepareRsbuild = async ( command, normalizedConfig: { isolate, - name, plugins, resolve, source, @@ -136,7 +55,6 @@ export const prepareRsbuild = async ( callerName: 'rstest', rsbuildConfig: { tools, - plugins, resolve, source, output, @@ -150,126 +68,26 @@ export const prepareRsbuild = async ( }, dev: { hmr: false, + writeToDisk, }, performance, - environments: { - [name]: { - dev: { - writeToDisk, - }, - source: { - define: { - 'import.meta.rstest': "global['@rstest/core']", - }, - }, - output: { - // Pass resources to the worker on demand according to entry - manifest: true, - sourceMap: { - js: 'source-map', - }, - externals: - testEnvironment === 'node' - ? [autoExternalNodeModules] - : undefined, - distPath: { - root: TEMP_RSTEST_OUTPUT_DIR, - }, - target: 'node', - }, - tools: { - rspack: (config, { isProd }) => { - // treat `test` as development mode - config.mode = isProd ? 'production' : 'development'; - config.output ??= {}; - config.output.iife = false; - // polyfill interop - config.output.importFunctionName = '__rstest_dynamic_import__'; - config.output.devtoolModuleFilenameTemplate = - '[absolute-resource-path]'; - config.plugins.push( - new rspack.experiments.RstestPlugin({ - injectModulePathName: true, - importMetaPathName: true, - hoistMockModule: true, - manualMockRoot: path.resolve(context.rootPath, '__mocks__'), - }), - ); - - // Avoid externals configuration being modified by users - config.externals = castArray(config.externals) || []; - - config.externals.unshift({ - '@rstest/core': 'global @rstest/core', - }); - - config.externalsPresets ??= {}; - config.externalsPresets.node = false; - config.externals.push(autoExternalNodeBuiltin); - - config.module.parser ??= {}; - config.module.parser.javascript = { - // Keep dynamic import expressions. - // eg. (modulePath) => import(modulePath) - importDynamic: false, - // Keep dynamic require expressions. - // eg. (modulePath) => require(modulePath) - requireDynamic: false, - requireAsExpression: false, - // Keep require.resolve expressions. - requireResolve: false, - ...(config.module.parser.javascript || {}), - }; - - config.resolve ??= {}; - config.resolve.extensions ??= []; - config.resolve.extensions.push('.cjs'); - - if (testEnvironment === 'node') { - // skip `module` field in Node.js environment. - // ESM module resolved by module field is not always a native ESM module - config.resolve.mainFields = config.resolve.mainFields?.filter( - (filed) => filed !== 'module', - ) || ['main']; - } - - config.resolve.byDependency ??= {}; - config.resolve.byDependency.commonjs ??= {}; - // skip `module` field when commonjs require - // By default, rspack resolves the "module" field for commonjs first, but this is not always returned synchronously in esm - config.resolve.byDependency.commonjs.mainFields = ['main', '...']; - - config.optimization = { - moduleIds: 'named', - chunkIds: 'named', - nodeEnv: false, - ...(config.optimization || {}), - // make sure setup file and test file share the runtime - runtimeChunk: { - name: 'runtime', - }, - }; - }, - }, - plugins: [ - pluginIgnoreResolveError, - pluginMockRuntime, - pluginCSSFilter(), - pluginEntryWatch({ - globTestSourceEntries, - setupFiles, - isWatch: command === 'watch', - }), - ], - }, - }, + plugins: [ + ...(plugins || []), + pluginBasic(context), + pluginIgnoreResolveError, + pluginMockRuntime, + pluginCSSFilter(), + pluginEntryWatch({ + globTestSourceEntries, + setupFiles, + isWatch: command === 'watch', + }), + pluginExternal(testEnvironment), + !isolate ? pluginCacheControl(Object.values(setupFiles)) : null, + ].filter(Boolean) as RsbuildPlugin[], }, }); - if (!isolate) { - rsbuildInstance.addPlugins([pluginCacheControl(Object.values(setupFiles))]); - } - return rsbuildInstance; }; diff --git a/tests/snapshot/file.test.ts b/tests/snapshot/file.test.ts index c7a9786e..99b1007a 100644 --- a/tests/snapshot/file.test.ts +++ b/tests/snapshot/file.test.ts @@ -62,6 +62,8 @@ describe('test snapshot', () => { }); it('test toMatchFileSnapshot correctly', async () => { - expect('hello world').toMatchFileSnapshot('__snapshots__/file.output.txt'); + await expect('hello world').toMatchFileSnapshot( + '__snapshots__/file.output.txt', + ); }); }); diff --git a/website/docs/en/api/test-api/expect.mdx b/website/docs/en/api/test-api/expect.mdx index 121e818b..b1c15288 100644 --- a/website/docs/en/api/test-api/expect.mdx +++ b/website/docs/en/api/test-api/expect.mdx @@ -251,6 +251,10 @@ expect('hello world').toMatchSnapshot(); expect(() => { throw new Error('fail'); }).toThrowErrorMatchingSnapshot(); + +await expect('hello world').toMatchFileSnapshot( + '__snapshots__/file.output.txt', +); ``` ### Promise matchers diff --git a/website/docs/zh/api/test-api/expect.mdx b/website/docs/zh/api/test-api/expect.mdx index 250fa0f0..cdbb4564 100644 --- a/website/docs/zh/api/test-api/expect.mdx +++ b/website/docs/zh/api/test-api/expect.mdx @@ -251,6 +251,10 @@ expect('hello world').toMatchSnapshot(); expect(() => { throw new Error('fail'); }).toThrowErrorMatchingSnapshot(); + +await expect('hello world').toMatchFileSnapshot( + '__snapshots__/file.output.txt', +); ``` ### Promise 匹配器 From 880bdf9f080fe8ce936cb38561abc6f901a312c7 Mon Sep 17 00:00:00 2001 From: neverland Date: Thu, 24 Jul 2025 11:24:47 +0800 Subject: [PATCH 11/16] chore: add open collective funding link (#416) --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..ea9f26e1 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +open_collective: rspack From bf8c9c1fa011a6744f02777fa5338ba409361933 Mon Sep 17 00:00:00 2001 From: Wei Date: Thu, 24 Jul 2025 14:15:44 +0800 Subject: [PATCH 12/16] fix: make mock works with async mock factory (#389) --- examples/react/package.json | 2 +- packages/core/package.json | 2 +- packages/core/src/core/plugins/mockRuntime.ts | 50 ++- pnpm-lock.yaml | 344 +++++++++--------- tests/dom/fixtures/package.json | 2 +- tests/mock/fixtures/unmock/unmock.test.ts | 4 +- tests/mock/src/c.ts | 1 + tests/mock/src/d.ts | 1 + tests/mock/tests/doMock.test.ts | 4 +- tests/mock/tests/mock.test.ts | 22 +- tests/mock/tests/mockHoist.test.ts | 17 + tests/mock/tests/reduxMocked.test.ts | 7 +- tests/package.json | 2 +- tests/vue/fixtures/package.json | 2 +- 14 files changed, 262 insertions(+), 198 deletions(-) create mode 100644 tests/mock/src/c.ts create mode 100644 tests/mock/src/d.ts create mode 100644 tests/mock/tests/mockHoist.test.ts diff --git a/examples/react/package.json b/examples/react/package.json index 445b1927..c9e8be95 100644 --- a/examples/react/package.json +++ b/examples/react/package.json @@ -13,7 +13,7 @@ "react-dom": "^19.1.0" }, "devDependencies": { - "@rsbuild/core": "1.4.8", + "@rsbuild/core": "1.4.9", "@rsbuild/plugin-react": "^1.3.4", "@testing-library/dom": "^10.4.0", "@testing-library/react": "^16.3.0", diff --git a/packages/core/package.json b/packages/core/package.json index 7e3d3dea..e2fd6758 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -54,7 +54,7 @@ "test": "npx rstest run --globals" }, "dependencies": { - "@rsbuild/core": "1.4.8", + "@rsbuild/core": "1.4.9", "@types/chai": "^5.2.2", "@vitest/expect": "^3.2.4", "@vitest/snapshot": "^3.2.4", diff --git a/packages/core/src/core/plugins/mockRuntime.ts b/packages/core/src/core/plugins/mockRuntime.ts index 4a2fdd83..e966fd5f 100644 --- a/packages/core/src/core/plugins/mockRuntime.ts +++ b/packages/core/src/core/plugins/mockRuntime.ts @@ -34,8 +34,7 @@ Object.keys(originalRequire).forEach(key => { __webpack_require__.rstest_original_modules = {}; -// TODO: Remove "reset_modules" in next Rspack version. -__webpack_require__.rstest_reset_modules = __webpack_require__.reset_modules = () => { +__webpack_require__.rstest_reset_modules = () => { const mockedIds = Object.keys(__webpack_require__.rstest_original_modules) Object.keys(__webpack_module_cache__).forEach(id => { // Do not reset mocks registry. @@ -45,21 +44,27 @@ __webpack_require__.rstest_reset_modules = __webpack_require__.reset_modules = ( }); } -// TODO: Remove "unmock" in next Rspack version. -__webpack_require__.rstest_unmock = __webpack_require__.unmock = (id) => { +__webpack_require__.rstest_unmock = (id) => { delete __webpack_module_cache__[id] } -// TODO: Remove "require_actual" and "import_actual" in next Rspack version. -__webpack_require__.rstest_require_actual = __webpack_require__.rstest_import_actual = __webpack_require__.require_actual = __webpack_require__.import_actual = (id) => { +__webpack_require__.rstest_require_actual = __webpack_require__.rstest_import_actual = (id) => { const originalModule = __webpack_require__.rstest_original_modules[id]; // Use fallback module if the module is not mocked. const fallbackMod = __webpack_require__(id); return originalModule ? originalModule : fallbackMod; } -// TODO: Remove "set_mock" in next Rspack version. -__webpack_require__.rstest_set_mock = __webpack_require__.set_mock = (id, modFactory) => { +__webpack_require__.rstest_exec = async (id, modFactory) => { + if (__webpack_module_cache__) { + let asyncFactory = __webpack_module_cache__[id]; + if (asyncFactory && asyncFactory.constructor.name === 'AsyncFunction') { + await asyncFactory(); + } + } +}; + +__webpack_require__.rstest_mock = (id, modFactory) => { let requiredModule = undefined try { requiredModule = __webpack_require__(id); @@ -71,11 +76,38 @@ __webpack_require__.rstest_set_mock = __webpack_require__.set_mock = (id, modFac if (typeof modFactory === 'string' || typeof modFactory === 'number') { __webpack_module_cache__[id] = { exports: __webpack_require__(modFactory) }; } else if (typeof modFactory === 'function') { - let exports = modFactory(); + if (modFactory.constructor.name === 'AsyncFunction') { + __webpack_module_cache__[id] = async () => { + const exports = await modFactory(); + __webpack_require__.r(exports); + __webpack_module_cache__[id] = { exports, id, loaded: true }; + } + } else { + const exports = modFactory(); + __webpack_require__.r(exports); + __webpack_module_cache__[id] = { exports, id, loaded: true }; + } + } +}; + +__webpack_require__.rstest_do_mock = (id, modFactory) => { + let requiredModule = undefined + try { + requiredModule = __webpack_require__(id); + } catch { + // TODO: non-resolved module + } finally { + __webpack_require__.rstest_original_modules[id] = requiredModule; + } + if (typeof modFactory === 'string' || typeof modFactory === 'number') { + __webpack_module_cache__[id] = { exports: __webpack_require__(modFactory) }; + } else if (typeof modFactory === 'function') { + const exports = modFactory(); __webpack_require__.r(exports); __webpack_module_cache__[id] = { exports, id, loaded: true }; } }; + `; } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 20d7e85a..d9952cbe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,7 +18,7 @@ importers: version: 2.29.5 '@rsdoctor/rspack-plugin': specifier: ^1.1.8 - version: 1.1.8(@rsbuild/core@1.4.8)(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) + version: 1.1.8(@rsbuild/core@1.4.9)(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) '@rstest/core': specifier: workspace:* version: link:packages/core @@ -87,11 +87,11 @@ importers: version: 19.1.0(react@19.1.0) devDependencies: '@rsbuild/core': - specifier: 1.4.8 - version: 1.4.8 + specifier: 1.4.9 + version: 1.4.9 '@rsbuild/plugin-react': specifier: ^1.3.4 - version: 1.3.4(@rsbuild/core@1.4.8) + version: 1.3.4(@rsbuild/core@1.4.9) '@testing-library/dom': specifier: ^10.4.0 version: 10.4.0 @@ -114,8 +114,8 @@ importers: packages/core: dependencies: '@rsbuild/core': - specifier: 1.4.8 - version: 1.4.8 + specifier: 1.4.9 + version: 1.4.9 '@types/chai': specifier: ^5.2.2 version: 5.2.2 @@ -210,8 +210,8 @@ importers: tests: devDependencies: '@rsbuild/core': - specifier: 1.4.8 - version: 1.4.8 + specifier: 1.4.9 + version: 1.4.9 '@rslib/core': specifier: 0.11.0 version: 0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(typescript@5.8.3) @@ -272,11 +272,11 @@ importers: version: 19.1.0(react@19.1.0) devDependencies: '@rsbuild/core': - specifier: 1.4.8 - version: 1.4.8 + specifier: 1.4.9 + version: 1.4.9 '@rsbuild/plugin-react': specifier: ^1.3.4 - version: 1.3.4(@rsbuild/core@1.4.8) + version: 1.3.4(@rsbuild/core@1.4.9) '@testing-library/dom': specifier: ^10.4.0 version: 10.4.0 @@ -374,7 +374,7 @@ importers: devDependencies: '@rsbuild/plugin-react': specifier: ^1.3.4 - version: 1.3.4(@rsbuild/core@1.4.8) + version: 1.3.4(@rsbuild/core@1.4.9) '@types/react': specifier: ^19.1.8 version: 19.1.8 @@ -392,17 +392,17 @@ importers: version: 3.5.17(typescript@5.8.3) devDependencies: '@rsbuild/core': - specifier: 1.4.8 - version: 1.4.8 + specifier: 1.4.9 + version: 1.4.9 '@rsbuild/plugin-babel': specifier: ^1.0.5 - version: 1.0.5(@rsbuild/core@1.4.8) + version: 1.0.5(@rsbuild/core@1.4.9) '@rsbuild/plugin-vue': specifier: ^1.1.0 - version: 1.1.0(@rsbuild/core@1.4.8)(vue@3.5.17(typescript@5.8.3)) + version: 1.1.0(@rsbuild/core@1.4.9)(vue@3.5.17(typescript@5.8.3)) '@rsbuild/plugin-vue-jsx': specifier: ^1.1.0 - version: 1.1.0(@babel/core@7.28.0)(@rsbuild/core@1.4.8) + version: 1.1.0(@babel/core@7.28.0)(@rsbuild/core@1.4.9) '@rstest/core': specifier: workspace:* version: link:../../../packages/core @@ -426,7 +426,7 @@ importers: devDependencies: '@rsbuild/plugin-sass': specifier: ^1.3.3 - version: 1.3.3(@rsbuild/core@1.4.8) + version: 1.3.3(@rsbuild/core@1.4.9) '@rspress/core': specifier: ^2.0.0-beta.22 version: 2.0.0-beta.22(@types/react@19.1.8)(acorn@8.14.1)(webpack@5.99.9) @@ -456,10 +456,10 @@ importers: version: 19.1.0(react@19.1.0) rsbuild-plugin-google-analytics: specifier: ^1.0.3 - version: 1.0.3(@rsbuild/core@1.4.8) + version: 1.0.3(@rsbuild/core@1.4.9) rsbuild-plugin-open-graph: specifier: ^1.0.2 - version: 1.0.2(@rsbuild/core@1.4.8) + version: 1.0.2(@rsbuild/core@1.4.9) rspress-plugin-font-open-sans: specifier: ^1.0.0 version: 1.0.0 @@ -838,14 +838,14 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - '@emnapi/core@1.4.3': - resolution: {integrity: sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==} + '@emnapi/core@1.4.5': + resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} - '@emnapi/runtime@1.4.3': - resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} - '@emnapi/wasi-threads@1.0.2': - resolution: {integrity: sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==} + '@emnapi/wasi-threads@1.0.4': + resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -950,30 +950,30 @@ packages: '@microsoft/tsdoc@0.15.1': resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} - '@module-federation/error-codes@0.16.0': - resolution: {integrity: sha512-TfmA45b8vvISniGudMg8jjIy1q3tLPon0QN/JdFp5f8AJ8/peICN5b+dkEQnWsAVg2fEusYhk9dO7z3nUeJM8A==} + '@module-federation/error-codes@0.17.0': + resolution: {integrity: sha512-+pZ12frhaDqh4Xs/MQj4Vu4CAjnJTiEb8Z6fqPfn/TLHh4YLWMOzpzxGuMFDHqXwMb3o8FRAUhNB0eX2ZmhwTA==} - '@module-federation/runtime-core@0.16.0': - resolution: {integrity: sha512-5SECQowG4hlUVBRk/y6bnYLfxbsl5NcMmqn043WPe7NDOhGQWbTuYibJ3Bk+ZBv5U4uYLEmXipBGDc1FKsHklQ==} + '@module-federation/runtime-core@0.17.0': + resolution: {integrity: sha512-MYwDDevYnBB9gXFfNOmJVIX5XZcbCHd0dral7gT7yVmlwOhbuGOLlm2dh2icwwdCYHA9AFDCfU9l1nJR4ex/ng==} - '@module-federation/runtime-tools@0.16.0': - resolution: {integrity: sha512-OzmXNluXBQ2E6znzX4m9CJt1MFHVGmbN8c8MSKcYIDcLzLSKBQAiaz9ZUMhkyWx2YrPgD134glyPEqJrc+fY8A==} + '@module-federation/runtime-tools@0.17.0': + resolution: {integrity: sha512-t4QcKfhmwOHedwByDKUlTQVw4+gPotySYPyNa8GFrBSr1F6wcGdGyOhzP+PdgpiJLIM03cB6V+IKGGHE28SfDQ==} - '@module-federation/runtime@0.16.0': - resolution: {integrity: sha512-6o84WI8Qhc9O3HwPLx89kTvOSkyUOHQr73R/zr0I04sYhlMJgw5xTwXeGE7bQAmNgbJclzW9Kh7JTP7+3o3CHg==} + '@module-federation/runtime@0.17.0': + resolution: {integrity: sha512-eMtrtCSSV6neJpMmQ8WdFpYv93raSgsG5RiAPsKUuSCXfZ5D+yzvleZ+gPcEpFT9HokmloxAn0jep50/1upTQw==} - '@module-federation/sdk@0.16.0': - resolution: {integrity: sha512-UXJW1WWuDoDmScX0tpISjl4xIRPzAiN62vg9etuBdAEUM+ja9rz/zwNZaByiUPFS2aqlj2RHenCRvIapE8mYEg==} + '@module-federation/sdk@0.17.0': + resolution: {integrity: sha512-tjrNaYdDocHZsWu5iXlm83lwEK8A64r4PQB3/kY1cW1iOvggR2RESLAWPxRJXC2cLF8fg8LDKOBdgERZW1HPFA==} - '@module-federation/webpack-bundler-runtime@0.16.0': - resolution: {integrity: sha512-yqIDQTelJZP0Rxml0OXv4Er8Kbdxy7NFh6PCzPwDFWI1SkiokJ3uXQJBvtlxZ3lOnCDYOzdHstqa8sJG4JP02Q==} - - '@napi-rs/wasm-runtime@0.2.12': - resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + '@module-federation/webpack-bundler-runtime@0.17.0': + resolution: {integrity: sha512-o8XtXwqTDlqLgcALOfObcCbqXvUcSDHIEXrkcb4W+I8GJY7IqV0+x6rX4mJ3f59tca9qOF8zsZsOA6BU93Pvgw==} '@napi-rs/wasm-runtime@0.2.4': resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} + '@napi-rs/wasm-runtime@1.0.1': + resolution: {integrity: sha512-KVlQ/jgywZpixGCKMNwxStmmbYEMyokZpCf2YuIChhfJA2uqfAKNEM8INz7zzTo55iEXfBhIIs3VqYyqzDLj8g==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1054,8 +1054,8 @@ packages: resolution: {integrity: sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==} engines: {node: '>=14.0.0'} - '@rsbuild/core@1.4.8': - resolution: {integrity: sha512-IJhpLl8lrp5ynlf04V5l7rMrVTNuGLG36ZDadHiBIC5qLRGSS3rMF8cVLSkSA6qM1OiRlPpMgwQbqFYh325RvQ==} + '@rsbuild/core@1.4.9': + resolution: {integrity: sha512-LvF0YQ2IQf6ddDQQCkWxgPxHJFrZT8bvwwsHYo8K9g8KJTlrrstMV85lU3DROaH5tm98jN3zYZIOCbqQzklx5g==} engines: {node: '>=16.10.0'} hasBin: true @@ -1142,60 +1142,60 @@ packages: typescript: optional: true - '@rspack/binding-darwin-arm64@1.4.8': - resolution: {integrity: sha512-PQRNjC3Fc0avpx8Gk+sT5P+HAXxTSzmBA8lU7QLlmbW5GGXO2taVhNstbZ4oxyIX5uDVZpQ2yQ2E0zXirK6/UQ==} + '@rspack/binding-darwin-arm64@1.4.9': + resolution: {integrity: sha512-P0O10aXEaLLrwKXK7muSXl64wGJsLGbJEE97zeFe0mFVFo44m3iVC+KVpRpBFBrXhnL1ylCYsu2mS/dTJ+970g==} cpu: [arm64] os: [darwin] - '@rspack/binding-darwin-x64@1.4.8': - resolution: {integrity: sha512-ZnPZbo1dhhbfevxSS99y8w02xuEbxyiV1HaUie/S8jzy9DPmk+4Br+DddufnibPNU85e3BZKjp+HDFMYkdn6cg==} + '@rspack/binding-darwin-x64@1.4.9': + resolution: {integrity: sha512-eCbjVEkrSpFzLYye8Xd3SJgoaJ+GXCEVXJNLIqqt+BwxAknuVcHOHWFtppCw5/FcPWZkB03fWMah7aW8/ZqDyg==} cpu: [x64] os: [darwin] - '@rspack/binding-linux-arm64-gnu@1.4.8': - resolution: {integrity: sha512-mJK9diM4Gd8RIGO90AZnl27WwUuAOoRplPQv9G+Vxu2baCt1xE1ccf8PntIJ70/rMgsUdnmkR5qQBaGxhAMJvA==} + '@rspack/binding-linux-arm64-gnu@1.4.9': + resolution: {integrity: sha512-OTsco8WagOax9o6W66i//GjgrjhNFFOXhcS/vl81t7Hx5APEpEXX+pnccirH0e67Gs5sNlm/uLVS1cyA/B77Sg==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-arm64-musl@1.4.8': - resolution: {integrity: sha512-+n9QxeDDZKwVB4D6cwpNRJzsCeuwNqd/fwwbMQVTctJ+GhIHlUPsE8y5tXN7euU7kDci81wMBBFlt6LtXNcssA==} + '@rspack/binding-linux-arm64-musl@1.4.9': + resolution: {integrity: sha512-vxnh8TwTX5tquZz8naGd1NIBOESyKAPRemHZUWfAnK1p4WzM+dbTkGeIU7Z1fUzF/AXEbdRQ/omWlvp5nCOOZA==} cpu: [arm64] os: [linux] - '@rspack/binding-linux-x64-gnu@1.4.8': - resolution: {integrity: sha512-rEypDlbIfv9B/DcZ2vYVWs56wo5VWE5oj/TvM9JT+xuqwvVWsN/A2TPMiU6QBgOKGXat3EM/MEgx8NhNZUpkXg==} + '@rspack/binding-linux-x64-gnu@1.4.9': + resolution: {integrity: sha512-MitSilaS23e7EPNqYT9PEr2Zomc51GZSaCRCXscNOica5V/oAVBcEMUFbrNoD4ugohDXM68RvK0kVyFmfYuW+Q==} cpu: [x64] os: [linux] - '@rspack/binding-linux-x64-musl@1.4.8': - resolution: {integrity: sha512-o9OsvJ7olH0JPU9exyIaYTNQ+aaR5CNAiinkxr+LkV2i3DMIi/+pDVveDiodYjVhzZjWfsP/z8QPO4c6Z06bEw==} + '@rspack/binding-linux-x64-musl@1.4.9': + resolution: {integrity: sha512-fdBLz3RPvEEaz91IHXP4pMDNh9Nfl6nkYDmmLBJRu4yHi97j1BEeymrq3lKssy/1kDR70t6T47ZjfRJIgM6nYg==} cpu: [x64] os: [linux] - '@rspack/binding-wasm32-wasi@1.4.8': - resolution: {integrity: sha512-hF5gqT0aQ66VUclM2A9MSB6zVdEJqzp++TAXaShBK/eVBI0R4vWrMfJ2TOdzEsSbg4gXgeG4swURpHva3PKbcA==} + '@rspack/binding-wasm32-wasi@1.4.9': + resolution: {integrity: sha512-yWd5llZHBCsA0S5W0UGuXdQQ5zkZC4PQbOQS7XiblBII9RIMZZKJV/3AsYAHUeskTBPnwYMQsm8QCV52BNAE9A==} cpu: [wasm32] - '@rspack/binding-win32-arm64-msvc@1.4.8': - resolution: {integrity: sha512-umD0XzesJq4nnStv9/2/VOmzNUWHfLMIjeHmiHYHpc7iVC0SkXgIdc6Ac7c+g2q7/V3/MFxL66Y60oy7lQE3fg==} + '@rspack/binding-win32-arm64-msvc@1.4.9': + resolution: {integrity: sha512-3+oG19ye2xOmVGGKHao0EXmvPaiGvaFnxJRQ6tc6T7MSxhOvvDhQ1zmx+9X/wXKv/iytAHXMuoLGLHwdGd7GJg==} cpu: [arm64] os: [win32] - '@rspack/binding-win32-ia32-msvc@1.4.8': - resolution: {integrity: sha512-Uu+F/sxz7GgIMbuCCZVOD1HPjoHQdyrFHi/TE2EmuZzs9Ji9a9mtNJNrKc8+h9YFpaLeade7cbMDjRu4MHxiVA==} + '@rspack/binding-win32-ia32-msvc@1.4.9': + resolution: {integrity: sha512-l9K68LNP2j2QnCFYz17Rea7wdk04m4jnGB6CyRrS0iuanTn+Hvz3wgAn1fqADJxE4dtX+wNbTPOWJr0SrVHccw==} cpu: [ia32] os: [win32] - '@rspack/binding-win32-x64-msvc@1.4.8': - resolution: {integrity: sha512-BVkOfJDZnexHNpGgc/sWENyGrsle1jUQTeUEdSyNYsu4Elsgk/T9gnGK8xyLRd2c6k20M5FN38t0TumCp4DscQ==} + '@rspack/binding-win32-x64-msvc@1.4.9': + resolution: {integrity: sha512-2i4+/E5HjqobNBA86DuqQfqw6mW/jsHGUzUfgwKEKW8I6wLU0Gz7dUcz0fExvr8W5I8f/ccOfqR2bPGnxJ8vNw==} cpu: [x64] os: [win32] - '@rspack/binding@1.4.8': - resolution: {integrity: sha512-VKE+2InUdudBUOn3xMZfK9a6KlOwmSifA0Nupjsh7N9/brcBfJtJGSDCnfrIKCq54FF+QAUCgcNAS0DB4/tZmw==} + '@rspack/binding@1.4.9': + resolution: {integrity: sha512-9EY8OMCNZrwCupQMZccMgrTxWGUQvZGFrLFw/rxfTt+uT4fS4CAbNwHVFxsnROaRd+EE6EXfUpUYu66j6vd4qA==} - '@rspack/core@1.4.8': - resolution: {integrity: sha512-ARHuZ+gx3P//RIUKSjk/riQUn/D5tCwCWbfgeM5pk/Ti2JsgVnqiP9Sksge8JovVPf7b6Zgw73Cq5FpX4aOXeQ==} + '@rspack/core@1.4.9': + resolution: {integrity: sha512-fHEGOzVcyESVfprFTqgeJ7vAnmkmY/nbljaeGsJY4zLmROmkbGTh4xgLEY3O5nEukLfEFbdLapvBqYb5tE/fmA==} engines: {node: '>=16.0.0'} peerDependencies: '@swc/helpers': '>=0.5.1' @@ -4889,16 +4889,16 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} - '@emnapi/core@1.4.3': + '@emnapi/core@1.4.5': dependencies: - '@emnapi/wasi-threads': 1.0.2 + '@emnapi/wasi-threads': 1.0.4 tslib: 2.8.1 - '@emnapi/runtime@1.4.3': + '@emnapi/runtime@1.4.5': dependencies: tslib: 2.8.1 - '@emnapi/wasi-threads@1.0.2': + '@emnapi/wasi-threads@1.0.4': dependencies: tslib: 2.8.1 @@ -5076,44 +5076,44 @@ snapshots: '@microsoft/tsdoc@0.15.1': {} - '@module-federation/error-codes@0.16.0': {} + '@module-federation/error-codes@0.17.0': {} - '@module-federation/runtime-core@0.16.0': + '@module-federation/runtime-core@0.17.0': dependencies: - '@module-federation/error-codes': 0.16.0 - '@module-federation/sdk': 0.16.0 + '@module-federation/error-codes': 0.17.0 + '@module-federation/sdk': 0.17.0 - '@module-federation/runtime-tools@0.16.0': + '@module-federation/runtime-tools@0.17.0': dependencies: - '@module-federation/runtime': 0.16.0 - '@module-federation/webpack-bundler-runtime': 0.16.0 + '@module-federation/runtime': 0.17.0 + '@module-federation/webpack-bundler-runtime': 0.17.0 - '@module-federation/runtime@0.16.0': + '@module-federation/runtime@0.17.0': dependencies: - '@module-federation/error-codes': 0.16.0 - '@module-federation/runtime-core': 0.16.0 - '@module-federation/sdk': 0.16.0 + '@module-federation/error-codes': 0.17.0 + '@module-federation/runtime-core': 0.17.0 + '@module-federation/sdk': 0.17.0 - '@module-federation/sdk@0.16.0': {} + '@module-federation/sdk@0.17.0': {} - '@module-federation/webpack-bundler-runtime@0.16.0': + '@module-federation/webpack-bundler-runtime@0.17.0': dependencies: - '@module-federation/runtime': 0.16.0 - '@module-federation/sdk': 0.16.0 - - '@napi-rs/wasm-runtime@0.2.12': - dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 - '@tybys/wasm-util': 0.10.0 - optional: true + '@module-federation/runtime': 0.17.0 + '@module-federation/sdk': 0.17.0 '@napi-rs/wasm-runtime@0.2.4': dependencies: - '@emnapi/core': 1.4.3 - '@emnapi/runtime': 1.4.3 + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 '@tybys/wasm-util': 0.9.0 + '@napi-rs/wasm-runtime@1.0.1': + dependencies: + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@tybys/wasm-util': 0.10.0 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5167,21 +5167,21 @@ snapshots: '@remix-run/router@1.23.0': {} - '@rsbuild/core@1.4.8': + '@rsbuild/core@1.4.9': dependencies: - '@rspack/core': 1.4.8(@swc/helpers@0.5.17) + '@rspack/core': 1.4.9(@swc/helpers@0.5.17) '@rspack/lite-tapable': 1.0.1 '@swc/helpers': 0.5.17 core-js: 3.44.0 jiti: 2.4.2 - '@rsbuild/plugin-babel@1.0.5(@rsbuild/core@1.4.8)': + '@rsbuild/plugin-babel@1.0.5(@rsbuild/core@1.4.9)': dependencies: '@babel/core': 7.28.0 '@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.28.0) '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.0) '@babel/preset-typescript': 7.27.1(@babel/core@7.28.0) - '@rsbuild/core': 1.4.8 + '@rsbuild/core': 1.4.9 '@types/babel__core': 7.20.5 deepmerge: 4.3.1 reduce-configs: 1.1.0 @@ -5189,7 +5189,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@rsbuild/plugin-check-syntax@1.3.0(@rsbuild/core@1.4.8)': + '@rsbuild/plugin-check-syntax@1.3.0(@rsbuild/core@1.4.9)': dependencies: acorn: 8.14.1 browserslist-to-es-version: 1.0.0 @@ -5197,39 +5197,39 @@ snapshots: picocolors: 1.1.1 source-map: 0.7.4 optionalDependencies: - '@rsbuild/core': 1.4.8 + '@rsbuild/core': 1.4.9 - '@rsbuild/plugin-react@1.3.4(@rsbuild/core@1.4.8)': + '@rsbuild/plugin-react@1.3.4(@rsbuild/core@1.4.9)': dependencies: - '@rsbuild/core': 1.4.8 + '@rsbuild/core': 1.4.9 '@rspack/plugin-react-refresh': 1.4.3(react-refresh@0.17.0) react-refresh: 0.17.0 transitivePeerDependencies: - webpack-hot-middleware - '@rsbuild/plugin-sass@1.3.3(@rsbuild/core@1.4.8)': + '@rsbuild/plugin-sass@1.3.3(@rsbuild/core@1.4.9)': dependencies: - '@rsbuild/core': 1.4.8 + '@rsbuild/core': 1.4.9 deepmerge: 4.3.1 loader-utils: 2.0.4 postcss: 8.5.6 reduce-configs: 1.1.0 sass-embedded: 1.89.2 - '@rsbuild/plugin-vue-jsx@1.1.0(@babel/core@7.28.0)(@rsbuild/core@1.4.8)': + '@rsbuild/plugin-vue-jsx@1.1.0(@babel/core@7.28.0)(@rsbuild/core@1.4.9)': dependencies: - '@rsbuild/plugin-babel': 1.0.5(@rsbuild/core@1.4.8) + '@rsbuild/plugin-babel': 1.0.5(@rsbuild/core@1.4.9) '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.28.0) babel-plugin-vue-jsx-hmr: 1.0.0 optionalDependencies: - '@rsbuild/core': 1.4.8 + '@rsbuild/core': 1.4.9 transitivePeerDependencies: - '@babel/core' - supports-color - '@rsbuild/plugin-vue@1.1.0(@rsbuild/core@1.4.8)(vue@3.5.17(typescript@5.8.3))': + '@rsbuild/plugin-vue@1.1.0(@rsbuild/core@1.4.9)(vue@3.5.17(typescript@5.8.3))': dependencies: - '@rsbuild/core': 1.4.8 + '@rsbuild/core': 1.4.9 vue-loader: 17.4.2(vue@3.5.17(typescript@5.8.3))(webpack@5.99.9) webpack: 5.99.9 transitivePeerDependencies: @@ -5242,13 +5242,13 @@ snapshots: '@rsdoctor/client@1.1.8': {} - '@rsdoctor/core@1.1.8(@rsbuild/core@1.4.8)(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9)': + '@rsdoctor/core@1.1.8(@rsbuild/core@1.4.9)(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': dependencies: - '@rsbuild/plugin-check-syntax': 1.3.0(@rsbuild/core@1.4.8) - '@rsdoctor/graph': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/sdk': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/types': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/utils': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsbuild/plugin-check-syntax': 1.3.0(@rsbuild/core@1.4.9) + '@rsdoctor/graph': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/sdk': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/types': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/utils': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) axios: 1.11.0 browserslist-load-config: 1.0.0 enhanced-resolve: 5.12.0 @@ -5268,10 +5268,10 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/graph@1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9)': + '@rsdoctor/graph@1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': dependencies: - '@rsdoctor/types': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/utils': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/types': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/utils': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) lodash.unionby: 4.8.0 socket.io: 4.8.1 source-map: 0.7.4 @@ -5282,16 +5282,16 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/rspack-plugin@1.1.8(@rsbuild/core@1.4.8)(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9)': + '@rsdoctor/rspack-plugin@1.1.8(@rsbuild/core@1.4.9)(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': dependencies: - '@rsdoctor/core': 1.1.8(@rsbuild/core@1.4.8)(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/graph': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/sdk': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/types': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/utils': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/core': 1.1.8(@rsbuild/core@1.4.9)(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/graph': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/sdk': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/types': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/utils': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) lodash: 4.17.21 optionalDependencies: - '@rspack/core': 1.4.8(@swc/helpers@0.5.17) + '@rspack/core': 1.4.9(@swc/helpers@0.5.17) transitivePeerDependencies: - '@rsbuild/core' - bufferutil @@ -5300,12 +5300,12 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/sdk@1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9)': + '@rsdoctor/sdk@1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': dependencies: '@rsdoctor/client': 1.1.8 - '@rsdoctor/graph': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/types': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/utils': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/graph': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/types': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/utils': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) '@types/fs-extra': 11.0.4 body-parser: 1.20.3 cors: 2.8.5 @@ -5325,20 +5325,20 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/types@1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9)': + '@rsdoctor/types@1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': dependencies: '@types/connect': 3.4.38 '@types/estree': 1.0.5 '@types/tapable': 2.2.7 source-map: 0.7.4 optionalDependencies: - '@rspack/core': 1.4.8(@swc/helpers@0.5.17) + '@rspack/core': 1.4.9(@swc/helpers@0.5.17) webpack: 5.99.9 - '@rsdoctor/utils@1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9)': + '@rsdoctor/utils@1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': dependencies: '@babel/code-frame': 7.26.2 - '@rsdoctor/types': 1.1.8(@rspack/core@1.4.8(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/types': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) '@types/estree': 1.0.5 acorn: 8.14.1 acorn-import-attributes: 1.9.5(acorn@8.14.1) @@ -5361,62 +5361,62 @@ snapshots: '@rslib/core@0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(typescript@5.8.3)': dependencies: - '@rsbuild/core': 1.4.8 - rsbuild-plugin-dts: 0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(@rsbuild/core@1.4.8)(typescript@5.8.3) + '@rsbuild/core': 1.4.9 + rsbuild-plugin-dts: 0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(@rsbuild/core@1.4.9)(typescript@5.8.3) tinyglobby: 0.2.14 optionalDependencies: '@microsoft/api-extractor': 7.52.8(@types/node@22.13.8) typescript: 5.8.3 - '@rspack/binding-darwin-arm64@1.4.8': + '@rspack/binding-darwin-arm64@1.4.9': optional: true - '@rspack/binding-darwin-x64@1.4.8': + '@rspack/binding-darwin-x64@1.4.9': optional: true - '@rspack/binding-linux-arm64-gnu@1.4.8': + '@rspack/binding-linux-arm64-gnu@1.4.9': optional: true - '@rspack/binding-linux-arm64-musl@1.4.8': + '@rspack/binding-linux-arm64-musl@1.4.9': optional: true - '@rspack/binding-linux-x64-gnu@1.4.8': + '@rspack/binding-linux-x64-gnu@1.4.9': optional: true - '@rspack/binding-linux-x64-musl@1.4.8': + '@rspack/binding-linux-x64-musl@1.4.9': optional: true - '@rspack/binding-wasm32-wasi@1.4.8': + '@rspack/binding-wasm32-wasi@1.4.9': dependencies: - '@napi-rs/wasm-runtime': 0.2.12 + '@napi-rs/wasm-runtime': 1.0.1 optional: true - '@rspack/binding-win32-arm64-msvc@1.4.8': + '@rspack/binding-win32-arm64-msvc@1.4.9': optional: true - '@rspack/binding-win32-ia32-msvc@1.4.8': + '@rspack/binding-win32-ia32-msvc@1.4.9': optional: true - '@rspack/binding-win32-x64-msvc@1.4.8': + '@rspack/binding-win32-x64-msvc@1.4.9': optional: true - '@rspack/binding@1.4.8': + '@rspack/binding@1.4.9': optionalDependencies: - '@rspack/binding-darwin-arm64': 1.4.8 - '@rspack/binding-darwin-x64': 1.4.8 - '@rspack/binding-linux-arm64-gnu': 1.4.8 - '@rspack/binding-linux-arm64-musl': 1.4.8 - '@rspack/binding-linux-x64-gnu': 1.4.8 - '@rspack/binding-linux-x64-musl': 1.4.8 - '@rspack/binding-wasm32-wasi': 1.4.8 - '@rspack/binding-win32-arm64-msvc': 1.4.8 - '@rspack/binding-win32-ia32-msvc': 1.4.8 - '@rspack/binding-win32-x64-msvc': 1.4.8 - - '@rspack/core@1.4.8(@swc/helpers@0.5.17)': - dependencies: - '@module-federation/runtime-tools': 0.16.0 - '@rspack/binding': 1.4.8 + '@rspack/binding-darwin-arm64': 1.4.9 + '@rspack/binding-darwin-x64': 1.4.9 + '@rspack/binding-linux-arm64-gnu': 1.4.9 + '@rspack/binding-linux-arm64-musl': 1.4.9 + '@rspack/binding-linux-x64-gnu': 1.4.9 + '@rspack/binding-linux-x64-musl': 1.4.9 + '@rspack/binding-wasm32-wasi': 1.4.9 + '@rspack/binding-win32-arm64-msvc': 1.4.9 + '@rspack/binding-win32-ia32-msvc': 1.4.9 + '@rspack/binding-win32-x64-msvc': 1.4.9 + + '@rspack/core@1.4.9(@swc/helpers@0.5.17)': + dependencies: + '@module-federation/runtime-tools': 0.17.0 + '@rspack/binding': 1.4.9 '@rspack/lite-tapable': 1.0.1 optionalDependencies: '@swc/helpers': 0.5.17 @@ -5434,8 +5434,8 @@ snapshots: '@mdx-js/loader': 3.1.0(acorn@8.14.1)(webpack@5.99.9) '@mdx-js/mdx': 3.1.0(acorn@8.14.1) '@mdx-js/react': 3.1.0(@types/react@19.1.8)(react@19.1.0) - '@rsbuild/core': 1.4.8 - '@rsbuild/plugin-react': 1.3.4(@rsbuild/core@1.4.8) + '@rsbuild/core': 1.4.9 + '@rsbuild/plugin-react': 1.3.4(@rsbuild/core@1.4.9) '@rspress/mdx-rs': 0.6.6 '@rspress/runtime': 2.0.0-beta.22 '@rspress/shared': 2.0.0-beta.22 @@ -5533,7 +5533,7 @@ snapshots: '@rspress/shared@2.0.0-beta.22': dependencies: - '@rsbuild/core': 1.4.8 + '@rsbuild/core': 1.4.9 '@shikijs/rehype': 3.8.1 gray-matter: 4.0.3 lodash-es: 4.17.21 @@ -8404,10 +8404,10 @@ snapshots: rrweb-cssom@0.8.0: {} - rsbuild-plugin-dts@0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(@rsbuild/core@1.4.8)(typescript@5.8.3): + rsbuild-plugin-dts@0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(@rsbuild/core@1.4.9)(typescript@5.8.3): dependencies: '@ast-grep/napi': 0.37.0 - '@rsbuild/core': 1.4.8 + '@rsbuild/core': 1.4.9 magic-string: 0.30.17 picocolors: 1.1.1 tinyglobby: 0.2.14 @@ -8416,13 +8416,13 @@ snapshots: '@microsoft/api-extractor': 7.52.8(@types/node@22.13.8) typescript: 5.8.3 - rsbuild-plugin-google-analytics@1.0.3(@rsbuild/core@1.4.8): + rsbuild-plugin-google-analytics@1.0.3(@rsbuild/core@1.4.9): optionalDependencies: - '@rsbuild/core': 1.4.8 + '@rsbuild/core': 1.4.9 - rsbuild-plugin-open-graph@1.0.2(@rsbuild/core@1.4.8): + rsbuild-plugin-open-graph@1.0.2(@rsbuild/core@1.4.9): optionalDependencies: - '@rsbuild/core': 1.4.8 + '@rsbuild/core': 1.4.9 rslog@1.2.9: {} diff --git a/tests/dom/fixtures/package.json b/tests/dom/fixtures/package.json index f5ada922..d4ad4ec0 100644 --- a/tests/dom/fixtures/package.json +++ b/tests/dom/fixtures/package.json @@ -11,7 +11,7 @@ "react-dom": "^19.1.0" }, "devDependencies": { - "@rsbuild/core": "1.4.8", + "@rsbuild/core": "1.4.9", "@rsbuild/plugin-react": "^1.3.4", "@testing-library/jest-dom": "^6.6.3", "@testing-library/dom": "^10.4.0", diff --git a/tests/mock/fixtures/unmock/unmock.test.ts b/tests/mock/fixtures/unmock/unmock.test.ts index a313ba47..97bc1e8a 100644 --- a/tests/mock/fixtures/unmock/unmock.test.ts +++ b/tests/mock/fixtures/unmock/unmock.test.ts @@ -1,8 +1,8 @@ -import { randomFill } from 'node:crypto'; +import crypto from 'node:crypto'; import { expect, it, rs } from '@rstest/core'; rs.unmock('node:crypto'); it('should run setup file correctly2', () => { - expect(typeof randomFill === 'function').toBe(true); + expect(typeof crypto.randomFill === 'function').toBe(true); }); diff --git a/tests/mock/src/c.ts b/tests/mock/src/c.ts new file mode 100644 index 00000000..5f0cabef --- /dev/null +++ b/tests/mock/src/c.ts @@ -0,0 +1 @@ +export const c = 3; diff --git a/tests/mock/src/d.ts b/tests/mock/src/d.ts new file mode 100644 index 00000000..88dcd403 --- /dev/null +++ b/tests/mock/src/d.ts @@ -0,0 +1 @@ +export const d = 4; diff --git a/tests/mock/tests/doMock.test.ts b/tests/mock/tests/doMock.test.ts index c2c50000..15951786 100644 --- a/tests/mock/tests/doMock.test.ts +++ b/tests/mock/tests/doMock.test.ts @@ -1,4 +1,5 @@ import { expect, rs, test } from '@rstest/core'; +import { sleep } from '../../scripts/utils'; test('doMock works', async () => { const { increment: incrementWith1 } = await import('../src/increment'); @@ -31,9 +32,6 @@ test('the second doMock can override the first doMock', async () => { }); test('the third doMock can override the second doMock', async () => { - const sleep = (ms: number) => - new Promise((resolve) => setTimeout(resolve, ms)); - rs.doMock('../src/increment', async () => { await sleep(500); return { diff --git a/tests/mock/tests/mock.test.ts b/tests/mock/tests/mock.test.ts index c894c9f8..839bcc8a 100644 --- a/tests/mock/tests/mock.test.ts +++ b/tests/mock/tests/mock.test.ts @@ -1,17 +1,29 @@ import { expect, it, rs } from '@rstest/core'; +import redux from 'redux'; +import { sleep } from '../../scripts/utils'; +import { d } from '../src/d'; -// TODO: static import with mockFactory, any other imported module in mockFactory -// will throw an reference error as it hoisted to the top of the module. -// import r from 'redux'; +// To test async mocking factory. +rs.mock('../src/d', async () => { + await sleep(1000); + return { + d: rs.fn(), + }; +}); + +it('mocked d', async () => { + // @ts-expect-error: It has been mocked. + d('string1'); + expect(d).toHaveBeenCalledWith('string1'); +}); // manual mock rs.mock('redux'); it('mocked redux', async () => { - const redux = (await import('redux')).default; redux.isAction('string'); expect(redux.isAction).toHaveBeenCalledWith('string'); - // @ts-ignore + // @ts-expect-error: It has been mocked. expect(redux.mocked).toBe('redux_yes'); }); diff --git a/tests/mock/tests/mockHoist.test.ts b/tests/mock/tests/mockHoist.test.ts new file mode 100644 index 00000000..fa62baa1 --- /dev/null +++ b/tests/mock/tests/mockHoist.test.ts @@ -0,0 +1,17 @@ +import { expect, it, rs } from '@rstest/core'; +import { c } from '../src/c'; +import { d } from '../src/d'; + +rs.mock('../src/c', () => { + return { + c: rs.fn(), + d, + }; +}); + +it('mocked c', async () => { + // @ts-expect-error: It has been mocked. + c('c'); + expect(c).toHaveBeenCalledWith('c'); + expect(d).toBe(4); +}); diff --git a/tests/mock/tests/reduxMocked.test.ts b/tests/mock/tests/reduxMocked.test.ts index cebd62c0..44fd9ce9 100644 --- a/tests/mock/tests/reduxMocked.test.ts +++ b/tests/mock/tests/reduxMocked.test.ts @@ -17,9 +17,12 @@ it('importActual works', async () => { }); it('requireActual and importActual works together', async () => { - const rxEsm = await rs.importActual('redux'); + // const rxEsm = await rs.importActual('redux'); const rxCjs = rs.requireActual('redux'); expect(rs.isMockFunction(rxCjs.isAction)).toBe(false); expect(typeof rxCjs.applyMiddleware).toBe('function'); - expect(rxEsm.compose).not.toBe(rxCjs.compose); + + // TODO: https://github.com/web-infra-dev/rspack/pull/11111 breaks resolved module in external function, + // which will be fixed in the near future. + // expect(rxEsm.compose).not.toBe(rxCjs.compose); }); diff --git a/tests/package.json b/tests/package.json index 8389b826..2ed780ba 100644 --- a/tests/package.json +++ b/tests/package.json @@ -7,7 +7,7 @@ "typecheck": "tsc --noEmit" }, "devDependencies": { - "@rsbuild/core": "1.4.8", + "@rsbuild/core": "1.4.9", "@rslib/core": "0.11.0", "@rstest/core": "workspace:*", "@rstest/tsconfig": "workspace:*", diff --git a/tests/vue/fixtures/package.json b/tests/vue/fixtures/package.json index a9d1ba9c..161f9e11 100644 --- a/tests/vue/fixtures/package.json +++ b/tests/vue/fixtures/package.json @@ -12,7 +12,7 @@ }, "devDependencies": { "@rstest/core": "workspace:*", - "@rsbuild/core": "1.4.8", + "@rsbuild/core": "1.4.9", "@rsbuild/plugin-babel": "^1.0.5", "@rsbuild/plugin-vue": "^1.1.0", "@rsbuild/plugin-vue-jsx": "^1.1.0", From 338f354fb1030d29dcd4cb5b3d14f6fb6309b36d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 24 Jul 2025 15:01:35 +0800 Subject: [PATCH 13/16] chore(deps): update all patch dependencies (#412) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 4 +- packages/core/package.json | 4 +- pnpm-lock.yaml | 410 +++++++++++++++++--------------- tests/package.json | 2 +- tests/vue/fixtures/package.json | 6 +- 5 files changed, 222 insertions(+), 204 deletions(-) diff --git a/package.json b/package.json index b8d78aa0..2884eb64 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "devDependencies": { "@biomejs/biome": "^2.1.2", "@changesets/cli": "^2.29.5", - "@rsdoctor/rspack-plugin": "^1.1.8", + "@rsdoctor/rspack-plugin": "^1.1.10", "@rstest/core": "workspace:*", "@types/fs-extra": "^11.0.4", "@types/node": "^22.13.8", @@ -42,7 +42,7 @@ "fs-extra": "^11.3.0", "heading-case": "^0.1.6", "nano-staged": "^0.8.0", - "nx": "^21.3.1", + "nx": "^21.3.5", "path-serializer": "0.5.0", "prettier": "^3.6.2", "prettier-plugin-packagejson": "^2.5.19", diff --git a/packages/core/package.json b/packages/core/package.json index e2fd6758..a7ac7629 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -67,7 +67,7 @@ "devDependencies": { "@babel/code-frame": "^7.27.1", "@jridgewell/trace-mapping": "0.3.29", - "@microsoft/api-extractor": "^7.52.8", + "@microsoft/api-extractor": "^7.52.9", "@rslib/core": "0.11.0", "@rstest/tsconfig": "workspace:*", "@sinonjs/fake-timers": "^14.0.0", @@ -77,7 +77,7 @@ "@types/source-map-support": "^0.5.10", "cac": "^6.7.14", "happy-dom": "^18.0.1", - "jest-diff": "^30.0.4", + "jest-diff": "^30.0.5", "jsdom": "^26.1.0", "license-webpack-plugin": "^4.0.2", "picocolors": "^1.1.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d9952cbe..8be4ae77 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,8 +17,8 @@ importers: specifier: ^2.29.5 version: 2.29.5 '@rsdoctor/rspack-plugin': - specifier: ^1.1.8 - version: 1.1.8(@rsbuild/core@1.4.9)(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + specifier: ^1.1.10 + version: 1.1.10(@rsbuild/core@1.4.9)(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) '@rstest/core': specifier: workspace:* version: link:packages/core @@ -47,8 +47,8 @@ importers: specifier: ^0.8.0 version: 0.8.0 nx: - specifier: ^21.3.1 - version: 21.3.1 + specifier: ^21.3.5 + version: 21.3.5 path-serializer: specifier: 0.5.0 version: 0.5.0 @@ -148,11 +148,11 @@ importers: specifier: 0.3.29 version: 0.3.29 '@microsoft/api-extractor': - specifier: ^7.52.8 - version: 7.52.8(@types/node@22.13.8) + specifier: ^7.52.9 + version: 7.52.9(@types/node@22.13.8) '@rslib/core': specifier: 0.11.0 - version: 0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(typescript@5.8.3) + version: 0.11.0(@microsoft/api-extractor@7.52.9(@types/node@22.13.8))(typescript@5.8.3) '@rstest/tsconfig': specifier: workspace:* version: link:../../scripts/tsconfig @@ -178,8 +178,8 @@ importers: specifier: ^18.0.1 version: 18.0.1 jest-diff: - specifier: ^30.0.4 - version: 30.0.4 + specifier: ^30.0.5 + version: 30.0.5 jsdom: specifier: ^26.1.0 version: 26.1.0 @@ -214,7 +214,7 @@ importers: version: 1.4.9 '@rslib/core': specifier: 0.11.0 - version: 0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(typescript@5.8.3) + version: 0.11.0(@microsoft/api-extractor@7.52.9(@types/node@22.13.8))(typescript@5.8.3) '@rstest/core': specifier: workspace:* version: link:../packages/core @@ -225,7 +225,7 @@ importers: specifier: ^6.4.0 version: 6.4.0 axios: - specifier: ^1.10.0 + specifier: ^1.11.0 version: 1.11.0 jest-image-snapshot: specifier: ^6.5.1 @@ -388,8 +388,8 @@ importers: tests/vue/fixtures: dependencies: vue: - specifier: ^3.5.17 - version: 3.5.17(typescript@5.8.3) + specifier: ^3.5.18 + version: 3.5.18(typescript@5.8.3) devDependencies: '@rsbuild/core': specifier: 1.4.9 @@ -399,7 +399,7 @@ importers: version: 1.0.5(@rsbuild/core@1.4.9) '@rsbuild/plugin-vue': specifier: ^1.1.0 - version: 1.1.0(@rsbuild/core@1.4.9)(vue@3.5.17(typescript@5.8.3)) + version: 1.1.0(@rsbuild/core@1.4.9)(vue@3.5.18(typescript@5.8.3)) '@rsbuild/plugin-vue-jsx': specifier: ^1.1.0 version: 1.1.0(@babel/core@7.28.0)(@rsbuild/core@1.4.9) @@ -407,14 +407,14 @@ importers: specifier: workspace:* version: link:../../../packages/core '@vue/compiler-dom': - specifier: ^3.5.17 - version: 3.5.17 + specifier: ^3.5.18 + version: 3.5.18 '@vue/server-renderer': - specifier: ^3.5.17 - version: 3.5.17(vue@3.5.17(typescript@5.8.3)) + specifier: ^3.5.18 + version: 3.5.18(vue@3.5.18(typescript@5.8.3)) '@vue/test-utils': specifier: ^2.4.6 - version: 2.4.6(@vue/compiler-dom@3.5.17)(@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3)) + version: 2.4.6(@vue/compiler-dom@3.5.18)(@vue/server-renderer@3.5.18(vue@3.5.18(typescript@5.8.3)))(vue@3.5.18(typescript@5.8.3)) tests/watch: devDependencies: @@ -871,6 +871,10 @@ packages: resolution: {integrity: sha512-+g/1TKjFuGrf1Hh0QPCv0gISwBxJ+MQSNXmG9zjHy7BmFhtoJ9fdNhWJp3qUKRi93AOZHXtdxZgJ1vAtz6z65w==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/schemas@30.0.5': + resolution: {integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + '@jest/types@30.0.1': resolution: {integrity: sha512-HGwoYRVF0QSKJu1ZQX0o5ZrUrrhj0aOOFA8hXrumD7SIzjouevhawbTjmXdwOmURdGluU9DM/XvGm3NyFoiQjw==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -937,11 +941,11 @@ packages: '@types/react': '>=16' react: '>=16' - '@microsoft/api-extractor-model@7.30.6': - resolution: {integrity: sha512-znmFn69wf/AIrwHya3fxX6uB5etSIn6vg4Q4RB/tb5VDDs1rqREc+AvMC/p19MUN13CZ7+V/8pkYPTj7q8tftg==} + '@microsoft/api-extractor-model@7.30.7': + resolution: {integrity: sha512-TBbmSI2/BHpfR9YhQA7nH0nqVmGgJ0xH0Ex4D99/qBDAUpnhA2oikGmdXanbw9AWWY/ExBYIpkmY8dBHdla3YQ==} - '@microsoft/api-extractor@7.52.8': - resolution: {integrity: sha512-cszYIcjiNscDoMB1CIKZ3My61+JOhpERGlGr54i6bocvGLrcL/wo9o+RNXMBrb7XgLtKaizZWUpqRduQuHQLdg==} + '@microsoft/api-extractor@7.52.9': + resolution: {integrity: sha512-313nyhc6DSSMVKD43jZK6Yp5XbliGw5vjN7QOw1FHzR1V6DQ67k4dzkd3BSxMtWcm+cEs1Ux8rmDqots6EABFA==} hasBin: true '@microsoft/tsdoc-config@0.17.1': @@ -986,53 +990,53 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@nx/nx-darwin-arm64@21.3.1': - resolution: {integrity: sha512-DND5/CRN1rP7qMt4xkDjklzf3OoA3JcweN+47xZCfiQlu/VobvnS04OC6tLZc+Nymi73whk4lserpUG9biQjCA==} + '@nx/nx-darwin-arm64@21.3.5': + resolution: {integrity: sha512-QKWtKjIdYS2foDo/4ojvVr5NjrtY8IcHPyFFATAk7v5BWe2tEGh6pPDj8GRqvSqZPWSBZNDcJ6efovJyka6yzw==} cpu: [arm64] os: [darwin] - '@nx/nx-darwin-x64@21.3.1': - resolution: {integrity: sha512-iFR/abYakCwrFFIfb6gRXN6/gytle/8jj2jwEol0EFrkBIrBi/YrSyuRpsbnxuDB7MhuZ9zwvxlkE6mEJt9UoQ==} + '@nx/nx-darwin-x64@21.3.5': + resolution: {integrity: sha512-X06eb6lzuln9ZHh7L8430s4Cc7pi5mihU3IlJsN0rbgdCp2PMlOsJ/8P/zw/DBwq6qmTuVwZ8Xk01VOVtWZT0w==} cpu: [x64] os: [darwin] - '@nx/nx-freebsd-x64@21.3.1': - resolution: {integrity: sha512-e/cx0cR8sLBX3b2JRLqwXj8z4ENhgDwJ5CF7hbcNRkMncKz1J2MZSsqHQHKUfls+HT4Mmmzwyf86laj879cs7Q==} + '@nx/nx-freebsd-x64@21.3.5': + resolution: {integrity: sha512-+ZWvAn/1UD4Wwduv5nhcXWIUcev1JDEEsNBesGvFWS4c19dBk8vaUpUv3YQspwRUgAGdfYw1CWqDDOYvGFrZ3w==} cpu: [x64] os: [freebsd] - '@nx/nx-linux-arm-gnueabihf@21.3.1': - resolution: {integrity: sha512-JvDfLVZhxzKfetcA1r5Ak+re5Qfks6JdgQD165wMysgAyZDdeM1GFn78xo5CqRPShlE8f/nhF4aX405OL6HYPw==} + '@nx/nx-linux-arm-gnueabihf@21.3.5': + resolution: {integrity: sha512-JeSw0/WdVo4AxCKWRrH686rxu9jHzKnl/IY1m+/jiIPq2yUPUUxqSj9+Xesvp9K3plAmZFlSulbfd8BX15/cEw==} cpu: [arm] os: [linux] - '@nx/nx-linux-arm64-gnu@21.3.1': - resolution: {integrity: sha512-J+LkCHzFCgZw4ZMgIuahprjaabWTDmsqJdsYLPFm/pw7TR6AyidXzUEZPfEgBK5WTO1PQr1LJp+Ps8twpf+iBg==} + '@nx/nx-linux-arm64-gnu@21.3.5': + resolution: {integrity: sha512-TlMhwwj75cP67m/qYuSAmvdMMW6oASELo3uxRJ9PbpyTRiCmQZoqjZqALL/48rAEk1Ig69o83RI4pIMRkGMQUw==} cpu: [arm64] os: [linux] - '@nx/nx-linux-arm64-musl@21.3.1': - resolution: {integrity: sha512-VCiwPf4pj6WZWmPl30UpcKyp8DWb7Axs0pvU0/dsJz6Ye7bhKnsEZ/Ehp4laVZkck+MVEMFMHavikUdgNzWx3g==} + '@nx/nx-linux-arm64-musl@21.3.5': + resolution: {integrity: sha512-GZBMLTJFP9H9/o26jSfqxwlBoZ4c0FNBl8rJ3tOC9jCNHn7wcMJKaVbp0dUKDgUtyzATa5poJsdClG84zMnHdA==} cpu: [arm64] os: [linux] - '@nx/nx-linux-x64-gnu@21.3.1': - resolution: {integrity: sha512-Erxxqir8zZDgfrTgOOeaByn22e8vbOTxWNif5i0brH2tQpdr6+2f3v1qNrRlP9CWjqwypPDmkU781U38u+qHHg==} + '@nx/nx-linux-x64-gnu@21.3.5': + resolution: {integrity: sha512-rNZ2X+h3AbF+vM3zKcpv122Eu5fyYS0079iNiYAHNknwLPJUlvDEQU3nu6ts8Hw1zSjxzibHbWZghSfZRAIHZA==} cpu: [x64] os: [linux] - '@nx/nx-linux-x64-musl@21.3.1': - resolution: {integrity: sha512-dG5djRnC3zzOjEzOAzVX8u1sZSn0TSmvVUKKH+WorxI8QKpxHVHbzpvvyLXpiAbtSk0reIPC1c9iRw+MR0GAvw==} + '@nx/nx-linux-x64-musl@21.3.5': + resolution: {integrity: sha512-LtsDUhrH0sVl7gBSsJ+cy/cKH71PorysOhJqTrE7Z5UVpnWu+1djiOsbEDRAheyUf80QfFA8xC239Pi+QG3T/w==} cpu: [x64] os: [linux] - '@nx/nx-win32-arm64-msvc@21.3.1': - resolution: {integrity: sha512-mkV6HERTtP2uY6aq0AhxbkL6KSsvomobPOypdEdrnfUsc2Rvd+U/pWl/flZHFkk8V6aXzEG56lWCZqXVyGUD1Q==} + '@nx/nx-win32-arm64-msvc@21.3.5': + resolution: {integrity: sha512-lmhzLTVXzQNa0em6v0gBCfswpD5vdgtcjUxr5flR6ylWYo0hVYD4w/EqoymqXq0rU94lx28lksmKX0vhNH5aiw==} cpu: [arm64] os: [win32] - '@nx/nx-win32-x64-msvc@21.3.1': - resolution: {integrity: sha512-9cQZDiLT9bD1ixZ+WwNHVPRrxuszGHc30xzLzVgQ2l/IwOHJX6oRxMZa1IfgUYv846K0TSKWis+S41tcxUy80Q==} + '@nx/nx-win32-x64-msvc@21.3.5': + resolution: {integrity: sha512-8ljAlmV96WUK7NbXCL96HDxP7Qm6MDKgz/8mD4XtMJIWvZ098VDv4+1Ce2lK366grQRmNQfYVUuhwPppnJfqug==} cpu: [x64] os: [win32] @@ -1095,28 +1099,28 @@ packages: peerDependencies: '@rsbuild/core': 1.x - '@rsdoctor/client@1.1.8': - resolution: {integrity: sha512-TSNF2EI6x5bGojBExY6W0zHeG/FZ48JSkU5TWvGII7MWcvjNloQa7roIKbTUh6YU6N4AhUd3pJqXKrfEusodzA==} + '@rsdoctor/client@1.1.10': + resolution: {integrity: sha512-0UHvH1VEumODIJ7RaC0mlD+gUa4kOSq1U1V/Bd3FFjOB2Hwmkd0oLaEn+UgaruggFI2TnZ0/9Aw/2kvLo5HMXw==} - '@rsdoctor/core@1.1.8': - resolution: {integrity: sha512-VA8A9cYKObTq+MevFaAuFRaN5IDy9q5/QbscmZbjWcboozQ4WXhn0qATtZrTzEXiAc/TrvzPd18l2PtPdP3icw==} + '@rsdoctor/core@1.1.10': + resolution: {integrity: sha512-U62AzC8ejQYdjMjupLM6cQ7+bLp1vcqWR8QOcHM1lACK42lrgM/uzaH5KElBGOHReu7ZxADEzs2dWP0Pdl9H1Q==} - '@rsdoctor/graph@1.1.8': - resolution: {integrity: sha512-tAoiLLA3D+txIQNUj+k7z6xrtHJmXEh5Lk//daWKWz6gbL5QO1LC/bpiTXHNX3WAXEu0zz/wG3kVOoY+LtKjVg==} + '@rsdoctor/graph@1.1.10': + resolution: {integrity: sha512-DdVyEH9VMbg4wWkIByb4EtzchVBhxKunz9LBx2lWZYUXxqaK4iUbB6JP6e8+kQ8zUp7/3gtoMs3hb2eWExeExg==} - '@rsdoctor/rspack-plugin@1.1.8': - resolution: {integrity: sha512-DY2s03s3+31tAiLeAle+BQDPAC+SLIkBLmPGcubqgwKr2AVcSXCyUt7BLE3WLf4sc+JChrZ6FJlkhd2IW4/69A==} + '@rsdoctor/rspack-plugin@1.1.10': + resolution: {integrity: sha512-rQSuCXuV0Jn/ykduAD1WdHU4K9CkDAsV1AhGWfkyWFQ+ebREPVwn7zSfuQMQXMpMOCAOfeg0nmYhg8nv8RWVhQ==} peerDependencies: '@rspack/core': '*' peerDependenciesMeta: '@rspack/core': optional: true - '@rsdoctor/sdk@1.1.8': - resolution: {integrity: sha512-6RrCPuMpmz3Yk5HWkgIFvqkHBhGkgTDWFtq9/0BRdzQfFGfyZ6S+YVGbc5c3h1epQzYX6WHQPPlkWVJsNVAYyQ==} + '@rsdoctor/sdk@1.1.10': + resolution: {integrity: sha512-uOkiYPhY/yD+x8pA/5BJaMAakwQL4GZ0mRXDT8hZLNeBfPuxHdAa3ClGk6F/igK3V3kshMMtPkritB+yhGVlGw==} - '@rsdoctor/types@1.1.8': - resolution: {integrity: sha512-P5wJB1/kaOb7RNYoI0F/jSkcxr3E1+PhZKAZ4tvUZ7zP1zsOoZ8W9oIhAr23PYpS+0s5FLWrUBmRkmgCGPBUkg==} + '@rsdoctor/types@1.1.10': + resolution: {integrity: sha512-J2smkLITa0EIXJfQ7QGoaPFFVkhsuIRjVOEvBTNvuzatcM9mtg0HM+h4uH4evSEw2crMy6S1Bnp3/vCwh1JVKg==} peerDependencies: '@rspack/core': '*' webpack: 5.x @@ -1126,8 +1130,8 @@ packages: webpack: optional: true - '@rsdoctor/utils@1.1.8': - resolution: {integrity: sha512-t8OWc9cDJHaiHDWunWBYjAJnBBZ+q0XgQfWkHJHRtF+MPf4RpZCQtNiu7WwZOXquKNu+3fY+otOJtnHnlRtvww==} + '@rsdoctor/utils@1.1.10': + resolution: {integrity: sha512-VdKGPOHVvQZZ06lhQG4Xru8gqlCcDb2tzUGrZNuXCnzyAjed3H3zWF0+R0ZYX1xXFdhwdV+cr8/rJU/xFMWkxA==} '@rslib/core@0.11.0': resolution: {integrity: sha512-ku5Qs3sSBZSmUVRQHM0JG2ZHXmw7aGvxmf0fseUjYWCAWzuBvTeXcthO2eCYKlYvYOIZBQH4QO1eVgz6fWfPkw==} @@ -1293,8 +1297,8 @@ packages: '@rstack-dev/doc-ui@1.10.8': resolution: {integrity: sha512-F/v0XzRI1ZIAzBBLx91um4TLMIUWw3LiQsPXtZe8ZAF6wQUVk47YPK/kB1VPkLLaD214JrwWq+L6P7UnD8MT7A==} - '@rushstack/node-core-library@5.13.1': - resolution: {integrity: sha512-5yXhzPFGEkVc9Fu92wsNJ9jlvdwz4RNb2bMso+/+TH0nMm1jDDDsOIf4l8GAkPxGuwPw5DH24RliWVfSPhlW/Q==} + '@rushstack/node-core-library@5.14.0': + resolution: {integrity: sha512-eRong84/rwQUlATGFW3TMTYVyqL1vfW9Lf10PH+mVGfIb9HzU3h5AASNIw+axnBLjnD0n3rT5uQBwu9fvzATrg==} peerDependencies: '@types/node': '*' peerDependenciesMeta: @@ -1304,16 +1308,16 @@ packages: '@rushstack/rig-package@0.5.3': resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==} - '@rushstack/terminal@0.15.3': - resolution: {integrity: sha512-DGJ0B2Vm69468kZCJkPj3AH5nN+nR9SPmC0rFHtzsS4lBQ7/dgOwtwVxYP7W9JPDMuRBkJ4KHmWKr036eJsj9g==} + '@rushstack/terminal@0.15.4': + resolution: {integrity: sha512-OQSThV0itlwVNHV6thoXiAYZlQh4Fgvie2CzxFABsbO2MWQsI4zOh3LRNigYSTrmS+ba2j0B3EObakPzf/x6Zg==} peerDependencies: '@types/node': '*' peerDependenciesMeta: '@types/node': optional: true - '@rushstack/ts-command-line@5.0.1': - resolution: {integrity: sha512-bsbUucn41UXrQK7wgM8CNM/jagBytEyJqXw/umtI8d68vFm1Jwxh1OtLrlW7uGZgjCWiiPH6ooUNa1aVsuVr3Q==} + '@rushstack/ts-command-line@5.0.2': + resolution: {integrity: sha512-+AkJDbu1GFMPIU8Sb7TLVXDv/Q7Mkvx+wAjEl8XiXVVq+p1FmWW6M3LYpJMmoHNckSofeMecgWg5lfMwNAAsEQ==} '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} @@ -1572,34 +1576,34 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@vue/compiler-core@3.5.17': - resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} + '@vue/compiler-core@3.5.18': + resolution: {integrity: sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==} - '@vue/compiler-dom@3.5.17': - resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} + '@vue/compiler-dom@3.5.18': + resolution: {integrity: sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==} - '@vue/compiler-sfc@3.5.17': - resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} + '@vue/compiler-sfc@3.5.18': + resolution: {integrity: sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==} - '@vue/compiler-ssr@3.5.17': - resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} + '@vue/compiler-ssr@3.5.18': + resolution: {integrity: sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==} - '@vue/reactivity@3.5.17': - resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==} + '@vue/reactivity@3.5.18': + resolution: {integrity: sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==} - '@vue/runtime-core@3.5.17': - resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==} + '@vue/runtime-core@3.5.18': + resolution: {integrity: sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==} - '@vue/runtime-dom@3.5.17': - resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==} + '@vue/runtime-dom@3.5.18': + resolution: {integrity: sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==} - '@vue/server-renderer@3.5.17': - resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==} + '@vue/server-renderer@3.5.18': + resolution: {integrity: sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==} peerDependencies: - vue: 3.5.17 + vue: 3.5.18 - '@vue/shared@3.5.17': - resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} + '@vue/shared@3.5.18': + resolution: {integrity: sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==} '@vue/test-utils@2.4.6': resolution: {integrity: sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==} @@ -2777,8 +2781,8 @@ packages: resolution: {integrity: sha512-Q1TAV0cUcBTic57SVnk/mug0/ASyAqtSIOkr7RAlxx97llRYsM74+E8N5WdGJUlwCKwgxPAkVjKh653h1+HA9A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - jest-diff@30.0.4: - resolution: {integrity: sha512-TSjceIf6797jyd+R64NXqicttROD+Qf98fex7CowmlSn7f8+En0da1Dglwr1AXxDtVizoxXYZBlUQwNhoOXkNw==} + jest-diff@30.0.5: + resolution: {integrity: sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} jest-image-snapshot@6.5.1: @@ -3245,8 +3249,8 @@ packages: nwsapi@2.2.20: resolution: {integrity: sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==} - nx@21.3.1: - resolution: {integrity: sha512-lOMDktM4CUcVa/yUmiAXGNxbNo6SC0T8/alRml1sgaOG1QHUpH6XyA1/nR4M3DNjlmON4wD06pZQUDKFb8kd8w==} + nx@21.3.5: + resolution: {integrity: sha512-iRAO7D7SkjhIM6y5xH8GO+ojTJB2QSIzG2xNBgbRwuTV6AxLBkq6sU5hFA0wNzD/LncUeEoJmRtHfbGXfQQORQ==} hasBin: true peerDependencies: '@swc-node/register': ^1.8.0 @@ -3440,6 +3444,10 @@ packages: resolution: {integrity: sha512-yC5/EBSOrTtqhCKfLHqoUIAXVRZnukHPwWBJWR7h84Q3Be1DRQZLncwcfLoPA5RPQ65qfiCMqgYwdUuQ//eVpg==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + pretty-format@30.0.5: + resolution: {integrity: sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==} + engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} + property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} @@ -4262,8 +4270,8 @@ packages: vue: optional: true - vue@3.5.17: - resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==} + vue@3.5.18: + resolution: {integrity: sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -4928,6 +4936,10 @@ snapshots: dependencies: '@sinclair/typebox': 0.34.33 + '@jest/schemas@30.0.5': + dependencies: + '@sinclair/typebox': 0.34.33 + '@jest/types@30.0.1': dependencies: '@jest/pattern': 30.0.1 @@ -5041,23 +5053,23 @@ snapshots: '@types/react': 19.1.8 react: 19.1.0 - '@microsoft/api-extractor-model@7.30.6(@types/node@22.13.8)': + '@microsoft/api-extractor-model@7.30.7(@types/node@22.13.8)': dependencies: '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1(@types/node@22.13.8) + '@rushstack/node-core-library': 5.14.0(@types/node@22.13.8) transitivePeerDependencies: - '@types/node' - '@microsoft/api-extractor@7.52.8(@types/node@22.13.8)': + '@microsoft/api-extractor@7.52.9(@types/node@22.13.8)': dependencies: - '@microsoft/api-extractor-model': 7.30.6(@types/node@22.13.8) + '@microsoft/api-extractor-model': 7.30.7(@types/node@22.13.8) '@microsoft/tsdoc': 0.15.1 '@microsoft/tsdoc-config': 0.17.1 - '@rushstack/node-core-library': 5.13.1(@types/node@22.13.8) + '@rushstack/node-core-library': 5.14.0(@types/node@22.13.8) '@rushstack/rig-package': 0.5.3 - '@rushstack/terminal': 0.15.3(@types/node@22.13.8) - '@rushstack/ts-command-line': 5.0.1(@types/node@22.13.8) + '@rushstack/terminal': 0.15.4(@types/node@22.13.8) + '@rushstack/ts-command-line': 5.0.2(@types/node@22.13.8) lodash: 4.17.21 minimatch: 3.0.8 resolve: 1.22.10 @@ -5126,34 +5138,34 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 - '@nx/nx-darwin-arm64@21.3.1': + '@nx/nx-darwin-arm64@21.3.5': optional: true - '@nx/nx-darwin-x64@21.3.1': + '@nx/nx-darwin-x64@21.3.5': optional: true - '@nx/nx-freebsd-x64@21.3.1': + '@nx/nx-freebsd-x64@21.3.5': optional: true - '@nx/nx-linux-arm-gnueabihf@21.3.1': + '@nx/nx-linux-arm-gnueabihf@21.3.5': optional: true - '@nx/nx-linux-arm64-gnu@21.3.1': + '@nx/nx-linux-arm64-gnu@21.3.5': optional: true - '@nx/nx-linux-arm64-musl@21.3.1': + '@nx/nx-linux-arm64-musl@21.3.5': optional: true - '@nx/nx-linux-x64-gnu@21.3.1': + '@nx/nx-linux-x64-gnu@21.3.5': optional: true - '@nx/nx-linux-x64-musl@21.3.1': + '@nx/nx-linux-x64-musl@21.3.5': optional: true - '@nx/nx-win32-arm64-msvc@21.3.1': + '@nx/nx-win32-arm64-msvc@21.3.5': optional: true - '@nx/nx-win32-x64-msvc@21.3.1': + '@nx/nx-win32-x64-msvc@21.3.5': optional: true '@one-ini/wasm@0.1.1': {} @@ -5227,10 +5239,10 @@ snapshots: - '@babel/core' - supports-color - '@rsbuild/plugin-vue@1.1.0(@rsbuild/core@1.4.9)(vue@3.5.17(typescript@5.8.3))': + '@rsbuild/plugin-vue@1.1.0(@rsbuild/core@1.4.9)(vue@3.5.18(typescript@5.8.3))': dependencies: '@rsbuild/core': 1.4.9 - vue-loader: 17.4.2(vue@3.5.17(typescript@5.8.3))(webpack@5.99.9) + vue-loader: 17.4.2(vue@3.5.18(typescript@5.8.3))(webpack@5.99.9) webpack: 5.99.9 transitivePeerDependencies: - '@swc/core' @@ -5240,15 +5252,15 @@ snapshots: - vue - webpack-cli - '@rsdoctor/client@1.1.8': {} + '@rsdoctor/client@1.1.10': {} - '@rsdoctor/core@1.1.8(@rsbuild/core@1.4.9)(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': + '@rsdoctor/core@1.1.10(@rsbuild/core@1.4.9)(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': dependencies: '@rsbuild/plugin-check-syntax': 1.3.0(@rsbuild/core@1.4.9) - '@rsdoctor/graph': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/sdk': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/types': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/utils': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/graph': 1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/sdk': 1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/types': 1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/utils': 1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) axios: 1.11.0 browserslist-load-config: 1.0.0 enhanced-resolve: 5.12.0 @@ -5268,10 +5280,10 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/graph@1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': + '@rsdoctor/graph@1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': dependencies: - '@rsdoctor/types': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/utils': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/types': 1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/utils': 1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) lodash.unionby: 4.8.0 socket.io: 4.8.1 source-map: 0.7.4 @@ -5282,13 +5294,13 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/rspack-plugin@1.1.8(@rsbuild/core@1.4.9)(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': + '@rsdoctor/rspack-plugin@1.1.10(@rsbuild/core@1.4.9)(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': dependencies: - '@rsdoctor/core': 1.1.8(@rsbuild/core@1.4.9)(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/graph': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/sdk': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/types': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/utils': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/core': 1.1.10(@rsbuild/core@1.4.9)(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/graph': 1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/sdk': 1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/types': 1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/utils': 1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) lodash: 4.17.21 optionalDependencies: '@rspack/core': 1.4.9(@swc/helpers@0.5.17) @@ -5300,12 +5312,12 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/sdk@1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': + '@rsdoctor/sdk@1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': dependencies: - '@rsdoctor/client': 1.1.8 - '@rsdoctor/graph': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/types': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) - '@rsdoctor/utils': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/client': 1.1.10 + '@rsdoctor/graph': 1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/types': 1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/utils': 1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) '@types/fs-extra': 11.0.4 body-parser: 1.20.3 cors: 2.8.5 @@ -5325,7 +5337,7 @@ snapshots: - utf-8-validate - webpack - '@rsdoctor/types@1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': + '@rsdoctor/types@1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': dependencies: '@types/connect': 3.4.38 '@types/estree': 1.0.5 @@ -5335,10 +5347,10 @@ snapshots: '@rspack/core': 1.4.9(@swc/helpers@0.5.17) webpack: 5.99.9 - '@rsdoctor/utils@1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': + '@rsdoctor/utils@1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9)': dependencies: '@babel/code-frame': 7.26.2 - '@rsdoctor/types': 1.1.8(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) + '@rsdoctor/types': 1.1.10(@rspack/core@1.4.9(@swc/helpers@0.5.17))(webpack@5.99.9) '@types/estree': 1.0.5 acorn: 8.14.1 acorn-import-attributes: 1.9.5(acorn@8.14.1) @@ -5359,13 +5371,13 @@ snapshots: - supports-color - webpack - '@rslib/core@0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(typescript@5.8.3)': + '@rslib/core@0.11.0(@microsoft/api-extractor@7.52.9(@types/node@22.13.8))(typescript@5.8.3)': dependencies: '@rsbuild/core': 1.4.9 - rsbuild-plugin-dts: 0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(@rsbuild/core@1.4.9)(typescript@5.8.3) + rsbuild-plugin-dts: 0.11.0(@microsoft/api-extractor@7.52.9(@types/node@22.13.8))(@rsbuild/core@1.4.9)(typescript@5.8.3) tinyglobby: 0.2.14 optionalDependencies: - '@microsoft/api-extractor': 7.52.8(@types/node@22.13.8) + '@microsoft/api-extractor': 7.52.9(@types/node@22.13.8) typescript: 5.8.3 '@rspack/binding-darwin-arm64@1.4.9': @@ -5566,7 +5578,7 @@ snapshots: - react - react-dom - '@rushstack/node-core-library@5.13.1(@types/node@22.13.8)': + '@rushstack/node-core-library@5.14.0(@types/node@22.13.8)': dependencies: ajv: 8.13.0 ajv-draft-04: 1.0.0(ajv@8.13.0) @@ -5584,16 +5596,16 @@ snapshots: resolve: 1.22.10 strip-json-comments: 3.1.1 - '@rushstack/terminal@0.15.3(@types/node@22.13.8)': + '@rushstack/terminal@0.15.4(@types/node@22.13.8)': dependencies: - '@rushstack/node-core-library': 5.13.1(@types/node@22.13.8) + '@rushstack/node-core-library': 5.14.0(@types/node@22.13.8) supports-color: 8.1.1 optionalDependencies: '@types/node': 22.13.8 - '@rushstack/ts-command-line@5.0.1(@types/node@22.13.8)': + '@rushstack/ts-command-line@5.0.2(@types/node@22.13.8)': dependencies: - '@rushstack/terminal': 0.15.3(@types/node@22.13.8) + '@rushstack/terminal': 0.15.4(@types/node@22.13.8) '@types/argparse': 1.0.38 argparse: 1.0.10 string-argv: 0.3.2 @@ -5796,7 +5808,7 @@ snapshots: '@types/jest@30.0.0': dependencies: expect: 30.0.3 - pretty-format: 30.0.2 + pretty-format: 30.0.5 '@types/js-yaml@4.0.9': {} @@ -5915,7 +5927,7 @@ snapshots: '@babel/types': 7.28.0 '@vue/babel-helper-vue-transform-on': 1.4.0 '@vue/babel-plugin-resolve-type': 1.4.0(@babel/core@7.28.0) - '@vue/shared': 3.5.17 + '@vue/shared': 3.5.18 optionalDependencies: '@babel/core': 7.28.0 transitivePeerDependencies: @@ -5928,70 +5940,70 @@ snapshots: '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 '@babel/parser': 7.28.0 - '@vue/compiler-sfc': 3.5.17 + '@vue/compiler-sfc': 3.5.18 transitivePeerDependencies: - supports-color - '@vue/compiler-core@3.5.17': + '@vue/compiler-core@3.5.18': dependencies: '@babel/parser': 7.28.0 - '@vue/shared': 3.5.17 + '@vue/shared': 3.5.18 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.17': + '@vue/compiler-dom@3.5.18': dependencies: - '@vue/compiler-core': 3.5.17 - '@vue/shared': 3.5.17 + '@vue/compiler-core': 3.5.18 + '@vue/shared': 3.5.18 - '@vue/compiler-sfc@3.5.17': + '@vue/compiler-sfc@3.5.18': dependencies: '@babel/parser': 7.28.0 - '@vue/compiler-core': 3.5.17 - '@vue/compiler-dom': 3.5.17 - '@vue/compiler-ssr': 3.5.17 - '@vue/shared': 3.5.17 + '@vue/compiler-core': 3.5.18 + '@vue/compiler-dom': 3.5.18 + '@vue/compiler-ssr': 3.5.18 + '@vue/shared': 3.5.18 estree-walker: 2.0.2 magic-string: 0.30.17 postcss: 8.5.6 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.17': + '@vue/compiler-ssr@3.5.18': dependencies: - '@vue/compiler-dom': 3.5.17 - '@vue/shared': 3.5.17 + '@vue/compiler-dom': 3.5.18 + '@vue/shared': 3.5.18 - '@vue/reactivity@3.5.17': + '@vue/reactivity@3.5.18': dependencies: - '@vue/shared': 3.5.17 + '@vue/shared': 3.5.18 - '@vue/runtime-core@3.5.17': + '@vue/runtime-core@3.5.18': dependencies: - '@vue/reactivity': 3.5.17 - '@vue/shared': 3.5.17 + '@vue/reactivity': 3.5.18 + '@vue/shared': 3.5.18 - '@vue/runtime-dom@3.5.17': + '@vue/runtime-dom@3.5.18': dependencies: - '@vue/reactivity': 3.5.17 - '@vue/runtime-core': 3.5.17 - '@vue/shared': 3.5.17 + '@vue/reactivity': 3.5.18 + '@vue/runtime-core': 3.5.18 + '@vue/shared': 3.5.18 csstype: 3.1.3 - '@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.8.3))': + '@vue/server-renderer@3.5.18(vue@3.5.18(typescript@5.8.3))': dependencies: - '@vue/compiler-ssr': 3.5.17 - '@vue/shared': 3.5.17 - vue: 3.5.17(typescript@5.8.3) + '@vue/compiler-ssr': 3.5.18 + '@vue/shared': 3.5.18 + vue: 3.5.18(typescript@5.8.3) - '@vue/shared@3.5.17': {} + '@vue/shared@3.5.18': {} - '@vue/test-utils@2.4.6(@vue/compiler-dom@3.5.17)(@vue/server-renderer@3.5.17(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))': + '@vue/test-utils@2.4.6(@vue/compiler-dom@3.5.18)(@vue/server-renderer@3.5.18(vue@3.5.18(typescript@5.8.3)))(vue@3.5.18(typescript@5.8.3))': dependencies: - '@vue/compiler-dom': 3.5.17 - '@vue/server-renderer': 3.5.17(vue@3.5.17(typescript@5.8.3)) + '@vue/compiler-dom': 3.5.18 + '@vue/server-renderer': 3.5.18(vue@3.5.18(typescript@5.8.3)) js-beautify: 1.15.4 - vue: 3.5.17(typescript@5.8.3) + vue: 3.5.18(typescript@5.8.3) vue-component-type-helpers: 2.2.12 '@webassemblyjs/ast@1.14.1': @@ -7244,12 +7256,12 @@ snapshots: chalk: 4.1.2 pretty-format: 30.0.2 - jest-diff@30.0.4: + jest-diff@30.0.5: dependencies: '@jest/diff-sequences': 30.0.1 '@jest/get-type': 30.0.1 chalk: 4.1.2 - pretty-format: 30.0.2 + pretty-format: 30.0.5 jest-image-snapshot@6.5.1: dependencies: @@ -7965,7 +7977,7 @@ snapshots: nwsapi@2.2.20: {} - nx@21.3.1: + nx@21.3.5: dependencies: '@napi-rs/wasm-runtime': 0.2.4 '@yarnpkg/lockfile': 1.1.0 @@ -7983,7 +7995,7 @@ snapshots: flat: 5.0.2 front-matter: 4.0.2 ignore: 5.3.2 - jest-diff: 30.0.4 + jest-diff: 30.0.5 jsonc-parser: 3.2.0 lines-and-columns: 2.0.3 minimatch: 9.0.3 @@ -8003,16 +8015,16 @@ snapshots: yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 21.3.1 - '@nx/nx-darwin-x64': 21.3.1 - '@nx/nx-freebsd-x64': 21.3.1 - '@nx/nx-linux-arm-gnueabihf': 21.3.1 - '@nx/nx-linux-arm64-gnu': 21.3.1 - '@nx/nx-linux-arm64-musl': 21.3.1 - '@nx/nx-linux-x64-gnu': 21.3.1 - '@nx/nx-linux-x64-musl': 21.3.1 - '@nx/nx-win32-arm64-msvc': 21.3.1 - '@nx/nx-win32-x64-msvc': 21.3.1 + '@nx/nx-darwin-arm64': 21.3.5 + '@nx/nx-darwin-x64': 21.3.5 + '@nx/nx-freebsd-x64': 21.3.5 + '@nx/nx-linux-arm-gnueabihf': 21.3.5 + '@nx/nx-linux-arm64-gnu': 21.3.5 + '@nx/nx-linux-arm64-musl': 21.3.5 + '@nx/nx-linux-x64-gnu': 21.3.5 + '@nx/nx-linux-x64-musl': 21.3.5 + '@nx/nx-win32-arm64-msvc': 21.3.5 + '@nx/nx-win32-x64-msvc': 21.3.5 transitivePeerDependencies: - debug @@ -8180,6 +8192,12 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-format@30.0.5: + dependencies: + '@jest/schemas': 30.0.5 + ansi-styles: 5.2.0 + react-is: 18.3.1 + property-information@6.5.0: {} property-information@7.1.0: {} @@ -8404,7 +8422,7 @@ snapshots: rrweb-cssom@0.8.0: {} - rsbuild-plugin-dts@0.11.0(@microsoft/api-extractor@7.52.8(@types/node@22.13.8))(@rsbuild/core@1.4.9)(typescript@5.8.3): + rsbuild-plugin-dts@0.11.0(@microsoft/api-extractor@7.52.9(@types/node@22.13.8))(@rsbuild/core@1.4.9)(typescript@5.8.3): dependencies: '@ast-grep/napi': 0.37.0 '@rsbuild/core': 1.4.9 @@ -8413,7 +8431,7 @@ snapshots: tinyglobby: 0.2.14 tsconfig-paths: 4.2.0 optionalDependencies: - '@microsoft/api-extractor': 7.52.8(@types/node@22.13.8) + '@microsoft/api-extractor': 7.52.9(@types/node@22.13.8) typescript: 5.8.3 rsbuild-plugin-google-analytics@1.0.3(@rsbuild/core@1.4.9): @@ -8993,22 +9011,22 @@ snapshots: vue-component-type-helpers@2.2.12: {} - vue-loader@17.4.2(vue@3.5.17(typescript@5.8.3))(webpack@5.99.9): + vue-loader@17.4.2(vue@3.5.18(typescript@5.8.3))(webpack@5.99.9): dependencies: chalk: 4.1.2 hash-sum: 2.0.0 watchpack: 2.4.4 webpack: 5.99.9 optionalDependencies: - vue: 3.5.17(typescript@5.8.3) + vue: 3.5.18(typescript@5.8.3) - vue@3.5.17(typescript@5.8.3): + vue@3.5.18(typescript@5.8.3): dependencies: - '@vue/compiler-dom': 3.5.17 - '@vue/compiler-sfc': 3.5.17 - '@vue/runtime-dom': 3.5.17 - '@vue/server-renderer': 3.5.17(vue@3.5.17(typescript@5.8.3)) - '@vue/shared': 3.5.17 + '@vue/compiler-dom': 3.5.18 + '@vue/compiler-sfc': 3.5.18 + '@vue/runtime-dom': 3.5.18 + '@vue/server-renderer': 3.5.18(vue@3.5.18(typescript@5.8.3)) + '@vue/shared': 3.5.18 optionalDependencies: typescript: 5.8.3 diff --git a/tests/package.json b/tests/package.json index 2ed780ba..866ec908 100644 --- a/tests/package.json +++ b/tests/package.json @@ -12,7 +12,7 @@ "@rstest/core": "workspace:*", "@rstest/tsconfig": "workspace:*", "@types/jest-image-snapshot": "^6.4.0", - "axios": "^1.10.0", + "axios": "^1.11.0", "jest-image-snapshot": "^6.5.1", "memfs": "^4.17.2", "pathe": "^2.0.3", diff --git a/tests/vue/fixtures/package.json b/tests/vue/fixtures/package.json index 161f9e11..a6dcc762 100644 --- a/tests/vue/fixtures/package.json +++ b/tests/vue/fixtures/package.json @@ -8,7 +8,7 @@ "preview": "rsbuild preview" }, "dependencies": { - "vue": "^3.5.17" + "vue": "^3.5.18" }, "devDependencies": { "@rstest/core": "workspace:*", @@ -17,7 +17,7 @@ "@rsbuild/plugin-vue": "^1.1.0", "@rsbuild/plugin-vue-jsx": "^1.1.0", "@vue/test-utils": "^2.4.6", - "@vue/compiler-dom": "^3.5.17", - "@vue/server-renderer": "^3.5.17" + "@vue/compiler-dom": "^3.5.18", + "@vue/server-renderer": "^3.5.18" } } From 32d29d67dc68d0d1a2f74c8566ba2023f968f05c Mon Sep 17 00:00:00 2001 From: 9aoy Date: Thu, 24 Jul 2025 15:20:14 +0800 Subject: [PATCH 14/16] fix: allows importing TS files with `.js` extension (#417) --- packages/core/src/core/plugins/basic.ts | 5 +++++ .../core/__snapshots__/rsbuild.test.ts.snap | 22 +++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/packages/core/src/core/plugins/basic.ts b/packages/core/src/core/plugins/basic.ts index 0fc75299..1937244a 100644 --- a/packages/core/src/core/plugins/basic.ts +++ b/packages/core/src/core/plugins/basic.ts @@ -71,6 +71,11 @@ export const pluginBasic: (context: RstestContext) => RsbuildPlugin = ( config.resolve.extensions ??= []; config.resolve.extensions.push('.cjs'); + // TypeScript allows importing TS files with `.js` extension + config.resolve.extensionAlias ??= {}; + config.resolve.extensionAlias['.js'] = ['.js', '.ts', '.tsx']; + config.resolve.extensionAlias['.jsx'] = ['.jsx', '.tsx']; + if (context.normalizedConfig.testEnvironment === 'node') { // skip `module` field in Node.js environment. // ESM module resolved by module field is not always a native ESM module diff --git a/packages/core/tests/core/__snapshots__/rsbuild.test.ts.snap b/packages/core/tests/core/__snapshots__/rsbuild.test.ts.snap index 38e0ee0f..f44b683f 100644 --- a/packages/core/tests/core/__snapshots__/rsbuild.test.ts.snap +++ b/packages/core/tests/core/__snapshots__/rsbuild.test.ts.snap @@ -472,6 +472,17 @@ exports[`prepareRsbuild > should generate rspack config correctly (jsdom) 1`] = ], }, }, + "extensionAlias": { + ".js": [ + ".js", + ".ts", + ".tsx", + ], + ".jsx": [ + ".jsx", + ".tsx", + ], + }, "extensions": [ ".ts", ".tsx", @@ -952,6 +963,17 @@ exports[`prepareRsbuild > should generate rspack config correctly (node) 1`] = ` ], }, }, + "extensionAlias": { + ".js": [ + ".js", + ".ts", + ".tsx", + ], + ".jsx": [ + ".jsx", + ".tsx", + ], + }, "extensions": [ ".ts", ".tsx", From 6e81e17a59b92636cc69dbd5cc95325f8a4fd8d9 Mon Sep 17 00:00:00 2001 From: Wei Date: Thu, 24 Jul 2025 15:43:52 +0800 Subject: [PATCH 15/16] feat(mock): mock and doMock support typed first arg (#418) Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- packages/core/src/types/mock.ts | 23 +++++++------- tests/mock/src/b.ts | 2 +- tests/mock/src/c.ts | 2 +- tests/mock/src/d.ts | 2 +- tests/mock/tests/mockTypedArg.test.ts | 35 ++++++++++++++++++++++ website/docs/en/api/rstest/mockModules.mdx | 15 ++++++++-- website/docs/zh/api/rstest/mockModules.mdx | 15 ++++++++-- 7 files changed, 76 insertions(+), 18 deletions(-) create mode 100644 tests/mock/tests/mockTypedArg.test.ts diff --git a/packages/core/src/types/mock.ts b/packages/core/src/types/mock.ts index 058606dd..2b93ef07 100644 --- a/packages/core/src/types/mock.ts +++ b/packages/core/src/types/mock.ts @@ -1,5 +1,5 @@ import type { FakeTimerInstallOpts } from '@sinonjs/fake-timers'; -import type { FunctionLike } from './utils'; +import type { FunctionLike, MaybePromise } from './utils'; import type { RuntimeConfig } from './worker'; interface MockResultReturn { @@ -172,8 +172,9 @@ export interface Mock } export type MockFn = (fn?: T) => Mock; +type MockFactory = () => MaybePromise>; -export type RstestUtilities = { +export interface RstestUtilities { /** * Creates a spy on a function. */ @@ -208,10 +209,10 @@ export type RstestUtilities = { /** * Mock a module */ - mock: ( - moduleName: string, - moduleFactory?: () => T | Promise, - ) => void; + mock( + moduleName: string | Promise, + moduleFactory?: MockFactory, + ): void; /** * Mock a module @@ -224,10 +225,10 @@ export type RstestUtilities = { /** * Mock a module, not hoisted. */ - doMock: ( - moduleName: string, - moduleFactory?: () => T | Promise, - ) => void; + doMock( + moduleName: string | Promise, + moduleFactory?: MockFactory, + ): void; /** * Mock a module, not hoisted. @@ -337,4 +338,4 @@ export type RstestUtilities = { * Removes all timers that are scheduled to run. */ clearAllTimers: () => RstestUtilities; -}; +} diff --git a/tests/mock/src/b.ts b/tests/mock/src/b.ts index 20210308..008075c5 100644 --- a/tests/mock/src/b.ts +++ b/tests/mock/src/b.ts @@ -1 +1 @@ -export const b = 2; +export const b: number = 2; diff --git a/tests/mock/src/c.ts b/tests/mock/src/c.ts index 5f0cabef..e5ac4865 100644 --- a/tests/mock/src/c.ts +++ b/tests/mock/src/c.ts @@ -1 +1 @@ -export const c = 3; +export const c: number = 3; diff --git a/tests/mock/src/d.ts b/tests/mock/src/d.ts index 88dcd403..6b464fc5 100644 --- a/tests/mock/src/d.ts +++ b/tests/mock/src/d.ts @@ -1 +1 @@ -export const d = 4; +export const d: number = 4; diff --git a/tests/mock/tests/mockTypedArg.test.ts b/tests/mock/tests/mockTypedArg.test.ts new file mode 100644 index 00000000..b19c73d4 --- /dev/null +++ b/tests/mock/tests/mockTypedArg.test.ts @@ -0,0 +1,35 @@ +import { expect, it, rs } from '@rstest/core'; +import { b } from '../src/b'; +import { d } from '../src/d'; + +// b +rs.mock(import('../src/b'), async () => { + return { + b: 222, + }; +}); + +it('mocked b', async () => { + expect(b).toBe(222); +}); + +// c +it('mocked c', async () => { + rs.doMock(import('../src/c'), () => { + return { c: 333 }; + }); + + const { c } = await import('../src/c'); + expect(c).toBe(333); +}); + +// d +rs.mock<{ d: number }>('../src/d', async () => { + return { + d: 444, + }; +}); + +it('mocked d', async () => { + expect(d).toBe(444); +}); diff --git a/website/docs/en/api/rstest/mockModules.mdx b/website/docs/en/api/rstest/mockModules.mdx index 06cd80ae..6c77d4b0 100644 --- a/website/docs/en/api/rstest/mockModules.mdx +++ b/website/docs/en/api/rstest/mockModules.mdx @@ -8,7 +8,7 @@ Rstest supports mocking modules, which allows you to replace the implementation ## rs.mock -- **Type**: `(moduleName: string, moduleFactory?: () => T) => void` +- **Type**: `(moduleName: string | Promise, moduleFactory?: (() => Promise> | Partial)) => void` When calling `rs.mock`, Rstest will mock and replace the module specified in the first parameter. `rs.mock` will determine how to handle the mocked module based on whether a second mock factory function is provided, as explained in detail below. @@ -77,9 +77,20 @@ Based on the second parameter provided, `rs.mock` has two behaviors: lodash.random(multiple(1, 2), multiple(3, 4)); ``` + `rs.mock` and `rs.doMock` also support passing a `Promise` as the first parameter, and use the type `T` as the return value type of the second factory function after awaiting (`Promise`). This provides better type hints in IDEs and type validation for the factory function's return value. Passing `Promise` only enhances type hints and has no impact on the module mocking capabilities. + + ```ts + // Compared to rs.mock('../src/b', ...) the type is enhanced. + rs.mock(import('../src/b'), async () => { + return { + b: 222, + }; + }); + ``` + ## rs.doMock -- **Type**: `(moduleName: string, moduleFactory?: () => T | Promise) => void` +- **Type**: `(moduleName: string | Promise, moduleFactory?: (() => Promise> | Partial)) => void` Similar to `rs.mock`, `rs.doMock` also mocks modules, but it is not hoisted to the top of the module. It is called when it's executed, which means that if a module has already been imported before calling `rs.doMock`, that module will not be mocked, while modules imported after calling `rs.doMock` will be mocked. diff --git a/website/docs/zh/api/rstest/mockModules.mdx b/website/docs/zh/api/rstest/mockModules.mdx index 90392a1a..6eee774d 100644 --- a/website/docs/zh/api/rstest/mockModules.mdx +++ b/website/docs/zh/api/rstest/mockModules.mdx @@ -8,7 +8,7 @@ Rstest 支持对模块进行 mock,这使得你可以在测试中替换模块 ## rs.mock -- **类型:**: `(moduleName: string, moduleFactory?: () => T | Promise) => void` +- **类型:**: `(moduleName: string | Promise, moduleFactory?: (() => Promise> | Partial)) => void` 调用 `rs.mock` 时,Rstest 会对第一个参数对应的模块进行 mock 替换。`rs.mock` 将根据是否提供了第二个 mock 工厂函数来决定如何处理被 mock 的模块,下面会详细介绍这两种情况。 @@ -77,9 +77,20 @@ Rstest 支持对模块进行 mock,这使得你可以在测试中替换模块 lodash.random(multiple(1, 2), multiple(3, 4)); ``` + `rs.mock` 和 `rs.doMock` 也支持第一个参数传入一个 `Promise`,并将这个 `T` 的类型作为第二个工厂函数 await 后的返回值(`Promise`),这能够让 IDE 获得更好的类型提示,并对工厂函数的返回值做类型校验。传入 `Promise` 除对类型提示有增强外,对 mock 模块能力没有任何影响。 + + ```ts + // Compared to rs.mock('../src/b', ...) the type is enhanced. + rs.mock(import('../src/b'), async () => { + return { + b: 222, + }; + }); + ``` + ## rs.doMock -- **类型:**: `(moduleName: string, moduleFactory?: () => T | Promise) => void` +- **类型:**: `(moduleName: string | Promise, moduleFactory?: (() => Promise> | Partial)) => void` 与 `rs.mock` 类似,`rs.doMock` 也会 mock 模块,但它不会被提升到模块顶部。它会在被执行到时调用,这意味着,如果在调用 `rs.doMock` 之前已经导入了模块,则该模块不会被 mock,而在调用 `rs.doMock` 之后导入的模块会被 mock。 From 6c45a1655a325f909a6333957878f7ec8d3473ca Mon Sep 17 00:00:00 2001 From: 9aoy Date: Thu, 24 Jul 2025 16:32:12 +0800 Subject: [PATCH 16/16] release: 0.0.10 (#419) --- packages/core/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/package.json b/packages/core/package.json index a7ac7629..b58ec062 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@rstest/core", - "version": "0.0.9", + "version": "0.0.10", "description": "The Rsbuild-based test tool.", "bugs": { "url": "https://github.com/web-infra-dev/rstest/issues" pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy