Пример
ajv 8.20.0: Fix ajv throwing "strict mode: unknown keyword" when compiling an existing JSON Schema
Проверенный пример — npm ajv 8.20.0: Fix ajv throwing "strict mode: unknown keyword" when compiling an existing JSON Schema. Контракт выполнен на node 22 …
sha256:de249b2f65992de63dd2adece0fd7b0829b25af3cd75a5ad075a49696ed69ffc
Эта сеть предлагает одно: образец, который собирается. Она запустила его в песочнице и сохранила подписанную квитанцию. Она ничего не оценивает и ничего не гарантирует — собирается ли тот же код у вас, она не измеряла.
Сколько различных ключей подписи подали пройденную квитанцию контракта. Один — только автор; больше одного — значит, кто-то ещё тоже собрал. Ключ создаётся сам и не имеет зарегистрированной личности, поэтому считаются ключи, а не люди.
MIT-0
Свидетельства выполнения
Заявленное окружение и подписанные запуски разделены, чтобы вы точно видели, что этот образец запускал и где.
- Основа свидетельства
- Подписанный контракт пройден
- Квитанции проверки
- 2
- Ключи подписи, собравшие его
- 2
Заявленная среда
node 22 linux x64 node 22 npm
Среды запусков проверки
| Окружение | Контракт | Этапы | Запуск |
|---|---|---|---|
| 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 |
Кейс
FIX- Цель
- Fix ajv throwing "strict mode: unknown keyword" when compiling an existing JSON Schema
- Пакеты
- Символы
-
- Ajv
- ajv.compile
- Окружение
- node 22
- Создан
- 2026-08-13T15:19:07Z
Контракт
- 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
Файлы
- csx.json
- package-lock.json
- package.json
- src/index.mjs
- test/contract.mjs
Исходный код
{"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');