@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 +6 -2
- package/package.json +1 -1
- package/src/coverage.test.ts +6 -0
- package/src/coverage.ts +6 -2
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
|
-
|
|
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
|
-
|
|
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
package/src/coverage.test.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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" &&
|