0.0.2 • Published 2 years ago

json-schema-conditionals v0.0.2

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

NPM

JSON Schema Conditionals CircleCI

This package allows you to define custom conditionals within a schema and then will translate that into valid JSON schema.

Example

const injectConditionals = require('json-schema-conditionals');

const schemaWithConditionals = injectConditionals(schemaValues);

Conditionals

To create conditional validation through json schema, you need to use a series of if, then statements within an allOf key, however this can get very messy. Instead of defining these by hand you can instead define a new conditionals key and then when json schema conditionals complies the schema, it will inject all of the necessary if, then inside of an allOf. The conditionals key be placed at the top level of the schema.

Example definition:

  "conditionals": [
    {
      "fields": ["picked_for_match"],
      "dependsOn": {
        "available_for_match": "yes"
      }
    },
    {
      "fields": ["starting_position"],
      "dependsOn": {
        "picked_for_match": "yes"
      }
    },
    {
      "fields": ["reason_for_not_being_picked"],
      "dependsOn": {
        "picked_for_match": "no"
      }
    }
  ]

Example Schema output:

    "allOf": [
        {
            "if": {
                "required": [
                    "available_for_match"
                ],
                "properties": {
                    "available_for_match": {
                        "const": "yes"
                    }
                }
            },
            "then": {
                "required": [
                    "picked_for_match"
                ]
            }
        },
        {
            "if": {
                "required": [
                    "available_for_match",
                    "picked_for_match"
                ],
                "properties": {
                    "available_for_match": {
                        "const": "yes"
                    },
                    "picked_for_match": {
                        "const": "yes"
                    }
                }
            },
            "then": {
                "required": [
                    "starting_position"
                ]
            }
        },
        {
            "if": {
                "required": [
                    "available_for_match",
                    "picked_for_match"
                ],
                "properties": {
                    "available_for_match": {
                        "const": "yes"
                    },
                    "picked_for_match": {
                        "const": "no"
                    }
                }
            },
            "then": {
                "required": [
                    "reason_for_not_being_picked"
                ]
            }
        }
    ]

You can also have nested conditionals. For the fields string include the path by separating keys with a dot.

Example definition:

  "conditionals": [
    {
      "fields": ["fieldToRequire.nestedKey.secondNestedKey"],
      "dependsOn": {
        "conditional": "no"
      }
    }
  ]

Example Schema Output:

"allOf": [
        {
            "if": {
                "required": [
                    "conditional"
                ],
                "properties": {
                    "conditional": {
                        "const": "no"
                    }
                }
            },
            "then": {
                "properties": {
                    "fieldToRequire": {
                        "type": "object",
                        "properties": {
                            "nestedKey": {
                                "type": "object",
                                "required": [
                                    "secondNestedKey"
                                ]
                            }
                        }
                    }
                }
            }
        }
    ]

Docs

const schemaWithConditionals = injectConditionals(jsonSchemas)

Arguments

jsonSchemas e.g. schema1, schema2

  • Array of all the json schemas that you want the conditionals being applied to.
  • If you have multiple schemas at once then inject conditionals will only be able to reference and create conditionals for keys within the same schema.

Return Value

schemaWithConditionals e.g schema1WithConditionals, schema2WithConditionals

  • The return value is an array of json schema with the additional allOf property
  • This schema can now be read/used by other schema validation packages such as Ajv

Created by Wealth Wizards Software Engineering - http://wealthwizards.com