ajv-validator / ajv-merge-patch

$merge and $patch keywords for Ajv JSON-Schema validator to extend schemas
https://ajv.js.org
MIT License
46 stars 17 forks source link

Error: can't resolve reference http://json-schema.org/draft-07/schema# #47

Open mikebrant-xdelivery opened 2 years ago

mikebrant-xdelivery commented 2 years ago

It seems as if there is an out-of-the-box compatibility issue with Ajv2020 instances of ajv.

When trying to apply the ajv-merge-patch keywords, I get...

Error: can't resolve reference http://json-schema.org/draft-07/schema# from id # at Object.code (/Users/[redacted]/node_modules/ajv/dist/vocabularies/core/ref.js:21:19) at ...

...which looks like is related to code in /keywords/add_keyword.js of this repo where this metaschema is referenced.

Code to reproduce...

import Ajv2020 from 'ajv/dist/2020.js';
import ajvMergePatch from 'ajv-merge-patch';

const ajv = new Ajv2020();
ajvMergePatch(ajv);

I was able to workaround with the following...

import { readFileSync } from 'fs';

import Ajv2020 from 'ajv/dist/2020.js';
import ajvMergePatch from 'ajv-merge-patch';

const ajv = new Ajv2020();

// required by ajv-merge-patch
const draft7MetaUrl = new URL('../node_modules/ajv/dist/refs/json-schema-draft-07.json', import.meta.url);
const draft7MetaSchema = JSON.parse(readFileSync(draft7MetaUrl, 'utf8'));
ajv.addMetaSchema(draft7MetaSchema);

ajvMergePatch(ajv);

...but figured I would open issue here to raise visibility.

I know that ajv itself indicates there is no cross-compatibility between draft-2020-12 and draft-07 schema within same ajv instance, however this does seems to work. At a minimum, I would find it unexpected that a developer using only draft-2020-12 (or draft-2019 for that matter) schemas within their application and wanting to leverage this extension would get such breakage, with reference to a schema they are not even using.

fredericosilva commented 2 years ago

Same crash here, It took a while to find the source of the problem.

kierans commented 1 year ago

A simpler solution is to just require the JSON file.

ajv.addMetaSchema(require("ajv/dist/refs/json-schema-draft-07.json"));