# @cosyte/vitest-config 中文文档

规范地址：https://npmcn.com/package/%40cosyte/vitest-config/

版本：0\.1\.4
npm 元数据更新时间：2026-11-10T11:52:28.745Z
中文译文更新时间：2026-11-10T21:17:25.175Z
软件包许可：MIT

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40cosyte/vitest-config
原文对照：https://npmcn.com/package/%40cosyte/vitest-config/?lang=original
项目主页：https://github.com/cosyte/config/tree/main/packages/vitest-config#readme
源码仓库：https://github.com/cosyte/config

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：94.1 kB，13 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- 运行依赖：0 个
- peer 依赖：vite ^6\.0\.0 \|\| ^7\.0\.0 \|\| ^8\.0\.0，vitest ^4\.0\.0 \|\| ^5\.0\.0，typescript \>=5\.0\.0，@vitest/coverage-v8 ^4\.0\.0 \|\| ^5\.0\.0，@cosyte/script-utils ^0\.1\.9，@stryker-mutator/core ^10\.0\.0，@stryker-mutator/vitest-runner ^10\.0\.0
- 首次发布：2026-06-25T20:33:09.785Z
- 最新版本发布：2026-11-10T11:52:28.307Z
- 近 30 天下载量：5880（2026-10-11 至 2026-11-09，npm 官方下载统计）
- 已发布版本数：9（近 12 个月 9 个）

## 中文简介

共享 Vitest 配置(v8 覆盖度,每部目录为 QQ90 门) 和 StrykerJS 突变测试配置为 @ cosyte/ \* 包.

## 安装

```sh
npm install @cosyte/vitest-config
```

也可以使用：`pnpm add @cosyte/vitest-config`、`yarn add @cosyte/vitest-config`、`bun add @cosyte/vitest-config`

## README

