Skip to content

karmaniverous/handlebars

Repository files navigation

Handlebars Goodies

This repo adds a handful of very useful helpers to Handlebars.js.

dataAnchor

Renders an anchor tag with data attributes. Syntax:

{{dataAnchor '<anchor text>' '<data attribute 1>' '<value 1>' '<data attribute 2>' '<value 2>' ...}}

This template...

{{dataAnchor 'anchor text' 'merchantId' 'abc123' 'userId' 'xyz789'}}

... renders this HTML:

<a data-merchantId="abc123" data-userId="xyz789">anchor text</a>

lodash & numeral

These helpers expose the Lodash and Numeral.js libraries to your templates. Syntax:

{{lodash '<function>' <arg1> <arg2> ...}}
{{numeral '<function>' <arg1> <arg2> ...}}

Here's a combined example. If amount = 1000000 then:

{{numeral 'format' (lodash 'divide' amount 100) '$0,0.00'}}

renders:

$10,000.00

params

This helper converts its arguments into an array. Very useful for Lodash functions that expect an array argument. For example:

{{lodash 'get' object (params 'a' 'b' 'c')}}

logic

Performs logical operations on the arguments. Syntax:

{{logic '<operator>' <arg1> <arg2> ...}}

For example, all of these return true:

{{#if (logic 'and' true true true)}}
{{#if (logic 'or' true true false)}}
{{#if (logic 'not' false)}}:
{{#if (logic 'xor' true false false)}} (odd number of trues)

Parameters are evaluated for truthiness. Supported operations are and, or, not, and xor.

ifelse

A ternary operator. Syntax:

{{ifelse <condition> <value if truthy> <value if falsy>}}

json2tf

Renders an object as a Terraform literal using json2tf. The syntax is:

{{json2tf <object> [offset] [tabWidth]}}

For example:

import { Handlebars } from '@karmaniverous/handlebars';

const data = {
  amount: 1234.567,
  anchorText: 'anchor text',
  merchantId: 'abc123',
  userId: 'def456',
  extra: { a: [1, 2, { c: 'd' }] },
};

const template = `
  output "config" { 
    description = "Global config." 
    value = {{json2tf (lodash "omit" this "merchantId" "userId") 4 4}} 
  }`;

console.log(Handlebars.compile(template, { noEscape: true })(data));

/*
    output "config" { 
        description = "Global config." 
        value = {
            amount = 1234.567
            anchorText = "anchor text"
            extra = {
                a = [
                    1,
                    2,
                    {
                        c = "d"
                    }
                ]
            }
        } 
    }
*/

namify

Converts a string into a form valid for a particular target, substituting an optional delimiter for sequences of invalid characters. Syntax:

{{namify '<target>' <input string> [delimiter]}}

If no delimiter is supplied, it will default to a target-specific value.

For example:

{{namify 's3' 'My Resource Name'}}

# my-resource-name

These targets are currently available:

target Description default delimiter
s3 S3 bucket names '-'

throwif

Checks an condition. If true, throws an error before evauating the block content. Syntax:

{{#throwif <condition> <message>}}No Error!{{/throwif}}