json-rules-engine-schema-operator

An operator for json-rules-engine to evaluate a value against a JSON schema

Usage no npm install needed!

<script type="module">
  import jsonRulesEngineSchemaOperator from 'https://cdn.skypack.dev/json-rules-engine-schema-operator';
</script>

README

json-rules-engine-schema-operator

npm version codecov Build Status Bundle Phobia

What's This?

It's an operator to evaluate a value against a JSON Schema for the totally awesome json-rules-engine package.

Why?

Because a JSON Schema is a predicate. A value either validates against a schema, or it doesn't. Rather than writing (and maintaining) a bunch of custom operators and bloating your codebase with them, you only need one operator - a schema operator.

Installation

npm install json-rules-engine-schema-operator
# or
yarn add json-rules-engine-schema-operator

Usage

This package is BYOV - bring your own validator (highly recommend AJV!!)

import Ajv from 'ajv';
import { Engine } from 'json-rules-engine';
import createSchemaOperator from 'json-rules-engine-schema-operator';

const ajv = new Ajv();
const validator = (subject,schema) => ajv.validate(schema,subject);

const engine = new Engine();
engine.addOperator(createSchemaOperator(validator));

and now you can do this:

engine.addRule({
  conditions: {
    any: [
      {
        fact: 'firstName',
        operator: 'schema',
        value: {
          type: 'string',
          pattern: '^J',
        },
      },
    ],
  },
  event: {
    type: 'j_firstName',
  },
});

Custom Operator Name

By default, the name of the operator added to the engine is schema. This is configurable by passing in a custom name via the second optional parameter options:

const name = 'jsonSchemaOperator';
engine.addOperator(validator, { name });

engine.addRule({
  conditions: {
    any: [
      {
        fact: 'firstName',
        operator: name,
        value: {
          type: 'string',
          pattern: '^J',
        },
      },
    ],
  },
  event: {
    type: 'j_firstName',
  },
});

Related

I ❤️ JSON schema and json-rules-engine both so much, that I created a package json-schema-rules-engine that works very similarly, but it relies entirely on JSON schemas for predicates (or "operators"), which greatly simplifies the concept of the rules engine.