Skip to content

Neuron-JS vs json-rules-engine

json-rules-engine is the established Node.js default for JSON business rules. Choose it when its facts, events, priorities, and ecosystem match the problem. Choose Neuron-JS when a TypeScript product needs a developer-owned registry, schema validation before runtime, and explainable traces for stored or AI-generated JSON rules.

Fast answer

Use Neuron-JS when rule definitions must be stored or generated as JSON, validated before execution, executed deterministically, and explained after execution.

Use json-rules-engine when you want an established JSON rules-engine model built around facts, conditions, events, and rule priorities, and you do not need Neuron-JS's registry-and-trace contract.

Decision matrix

NeedNeuron-JSjson-rules-engine
JSON business rulesYesYes
Node.js supportYesYes
Browser supportYesYes
TypeScript-first extension base classesYesPartial/project-owned
Developer-owned registry vocabularyYesProject-owned facts/operators/events
Schema validation before runtimeBuilt inProject-owned
Normalized execution outputBuilt inProject-owned
Explanation tracesBuilt inProject-owned/debugging flow
Best fitValidated, explainable TypeScript decisionsEstablished facts/events JSON rules workflows

Choose Neuron-JS when

  • Generated or stored rules must be validated before runtime.
  • The application needs a constrained vocabulary of approved parameters, conditions, actions, and rules.
  • Business decisions need explanation traces for reviews, support, audit logs, or tests.
  • Workflow automation needs deterministic decisions after an LLM extracts or classifies input.
  • Backend and browser code need the same JSON rule contract.

Choose json-rules-engine when

  • Your team already models decisions as facts, events, and rule priorities.
  • Existing json-rules-engine integrations and rule assets are stable.
  • You need the broader adoption footprint and community history more than built-in validation/explainability contracts.
  • The migration cost is higher than the operational benefit.

Migration guide

The migration is not a keyword replacement. Move the rule's business decision into a Neuron-JS script, then use validation and explanation as the new safety rail.

Before: json-rules-engine-style event rule

json
{
  "conditions": {
    "all": [
      { "fact": "customerTier", "operator": "equal", "value": "gold" },
      { "fact": "cartTotal", "operator": "greaterThanInclusive", "value": 100 }
    ]
  },
  "event": {
    "type": "apply-discount",
    "params": { "percent": 15 }
  }
}

After: Neuron-JS script

json
{
  "id": "gold-customer-discount",
  "rules": [
    {
      "id": "gold-order-over-threshold",
      "type": "simple_rule",
      "options": {},
      "conditions": [
        {
          "id": "cart-total-threshold",
          "type": "compare_two_numbers",
          "options": {},
          "params": [
            { "id": "cart-total", "name": "op1", "type": "simple_number", "value": "125", "options": {} },
            { "id": "comparison", "name": "comp", "type": "comparator", "value": ">=", "options": {} },
            { "id": "threshold", "name": "op2", "type": "simple_number", "value": "100", "options": {} }
          ]
        }
      ],
      "actions": [
        {
          "id": "discount-score",
          "type": "add_two_numbers",
          "options": {},
          "params": [
            { "id": "base-discount", "name": "op1", "type": "simple_number", "value": "10", "options": {} },
            { "id": "tier-bonus", "name": "op2", "type": "simple_number", "value": "5", "options": {} }
          ]
        }
      ]
    }
  ]
}

Validate and explain the migrated rule

typescript
import {
  Neuron,
  Synapse,
  explainExecution,
  summarizeExecutionOutput,
  validateExecutionContext,
  validateScript,
} from '@sebasoft/neuron-js';

const context = { messages: [], state: { customerTier: 'gold', cartTotal: 125 } };

const scriptValidation = validateScript(script);
const contextValidation = validateExecutionContext(context);

if (!scriptValidation.ok || !contextValidation.ok) {
  throw new Error('Invalid migrated rule input');
}

const result = new Synapse(new Neuron()).execute(script, context);
const output = summarizeExecutionOutput(result);
const explanation = explainExecution({ script, result });

Migration checklist

  • Map each fact to a Neuron-JS parameter or context field.
  • Map each operator to an approved condition type.
  • Map each event to an approved action type.
  • Keep priorities and conflict-resolution rules explicit; do not assume order is equivalent without tests.
  • Validate every migrated script with validateScript(script).
  • Snapshot explanation traces for high-value business rules.