@bymax-one/nest-config 1.0.2 → 1.1.0

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.
Files changed (3) hide show
  1. package/CHANGELOG.md +62 -1
  2. package/README.md +10 -5
  3. package/package.json +4 -3
package/CHANGELOG.md CHANGED
@@ -11,6 +11,65 @@ as the GitHub Release body, so each released version needs a matching
11
11
 
12
12
  ## [Unreleased]
13
13
 
14
+ ## [1.1.0] - 2026-08-11
15
+
16
+ Coordinated ecosystem release aligning every `@bymax-one/*` package after the ioredis 6 /
17
+ bullmq 6 migration. **No source, runtime, or public-API change in this package** — the
18
+ published `dist/` is byte-identical to `1.0.3`; the changes below are development
19
+ and CI tooling only.
20
+
21
+ ### Changed
22
+
23
+ - Bumped the `dev-dependencies` group with 3 updates. None of these reaches the published bundle.
24
+ - Bumped the pinned `pnpm/action-setup` CI action from 6.0.9 to 6.0.10.
25
+ - Bumped the pinned `github/codeql-action/upload-sarif` CI action from 4.37.4 to 4.37.6 in the
26
+ codeql group.
27
+ - Reworked the mutation workflow to run incrementally on each push and to measure cold once a week.
28
+
29
+ ## [1.0.3] - 2026-08-07
30
+
31
+ **Documentation and tooling.** `dist/` differs from `1.0.2` only in the text of the comments
32
+ described below; no runtime code changed.
33
+
34
+ ### Changed
35
+
36
+ - **Equivalent mutants are documented in the source instead of only in the report.** Ten of
37
+ the eleven now carry `// Stryker disable next-line <Mutator>: <reason>` on the line they
38
+ apply to, which is the convention now shared across the `@bymax-one/nest-*` libraries. The
39
+ measured score moves from **95.74%** to **99.59%** — no test and no production logic
40
+ changed; Stryker excludes an ignored mutant from the denominator instead of counting it as
41
+ one the suite failed to kill.
42
+
43
+ Two needed the block `disable`/`restore` form, because `next-line` binds to the following
44
+ statement and those mutants do not sit on one.
45
+
46
+ The eleventh stays a **counted survivor**. A directive on the line above it was measured,
47
+ not assumed, to do nothing — one does not attach to a `.replace()` inside a method chain,
48
+ and the mutant still reported as surviving. Silencing it would take a block directive
49
+ spanning the neighbouring `.replace()`, whose own regex mutants the suite does kill, and a
50
+ killable mutant is never disabled to raise a number. It is argued in a plain comment at the
51
+ line and counted in the report.
52
+
53
+ - The README claimed **Zero suppressions** as a rule. It states what is true now: every
54
+ suppression carries its reason, in the grammar Stryker parses.
55
+
56
+ ### Security
57
+
58
+ - **`js-yaml` is floored at the patched release** (GHSA-5p4m-2wfm-xmqj, CVSS 7.5), which was
59
+ open as a Dependabot alert. It reaches this repo only through `jest` ->
60
+ `babel-plugin-istanbul` -> `@istanbuljs/load-nyc-config`; this package declares
61
+ `"dependencies": {}`, so `js-yaml` is never installed beside it and no consumer was
62
+ exposed. `dist/` is unaffected. (Landed separately, recorded here because it ships in this
63
+ version.)
64
+
65
+ ### Added
66
+
67
+ - `check:mutants` gate (`scripts/check-mutation-directives.mjs`) — validates every
68
+ `// Stryker` comment against the parser's own regular expression, rejecting a reason
69
+ written after `--` instead of a colon, a reason wrapped onto a second comment line, a
70
+ stray comma in the mutator list, and a mutator name Stryker does not know, which matches
71
+ nothing and so silences nothing. Wired into CI and `prepublishOnly`.
72
+
14
73
  ## [1.0.2] - 2026-08-06
15
74
 
16
75
  **Documentation only.** `dist/` is byte-identical to `1.0.1`.
@@ -132,4 +191,6 @@ have regressed from. They are kept because the reasoning is worth having.
132
191
  [1.0.0]: https://github.com/bymaxone/nest-config/releases/tag/v1.0.0
133
192
  [1.0.2]: https://github.com/bymaxone/nest-config/compare/v1.0.1...v1.0.2
134
193
  [1.0.1]: https://github.com/bymaxone/nest-config/compare/v1.0.0...v1.0.1
135
- [Unreleased]: https://github.com/bymaxone/nest-config/compare/v1.0.1...HEAD
194
+ [1.0.3]: https://github.com/bymaxone/nest-config/compare/v1.0.2...v1.0.3
195
+ [1.1.0]: https://github.com/bymaxone/nest-config/compare/v1.0.3...v1.1.0
196
+ [Unreleased]: https://github.com/bymaxone/nest-config/compare/v1.1.0...HEAD
package/README.md CHANGED
@@ -14,7 +14,7 @@
14
14
  <a href="https://www.npmjs.com/package/@bymax-one/nest-config"><img src="https://img.shields.io/npm/dm/@bymax-one/nest-config?style=flat-square&colorA=000000&colorB=000000" alt="npm downloads" /></a>
15
15
  <a href="https://github.com/bymaxone/nest-config/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/bymaxone/nest-config/ci.yml?branch=main&style=flat-square&colorA=000000&label=CI" alt="CI status" /></a>
