You have a deeply nested object with some missing values. You also have some rules how to calculate a value from other values. Depresso takes an object and the calculation rules, and does a dependency resolution. Let's see an example.

We have an object with a placeholder for missing values:

    MISSING = -1

    inventory =
        discount: 0.1
        price: MISSING
      products: [
        name: 'Bag'
        netPrice: 20
        tax: 0.1
        price: MISSING
        name: 'Beer'
        netPrice: 10
        tax: 0.2
        price: 12

There are two rules

  • A product price can be calculated by adding tax to the net price.
  • The total price is the sum of all product prices.

Here is the code describing these rules:

    rules = [
      target: '/products//price'
        netPrice: '../netPrice'
        tax: '../tax'
      calculate: ->
        @netPrice * (1 + @tax)
      target: '/general/price'
        prices: '/products//price'
      calculate: ->
          (x,y) -> x+y

A rule consists of

  • A target pointing to one or more nodes in the object.
  • Dependencies, mapping a name to an xpath-like expression.
  • A calculation which has access to the values defined in the dependencies, and returns a value that will be written into the underlying object.

Circular rules should be avoided.

Finally, we specify which node(s) should be calculated:

    {resolve} = require 'depresso'
    resolve inventory, rules, '/general/price'
    console.log inventory.general.price # prints 34

The xpath-like expressions used throughout the examples are provided by SpahQL, the order of dependency resolution is calculated with DepGraph. The spahql query language has some limitations, the biggest one being the lack of the parent path. Improvements are expected, see