@cldmv/vitest-runner 1.1.0 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -7,7 +7,7 @@ Sequential Vitest runner that spawns each test file in its own child process to
7
7
  - Auto-detects your vitest config; accepts an explicit path if needed
8
8
  - All standard Vitest CLI flags are forwarded unchanged
9
9
  - Usable as a **CLI binary** or as a **programmatic Node.js API**
10
- - Pure ESM with a CJS shim for `require()` compatibility
10
+ - Pure ESM source, bundled to a real CJS build for `require()` compatibility
11
11
 
12
12
  [![npm version]][npm_version_url] [![npm downloads]][npm_downloads_url] <!-- [![GitHub release]][github_release_url] -->[![GitHub downloads]][github_downloads_url] [![Last commit]][last_commit_url] <!-- [![Release date]][release_date_url] -->[![npm last update]][npm_last_update_url] [![Coverage]][coverage_url]
13
13
 
@@ -15,6 +15,24 @@ Sequential Vitest runner that spawns each test file in its own child process to
15
15
 
16
16
  ---
17
17
 
18
+ ## ✨ What's New
19
+
20
+ ### Latest: v1.4.0 (September 2026)
21
+
22
+ - **A real build, and a CLI that finally works when installed** — `dist/` (library) and `bin/` (CLI) are now bundled with tsup instead of hand-written; a one-character npm packaging bug that silently stripped the `bin` field is fixed, so `vitest-runner` now works as an installed command for the first time.
23
+ - **Runner-owned scratch directories** — a per-run scratch root is created and cleaned up automatically, with a `makeRunTmpDir(label)` helper for test files instead of managing your own `mkdtemp` base.
24
+ - **CI/release automation completed** — the v4 staging-branch workflow set is now full (auto-merging the release PR on approval, `dependabot.yml`, and the rest), and every file header is normalized.
25
+ - [View full v1.4.0 Changelog](https://github.com/CLDMV/vitest-runner/blob/master/docs/changelog/v1/v1.4.0.md)
26
+
27
+ ### Recent Releases
28
+
29
+ - **v1.3.3** (September 2026) — Dependency bump (`brace-expansion`, `postcss`) via Dependabot.
30
+ - **v1.3.2** (September 2026) — CI: pass `BOT_NAME`/`BOT_EMAIL` through to the v4 release/feature-PR workflows.
31
+ - **v1.3.0** (July 2026) — Onboarded onto the CLDMV v4 staging-branch release flow.
32
+ - **v1.2.0** (June 2026) — Added coverage `blobsDir` + `mergeReports` options.
33
+
34
+ ---
35
+
18
36
  ## Requirements
19
37
 
20
38
  - Node.js ≥ 18
@@ -45,20 +63,24 @@ vitest-runner [OPTIONS] [PATTERNS...]
45
63
 
46
64
  ### Runner flags
47
65
 
48
- | Flag | Description |
49
- |------|-------------|
50
- | `--test-list <file>` | Run only the files listed in a JSON array file instead of scanning |
51
- | `--file-pattern <regex>` | Override the file discovery regex (default: `\.test\.vitest\.(?:js\|mjs\|cjs)$`) |
52
- | `--workers <n>` | Number of parallel workers (default: `4` or `VITEST_WORKERS`) |
53
- | `--solo-pattern <pat>` | Run files matching this path substring solo (one at a time) before the worker pool; repeatable |
54
- | `--no-error-details` | Hide inline error blocks — show only counts in the summary |
55
- | `--coverage-quiet` | Implies `--coverage`; suppress per-file output and show only a live progress bar and final summaries |
56
- | `--log-file <path>` | Write a clean (ANSI-stripped) copy of all output to this file. Defaults to `coverage/coverage-run.log` when `--coverage-quiet` is active |
57
- | `--suppress-file-output` | Suppress per-file runner output blocks in any mode |
58
- | `--suppress-passing-files` | Hide the `PASSED TEST FILES` section in the final summary |
59
- | `--no-top-summary` | Hide `TOP MEMORY USERS` and `TOP DURATION` summary sections |
60
- | `--json` | Print a JSON run report (no runner text output) |
61
- | `--help`, `-h` | Print this help and exit |
66
+ | Flag | Description |
67
+ | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
68
+ | `--test-list <file>` | Run only the files listed in a JSON array file instead of scanning |
69
+ | `--file-pattern <regex>` | Override the file discovery regex (default: `\.test\.vitest\.(?:js\|mjs\|cjs)$`) |
70
+ | `--workers <n>` | Number of parallel workers (default: `4` or `VITEST_WORKERS`) |
71
+ | `--solo-pattern <pat>` | Run files matching this path substring solo (one at a time) before the worker pool; repeatable |
72
+ | `--no-error-details` | Hide inline error blocks — show only counts in the summary |
73
+ | `--coverage-quiet` | Implies `--coverage`; suppress per-file output and show only a live progress bar and final summaries |
74
+ | `--log-file <path>` | Write a clean (ANSI-stripped) copy of all output to this file. Defaults to `coverage/coverage-run.log` when `--coverage-quiet` is active |
75
+ | `--suppress-file-output` | Suppress per-file runner output blocks in any mode |
76
+ | `--suppress-passing-files` | Hide the `PASSED TEST FILES` section in the final summary |
77
+ | `--no-top-summary` | Hide `TOP MEMORY USERS` and `TOP DURATION` summary sections |
78
+ | `--json` | Print a JSON run report (no runner text output) |
79
+ | `--blobs-dir <path>` | Directory for per-file coverage blobs (default: `.vitest-coverage-blobs`, relative to `cwd`) |
80
+ | `--no-merge-reports` | Produce the coverage blobs but skip the merge and summary, leaving them in `--blobs-dir` for an external merge step |
81
+ | `--keep-tmp` | Keep this run's scratch directory instead of removing it on completion |
82
+ | `--scratch-dir <path>` | Per-run scratch root, relative to `cwd` (default: `tmp/vitest-runner`) |
83
+ | `--help`, `-h` | Print this help and exit |
62
84
 
63
85
  ### Test patterns
64
86
 
@@ -95,10 +117,10 @@ vitest-runner --bail
95
117
 
96
118
  ### Environment variables
97
119
 
98
- | Variable | Default | Description |
99
- |----------|---------|-------------|
100
- | `VITEST_HEAP_MB` | *(none)* | `--max-old-space-size` ceiling passed to every child process |
101
- | `VITEST_WORKERS` | `4` | Maximum parallel worker slots in the non-solo phase (overridden by `--workers`) |
120
+ | Variable | Default | Description |
121
+ | ---------------- | -------- | ------------------------------------------------------------------------------- |
122
+ | `VITEST_HEAP_MB` | _(none)_ | `--max-old-space-size` ceiling passed to every child process |
123
+ | `VITEST_WORKERS` | `4` | Maximum parallel worker slots in the non-solo phase (overridden by `--workers`) |
102
124
 
103
125
  ### Examples
104
126
 
@@ -145,10 +167,10 @@ vitest-runner --json --no-top-summary
145
167
  ## Programmatic API
146
168
 
147
169
  ```js
148
- import { run } from 'vitest-runner';
170
+ import { run } from "vitest-runner";
149
171
 
150
172
  // CommonJS
151
- const { run } = await require('vitest-runner');
173
+ const { run } = require("vitest-runner");
152
174
  ```
153
175
 
154
176
  ### `run(options)` → `Promise<number | object>`
@@ -156,10 +178,10 @@ const { run } = await require('vitest-runner');
156
178
  Runs the test suite and resolves with an exit code (`0` = all passed, `1` = any failure) by default. When `json: true` is passed, it returns a structured JSON report object (including `exitCode`) instead of printing runner text output.
157
179
 
158
180
  ```js
159
- import { run } from 'vitest-runner';
181
+ import { run } from "vitest-runner";
160
182
 
161
183
  const code = await run({
162
- testDir: 'src/tests',
184
+ testDir: "src/tests"
163
185
  });
164
186
 
165
187
  process.exit(code);
@@ -167,33 +189,54 @@ process.exit(code);
167
189
 
168
190
  #### Options
169
191
 
170
- | Option | Type | Default | Description |
171
- |--------|------|---------|-------------|
172
- | `cwd` | `string` | `process.cwd()` | Absolute project root directory |
173
- | `testDir` | `string` | `cwd` | Directory (absolute or relative to `cwd`) to scan for `*.test.vitest.{js,mjs}` files |
174
- | `vitestConfig` | `string` | auto-detect | Explicit vitest config path; when omitted the runner walks standard config names (`vitest.config.ts`, `vite.config.ts`, etc.) relative to `cwd` |
175
- | `testPatterns` | `string[]` | `[]` | File / folder patterns to filter — empty means all files in `testDir` |
176
- | `testListFile` | `string` | `undefined` | Path to a JSON array of test file paths; when set, scanning is skipped entirely |
177
- | `testFilePattern` | `RegExp` | `DEFAULT_TEST_FILE_PATTERN` | Regex matched against file names during discovery (`*.test.vitest.{js,mjs,cjs}` by default) |
178
- | `vitestArgs` | `string[]` | `[]` | Extra CLI args forwarded verbatim to every vitest invocation |
179
- | `showErrorDetails` | `boolean` | `true` | Print inline error blocks under each failed file in the summary |
180
- | `coverageQuiet` | `boolean` | `false` | Suppress per-file output; show only the progress bar and final summaries |
181
- | `suppressFileOutput` | `boolean` | `false` | Suppress per-file runner output blocks in all modes |
182
- | `suppressPassingFiles` | `boolean` | `false` | Hide passed-file rows in the final summary |
183
- | `topSummary` | `boolean` | `true` | Show or hide top memory/duration summary sections (and JSON arrays) |
184
- | `json` | `boolean` | `false` | Return a JSON report object instead of printing text output |
185
- | `workers` | `number` | `4` | Maximum parallel worker slots (overrides `VITEST_WORKERS`) |
186
- | `worstCoverageCount` | `number` | `10` | Rows in the worst-coverage table after a coverage run (`0` disables it) |
187
- | `maxOldSpaceMb` | `number` | `undefined` | Global `--max-old-space-size` ceiling in MB (overrides `VITEST_HEAP_MB`) |
188
- | `earlyRunPatterns` | `string[]` | `[]` | Path substrings — matching files run solo (one at a time) before the parallel worker pool starts |
189
- | `perFileHeapOverrides` | `PerFileHeapOverride[]` | `[]` | Per-file minimum heap ceilings; the maximum of this and `maxOldSpaceMb` wins |
190
- | `conditions` | `string[]` | `[]` | Additional `--conditions` Node flags forwarded to children |
191
- | `nodeEnv` | `string` | `'development'` | Value written to `NODE_ENV` in child processes |
192
+ | Option | Type | Default | Description |
193
+ | ---------------------- | ----------------------- | ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
194
+ | `cwd` | `string` | `process.cwd()` | Absolute project root directory |
195
+ | `testDir` | `string` | `cwd` | Directory (absolute or relative to `cwd`) to scan for `*.test.vitest.{js,mjs}` files |
196
+ | `vitestConfig` | `string` | auto-detect | Explicit vitest config path; when omitted the runner walks standard config names (`vitest.config.ts`, `vite.config.ts`, etc.) relative to `cwd` |
197
+ | `testPatterns` | `string[]` | `[]` | File / folder patterns to filter — empty means all files in `testDir` |
198
+ | `testListFile` | `string` | `undefined` | Path to a JSON array of test file paths; when set, scanning is skipped entirely |
199
+ | `testFilePattern` | `RegExp` | `DEFAULT_TEST_FILE_PATTERN` | Regex matched against file names during discovery (`*.test.vitest.{js,mjs,cjs}` by default) |
200
+ | `vitestArgs` | `string[]` | `[]` | Extra CLI args forwarded verbatim to every vitest invocation |
201
+ | `showErrorDetails` | `boolean` | `true` | Print inline error blocks under each failed file in the summary |
202
+ | `coverageQuiet` | `boolean` | `false` | Suppress per-file output; show only the progress bar and final summaries |
203
+ | `suppressFileOutput` | `boolean` | `false` | Suppress per-file runner output blocks in all modes |
204
+ | `suppressPassingFiles` | `boolean` | `false` | Hide passed-file rows in the final summary |
205
+ | `topSummary` | `boolean` | `true` | Show or hide top memory/duration summary sections (and JSON arrays) |
206
+ | `json` | `boolean` | `false` | Return a JSON report object instead of printing text output |
207
+ | `workers` | `number` | `4` | Maximum parallel worker slots (overrides `VITEST_WORKERS`) |
208
+ | `worstCoverageCount` | `number` | `10` | Rows in the worst-coverage table after a coverage run (`0` disables it) |
209
+ | `blobsDir` | `string` | `<cwd>/.vitest-coverage-blobs` | Directory for per-file coverage blobs. Relative paths resolve against `cwd`. Always cleared at the start of a coverage run |
210
+ | `mergeReports` | `boolean` | `true` | When `true`, blobs are merged via `vitest --mergeReports`, the coverage summary is printed, and `blobsDir` is deleted. When `false`, the run stops after producing blobs — no merge, no summary — and `blobsDir` is left populated for an external merge |
211
+ | `maxOldSpaceMb` | `number` | `undefined` | Global `--max-old-space-size` ceiling in MB (overrides `VITEST_HEAP_MB`) |
212
+ | `earlyRunPatterns` | `string[]` | `[]` | Path substrings — matching files run solo (one at a time) before the parallel worker pool starts |
213
+ | `perFileHeapOverrides` | `PerFileHeapOverride[]` | `[]` | Per-file minimum heap ceilings; the maximum of this and `maxOldSpaceMb` wins |
214
+ | `conditions` | `string[]` | `[]` | Additional `--conditions` Node flags forwarded to children |
215
+ | `nodeEnv` | `string` | `'development'` | Value written to `NODE_ENV` in child processes |
216
+ | `scratchDir` | `string` | `'tmp/vitest-runner'` | Per-run scratch root, relative to `cwd` (or absolute). A subdirectory is created per file invocation and exposed to it via `VITEST_RUNNER_TMP` |
217
+ | `keepTmp` | `boolean` | `false` | Keep the run's scratch root instead of removing it on completion (normal exit, failure, or SIGINT/SIGTERM) |
218
+
219
+ ### Scratch directories (`VITEST_RUNNER_TMP` / `makeRunTmpDir`)
220
+
221
+ Every run gets its own scratch root (`<scratchDir>/<pid>-<timestamp>/`), created before any file runs and removed once the run completes — on success, on failure, and on SIGINT/SIGTERM — unless `keepTmp` is set. Each file invocation gets its own subdirectory under that root, exposed to the child as `process.env.VITEST_RUNNER_TMP`. Stale roots left by a crashed prior run (dead PID) are swept at the start of the next run.
222
+
223
+ From a test file, use `makeRunTmpDir(label)` to get a fresh, uniquely-named subdirectory instead of managing your own `mkdtemp` base:
224
+
225
+ ```js
226
+ import { makeRunTmpDir } from "vitest-runner";
227
+
228
+ const dir = makeRunTmpDir("my-fixture"); // a fresh directory under VITEST_RUNNER_TMP
229
+ ```
230
+
231
+ CLI flags: `--scratch-dir <path>` and `--keep-tmp` (see [Runner flags](#runner-flags) below).
192
232
 
193
233
  #### `PerFileHeapOverride`
194
234
 
195
235
  ```ts
196
- { pattern: string; heapMb: number }
236
+ {
237
+ pattern: string;
238
+ heapMb: number;
239
+ }
197
240
  ```
198
241
 
199
242
  `pattern` is a substring matched against the normalised (forward-slash) file path. The first match wins and is compared against the global `maxOldSpaceMb`; the larger value is used.
@@ -202,42 +245,40 @@ process.exit(code);
202
245
 
203
246
  ```js
204
247
  // Run all tests under src/tests/ (cwd defaults to process.cwd())
205
- await run({ testDir: 'src/tests' });
248
+ await run({ testDir: "src/tests" });
206
249
 
207
250
  // Run only the config and metadata suites
208
251
  await run({
209
- testDir: 'src/tests',
210
- testPatterns: ['src/tests/config', 'src/tests/metadata'],
252
+ testDir: "src/tests",
253
+ testPatterns: ["src/tests/config", "src/tests/metadata"]
211
254
  });
212
255
 
213
256
  // Coverage run (OOM-safe blob + merge mode)
214
257
  await run({
215
- testDir: 'src/tests',
216
- vitestArgs: ['--coverage'],
258
+ testDir: "src/tests",
259
+ vitestArgs: ["--coverage"]
217
260
  });
218
261
 
219
262
  // Quiet coverage with live progress bar
220
263
  await run({
221
- testDir: 'src/tests',
222
- coverageQuiet: true,
264
+ testDir: "src/tests",
265
+ coverageQuiet: true
223
266
  });
224
267
 
225
268
  // Machine-readable output (no text logs)
226
269
  const report = await run({
227
- testDir: 'src/tests',
228
- json: true,
270
+ testDir: "src/tests",
271
+ json: true
229
272
  });
230
273
 
231
274
  console.log(report.exitCode);
232
275
 
233
276
  // Give heap-heavy files a larger ceiling while keeping the global limit lower
234
277
  await run({
235
- testDir: 'src/tests',
236
- maxOldSpaceMb: 2048,
237
- earlyRunPatterns: ['listener-cleanup/'],
238
- perFileHeapOverrides: [
239
- { pattern: 'listener-cleanup/', heapMb: 6144 },
240
- ],
278
+ testDir: "src/tests",
279
+ maxOldSpaceMb: 2048,
280
+ earlyRunPatterns: ["listener-cleanup/"],
281
+ perFileHeapOverrides: [{ pattern: "listener-cleanup/", heapMb: 6144 }]
241
282
  });
242
283
  ```
243
284
 
@@ -259,6 +300,28 @@ This avoids the OOM crash that occurs when a single vitest process holds coverag
259
300
 
260
301
  The log file path can be overridden with `--log-file <path>`. Passing `--log-file` by itself only enables log mirroring (it does not enable coverage mode).
261
302
 
303
+ ### Producing blobs for an external merge
304
+
305
+ Set `mergeReports: false` (CLI: `--no-merge-reports`) to stop the run after the per-file blobs are written. The internal `vitest --mergeReports` call and the coverage summary are skipped, and `blobsDir` is left intact instead of being deleted. The blobs directory is still cleared at the **start** of each run, so it only ever contains the current run's output.
306
+
307
+ This is useful when a second coverage blob set (for example, a browser-mode run with a different coverage transform) needs to be merged together with the node-mode blobs. Point both runs at known directories with `blobsDir`, then merge them in one external `vitest --mergeReports` step:
308
+
309
+ ```js
310
+ // Node-mode blobs, no internal merge
311
+ await run({
312
+ testDir: "src/tests",
313
+ vitestArgs: ["--coverage"],
314
+ blobsDir: ".coverage-blobs/node",
315
+ mergeReports: false
316
+ });
317
+
318
+ // (separately produce browser-mode blobs into .coverage-blobs/browser)
319
+ // then merge both blob sets in a single external step:
320
+ // vitest --mergeReports .coverage-blobs --coverage
321
+ ```
322
+
323
+ The exit code still reflects test pass/fail; there is just no coverage-merge result to fold in.
324
+
262
325
  ---
263
326
 
264
327
  ## Test list files
@@ -266,11 +329,7 @@ The log file path can be overridden with `--log-file <path>`. Passing `--log-fil
266
329
  A test list file is a plain JSON array of test file paths (relative to `cwd`):
267
330
 
268
331
  ```json
269
- [
270
- "src/tests/auth/login.test.vitest.mjs",
271
- "src/tests/auth/register.test.vitest.mjs",
272
- "src/tests/config/defaults.test.vitest.mjs"
273
- ]
332
+ ["src/tests/auth/login.test.vitest.mjs", "src/tests/auth/register.test.vitest.mjs", "src/tests/config/defaults.test.vitest.mjs"]
274
333
  ```
275
334
 
276
335
  Pass `--test-list <file>` (CLI) or `testListFile: 'path/to/list.json'` (API) to run exactly those files instead of scanning `testDir`.
@@ -281,7 +340,7 @@ Pass `--test-list <file>` (CLI) or `testListFile: 'path/to/list.json'` (API) to
281
340
 
282
341
  By default, the runner discovers files matching:
283
342
 
284
- ```
343
+ ```text
285
344
  *.test.vitest.js
286
345
  *.test.vitest.mjs
287
346
  *.test.vitest.cjs
@@ -297,37 +356,41 @@ vitest-runner --file-pattern '\.spec\.ts$'
297
356
  ```
298
357
 
299
358
  ```js
300
- await run({ cwd, testDir: 'src', testFilePattern: /\.spec\.ts$/i });
359
+ await run({ cwd, testDir: "src", testFilePattern: /\.spec\.ts$/i });
301
360
  ```
302
361
 
303
362
  ---
304
363
 
305
364
  ## Source layout
306
365
 
307
- ```
308
- index.mjs ← ESM entry (re-exports src/runner.mjs)
309
- index.cjs ← CJS shim (dynamic import of index.mjs)
310
- bin/
311
- vitest-runner.mjs ← CLI binary
366
+ ```text
367
+ dist/ ← built library entry (npm run build / tsup) — generated, not committed
368
+ index.mjs ← bundled ESM entry
369
+ index.cjs ← bundled CJS entry (real sync require, generated from the same source)
370
+ bin/ ← built CLI binary (npm run build / tsup) — generated, not committed
371
+ vitest-runner.mjs ← bundled CLI, from src/bin/vitest-runner.mjs (shebang preserved)
312
372
  src/
313
373
  runner.mjs ← main run() API + re-exports
374
+ bin/
375
+ vitest-runner.mjs ← CLI entry SOURCE — run this directly for source-level dev/testing
314
376
  utils/
315
377
  ansi.mjs ← stripAnsi, colourPct
316
378
  duration.mjs ← formatDuration
317
379
  env.mjs ← buildNodeOptions
318
380
  resolve.mjs ← resolveBin, resolveVitestConfig
319
381
  core/
320
- discover.mjs ← discoverVitestFiles, sortWithPriority
382
+ discover.mjs ← discoverVitestFiles, sortWithPriority, computeFilterConflicts
321
383
  parse.mjs ← parseVitestOutput, deduplicateErrors
322
384
  spawn.mjs ← runSingleFile, runVitestDirect, runMergeReports
323
385
  report.mjs ← printCoverageSummary, printMergeOutput
324
386
  progress.mjs ← createCoverageProgressTracker
387
+ scratch.mjs ← makeRunTmpDir + the scratch-directory lifecycle
325
388
  cli/
326
389
  args.mjs ← parseArguments
327
390
  help.mjs ← showHelp
328
391
  ```
329
392
 
330
- All sub-module utilities are re-exported from the root entry point, so deep imports are optional.
393
+ `src/` is not published — only `dist/`, `bin/`, and `types/` ship (see [Programmatic API](#programmatic-api) for the `vitest-runner-dev` export condition, used when developing against a workspace/local checkout instead of the published package). All sub-module utilities are re-exported from the root entry point, so deep imports are optional.
331
394
 
332
395
  ---
333
396
 
@@ -341,15 +404,15 @@ MIT
341
404
  <!-- [release date]: https://img.shields.io/github/release-date/CLDMV/vitest-runner?style=for-the-badge&logo=github&logoColor=white&labelColor=181717 -->
342
405
  <!-- [release_date_url]: https://github.com/CLDMV/vitest-runner/releases -->
343
406
 
344
- [npm version]: https://img.shields.io/npm/v/vitest-runner.svg?style=for-the-badge&logo=npm&logoColor=white&labelColor=CB3837
407
+ [npm version]: https://img.shields.io/npm/v/%40cldmv%2Fvitest-runner.svg?style=for-the-badge&logo=npm&logoColor=white&labelColor=CB3837
345
408
  [npm_version_url]: https://www.npmjs.com/package/@cldmv/vitest-runner
346
- [npm downloads]: https://img.shields.io/npm/dm/vitest-runner.svg?style=for-the-badge&logo=npm&logoColor=white&labelColor=CB3837
409
+ [npm downloads]: https://img.shields.io/npm/dm/%40cldmv%2Fvitest-runner.svg?style=for-the-badge&logo=npm&logoColor=white&labelColor=CB3837
347
410
  [npm_downloads_url]: https://www.npmjs.com/package/@cldmv/vitest-runner
348
411
  [github downloads]: https://img.shields.io/github/downloads/CLDMV/vitest-runner/total?style=for-the-badge&logo=github&logoColor=white&labelColor=181717
349
412
  [github_downloads_url]: https://github.com/CLDMV/vitest-runner/releases
350
413
  [last commit]: https://img.shields.io/github/last-commit/CLDMV/vitest-runner?style=for-the-badge&logo=github&logoColor=white&labelColor=181717
351
414
  [last_commit_url]: https://github.com/CLDMV/vitest-runner/commits
352
- [npm last update]: https://img.shields.io/npm/last-update/vitest-runner?style=for-the-badge&logo=npm&logoColor=white&labelColor=CB3837
415
+ [npm last update]: https://img.shields.io/npm/last-update/%40cldmv%2Fvitest-runner?style=for-the-badge&logo=npm&logoColor=white&labelColor=CB3837
353
416
  [npm_last_update_url]: https://www.npmjs.com/package/@cldmv/vitest-runner
354
417
  [coverage]: https://img.shields.io/endpoint?url=https%3A%2F%2Fraw.githubusercontent.com%2FCLDMV%2Fvitest-runner%2Fbadges%2Fcoverage.json&style=for-the-badge&logo=vitest&logoColor=white
355
418
  [coverage_url]: https://github.com/CLDMV/vitest-runner/blob/badges/coverage.json