16
16
  <a href="https://github.com/bymaxone/nest-config/actions/workflows/ci.yml"><img src="https://img.shields.io/badge/coverage-100%25-brightgreen?style=flat-square&colorA=000000" alt="coverage" /></a>
17
- <a href="https://github.com/bymaxone/nest-config/blob/main/docs/mutation_testing_results.md"><img src="https://img.shields.io/badge/mutation-95.74%25-brightgreen?style=flat-square&colorA=000000" alt="mutation score" /></a>
17
+ <a href="https://github.com/bymaxone/nest-config/blob/main/docs/mutation_testing_results.md"><img src="https://img.shields.io/badge/mutation-99.59%25-brightgreen?style=flat-square&colorA=000000" alt="mutation score" /></a>
18
18
  <a href="https://scorecard.dev/viewer/?uri=github.com/bymaxone/nest-config"><img src="https://api.scorecard.dev/projects/github.com/bymaxone/nest-config/badge?style=flat-square" alt="OpenSSF Scorecard" /></a>
19
19
  <a href="https://github.com/bymaxone/nest-config/blob/main/LICENSE"><img src="https://img.shields.io/github/license/bymaxone/nest-config?style=flat-square&colorA=000000&colorB=000000" alt="license" /></a>
20
20
  <a href="https://www.typescriptlang.org/"><img src="https://img.shields.io/badge/TypeScript-strict-3178C6?style=flat-square&logo=typescript&logoColor=white" alt="TypeScript" /></a>
@@ -477,9 +477,10 @@ Configuration decides whether a process may start at all, so the suite is held t
477
477
  beyond "the tests pass".
478
478
 
479
479
  - ✅ **100% line coverage** — statements, branches, functions and lines, enforced as a gate
480
- - ✅ **95.74% mutation score** — verified with [Stryker](https://stryker-mutator.io/) at
481
- `break: 95`; the eleven survivors are provable equivalents, documented in the
482
- [report](./docs/mutation_testing_results.md)
480
+ - ✅ **99.59% mutation score** — verified with [Stryker](https://stryker-mutator.io/) at
481
+ `break: 95`; ten provable equivalents carry their reason inline, and the one survivor left
482
+ is an equivalent no directive can reach, so it stays counted rather than silenced
483
+ ([report](./docs/mutation_testing_results.md))
483
484
  - ✅ **The value-free guarantee is tested, not assumed** — a sentinel secret is placed in a
484
485
  source and the assertion is that it appears nowhere in the rendered report or in the thrown
485
486
  error, because a guarantee about what is _absent_ is the one thing an ordinary assertion
@@ -487,7 +488,11 @@ beyond "the tests pass".
487
488
  - ✅ **Published-artifact gates** — `check:exports` resolves the types the way each module
488
489
  system does, `check:runtime` loads every subpath from the packed tarball in ESM and
489
490
  CommonJS, and `check:published` compiles this README's snippets against `dist/`
490
- - ✅ **Zero suppressions** — no coverage or mutation directives in the production source
491
+ - ✅ **Every suppression carries its reason** — no coverage directives anywhere; each
492
+ `// Stryker disable` in the production source names, after the `:` Stryker reads it from,
493
+ why the mutant it silences is behaviour-preserving, and `check:mutants` proves those
494
+ reasons parse so they reach the mutation report rather than the `Ignored using a comment`
495
+ fallback
491
496
 
492
497
  ```bash
493
498
  pnpm test # unit suite
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bymax-one/nest-config",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "Typed and validated environment configuration entry point for NestJS 11 applications, built on Zod v4.",
5
5
  "author": "Bymax One <support@bymax.one>",
6
6
  "license": "MIT",
@@ -56,6 +56,7 @@
56
56
  "scripts": {
57
57
  "build": "pnpm clean && tsup",
58
58
  "check:exports": "attw --pack . --profile strict",
59
+ "check:mutants": "node scripts/check-mutation-directives.mjs",
59
60
  "check:published": "node scripts/check-published-surface.mjs",
60
61
  "check:runtime": "node scripts/check-consumer-runtime.mjs",
61
62
  "clean": "node -e \"const fs=require('node:fs');for(const d of ['dist','coverage'])fs.rmSync(d,{recursive:true,force:true})\"",
@@ -63,10 +64,10 @@
63
64
  "lint": "eslint src",
64
65
  "lint:fix": "eslint src --fix",
65
66
  "mutation": "stryker run",
67
+ "mutation:full": "node -e \"require('node:fs').rmSync('reports/stryker-incremental.json',{force:true,recursive:true})\" && stryker run",
66
68
  "mutation:dry-run": "stryker run --dryRunOnly",
67
- "mutation:incremental": "stryker run --incremental",
68
69
  "prepare": "husky",
69
- "prepublishOnly": "pnpm typecheck && pnpm lint && pnpm test:cov:all && pnpm build && pnpm size && pnpm check:published",
70
+ "prepublishOnly": "pnpm typecheck && pnpm lint && pnpm check:mutants && pnpm test:cov:all && pnpm build && pnpm size && pnpm check:published",
70
71
  "release": "npm publish --provenance --access public",
71
72
  "size": "node scripts/check-size.mjs",
72
73
  "test": "jest",