[![The Cosyte logo on its own white ground: the icon beside the word Cosyte.](https://cosyte.com/tile/cosyte-lockup-tile-on-light-1200x300.png)](https://cosyte.com/)

# @ cosyte/ vitest- config

> 默认设定覆盖阈值, 外加一个套件来运行您文档中的实例 .

[![npm version](https://img.shields.io/npm/v/@cosyte/vitest-config.svg)](https://www.npmjs.com/package/@cosyte/vitest-config) [![CI](https://img.shields.io/github/actions/workflow/status/cosyte/config/ci.yml?branch=main&label=CI)](https://github.com/cosyte/config/actions/workflows/ci.yml) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/cosyte/config/blob/main/LICENSE) [![Node](https://img.shields.io/badge/node-%3E%3D22.14-brightgreen.svg)](https://nodejs.org/)

共享 Vitest 配置(v8 覆盖度,每部目录为 QQ90 门) 和 StrykerJS 突变测试配置为 @ cosyte/ \* 包.

## 为什么会这样

报告但封口的覆盖面是无人操作的数字,而整个重传的门槛隐藏着 一个没有的目录:一个软件包可以坐到92%的整体位置,而其序列器是40%. 每个目录的 Cosyte 基线闸门, 它的船允许而不是作为每个回波的设置 记得开机.

最近的选择是手写 `vitest.config.ts` 每个存储器 `coverage.thresholds` 复制进来。 这也是这个包裹的后半部分 来源:该选项中没有任何内容可以证明您文档中的实例仍然有效.

第三半为变异测试. 报道说有一条线路运行,没有说测试会注意到 如果线路错了. `@cosyte/vitest-config/stryker` 在StrykerJS下运行同样的Vitest套房, 以一个小方式修改代码, 计算没有注意到的更改.

## 状态

`@cosyte/vitest-config` 位于Cosyte 0.1.x线上:公共API被安顿下来,凸起类型跟随普通semver.

仍在移动:覆盖范围不包括清单和片段套接字(`runnableTag`, (中文(简体) ), `resolve`, (中文(简体) ), `requireSnippet`),随着第一批消费者采用它们而改变形状. 90个门槛和 页:1 `cosyteVitest(options)` 签名是已结算的部分,对其中任一部分的更改记录在 撞出型号,而不是被吸收到补丁中.

突变测试入口, `/stryker`, (中文(简体) ), `/mutate` 编辑 `cosyte-mutate` bin,为新和 最不落户的部分。 特别是,被更改的文件运行每个被更改的文件整体; 是否只打开在大文件中更快的已更改行.

## 安装

```sh
pnpm add -D @cosyte/vitest-config vitest @vitest/coverage-v8 vite
```

`vitest` (4或5个), `@vitest/coverage-v8` (同样的主要)和 `vite` 是同伴的依赖关系. 安装 `vite` 明确:vitest 4和5要求主要版本6或以后,不直接 宣布决心者将乐于保留一个不相容的Vite 5. 节点 `>=22.14`仅限无害环境管理.

为了进行突变测试,还安装了可选的同位素:StrykerJS 10及其Vitest跑道,以及 `@cosyte/script-utils`,哪个 `cosyte-mutate changed` 读取更改。 仅使用软件包 vitest 配置不安装其中之一; `cosyte-mutate changed` 无 `@cosyte/script-utils` 2号出口并命名它.

```sh
pnpm add -D @stryker-mutator/core @stryker-mutator/vitest-runner @cosyte/script-utils
```

## 使用量

`vitest.config.ts` 输出工厂的回报:

```ts
import { cosyteVitest } from "@cosyte/vitest-config";

const { thresholds } = cosyteVitest({ coverageDirs: ["parser", "model"] }).test.coverage;
thresholds.lines; // => 90
thresholds["src/parser/**"].lines; // => 90
```

每个条目 `coverageDirs` 增加每本目录 `src/<dir>/**` 门在地上90分 门,它阻止了一个覆盖良好的帮助目录支付一个未经测试的解析器.

## 入境点

| 进入点 | 这是什么 |
| --- | --- |
| `@cosyte/vitest-config` | 页:1 `cosyteVitest(opts?)` ,返回 Vitest 配置对象 |
| `@cosyte/vitest-config/snippets` | 以下 API 所描述的 doc/code- agreement guage |
| `@cosyte/vitest-config/stryker` | `cosyteStryker(options?)`,共享的 StrykerJS 配置 |
| `@cosyte/vitest-config/mutate` | `runMutate`,身体为 `cosyte-mutate` 及其部件 |
| `cosyte-mutate` (宾 | `full`,以及 `changed --base <ref>` |

它们是独立的子路径,因为它们是可单独收养的, 导入配置永远不会 装上绳子. `extractRunnableSnippets` 是决定运行的原始人 它报告 每个区块的一号码线,所以一个故障点在片段而不是栅栏:

```ts
import { extractRunnableSnippets } from "@cosyte/vitest-config/snippets";

const fence = "`".repeat(3);
const doc = ["# Title", "", fence + "ts runnable", "const dose = 5;", fence].join("\n");
extractRunnableSnippets(doc).length; // => 1
extractRunnableSnippets(doc)[0].line; // => 4
```

## 覆盖

两个切入点都是通过参数配置的,两个切入点都没有执行 消费者无法达到:

-   `cosyteVitest` 带 `coverageThresholds` 添加或推翻特定覆盖键,以及 `test` 对于任何其他Vitest选项。 两者最后合并,所以真正的无法持有的回购QQ 90 in 一个目录会降低一个密钥,而不是放弃配置.
-   `docSnippetSuite` 带 `docsDir` 或者说 `files`, (中文(简体) ), `include` (默认) `.md` 财务报告和审定财务报表 `.mdx`, (中文(简体) ), `resolve`, (中文(简体) ), `runnableTag` (默认) `"runnable"`, (中文(简体) ), `name`, (中文(简体) ), `requireSnippet`, (中文(简体) ), `tmpDir`, (中文(简体) ), `every`, (中文(简体) ), `includeGenerated` 财务报告和审定财务报表 `tsconfig`。 。 。 .

`cosyteStryker` 带 `mutate`, (中文(简体) ), `vitestConfig` 财务报告和审定财务报表 `stryker` (任何其他 Stryker 选项,合并) ; 其缺省及其原因列于下文的变异部分.

没有可运行片段的软件包产生一个空的、经过的套件,除非 `requireSnippet` 设置为: 离开会悄悄地退化 _错了_ 片段响亮失败 。 降低覆盖阈值是 因为与其他人不同 它会改变CI允许什么 通过.

## 突变测试: `/stryker` 财务报告和审定财务报表 `cosyte-mutate`

A 类 `stryker.config.mjs` 在套件根导出工厂返回的内容 :

```ts
import { cosyteStryker } from "@cosyte/vitest-config/stryker";

const config = cosyteStryker();
config.testRunner; // => "vitest"
config.ignoreStatic; // => false
config.jsonReporter; // => { fileName: "reports/mutation/mutation.json" }
```

然后,从同一个目录:

```sh
pnpm exec cosyte-mutate full                          # every file the config names
pnpm exec cosyte-mutate changed --base origin/main    # only what this change touched
pnpm exec cosyte-ratchet check --skip coverage --base origin/main
```

`full` 写入 `reports/mutation/mutation.json`,报告 地板文件的变异分数读取 从. `changed` 写入 `reports/mutation/changed.json` 在它旁边,所以跑过几个文件是永远不会 读取为整个包的分数。 没有更改源文件的更改开始不运行:它会写一个 空出报告,使鼠标能从"从未跑过"中分出"ran, nothing to mutate",并出0. `cosyte-mutate` 当运行完成时退出 0 , 当运行不能运行时退出 2 ; 它不判断 分数.

这个 `/mutate` 切入点是垃圾桶的躯体 和它建造的碎片 对于一个运行的呼叫者来说 从它自己的剧本. `selectChangedFiles` 规则是更改的运行从 :

```ts
import { selectChangedFiles } from "@cosyte/vitest-config/mutate";

const picked = selectChangedFiles({
  changed: ["src/a.ts", "src/a.test.ts", "README.md"],
  root: "/repo",
  cwd: "/repo",
  patterns: ["src/**/*.ts", "!src/**/*.test.ts"],
});
picked; // => ["src/a.ts"]
```

### 什么史崔克的配置,为什么

`cosyteStryker({ mutate, vitestConfig, stryker })` 获取文件列表、 Vitest 配置文件,以及 任何其它 Stryker 选项, 最后合并, 因此一个软件包可以更改下面的任何内容 。 每一个默认是 以及为什么:

| 设置 | 默认 | 为什么 |
| --- | --- | --- |
| `testRunner` | `vitest`,从此软件包中解析 | Stryker 找不到 pnpm 下的名称插件 |
| `vitest.pool` | `forks` | Vitest 本身的默认; Stryker 是线程, 其中 `process.chdir()` 掷出 |
| `coverageAnalysis` | `perTest` | 每一个变种人只进行能达到的测试 |
| `mutate` | `src/**/*.ts` 未进行测试,桶,类型 | 相同的文件 `@cosyte/vitest-config` 覆盖范围 |
| `ignoreStatic` | `false` | 静态变种是模块级表格,例如扫描仪的图案:保存 |
| `thresholds.break` | `null` | 楼层文件决定掉落,而不是 Stryker |
| 报告 | JSON 和 HTML 标题下 `reports/mutation/` | JSON为鼠标和CI, HTML为读取存活的变种人 |

设置 `ignoreStatic: true` 运行得更快, 值得回顾的是: 将每个模块级代码中的变异者从分数中丢出,而没有任何内含原因.

### 一个例外,为什么它需要两个评论

无法被杀死的变种人(等同的变种人,或只有儿童过程到达的行) 说明理由的内在例外:

```js
// Stryker disable next-line ConditionalExpression: both branches return the same value here
```

突变测试不会读取覆盖的被忽略的提示,所以从覆盖中排除的一行是: `/* v8 ignore next -- reason */` 仍然有它的变种人, 他们显示没有覆盖。 这么一行 需要两个评论,每个都有其理由. `cosyte-ratchet check --base` 列出在 更改了代码,所以拉动请求可以携带列表.

## 90个大门和地板文件

90个阈值是每个包件的一个固定的最低限值,它们都失败了测试本身. 这个 地板文件, `quality-floor.json`, 由 `cosyte-ratchet` 内 `@cosyte/script-utils`每一个 寄存器本身的记录 它的测量, 它只上升。 两人从事不同的工作:

-   一个超过90公尺的包裹被放在地上,放在它测量的地上;90公尺的门 是不会起火的后援.
-   一个比90以下的包在一个比分下方的键上 `coverageThresholds`和它的地板仍然 持有测量值,所以数字只能从那里上升.
-   牵引请求本身更改的行由鼠标所控为100道,无论哪个数字都表示.

这个 `json-summary` 财务报告和审定财务报表 `lcov` 报告这个配置的写法 是鼠标读取的两个.

## PHI 与安全

此包是测试配置 。 它不处理病人数据:它配置一个测试跑者,并且, 结束 `/snippets`,编译并执行您指向的代码块。 穿过 `/stryker` 这个 在沙盒目录中运行您自己的测试, 测试您自己来源的被修改的副本 (单位:千美元)`.stryker-tmp/`在您的项目中; 添加它和 `reports/mutation/` 改为 `.gitignore`。 。 。 .

有两个后果值得直言 因为 `/snippets` 运行代码。 它执行片段 在自己的文档中,在自己的过程中,所以文档示例决不能包含真实的 病人数据:然后执行,而且已经执行。 还有瞬间舱 `runSnippet` 写在您的工程根下, 因此磁盘上的片段输入区域完全为 测试的固定会。 在文档中使用合成数据,如在测试中使用.

## API 密码

### `cosyteVitest(options)`

基线配置: v8 覆盖 `text` 编号 : `html` 编号 : `lcov` 编号 : `json-summary` 记者,标准不包括 (管、固定装置、生成的代码、声明) **启用, 显示** 每个指令阈值 时间 **第90条**。 。 。 .

### 文档/代码协议 : `@cosyte/vitest-config/snippets`

这个 `/snippets` 子路径是 **符合标准者模拟文件**: 它证明了 软件包中的实例 `docs-content/` 仍照传道所言作. 复制可复制的片段 默回错误的字段(一剂,一码,一标识符)是一种临床-伤害故障模式 所以绿色的道克建筑 带错了片段 就是这个 预防.

标记有栅栏的块 **选入** 与 ` ```ts runnable ` 并用 `// =>`数字 :

````md
```ts runnable
import { parseHl7 } from "@cosyte/hl7";

const { warnings } = parseHl7(raw);
warnings.length; // => 0
```
````

`docSnippetSuite()` 移动一个文件目录, 将每个可运行块变为 Vitest `test` 标签 文件与行, 编译它, 并执行它: 窗体行 `<expr>; // => <value>` 变成 `expect(<expr>).toStrictEqual(<value>)`标记块 ` ```ts runnable throws ` 必须投出.

```ts
// test/docs-content.test.ts
import { join } from "node:path";
import { docSnippetSuite } from "@cosyte/vitest-config/snippets";

docSnippetSuite({
  docsDir: join(import.meta.dirname, "..", "docs-content"),
  // Point a snippet's `import ... from "@cosyte/hl7"` at what you want to prove against. This repo's
  // source for a fast local gate, or `../dist/index.js` (after `pnpm build`) for artifact fidelity.
  resolve: (spec) =>
    spec === "@cosyte/hl7" ? join(import.meta.dirname, "..", "src", "index.ts") : undefined,
});
```

选项 : `docsDir` 编号 : `files`, (中文(简体) ), `include` (默认) `.md` 编号 : `.mdx`, (中文(简体) ), `resolve` (进口说明) 再来一次, `runnableTag` (默认) `"runnable"`, (中文(简体) ), `name`, (中文(简体) ), `requireSnippet`, (中文(简体) ), `tmpDir`, (中文(简体) ), `every`, (中文(简体) ), `includeGenerated`, (中文(简体) ), `tsconfig`。没有的软件包 可流出片段产生一个空的、经过的套房: 缺席会悄悄地退化; a _错了_ 片断失败 大声点 原始人(`extractRunnableSnippets`, (中文(简体) ), `rewriteAssertions`, (中文(简体) ), `remapImports`, (中文(简体) ), `runSnippet`(中文(简体) ) 也出口出来,用于接线.

#### 每一个样本,不只是标记的

`docSnippetSuite({ every: true })` 运行 `ts`, (中文(简体) ), `typescript`, (中文(简体) ), `tsx`, (中文(简体) ), `js`, (中文(简体) ), `javascript` 财务报告和审定财务报表 `mjs` 块,标记与否,这是文件内容标准对库的要求(决定记录0006) 在cosyte/配置中。 在此模式下, JavaScript 样本将作为运行 `.mjs` 模块,所以 TypeScript 语法 它失败了,一个 `tsx` 样本运行为 `.tsx`; 无 `every`,每个 `runnable` 块运行为 `.ts`,作为 从前 一个无法运行的区块说出其栅栏上的原因 测试报告将它列为跳过 这个原因:

````md
```ts no-run opens a listener that stays open for the life of the process
const server = createServer().listen(2575);
```
````

A 类 `no-run` 没有任何理由 失败的套房。 贝壳、 JSON 和文本块不是样本 从来不是 运行. `extractSamples(markdown)` 财务报告和审定财务报表 `planSamples(files, options)` 这是背后的原始人.

走路时 `docsDir`中,此模式将删除 `api/` 它下面的文件夹: 引用生成器写 这些页面来自TSDoc, 以及他们的例子 是签名文件的一部分,而不是样本. `includeGenerated: true` 走路也一样。 给定的套房 `files`,或无 `every`,读读它是什么 和以前一样.

每个类型脚本样本( E)`ts`, (中文(简体) ), `typescript`, (中文(简体) ), `tsx`)也根据包的类型进行打字检查 在它运行之前,一个有类型错误的样本即使运行也会失败:一个复制它的读者 输入 TypeScript 工程将无法编译 。 样本是作为读者项目汇编的 将汇编它们,作为自己的模块,按其公布的名称输入软件包 项目的 `tsconfig.json` (那个) `tsconfig` 名称,或工作目录中的名称) 并关闭未用名称检查。 图书馆用它自己的名字来决定它已经建立的宣言 通过其 `exports`,所以在套房运行前建造, 因为套房已经运行样本 反对 `dist/`。这需要 `typescript` 软件包,可选的对等依赖。 其类型 无法检查,例如显示当一个打电话者忽略他们时会发生什么 栅栏;它仍然运行,它的测试名称带有:

````md
```ts throws no-typecheck passes a number where the types ask for a string, to show it throws
parseMessage(42);
```
````

A 类 `no-typecheck` 没有任何理由失败 套房,作为一个裸体 `no-run` 已经. `typecheckSamples(samples, options)` 这是背后的原始人。 无 `every`,没有键盘检查.

> `runSnippet` 写一个瞬间 `.ts` 模块(或 `extension` 样本名称) `tmpDir` (默认) `.cosyte-doc-snippets/` 在工程根中)并导入它,从而 Vitest 将 TypeScript 转换: 添加 `.cosyte-doc-snippets*/` 改为 `.gitignore`。它必须留在工程根;文件在下面 `node_modules` 没有改变.

## 捐款

问题、错误报告和提议 [问题跟踪器](https://github.com/cosyte/config/issues)欢迎调用请求 [cosyte/ 配置](https://github.com/cosyte/config),这个包裹住的地方.

改变必须清除所需的 `verify` 任务,以及阈值或排除需求的变化 说动了动的东西的变换器: 它能把经过的消费者弄红.

## 许可证

麻省理工学院,版权:Cosyte LLC. 见 [自由主义](https://github.com/cosyte/config/blob/main/LICENSE)。 。 。 .

## 常见问题

### @cosyte/vitest-config 是什么？

共享 Vitest 配置\(v8 覆盖度,每部目录为 QQ90 门\) 和 StrykerJS 突变测试配置为 @ cosyte/ \* 包\.

### 如何安装 @cosyte/vitest-config？

在项目目录运行 npm install @cosyte/vitest-config，或使用 pnpm add / yarn add / bun add。它还需要宿主项目提供 peer 依赖：vite（^6\.0\.0 \|\| ^7\.0\.0 \|\| ^8\.0\.0）、vitest（^4\.0\.0 \|\| ^5\.0\.0）、@vitest/coverage-v8（^4\.0\.0 \|\| ^5\.0\.0）。npm 7 及以上与 pnpm 8 及以上默认会自动安装必需的 peer 依赖，Yarn 需要手动安装。它还提供命令行工具 cosyte-mutate，可以用 npx cosyte-mutate 直接运行。

### @cosyte/vitest-config 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @cosyte/vitest-config 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @cosyte/vitest-config 可以商用吗？

@cosyte/vitest-config 使用 MIT 许可。宽松许可：允许商业使用、修改和再分发，通常只需在分发时保留原版权与许可声明。以上为概括，不构成法律意见，请以许可原文为准。

### @cosyte/vitest-config 的下载量有多少？

根据 npm 官方下载统计，@cosyte/vitest-config 在 2026/10/11 – 2026/11/09 这 30 天内被下载 5,880 次，日均约 196 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @cosyte/vitest-config 还在维护吗？

最新版本 0\.1\.4 发布于 2026/11/10（今天）；至今共发布 9 个版本，其中过去 12 个月发布了 9 个；首次发布于 2026/06/26。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

