jsont

Simple json template language

Usage no npm install needed!

<script type="module">
  import jsont from 'https://cdn.skypack.dev/jsont';
</script>

README

jsont Build Status

Simple json template language

Installation

$ npm install jsont
$ component install CamShaft/jsont

Features

  • Simple
  • Valid JSON
  • Extensible
  • Auto-parallelization of templated properties

Example

Input:

{
  "name": "`user.firstName`",
  "birthday": "`user.birthday | date:'MMMM Do'`",
  "addresses": "`user.addresses | map | partial:address`"
}

Output:

{
  "name": "Cameron",
  "birthday": "September 19th",
  "addresses": [
    {
      "street": "123 Fake Street",
      "city": "Nowhere",
      "country": "USA"
    },
    {
      "street": "Broadway Street",
      "city": "NY",
      "country": "USA"
    }
  ]
}

Usage

var jsont = require('jsont')();

var template = require('./my-template.json');

var options = {};

jsont.render(template, options, function(err, out) {
  console.log(out);
});

Helpers

You can easily extend jsont by calling use:

var jsont = require('jsont')();

jsont.use('reverse', function(input, next) {
  next(null, input.reverse());
});

In your template you can then call the helper by piping data to it:

{
  "reversed-name": "'Cameron' | reverse"
}

Out comes:

{
  "reversed-name": "noremaC"
}

You can also pass arguments and chain arguments

{
  "list": "'1,2,3,4,5' | split:',' | map | to-int"
}
jsont.use('split', function(input, separator, next) {
  next(null, input.split(separator));
});

jsont.use('to-int', function(input, next) {
  next(null, parseInt(input));
});

And we get:

{
  "list": [
    1,
    2,
    3,
    4,
    5
  ]
}

Parallelization

Since helpers are all asynchronous behind the scenes we get parallelization in a simple form:

var api = require('./api');

jsont.use('userLikes', function(id, next) {
  api.likes(id, next);
});

jsont.use('userFollowers', function(id, next) {
  api.followers(id, next);
});

jsont.use('length', function(likes, next) {
  next(null, likes ? likes.length : 0);
});

jsont.use('partial', function(data, partial, next) {
  // load your partial here
  jsont.render(partial, data, next);
})
{
  "likes": "`id | userLikes | length`",
  "followers": "`id | userFollowers | map | partial:follower`"
}

Everything gets put on the event loop and renders as responses come back.

{
  "likes": 42,
  "followers": [
    {
      "id": 1,
      "name": "Scott"
    },
    {
      "id": 2,
      "name": "Dave"
    }
  ]
}

Tests

$ npm test