Skip to content

Commit a70ca81

Browse files
committed
Make 2020-12 format a distinct keyword
1 parent f1b97fb commit a70ca81

File tree

8 files changed

+70
-29
lines changed

8 files changed

+70
-29
lines changed

README.md

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -507,32 +507,31 @@ associate that format handler with the format keyword that applies to the
507507
dialects you're targeting.
508508
509509
```JavaScript
510-
import { registerSchema, validate } from "@hyperjump/json-schema/draft-2020-12";
511-
import {
512-
setShouldValiateFormat,
513-
addFormat,
514-
setFormatHandler
515-
} from "@hyperjump/json-schema/formats";
510+
import { registerSchema, validate, setShouldValidateFormat } from "@hyperjump/json-schema/draft-2020-12";
511+
import { addFormat, setFormatHandler } from "@hyperjump/json-schema/experimental";
516512

517-
const isoDateFormatUri = "https://example.com/format/iso-8601-date";
513+
const isoDateFormatUri = "https://example.com/format/iso-8601-date";
518514

515+
// Add the iso-date format handler
519516
addFormat({
520517
id: isoDateFormatUri,
521-
handler: (date) => Date.parse(date).toISOString() === date
518+
handler: (date) => new Date(date).toISOString() === date
522519
});
523520

524-
addFormatHandler("https://json-schema.org/keyword/format", "iso-date", isoDateFormatUri);
525-
addFormatHandler("https://json-schema.org/keyword/format-assertion", "iso-date", isoDateFormatUri);
526-
// Optional: Add the iso-date format to other dialects
527-
addFormatHandler("https://json-schema.org/keyword/draft-2019-09/format", "iso-date", isoDateFormatUri);
528-
addFormatHandler("https://json-schema.org/keyword/draft-2019-09/format-assertion", "iso-date", isoDateFormatUri);
529-
addFormatHandler("https://json-schema.org/keyword/draft-07/format", "iso-date", isoDateFormatUri);
530-
addFormatHandler("https://json-schema.org/keyword/draft-06/format", "iso-date", isoDateFormatUri);
531-
addFormatHandler("https://json-schema.org/keyword/draft-04/format", "iso-date", isoDateFormatUri);
521+
// Add the "iso-date" format to the 2020-12 version of `format`
522+
setFormatHandler("https://json-schema.org/keyword/draft-2020-12/format", "iso-date", isoDateFormatUri);
523+
setFormatHandler("https://json-schema.org/keyword/draft-2020-12/format-assertion", "iso-date", isoDateFormatUri);
524+
525+
// Optional: Add the "iso-date" format to other dialects
526+
setFormatHandler("https://json-schema.org/keyword/draft-2019-09/format", "iso-date", isoDateFormatUri);
527+
setFormatHandler("https://json-schema.org/keyword/draft-2019-09/format-assertion", "iso-date", isoDateFormatUri);
528+
setFormatHandler("https://json-schema.org/keyword/draft-07/format", "iso-date", isoDateFormatUri);
529+
setFormatHandler("https://json-schema.org/keyword/draft-06/format", "iso-date", isoDateFormatUri);
530+
setFormatHandler("https://json-schema.org/keyword/draft-04/format", "iso-date", isoDateFormatUri);
532531

533532
const schemaUri = "https://example.com/main";
534533
registerSchema({
535-
"$schema": "https://json-schema.org/draft/2002-12/schema",
534+
"$schema": "https://json-schema.org/draft/2020-12/schema",
536535

537536
"type": "string",
538537
"format": "iso-date"

draft-2020-12/format.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
import * as Browser from "@hyperjump/browser";
2+
import * as Instance from "../lib/instance.js";
3+
import { getShouldValidateFormat } from "../lib/configuration.js";
4+
import { getFormatHandler } from "../lib/keywords.js";
5+
6+
7+
const id = "https://json-schema.org/keyword/draft-2020-12/format";
8+
9+
const compile = (schema) => Browser.value(schema);
10+
11+
const interpret = (format, instance) => {
12+
if (!getShouldValidateFormat()) {
13+
return true;
14+
}
15+
16+
const handler = getFormatHandler(formats[format]);
17+
return handler?.(Instance.value(instance)) ?? true;
18+
};
19+
20+
const annotation = (format) => format;
21+
22+
const formats = {
23+
"date-time": "https://json-schema.org/format/date-time",
24+
"date": "https://json-schema.org/format/date",
25+
"time": "https://json-schema.org/format/time",
26+
"duration": "https://json-schema.org/format/duration",
27+
"email": "https://json-schema.org/format/email",
28+
"idn-email": "https://json-schema.org/format/idn-email",
29+
"hostname": "https://json-schema.org/format/hostname",
30+
"idn-hostname": "https://json-schema.org/format/idn-hostname",
31+
"ipv4": "https://json-schema.org/format/ipv4",
32+
"ipv6": "https://json-schema.org/format/ipv6",
33+
"uri": "https://json-schema.org/format/uri",
34+
"uri-reference": "https://json-schema.org/format/uri-reference",
35+
"iri": "https://json-schema.org/format/iri",
36+
"iri-reference": "https://json-schema.org/format/iri-reference",
37+
"uuid": "https://json-schema.org/format/uuid",
38+
"uri-template": "https://json-schema.org/format/uri-template",
39+
"json-pointer": "https://json-schema.org/format/json-pointer",
40+
"relative-json-pointer": "https://json-schema.org/format/relative-json-pointer",
41+
"regex": "https://json-schema.org/format/regex"
42+
};
43+
44+
export default { id, compile, interpret, annotation, formats };

draft-2020-12/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import unevaluatedMetaSchema from "./meta/unevaluated.js";
1313

1414
import dynamicAnchor from "./dynamicAnchor.js";
1515
import dynamicRef from "./dynamicRef.js";
16-
import format from "../draft-2019-09/format.js";
16+
import format from "./format.js";
1717
import formatAssertion from "./format-assertion.js";
1818

1919

@@ -85,7 +85,7 @@ defineVocabulary("https://json-schema.org/draft/2020-12/vocab/meta-data", {
8585
});
8686

8787
defineVocabulary("https://json-schema.org/draft/2020-12/vocab/format-annotation", {
88-
"format": "https://json-schema.org/keyword/draft-2019-09/format"
88+
"format": "https://json-schema.org/keyword/draft-2020-12/format"
8989
});
9090

9191
defineVocabulary("https://json-schema.org/draft/2020-12/vocab/format-assertion", {

formats/formats-test-suite.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import fs from "node:fs";
22
import { describe, it, expect, beforeAll, afterAll } from "vitest";
3-
import { registerSchema, unregisterSchema, validate } from "../lib/index.js";
3+
import { registerSchema, setShouldValidateFormat, unregisterSchema, validate } from "../lib/index.js";
4+
import "./index.js";
45
import "../draft-2020-12/index.js";
56
import "../draft-2019-09/index.js";
67
import "../draft-07/index.js";
78
import "../draft-06/index.js";
89
import "../draft-04/index.js";
9-
import { setShouldValidateFormat } from "./index.js";
1010

1111
import type { Json } from "@hyperjump/json-pointer";
1212
import type { SchemaObject, Validator } from "../lib/index.js";

formats/index.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { addFormat } from "../lib/keywords.js";
2+
import "./lite.js";
23

34
import idnEmail from "./handlers/idn-email.js";
45
import hostname from "./handlers/hostname.js";
@@ -8,5 +9,3 @@ import idnHostname from "./handlers/idn-hostname.js";
89
addFormat(idnEmail);
910
addFormat(hostname);
1011
addFormat(idnHostname);
11-
12-
export * from "./lite.js";

formats/lite.js

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,3 @@ addFormat(uriTemplate);
3636
addFormat(jsonPointer);
3737
addFormat(relativeJsonPointer);
3838
addFormat(regex);
39-
40-
export {
41-
getShouldValidateFormat,
42-
setShouldValidateFormat
43-
} from "../lib/configuration.js";

lib/index.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ export const setMetaSchemaOutputFormat: (format: OutputFormat) => void;
5454
export const getMetaSchemaOutputFormat: () => OutputFormat;
5555
export const setShouldValidateSchema: (isEnabled: boolean) => void;
5656
export const getShouldValidateSchema: () => boolean;
57+
export const setShouldValidateFormat: (isEnabled: boolean) => void;
58+
export const getShouldValidateFormat: () => boolean;
5759

5860
export class InvalidSchemaError extends Error {
5961
public output: Output & { valid: false };

lib/index.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,8 @@ export {
135135
getMetaSchemaOutputFormat,
136136
setMetaSchemaOutputFormat,
137137
getShouldValidateSchema,
138-
setShouldValidateSchema
138+
setShouldValidateSchema,
139+
getShouldValidateFormat,
140+
setShouldValidateFormat
139141
} from "./configuration.js";
140142
export { InvalidSchemaError } from "./invalid-schema-error.js";

0 commit comments

Comments
 (0)