UNPKG

@karmaniverous/handlebars

Version:

Exposes Lodash & Numeral.js as Handlebars helpers, plus some other goodies.

221 lines (151 loc) 5.14 kB
# Handlebars Goodies This repo adds a handful of very useful helpers to Handlebars.js. ## dataAnchor Renders an anchor tag with data attributes. Syntax: ```handlebars {{dataAnchor '<anchor text>' '<data attribute 1>' '<value 1>' '<data attribute 2>' '<value 2>' ...}} ``` This template... ```handlebars {{dataAnchor 'anchor text' 'merchantId' 'abc123' 'userId' 'xyz789'}} ``` ... renders this HTML: ```html <a data-merchantId="abc123" data-userId="xyz789">anchor text</a> ``` ## humanizeDuration Renders a human-readable duration from a number of milliseconds. Syntax: ```handlebars {{humanizeDuration <milliseconds> [(object ...options)]}} ``` For example: ```handlebars {{humanizeDuration 1000}} ``` renders: ```html 1 second ``` You can also pass an `object` to customize the output. For example: ```handlebars {{humanizeDuration 86401000 (object conjunction=' and ' serialComma=false)}} ``` renders: ```html 1 day and 1 second ``` ## ifelse A ternary operator. Syntax: ```handlebars {{ifelse <condition> <value if truthy> <value if falsy>}} ``` ## json2tf Renders an object as a Terraform literal using [json2tf](https://github.com/karmaniverous/json2tf). The syntax is: ```handlebars {{json2tf <object> [offset] [tabWidth]}} ``` For example: ```ts 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" } ] } } } */ ``` ## lodash & numeral These helpers expose the [Lodash](https://lodash.com/) and [Numeral.js](http://numeraljs.com/) libraries to your templates. Syntax: ```handlebars {{lodash '<function>' <arg1> <arg2> ...}} {{numeral '<function>' <arg1> <arg2> ...}} ``` Here's a combined example. If `amount = 1000000` then: ```handlebars {{numeral 'format' (lodash 'divide' amount 100) '$0,0.00'}} ``` renders: ```html $10,000.00 ``` ## logic Performs logical operations on the arguments. Syntax: ```handlebars {{logic '<operator>' <arg1> <arg2> ...}} ``` For example, all of these return `true`: ```handlebars {{#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`. ## namify Converts a string into a form valid for a particular target, substituting an optional delimiter for sequences of invalid characters. Syntax: ```handlebars {{namify '<target>' <input string> [delimiter]}} ``` If no `delimiter` is supplied, it will default to a `target`-specific value. For example: ```handlebars {{namify 's3' 'My Resource Name'}} # my-resource-name ``` These targets are currently available: | `target` | Description | default `delimiter` | | -------- | ----------------------------------------------------------------------------------------------- | ------------------- | | `s3` | [S3 bucket names](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html) | `'-'` | ## object Returns the `hash` object passed to it. This is useful for passing an object to a helper that expects an object as its first argument. Syntax: ```handlebars {{object key1=value1 key2=value2 ...}} ``` ## params This helper converts its arguments into an array. Very useful for Lodash functions that expect an array argument. For example: ```handlebars {{lodash 'get' object (params 'a' 'b' 'c')}} ``` ## throwif Checks an condition. If true, throws an error before evauating the block content. Syntax: ```handlebars {{#throwif <condition> <message>}}No Error!{{/throwif}} ``` ## recursiveRender A helper function that recursively renders a Handlebars template until the output stabilizes or a maximum depth is reached. This is useful for templates that may contain recursive structures. Syntax: ```ts import { recursiveRender } from '@karmaniverous/handlebars'; const data = { baseUrl: 'https://example.com', jwt: 'abc123', url: '{{baseUrl}}?jwt={{jwt}}', }; const template = '{{url}}'; const result = recursiveRender(template, data); console.log(result); // Outputs: https://example.com?jwt=abc123 ```