@specific.dev/spectest 0.85.0 → 0.85.1

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/dist/coverage.js CHANGED
@@ -57,10 +57,14 @@ export function validateCoverage(service, cov) {
57
57
  const obj = typeof cov === "object" && cov !== null ? cov : null;
58
58
  const adapters = obj?.adapters;
59
59
  const reports = obj?.reports;
60
- const knownKeys = obj !== null && Object.keys(obj).every((k) => k === "adapters" || k === "reports");
60
+ // `explains` is what `applyCoverageAdapters` adds for the wire; the
61
+ // config is validated again after that, so it must pass here.
62
+ const explains = obj?.explains;
63
+ const knownKeys = obj !== null && Object.keys(obj).every((k) => k === "adapters" || k === "reports" || k === "explains");
61
64
  const okReports = reports === undefined || reports === "delta" || reports === "cumulative";
62
65
  const okAdapters = adapters === undefined || Array.isArray(adapters);
63
- if (obj !== null && knownKeys && okReports && okAdapters && (adapters !== undefined || reports !== undefined)) {
66
+ const okExplains = explains === undefined || (Array.isArray(explains) && explains.every((e) => typeof e === "string"));
67
+ if (obj !== null && knownKeys && okReports && okAdapters && okExplains && (adapters !== undefined || reports !== undefined)) {
64
68
  for (const a of adapters ?? []) {
65
69
  const ok = typeof a === "object" &&
66
70
  a !== null &&
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@specific.dev/spectest",
3
- "version": "0.85.0",
3
+ "version": "0.85.1",
4
4
  "description": "Spectest SDK for defining test environments in TypeScript.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -65,6 +65,12 @@ describe("validateCoverage", () => {
65
65
  });
66
66
 
67
67
  describe("applyCoverageAdapters", () => {
68
+ test("the applied (wire) form validates again, as defineEnvironment does after applying", () => {
69
+ const out = applyCoverageAdapters("api", { ...base, coverage: { adapters: [node()] } });
70
+ expect(() => validateCoverage("api", out.coverage)).not.toThrow();
71
+ expect(() => validateCoverage("api", JSON.parse(JSON.stringify(out.coverage)))).toThrow(); // names only: not a config
72
+ expect(() => validateCoverage("api", { adapters: [node()], explains: [1] })).toThrow();
73
+ });
68
74
  test("node: appends NODE_OPTIONS, sets the coverage dir env, mounts the hook — never NODE_V8_COVERAGE", () => {
69
75
  const out = applyCoverageAdapters("api", { ...base, coverage: { adapters: [node()] } });
70
76
  expect(out.env?.NODE_OPTIONS).toBe(`--max-old-space-size=512 --require ${NODE_COVERAGE_HOOK_PATH}`);
package/src/coverage.ts CHANGED
@@ -184,10 +184,14 @@ export function validateCoverage(service: string, cov: unknown): void {
184
184
  const obj = typeof cov === "object" && cov !== null ? (cov as Record<string, unknown>) : null;
185
185
  const adapters = obj?.adapters;
186
186
  const reports = obj?.reports;
187
- const knownKeys = obj !== null && Object.keys(obj).every((k) => k === "adapters" || k === "reports");
187
+ // `explains` is what `applyCoverageAdapters` adds for the wire; the
188
+ // config is validated again after that, so it must pass here.
189
+ const explains = obj?.explains;
190
+ const knownKeys = obj !== null && Object.keys(obj).every((k) => k === "adapters" || k === "reports" || k === "explains");
188
191
  const okReports = reports === undefined || reports === "delta" || reports === "cumulative";
189
192
  const okAdapters = adapters === undefined || Array.isArray(adapters);
190
- if (obj !== null && knownKeys && okReports && okAdapters && (adapters !== undefined || reports !== undefined)) {
193
+ const okExplains = explains === undefined || (Array.isArray(explains) && explains.every((e) => typeof e === "string"));
194
+ if (obj !== null && knownKeys && okReports && okAdapters && okExplains && (adapters !== undefined || reports !== undefined)) {
191
195
  for (const a of (adapters as unknown[] | undefined) ?? []) {
192
196
  const ok =
193
197
  typeof a === "object" &&