json-expand

    1.4.0 • Public • Published

    json-expand

    Expands your self referencing json

    Installation

    Standalone Script

    $ git clone https://github.com/joshwillik/json-expand.git
    $ chmod +x json-expand/json-expand.js
    $ mv json-expand/json-expand.js ~/my-scripts/json-expand
    # Assuming ~/my-scripts is in $PATH 

    NPM module

    $ npm install -g json-expand

    CLI Usage

    // config.json
    {
      "apiDomain": "api.{{baseDomain}}",
      "baseDomain": "{{userAccount}}.{{hostingProvider}}",
      "userAccount": "joshwillik",
      "hostingProvider": "superhost.foobar",
      "authDomain": "{{google.accounts.base}}{{google.accounts.url}}",
      "google": {
        "accounts": {
          "url": "/login",
          "base": "accounts.google.com"
        }
      }
    }
    $ json-expand < config.json
    {
      "apiDomain""api.joshwillik.superhost.foobar",
      "baseDomain""joshwillik.superhost.foobar",
      "userAccount""joshwillik",
      "hostingProvider""superhost.foobar",
      "authDomain""accounts.google.com/login",
      "google"{
        "accounts"{
          "url""/login",
          "base""accounts.google.com"
        }
      }
    }

    Node.js usage

    var expand = require( 'json-expand' )
    var obj = {
        foo: "bar",
        message: "foo = {{foo}}"
    }
    expand( obj )
    > { foo: 'bar', message: 'foo = bar' }

    Rules

    Any expression wrapped in {{ }} will be expanded to the correct value or an empty string if none exists. The expression to expand may come before the thing it will expand to.

    {
        "name": "John, son of {{parent}}",
        "parent": "Bill"
    }
    // becomes
    {
        "name": "John, son of Bill",
        "parent": "Bill"
    }

    An expression may reference sub-properties of the document it resides in. All expressions are evaluated starting at the top scope.

    {
        "description": "John drives with {{vehicle.wheels}} wheels",
        "vehicle": {
            "wheels":4
        }
    }
    // becomes
    {
        "description": "John drives with 4 wheels",
        "vehicle": {
            "wheels":4
        }
    }

    Using || operator will make json-expand attempt to expand each option, in order, until one works. Once one value is valid, the rest of the options are ignored.

    {
        "description": "I enjoy {{ favoriteFood || foodIKindaLike }}",
        "foodIKindaLike": "spaghetti"
    }
    // becomes
    {
        "description": "I enjoy spaghetti",
        "foodIKindaLike": "spaghetti"
    }
    // but
    {
        "description": "I enjoy {{ favoriteFood || foodIKindaLike }}",
        "foodIKindaLike": "spaghetti",
        "favoriteFood": "meatballs"
    }
    // becomes
    {
        "description": "I enjoy meatballs",
        "foodIKindaLike": "spaghetti",
        "favoriteFood": "meatballs"
    }

    Environment variables may be substituted by adding a $ before an expression. Using || works just fine with these.

    {
        "remoteHost": "{{ $REMOTE_HOST || defaultHost }}",
        "defaultHost": "production.project.com"
    }
    // if REMOTE_HOST has been set to 'dev.project.com
    {
        "remoteHost": "dev.project.com",
        "defaultHost": "production.project.com"
    }
    // otherwise
    {
        "remoteHost": "production.project.com",
        "defaultHost": "production.project.com"
    }

    Expressions can be concatinated together if desired. The + has higher precedence than ||, so {{ foo || bar + ' test'}} will result in either (foo) or (bar + ' test'), never (foo + ' test').

    Using parenthesis to override the order of operations will not work in this version.

    {
        "baseDomain": "my-project.com",
        "apiDomain": "{{ doesNotExist || 'api.' + baseDomain }}"
    }
    // becomes
    {
        "baseDomain": "my-project.com",
        "apiDomain": "api.my-project.com"
    }

    Keywords

    Install

    npm i json-expand

    DownloadsWeekly Downloads

    60

    Version

    1.4.0

    License

    ISC

    Last publish

    Collaborators

    • joshwillik