Beispiel
ajv 8.20.0: Fix ajv throwing "strict mode: unknown keyword" when compiling an existing JSON Schema
Verifiziertes Beispiel für npm ajv 8.20.0: Fix ajv throwing "strict mode: unknown keyword" when compiling an existing JSON Schema. Der Vertrag lief auf node…
sha256:de249b2f65992de63dd2adece0fd7b0829b25af3cd75a5ad075a49696ed69ffc
Dieses Netzwerk bietet eine Sache: ein Sample, das baut. Es hat es in einer Sandbox ausgeführt und die signierte Quittung behalten. Es bewertet nichts und garantiert nichts — ob derselbe Code bei Ihnen baut, hat es nicht gemessen.
Wie viele verschiedene Signaturschlüssel eine bestandene Vertragsquittung eingereicht haben. Einer ist der Autor allein; mehr als einer heißt, jemand anderes hat es auch gebaut. Ein Schlüssel wird selbst erzeugt und hat keine registrierte Identität dahinter — gezählt werden Schlüssel, nicht Personen.
MIT-0
Ausführungsbelege
Die deklarierte Umgebung und die signierten Läufe stehen getrennt, damit Sie genau sehen, was dieses Sample ausgeführt hat und wo.
- Beleggrundlage
- Signierter Vertrag bestanden
- Verifizierungsbelege
- 2
- Signaturschlüssel, die es gebaut haben
- 2
Deklarierte Umgebung
node 22 linux x64 node 22 npm
Umgebungen der Verifizierungsläufe
| Umgebung | Contract | Stufen | Lauf |
|---|---|---|---|
| node 22 · linux alpine/x64 · docker ed25519:a2ec939a4c60e243 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · node-typescript@1 |
2026-08-13 |
| node 22 · linux alpine/x64 · docker ed25519:d91480838ac982c9 | PASS | compile:SKIPPED · contract:PASS · load:PASS · resolve:PASS CONTAINER_RUN · node-typescript@1 |
2026-08-17 |
Fall
FIX- Ziel
- Fix ajv throwing "strict mode: unknown keyword" when compiling an existing JSON Schema
- Pakete
- Symbole
-
- Ajv
- ajv.compile
- Umgebung
- node 22
- Erstellt
- 2026-08-13T15:19:07Z
Contract
- compile a schema that carries an annotation keyword ajv does not know
- assert strict mode rejects it at compile time
- assert declaring the keyword lets the same schema compile
- assert validation errors carry instancePath and keyword
Dateien
- csx.json
- package-lock.json
- package.json
- src/index.mjs
- test/contract.mjs
Quelltext
{"case":{"caseId":"case:sha256:bf1efc99da33779f2c29f6db99c83cf7239203d9cd62475f93ecd48851de4f21","constraints":{"moduleSystem":"esm","runtime":"node"},"contract":["compile a schema that carries an annotation keyword ajv does not know","assert strict mode rejects it at compile time","assert declaring the keyword lets the same schema compile","assert validation errors carry instancePath and keyword"],"goal":"Fix ajv throwing \"strict mode: unknown keyword\" when compiling an existing JSON Schema","kind":"FIX","packages":["pkg:npm/ajv@8.20.0"],"schemaVersion":1,"symbols":["Ajv","ajv.compile"]},"contractCommand":["node","test/contract.mjs"],"environment":{"arch":"x64","ecosystem":"npm","executionContext":"node","moduleSystem":"esm","os":"linux","packageManager":"npm","runtime":"node","runtimeVersion":"22","schemaVersion":1},"license":"MIT-0","packages":["pkg:npm/ajv@8.20.0"],"schemaVersion":1,"symbols":["Ajv","ajv.compile"],"verifierAdapter":"node-typescript@1"}
{
"name": "csx-sample-ajv-strict-schema",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "csx-sample-ajv-strict-schema",
"version": "1.0.0",
"license": "MIT-0",
"dependencies": {
"ajv": "8.20.0"
}
},
"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==",
"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/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==",
"license": "MIT"
},
"node_modules/fast-uri": {
"version": "3.1.5",
"resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz",
"integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/fastify"
},
{
"type": "opencollective",
"url": "https://opencollective.com/fastify"
}
],
"license": "BSD-3-Clause"
},
"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==",
"license": "MIT"
},
"node_modules/require-from-string": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
"integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
}
}
}
{
"name": "csx-sample-ajv-strict-schema",
"version": "1.0.0",
"private": true,
"type": "module",
"license": "MIT-0",
"dependencies": {
"ajv": "8.20.0"
}
}
import Ajv from 'ajv';
// ajv 8 turns strict mode ON by default: any keyword it does not recognize
// throws at compile time rather than being ignored as in ajv 6/7. Turning
// strict off hides real typos, so declaring the keyword is the safer fix.
// Errors also changed shape in v8 — dataPath became instancePath.
export function compileStrict(schema) {
const ajv = new Ajv({ strict: true });
return ajv.compile(schema);
}
export function compileWithKeyword(schema, keyword) {
const ajv = new Ajv({ strict: true });
ajv.addKeyword({ keyword, schemaType: 'string' });
return ajv.compile(schema);
}
import { strict as assert } from 'node:assert';
import { compileStrict, compileWithKeyword } from '../src/index.mjs';
const schema = {
type: 'object',
properties: { name: { type: 'string' }, port: { type: 'integer' } },
required: ['name'],
'x-unit': 'milliseconds', // annotation ajv does not know
};
assert.throws(() => compileStrict(schema), /strict mode/i);
const validate = compileWithKeyword(schema, 'x-unit');
assert.equal(validate({ name: 'csx', port: 8080 }), true);
assert.equal(validate({ port: 'not-an-integer' }), false);
const codes = validate.errors.map((e) => e.keyword);
assert.ok(codes.includes('required'));
assert.equal(typeof validate.errors[0].instancePath, 'string'); // v8 name
console.log('CONTRACT PASS: ajv 8 strict mode explained and the schema compiled');