@cosyte/vitest-config

中文文档
0.1.4发布于 2026/11/10MITTypeScriptES Module零依赖构建来源已验证近 30 天下载 5880

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

中文使用文档
文档目录16 节
  1. 为什么会这样
  2. 状态
  3. 安装
  4. 使用量
  5. 入境点
  6. 覆盖
  7. 突变测试: /stryker 财务报告和审定财务报表 cosyte-mutate
  8. 什么史崔克的配置,为什么
  9. 一个例外,为什么它需要两个评论
  10. 90个大门和地板文件
  11. PHI 与安全
  12. API 密码
  13. cosyteVitest(options)
  14. 文档/代码协议 : @cosyte/vitest-config/snippets
  15. 捐款
  16. 许可证
The Cosyte logo on its own white ground: the icon beside the word Cosyte.

@ cosyte/ vitest- config

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

npm version CI License: MIT Node

共享 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,为新和 最不落户的部分。 特别是,被更改的文件运行每个被更改的文件整体; 是否只打开在大文件中更快的已更改行.

安装

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号出口并命名它.

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

使用量

vitest.config.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/strykercosyteStryker(options?),共享的 StrykerJS 配置
@cosyte/vitest-config/mutaterunMutate,身体为 cosyte-mutate 及其部件
cosyte-mutate (宾full,以及 changed --base <ref>

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

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 在套件根导出工厂返回的内容 :

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

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

然后,从同一个目录:

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 规则是更改的运行从 :

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 选项, 最后合并, 因此一个软件包可以更改下面的任何内容 。 每一个默认是 以及为什么:

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

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

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

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

// 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 并用 // =>数字 :

```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 必须投出.

// 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,作为 从前 一个无法运行的区块说出其栅栏上的原因 测试报告将它列为跳过 这个原因:

```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 软件包,可选的对等依赖。 其类型 无法检查,例如显示当一个打电话者忽略他们时会发生什么 栅栏;它仍然运行,它的测试名称带有:

```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 没有改变.

捐款

问题、错误报告和提议 问题跟踪器欢迎调用请求 cosyte/ 配置,这个包裹住的地方.

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

许可证

麻省理工学院,版权:Cosyte LLC. 见 自由主义。 。 。 .

版本与发布记录

@cosyte/vitest-config 共发布 9 个版本,首次发布于 2026/06/26;过去 12 个月发布了 9 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.1.4latest2026/11/10今天
0.1.32026/11/082 天前
0.1.22026/11/082 天前
0.1.12026/11/083 天前
0.1.02026/09/211 个月前
0.0.42026/08/053 个月前

关于 @cosyte/vitest-config 的常见问题

@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 和提交记录判断。