Custom Json Schema Validation Keywords (SVK)

Using ajv as plugin, the Schema Validation Keywords (SVK) funcionalities will be enabled and can be extended too.

See the ajv documentation: Defining Custom Keywords for a deeper explaination

Below we see how to implement it in mobx-react-form:

Define a keywords object with the custom keyword


const keywords = {
  /**
    Define a `range` keyword
  */
  range: {
    type: 'number',
    compile: (sch, parentSchema) => {
      const min = sch[0];
      const max = sch[1];

      return parentSchema.exclusiveRange === true
              ? (data) => (data > min && data < max)
              : (data) => (data >= min && data <= max);
    },
  },
};

Define a JSON schema using the new keyword

var $schema = {
  type: 'object',
  properties: {
    fieldname: {
      "range": [2, 4],
      "exclusiveRange": true,
    },
  },
};

Implement the extend callback for the plugins object

The extend function takes in input an object with the following props:

  • the form instance
  • the validator instance
import svk from 'mobx-react-form/lib/validators/SVK';
import ajv from 'ajv';

const plugins = {
  svk: svk({
    package: ajv,
    schema: $schema,
    options: { ... }, // ajv options
    extend: ({ validator, form }) => {
      // here we can access the `ajv` instance (validator) and we can
      // add the keywords of our object using the `addKeyword()` method.
      Object.keys(keywords).forEach((key) =>
        validator.addKeyword(key, keywords[key]));
    };
  }),
};

// create the form using extended plugins

new Form({ fields }, { plugins });
VERSION < 1.37

No need to import the plugin function:

import ajv from 'ajv';

const plugins = {
  svk: {
    package: ajv,
    extend: () => { ... },
  },
};

and the schema goes to the form initialization:

new Form({ ..., schema }, { plugins });


See here more info about epoberezkin/ajv options.

results matching ""

    No results matching ""