Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unexpected behaviour of unevaluatedProperties when used with dependentSchemas #2483

Open
ahumellihuk opened this issue Aug 1, 2024 · 1 comment
Labels

Comments

@ahumellihuk
Copy link

ahumellihuk commented Aug 1, 2024

Code sandbox: https://codesandbox.io/s/ajv-playground-forked-nz924l?file=/src/index.js

What version of Ajv are you using? Does the issue happen if you use the latest version?

Latest 8.17.1

Ajv options object

Empty (no options)

JSON Schema

{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "link": {
      "type": "boolean"
    }
  },
  "required": ["name"],
  "unevaluatedProperties": false,
  "dependentSchemas": {
    "link": {
      "if": {
        "properties": {
          "link": {
            "const": true
          }
        }
      },
      "then": {
        "properties": {
          "originalId": {
            "type": "string"
          }
        },
        "required": ["originalId"]
      }
    }
  }
}

Sample data

{
  "name": "test"
}

Your code

const Ajv2020 = require("ajv/dist/2020");
const ajv = new Ajv2020();

const schema = require("./schema.json");
const validate = ajv.compile(schema);

const valid = validate({
  name: "test"
});

Validation result, data AFTER validation, error messages

{
  "instancePath": "",
  "schemaPath": "#/unevaluatedProperties",
  "keyword": "unevaluatedProperties",
  "params": {
    "unevaluatedProperty": "name"
  },
  "message": "must NOT have unevaluated properties"
}

What results did you expect?

If I understand the JSON Schema specification around unevaluatedProperties and sub-schemas applied conditionally, the validation should pass with no errors given that name is defined in properties adjacent to unevaluatedProperties and it is present in the data instance.

Interestingly, the same example passes validation in https://www.jsonschemavalidator.net

Are you going to resolve the issue?

Looking for clarification/analysis from maintainers or those who are well-versed in latest JSON Schema specifications.

@jasoniangreen
Copy link
Collaborator

After looking at this issue for a while now I have to agree it does look like a bug. I have created this runkit example for convenience.
It does seem that dependantSchema is interfering with name being considered an evaluated property because if I (a) remove dependentSchemas or (b) use another keyword like allOf to do any other processing this passes.

I will try and look into the dependentSchemas keyword to see if I can understand what's happening.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Development

No branches or pull requests

2 participants