Skip to content

Commit 70666cc

Browse files
committed
Restore support for DETAILED output
1 parent f47aaf5 commit 70666cc

File tree

10 files changed

+1345
-20
lines changed

10 files changed

+1345
-20
lines changed

annotations/index.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { FLAG } from "../lib/index.js";
12
import { ValidationError } from "./validation-error.js";
23
import { getSchema, compile, BASIC } from "../lib/experimental.js";
34
import Validation from "../lib/keywords/validation.js";
@@ -15,10 +16,11 @@ export const annotate = async (schemaUri, json = undefined, outputFormat = undef
1516
export const interpret = ({ ast, schemaUri }, instance, outputFormat = BASIC) => {
1617
const errors = [];
1718
const annotations = [];
18-
const valid = Validation.interpret(schemaUri, instance, { ast, schemaUri, dynamicAnchors: {}, errors, annotations });
19+
const context = { ast, schemaUri, dynamicAnchors: {}, errors, annotations, outputFormat };
20+
const valid = Validation.interpret(schemaUri, instance, context);
1921

2022
if (!valid) {
21-
const result = outputFormat === BASIC && !valid ? { valid, errors } : { valid };
23+
const result = outputFormat === FLAG || valid ? { valid } : { valid, errors };
2224
throw new ValidationError(result);
2325
}
2426

bundle/generate-snapshots.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { writeFile, mkdir, rm } from "node:fs/promises";
22
import { isCompatible, md5, loadSchemas, testSuite, unloadSchemas } from "./test-utils.js";
3-
import { compile, getSchema, Validation } from "../lib/experimental.js";
3+
import { BASIC, compile, getSchema, Validation } from "../lib/experimental.js";
44
import "../stable/index.js";
55
import "../draft-2020-12/index.js";
66
import "../draft-2019-09/index.js";
@@ -30,7 +30,8 @@ const snapshotGenerator = async (version, dialect) => {
3030
const instance = Instance.fromJs(test.instance);
3131
const errors = [];
3232
const annotations = [];
33-
const valid = Validation.interpret(schemaUri, instance, { ast, schemaUri, dynamicAnchors: {}, errors, annotations });
33+
const context = { ast, schemaUri, dynamicAnchors: {}, errors, annotations, outputFormat: BASIC };
34+
const valid = Validation.interpret(schemaUri, instance, context);
3435

3536
const expectedOutput = { valid, errors, annotations };
3637

bundle/test-suite.spec.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { readFile } from "node:fs/promises";
22
import { describe, it, expect, beforeAll, afterAll } from "vitest";
33
import { isCompatible, md5, loadSchemas, unloadSchemas, testSuite } from "./test-utils.js";
44
import { registerSchema, unregisterSchema } from "../lib/index.js";
5-
import { compile, getKeywordName, getSchema, Validation } from "../lib/experimental.js";
5+
import { BASIC, compile, getKeywordName, getSchema, Validation } from "../lib/experimental.js";
66
import * as Instance from "../lib/instance.js";
77
import "../stable/index.js";
88
import "../draft-2020-12/index.js";
@@ -62,7 +62,8 @@ const testRunner = (version: number, dialect: string) => {
6262
const instance = Instance.fromJs(test.instance);
6363
const errors: OutputUnit[] = [];
6464
const annotations: OutputUnit[] = [];
65-
const valid = Validation.interpret(schemaUri, instance, { ast, schemaUri, dynamicAnchors: {}, errors, annotations });
65+
const context = { ast, schemaUri, dynamicAnchors: {}, errors, annotations, outputFormat: BASIC };
66+
const valid = Validation.interpret(schemaUri, instance, context);
6667

6768
const output = { valid, errors, annotations };
6869

lib/core.js

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { getKeywordName } from "./keywords.js";
1313
import Validation from "./keywords/validation.js";
1414

1515

16-
export const FLAG = "FLAG", BASIC = "BASIC";
16+
export const FLAG = "FLAG", BASIC = "BASIC", DETAILED = "DETAILED";
1717
setMetaSchemaOutputFormat(FLAG);
1818

1919
export const validate = async (url, value = undefined, outputFormat = undefined) => {
@@ -32,8 +32,9 @@ export const compile = async (schema) => {
3232

3333
export const interpret = curry(({ ast, schemaUri }, instance, outputFormat = FLAG) => {
3434
const errors = [];
35-
const valid = Validation.interpret(schemaUri, instance, { ast, schemaUri, dynamicAnchors: {}, errors, annotations: [] });
36-
return outputFormat === BASIC && !valid ? { valid, errors } : { valid };
35+
const context = { ast, schemaUri, dynamicAnchors: {}, errors, annotations: [], outputFormat };
36+
const valid = Validation.interpret(schemaUri, instance, context);
37+
return outputFormat === FLAG || valid ? { valid } : { valid, errors };
3738
});
3839

3940
const metaValidators = {};

lib/experimental.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ type Anchors = Record<string, string>;
3232

3333
// Output Formats
3434
export const BASIC: "BASIC";
35+
export const DETAILED: "DETAILED";
3536

3637
// Schema
3738
export const getSchema: (uri: string, browser?: Browser) => Promise<Browser<SchemaDocument>>;

lib/experimental.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
export { compile, interpret, BASIC } from "./core.js";
1+
export { compile, interpret, BASIC, DETAILED } from "./core.js";
22
export {
33
addKeyword, getKeyword, getKeywordByName, getKeywordName, getKeywordId,
44
defineVocabulary,

lib/keywords/itemPattern.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ const compile = async (schema, ast) => {
3939
.reduce(union);
4040
};
4141

42-
const evaluate = (strategy) => (nfa, instance, context) => {
42+
const evaluate = (strategy, nfa, instance, context) => {
4343
if (Instance.typeOf(instance) !== "array") {
4444
return true;
4545
}
@@ -84,8 +84,8 @@ const transition = (strategy, transitions, instance, context) => {
8484
}
8585
};
8686

87-
const interpret = evaluate(Validation.interpret);
88-
const collectEvalatedProperties = evaluate(Validation.collectEvaluatedProperties);
89-
const collectEvalatedItems = evaluate(Validation.collectEvaluatedItems);
87+
const interpret = (...args) => evaluate(Validation.interpret, ...args);
88+
const collectEvalatedProperties = (...args) => evaluate(Validation.collectEvaluatedProperties, ...args);
89+
const collectEvalatedItems = (...args) => evaluate(Validation.collectEvaluatedItems, ...args);
9090

9191
export default { id, compile, interpret, collectEvalatedProperties, collectEvalatedItems };

lib/keywords/validation.js

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import { append as pointerAppend } from "@hyperjump/json-pointer";
44
import { publishAsync } from "../pubsub.js";
55
import * as Instance from "../instance.js";
66
import { toAbsoluteUri } from "../common.js";
7-
import { canonicalUri, getKeyword, getKeywordByName } from "../experimental.js";
7+
import { canonicalUri, getKeyword, getKeywordByName, BASIC, DETAILED } from "../experimental.js";
8+
import { FLAG } from "../index.js";
89

910

1011
const id = "https://json-schema.org/evaluation/validate";
@@ -44,7 +45,7 @@ const compile = async (schema, ast) => {
4445
return url;
4546
};
4647

47-
const interpret = (url, instance, { ast, dynamicAnchors, errors, annotations }) => {
48+
const interpret = (url, instance, { ast, dynamicAnchors, errors, annotations, outputFormat }) => {
4849
dynamicAnchors = { ...ast.metaData[toAbsoluteUri(url)].dynamicAnchors, ...dynamicAnchors };
4950

5051
if (typeof ast[url] === "boolean") {
@@ -63,15 +64,24 @@ const interpret = (url, instance, { ast, dynamicAnchors, errors, annotations })
6364

6465
let isSchemaValid = true;
6566
for (const [keywordId, schemaUri, keywordValue] of ast[url]) {
66-
const context = { ast, dynamicAnchors, schemaUri, errors: [], annotations: [] };
67+
const context = { ast, dynamicAnchors, schemaUri, errors: [], annotations: [], outputFormat };
6768
if (!getKeyword(keywordId).interpret(keywordValue, instance, context)) {
6869
isSchemaValid = false;
69-
errors.push({
70+
if (outputFormat === FLAG) {
71+
continue;
72+
}
73+
74+
const outputUnit = {
7075
keyword: keywordId,
7176
absoluteKeywordLocation: schemaUri,
7277
instanceLocation: Instance.uri(instance)
73-
});
74-
errors.push(...context.errors);
78+
};
79+
errors.push(outputUnit);
80+
if (outputFormat === DETAILED && context.errors.length > 0) {
81+
outputUnit.errors = context.errors;
82+
} else if (outputFormat === BASIC) {
83+
errors.push(...context.errors);
84+
}
7585
} else {
7686
schemaAnnotations.push(...context.annotations);
7787
}
File renamed without changes.

0 commit comments

Comments
 (0)