ajv-validator / ajv

The fastest JSON schema Validator. Supports JSON Schema draft-04/06/07/2019-09/2020-12 and JSON Type Definition (RFC8927)
https://ajv.js.org
MIT License
13.82k stars 876 forks source link

JTD - support float32 and float64 ranges (with option) #1993

Open curvedriver opened 2 years ago

curvedriver commented 2 years ago

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

Ajv options object

I'm using the default options.

JTD Schema

{
    "properties": {
        "outOfRangeFloat32": { "type": "float32" },
        "infinitiy": { "type": "float64" }
    }
}

Sample data

const data = {
    outOfRangeFloat32: 6E+38,
    infinitiy: Infinity
};
import Ajv, { JTDDataType } from 'ajv/dist/jtd';
const ajv = new Ajv();

const schema = {
    properties: {
        outOfRangeFloat32: { type: 'float32' },
        infinitiy: { type: 'float64' }
    }
} as const;

type MyData = JTDDataType<typeof schema>

const validate = ajv.compile<MyData>(schema);

const invalidData = {
    outOfRangeFloat32: 6E+38,
    infinitiy: Infinity
};

if (validate(invalidData)) {
    console.log('The following should be invalid:\n', invalidData);
} else {
    console.log(validate.errors);
}

Validation result, data AFTER validation, error messages

no errors after validation, data are considered as valid

What results did you expect? The same behaviour as it is in case of integer data types. If a value is out of range of the defined data type, then the ValidationFunction should return false and an errors should be added to the errors list.

Validation in case of the integer types: https://github.com/ajv-validator/ajv/blob/e73bc750634947f4270597136e203c27213aa565/lib/vocabularies/jtd/type.ts#L66

In case of float32 and float64 is such a validation missing: https://github.com/ajv-validator/ajv/blob/e73bc750634947f4270597136e203c27213aa565/lib/vocabularies/jtd/type.ts#L58

epoberezkin commented 2 years ago

It's been a conscious choice not to limit the range of floats, as the most common use case for validation is processing incoming data, and in this case data being out of range wouldn't prevent its processing in JS code.

I understand that it may be needed for cases when you validate data on its way to some consumer that would have such limits... e.g. database.

So, happy to add support for validating these ranges with some option. PR is welcome.