feat(json-schema-2020-12): add support for validation keywords for numbers (#8624)

Includes following keywords:
  - multipleOf
  - minimum
  - maximum
  - inclusiveMinimum
  - inclusiveMaximum

Refs #8513
This commit is contained in:
Vladimír Gorej
2023-05-08 11:00:01 +02:00
committed by GitHub
parent 3b940d0d76
commit 1a29662977
10 changed files with 108 additions and 18 deletions

View File

@@ -179,3 +179,67 @@ export const stringify = (value) => {
return JSON.stringify(value)
}
const stringifyConstraintMultipleOf = (schema) => {
if (typeof schema?.multipleOf !== "number") return null
if (schema.multipleOf <= 0) return null
if (schema.multipleOf === 1) return null
const { multipleOf } = schema
if (Number.isInteger(multipleOf)) {
return `multiple of ${multipleOf}`
}
const decimalPlaces = multipleOf.toString().split(".")[1].length
const factor = 10 ** decimalPlaces
const numerator = multipleOf * factor
const denominator = factor
return `multiple of ${numerator}/${denominator}`
}
const stringifyConstraintNumberRange = (schema) => {
const minimum = schema?.minimum
const maximum = schema?.maximum
const exclusiveMinimum = schema?.exclusiveMinimum
const exclusiveMaximum = schema?.exclusiveMaximum
const hasMinimum = typeof minimum === "number"
const hasMaximum = typeof maximum === "number"
const hasExclusiveMinimum = typeof exclusiveMinimum === "number"
const hasExclusiveMaximum = typeof exclusiveMaximum === "number"
const isMinExclusive = hasExclusiveMinimum && minimum < exclusiveMinimum
const isMaxExclusive = hasExclusiveMaximum && maximum > exclusiveMaximum
if (hasMinimum && hasMaximum) {
const minSymbol = isMinExclusive ? "(" : "["
const maxSymbol = isMaxExclusive ? ")" : "]"
const minValue = isMinExclusive ? exclusiveMinimum : minimum
const maxValue = isMaxExclusive ? exclusiveMaximum : maximum
return `${minSymbol}${minValue}, ${maxValue}${maxSymbol}`
}
if (hasMinimum) {
const minSymbol = isMinExclusive ? ">" : "≥"
const minValue = isMinExclusive ? exclusiveMinimum : minimum
return `${minSymbol} ${minValue}`
}
if (hasMaximum) {
const maxSymbol = isMaxExclusive ? "<" : "≤"
const maxValue = isMaxExclusive ? exclusiveMaximum : maximum
return `${maxSymbol} ${maxValue}`
}
return null
}
export const stringifyConstraints = (schema) => {
const constraints = []
// Validation Keywords for Numeric Instances (number and integer)
const constraintMultipleOf = stringifyConstraintMultipleOf(schema)
if (constraintMultipleOf !== null) constraints.push(constraintMultipleOf)
const constraintNumberRange = stringifyConstraintNumberRange(schema)
if (constraintNumberRange !== null) constraints.push(constraintNumberRange)
return constraints
}