diff --git a/package-lock.json b/package-lock.json index bc94a988e2..0436aecd16 100644 --- a/package-lock.json +++ b/package-lock.json @@ -47,7 +47,8 @@ "@types/stream-json": "^1.7.3", "@types/urijs": "^1.19.26", "@types/wordwrap": "^1.0.3", - "ajv": "^5.5.2", + "ajv": "^8.20.0", + "ajv-formats": "^3.0.1", "deep-equal": "^2.2.3", "esbuild": "^0.28.1", "promise-timeout": "^1.3.0", @@ -1444,23 +1445,6 @@ "node": ">=20.0.0" } }, - "node_modules/@secretlint/config-loader/node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/@secretlint/config-loader/node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -1479,20 +1463,6 @@ } } }, - "node_modules/@secretlint/config-loader/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@secretlint/config-loader/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/@secretlint/config-loader/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2973,14 +2943,38 @@ } }, "node_modules/ajv": { - "version": "5.5.2", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", "dev": true, "license": "MIT", "dependencies": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } } }, "node_modules/ansi-colors": { @@ -3637,15 +3631,6 @@ "node": ">=12" } }, - "node_modules/co": { - "version": "4.6.0", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, "node_modules/cockatiel": { "version": "3.1.2", "dev": true, @@ -4614,7 +4599,9 @@ "license": "MIT" }, "node_modules/fast-deep-equal": { - "version": "1.1.0", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, @@ -4634,11 +4621,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/fast-levenshtein": { "version": "2.0.6", "dev": true, @@ -5630,7 +5612,9 @@ } }, "node_modules/json-schema-traverse": { - "version": "0.3.1", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, @@ -8602,37 +8586,6 @@ "node": ">=12.17" } }, - "node_modules/table/node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, "node_modules/tapable": { "version": "2.2.1", "dev": true, diff --git a/package.json b/package.json index f6b9361260..9324aeb5e9 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,8 @@ "@types/stream-json": "^1.7.3", "@types/urijs": "^1.19.26", "@types/wordwrap": "^1.0.3", - "ajv": "^5.5.2", + "ajv": "^8.20.0", + "ajv-formats": "^3.0.1", "deep-equal": "^2.2.3", "esbuild": "^0.28.1", "promise-timeout": "^1.3.0", diff --git a/test/fixtures.ts b/test/fixtures.ts index 6d22a9ac7c..dece181ef6 100644 --- a/test/fixtures.ts +++ b/test/fixtures.ts @@ -5,6 +5,8 @@ import { randomBytes } from "node:crypto"; import * as shell from "shelljs"; const Ajv = require("ajv"); +const addFormats = require("ajv-formats"); +const draft06MetaSchema = require("ajv/dist/refs/json-schema-draft-06.json"); import { compareJsonFileToJson, @@ -600,17 +602,26 @@ class JSONSchemaJSONFixture extends JSONToXToYFixture { fs.readFileSync(this.language.output, "utf8"), ); - const ajv = new Ajv({ - format: "full", - unknownFormats: ["integer", "boolean"], - }); + const ajv = new Ajv(); + // We generate draft-06 schemas, which Ajv 8 doesn't support out of + // the box anymore. + ajv.addMetaSchema(draft06MetaSchema); + // Ajv 8 moved the format validators into the ajv-formats package; + // its default mode is "full", like the old `format: "full"` option. + addFormats(ajv); + // Our custom schema keywords, which strict mode would reject. + ajv.addVocabulary(["qt-uri-protocols", "qt-uri-extensions"]); // Make Ajv's date-time compatible with what we recognize. All non-standard // JSON formats that we use for transformed type kinds must be registered here - // with a validation function. + // with a validation function. Formats registered with `true` are + // accepted without validating the string. This replaces the old + // `unknownFormats: ["integer", "boolean"]` option. // FIXME: Unify this with what's in StringTypes.ts. ajv.addFormat("date-time", (s: string) => dateTimeRecognizer.isDateTime(s), ); + ajv.addFormat("integer", true); + ajv.addFormat("boolean", true); const valid = ajv.validate(schema, input); if (!valid) { failWith("Generated schema does not validate input JSON.", {