btick is a JavaScript template-literal preprocessor for Node.js.
It evaluates .jsml templates and produces rendered text (example: HTML), while supporting:
- inline JavaScript expressions
- async template values
- mutable and immutable template scope (
const) - capture groups for custom block rendering (loops/repetition)
npm install -g bticknpm install btickThe package exposes the CLI command btick:
btick <template-file> [args-json]<template-file>: required path to your template (for example,.jsml)[args-json]: optional JSON file whose content becomes template globals
Minimal example:
btick resources/minimal.jsml resources/minimal.args.jsonresources/minimal.jsml:
<h1>Hello ${name}</h1>
<p>2 + 3 = ${2 + 3}</p>resources/minimal.args.json:
{
"name": "World"
}Render the bundled sample:
btick resources/example.jsml resources/args.jsonWrite output to a file:
btick resources/example.jsml resources/args.json > output.htmlRun without global install:
node ./bin/index.js resources/example.jsml resources/args.jsonStream args through stdin
echo '{"name": "echo"}' | node ./bin/index.js resources/example.jsmlTemplates are plain text with ${...} expressions.
<h1>Hello ${args.name}</h1>
<p>Time: ${new Date().toISOString()}</p>Expressions can return:
- strings/numbers/booleans (rendered as text)
- promises (awaited)
- objects (used to update template scope)
Return an object to set scope variables:
${{ title: "Welcome" }}
<h1>${({ title }) => title}</h1>Return { const: {...} } to define immutable scope values:
${{ const: { appName: "btick" } }}
<p>${({ appName }) => appName}</p>Attempting to reassign a const key throws an error.
const fs = require('fs');
const btick = require('btick');
async function main() {
const template = fs.readFileSync('./resources/example.jsml', 'utf8');
const globals = { args: { name: { morning: 'Akash', evening: 'Webcrafti' } } };
const { text, ctx, render } = await btick(template, globals);
console.log(text);
console.log(ctx);
// Re-render with updated context state
const rerendered = await render({ ...ctx, extra: 'value' });
console.log(rerendered.text);
}
main();btick.groom(str): escapes raw backticks in template textbtick.createCaptureGroup(handler?): create custom capture group markersbtick.captureGroupEnd: helper marker for capture group termination
Start the included demo server:
npm run serveThen open:
http://localhost:8083/example
The server reads templates from resources/*.jsml.
bin/index.js: CLI entrypoint (btick)code/index.js: main compiler/renderer APIcode/server.js: demo HTTP serverresources/example.jsml: sample templateresources/args.json: sample input args