Skip to content

Commit fef4665

Browse files
committed
Register schemas to support coverage for external references
1 parent 37c0312 commit fef4665

File tree

2 files changed

+22
-16
lines changed

2 files changed

+22
-16
lines changed

README.md

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,6 @@ The following are know limitations I'm hopeful can be addressed.
3434
- Schemas in YAML aren't supported.
3535
- Custom vocabularies aren't supported.
3636
- There's no way to load schemas.
37-
- Invalid schemas cause an error to be thrown.
38-
- Coverage maps are generated in the order they're loaded from the filesystem.
39-
If one references a schema that hasn't been generated yet, an error will be
40-
thrown.
4137

4238
## Vitest
4339

src/vitest/coverage-provider.js

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { glob } from "tinyglobby";
1010
import { resolve } from "pathe";
1111
import c from "tinyrainbow";
1212
import { coverageConfigDefaults } from "vitest/config";
13-
import "@hyperjump/json-schema/draft-2020-12";
13+
import { registerSchema } from "@hyperjump/json-schema/draft-2020-12";
1414
import "@hyperjump/json-schema/draft-2019-09";
1515
import "@hyperjump/json-schema/draft-07";
1616
import "@hyperjump/json-schema/draft-06";
@@ -28,6 +28,7 @@ import { fromJson } from "../json-util.js";
2828
* Vitest
2929
* } from "vitest"
3030
* @import { CoverageMap, CoverageMapData } from "istanbul-lib-coverage"
31+
* @import { SchemaObject } from "@hyperjump/json-schema"
3132
*/
3233

3334
/** @type CoverageProviderModule */
@@ -122,14 +123,28 @@ class JsonSchemaCoverageProvider {
122123
.add(gitignore)
123124
.filter(includedFiles);
124125

126+
// Register all schemas
125127
for (const file of files) {
126-
const schema = await getSchema(file);
128+
try {
129+
const schemaPath = path.resolve(root, file);
130+
const json = await fs.readFile(schemaPath, "utf-8");
131+
/** @type SchemaObject */
132+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
133+
const schema = JSON.parse(json);
134+
registerSchema(schema);
135+
} catch (_error) {
136+
}
137+
}
138+
139+
for (const file of files) {
140+
const schemaPath = path.resolve(root, file);
141+
const schema = await getSchema(schemaPath);
127142
const compiledSchema = await compile(schema);
128-
const json = await fs.readFile(file, "utf-8");
129-
const tree = fromJson(json);
130-
const coverageMap = astToCoverageMap(compiledSchema, path.resolve(root, file), tree);
131143
const fileHash = createHash("md5").update(compiledSchema.schemaUri).digest("hex");
132144
const coverageFilePath = path.resolve(this.coverageFilesDirectory, fileHash);
145+
const json = await fs.readFile(schemaPath, "utf-8");
146+
const tree = fromJson(json);
147+
const coverageMap = astToCoverageMap(compiledSchema, path.resolve(root, file), tree);
133148
await fs.writeFile(coverageFilePath, JSON.stringify(coverageMap));
134149
}
135150
}
@@ -147,7 +162,7 @@ class JsonSchemaCoverageProvider {
147162

148163
/** @type CoverageProvider["reportCoverage"] */
149164
async reportCoverage(coverageMap) {
150-
this.generateReports(/** @type CoverageMap */ (coverageMap) ?? this.createCoverageMap());
165+
this.generateReports(/** @type CoverageMap */ (coverageMap) ?? coverage.createCoverageMap());
151166

152167
// In watch mode we need to preserve the previous results if cleanOnRerun is disabled
153168
const keepResults = !this.options.cleanOnRerun && this.ctx.config.watch;
@@ -189,11 +204,6 @@ class JsonSchemaCoverageProvider {
189204
});
190205
}
191206

192-
/** @type () => CoverageMap */
193-
createCoverageMap() {
194-
return coverage.createCoverageMap({});
195-
}
196-
197207
/** @type CoverageProvider["onAfterSuiteRun"] */
198208
onAfterSuiteRun() {
199209
// The method is required by the interface, but doesn't seem to ever be called
@@ -202,7 +212,7 @@ class JsonSchemaCoverageProvider {
202212

203213
/** @type CoverageProvider["generateCoverage"] */
204214
async generateCoverage() {
205-
const coverageMap = this.createCoverageMap();
215+
const coverageMap = coverage.createCoverageMap();
206216

207217
for (const file of await fs.readdir(this.coverageFilesDirectory, { recursive: true, withFileTypes: true })) {
208218
const path = resolve(file.parentPath, file.name);

0 commit comments

Comments
 (0)