◆ 代入するヘルパ
◆ ブロック内のみヘルパに渡した変数が使えるヘルパ

<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/4.1.1/handlebars.js"></script>
<script>
Handlebars.registerHelper({
">="(a, b, opt) { return a >= b },
"+"(a, b, opt) { return a + b },
eq(a, b, opt) { return a === b },
})
</script>

がロードされてる前提です

同じ条件を繰り返したい

こういう感じで同じ条件の if が続くことって割とあるかと思います

{{#if a}}x{{/if}}y{{#if a}}z{{/if}}

これくらいならいいのですが条件部分が複雑になって

{{#if (">=" ("+" aaa bbb) ("+" ccc ddd))}}x{{/if}}y{{#if (">=" ("+" aaa bbb) ("+" ccc ddd))}}z{{/if}}

というレベルになるとさすがに嫌です
色がついてないとパット見て if の中と外が見分けつきづらすぎです

assign

普通のプログラム同様 長くて何度も書きたくないなら変数に代入してしまうとスッキリします

Handlebars.registerHelper({
assign(a, b, opt) { this[a] = b },
})

{{assign "tmp" (eq 1 1)}}{{ tmp }}

そのまま tmp という変数名で参照できるようにするため 代入先は他の変数と同じオブジェクトです

const obj = {x: 1}
Handlebars.compile(`xxx{{assign "tmp" (eq 1 x)}}yyy{{ tmp }}`)(obj)
// "xxxyyytrue"

obj
// {x: 1, tmp: true}

最初にあげた例だとこうなります

const tpl = Handlebars.compile(`{{assign "tmp" (">=" ("+" aaa bbb) ("+" ccc ddd))}}{{#if tmp}}x{{/if}}y{{#if tmp}}z{{/if}}`)

tpl({
aaa: 1,
bbb: 1,
ccc: 1,
ddd: 1,
})
// "xyz"

tpl({
aaa: 1,
bbb: 1,
ccc: 10,
ddd: 1,
})
// "y"

let

代入ではなく 関数の引数として呼び出す風な考え方で let というのも作ってみました
let は assign みたいな使い方ではなく if のように内側にブロックを持つヘルパです
内部の実行時には this で値を参照できます

Handlebars.registerHelper({
let(a, opt) { return opt.fn(a) }
})

{{#let (eq 1 1)}}{{ this }}{{/let}}

const tpl = Handlebars.compile(`{{#let (">=" ("+" aaa bbb) ("+" ccc ddd))}}{{#if this}}x{{/if}}y{{#if this}}z{{/if}}{{/let}}`)

tpl({
aaa: 1,
bbb: 1,
ccc: 1,
ddd: 1,
})
// "xyz"

tpl({
aaa: 1,
bbb: 1,
ccc: 10,
ddd: 1,
})
// "y"

似たことをするもので with というのがデフォルトでありますが こっちは false のときには else ブロックを実行します
別々のテンプレートを設定したいなら使えますが let と else で同じテンプレートを使いたいなら 両方に同じことを書く必要があるので let を作りました
let では else は使わないので書いても無視されます