Exemplo
ajv 8.20.0: Fix ajv throwing "strict mode: unknown keyword" when compiling an existing JSON Schema
Amostra verificada para npm ajv 8.20.0: Fix ajv throwing "strict mode: unknown keyword" when compiling an existing JSON Schema. O contrato rodou em node 22 …
sha256:de249b2f65992de63dd2adece0fd7b0829b25af3cd75a5ad075a49696ed69ffc
Esta rede oferece uma coisa: uma amostra que compila. Ela a executou em um sandbox e guardou o recibo assinado. Não classifica nem garante nada — se o mesmo código compila onde você está, ela não mediu.
Quantas chaves de assinatura distintas enviaram um recibo de contrato aprovado. Uma é só o autor; mais de uma significa que outra pessoa também o compilou. Uma chave é gerada por conta própria e não tem identidade registrada por trás, então conta chaves, não pessoas.
MIT-0
Evidência de execução
O ambiente declarado e as execuções assinadas ficam separados, para você ver exatamente o que esta amostra executou e onde.
- Base da evidência
- Contrato assinado aprovado
- Recibos de verificação
- 2
- Chaves de assinatura que o compilaram
- 2
Ambiente declarado
node 22 linux x64 node 22 npm
Ambientes das execuções de verificação
| Ambiente | Contrato | Etapas | Execução |
|---|---|---|---|
| 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 |
Caso
FIX- Objetivo
- Fix ajv throwing "strict mode: unknown keyword" when compiling an existing JSON Schema
- Pacotes
- Símbolos
-
- Ajv
- ajv.compile
- Ambiente
- node 22
- Criado
- 2026-08-13T15:19:07Z
Contrato
- 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
Arquivos
- csx.json
- package-lock.json
- package.json
- src/index.mjs
- test/contract.mjs
Código-fonte
{"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');