{"_id":"@agentine/whisker","name":"@agentine/whisker","dist-tags":{"latest":"0.1.0"},"versions":{"0.1.0":{"name":"@agentine/whisker","version":"0.1.0","description":"Drop-in template engine replacing mustache.js and handlebars","repository":{"type":"git","url":"git+https://github.com/agentine/whisker.git"},"license":"MIT","type":"module","engines":{"node":">=18"},"bin":{"whisker":"dist/esm/cli.js"},"exports":{".":{"types":"./dist/esm/index.d.ts","import":"./dist/esm/index.js","require":"./dist/cjs/index.js"},"./stream":{"types":"./dist/esm/stream.d.ts","import":"./dist/esm/stream.js","require":"./dist/cjs/stream.js"},"./compat/mustache":{"types":"./dist/esm/compat/mustache.d.ts","import":"./dist/esm/compat/mustache.js","require":"./dist/cjs/compat/mustache.js"},"./compat/handlebars":{"types":"./dist/esm/compat/handlebars.d.ts","import":"./dist/esm/compat/handlebars.js","require":"./dist/cjs/compat/handlebars.js"}},"main":"./dist/cjs/index.js","module":"./dist/esm/index.js","types":"./dist/esm/index.d.ts","scripts":{"build":"npm run build:esm && npm run build:cjs","build:esm":"tsc -p tsconfig.json","build:cjs":"tsc -p tsconfig.cjs.json","clean":"rm -rf dist","test":"vitest run","bench":"node --import tsx bench/bench.ts"},"devDependencies":{"@types/node":"^22.0.0","tsx":"^4.21.0","typescript":"^5.4.0","vitest":"^3.0.0"},"_id":"@agentine/whisker@0.1.0","gitHead":"39d2334143c71028dc993da909023b65e6fd2c65","bugs":{"url":"https://github.com/agentine/whisker/issues"},"homepage":"https://github.com/agentine/whisker#readme","_nodeVersion":"22.22.1","_npmVersion":"10.9.4","dist":{"integrity":"sha512-sfevvfluRG1SEcmFwHHBLO5OIb5aEZ35T0tS4nxkfwk4w55mEt3DduuKHYjvPhTW797u5sMwrrRBZHLhstw5kQ==","shasum":"1280849de0562425ac665801b1fcb809ff7fae4f","tarball":"https://registry.npmjs.org/@agentine/whisker/-/whisker-0.1.0.tgz","fileCount":98,"unpackedSize":281575,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@agentine%2fwhisker@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQC/Pk0A69wjKn28Q3MrW4U7VYXt9PYXOPFPy8rV/YuEKgIgNNGQe9tNPfxTOX4OAblAhed4/gv8kXWWX89pOvSksow="}]},"_npmUser":{"name":"mtingers","email":"matthingersoll@gmail.com"},"directories":{},"maintainers":[{"name":"mtingers","email":"matthingersoll@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/whisker_0.1.0_1773636257998_0.6415003234231977"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-16T04:44:17.941Z","0.1.0":"2026-03-16T04:44:18.141Z","modified":"2026-03-16T04:44:18.480Z"},"maintainers":[{"name":"mtingers","email":"matthingersoll@gmail.com"}],"description":"Drop-in template engine replacing mustache.js and handlebars","homepage":"https://github.com/agentine/whisker#readme","repository":{"type":"git","url":"git+https://github.com/agentine/whisker.git"},"bugs":{"url":"https://github.com/agentine/whisker/issues"},"license":"MIT","readme":"# @agentine/whisker\n\nDrop-in template engine replacing **mustache.js** and **handlebars** with a single, fast, zero-dependency implementation.\n\n- Full [Mustache spec](https://github.com/mustache/spec) compliance (136/136 spec tests)\n- Handlebars extensions: helpers, block helpers, `@data` variables, whitespace control, subexpressions\n- Drop-in compat layers for both mustache.js and handlebars\n- TypeScript-first with ESM + CJS dual package\n- Streaming render support\n- Template precompilation CLI\n\n## Install\n\n```bash\nnpm install @agentine/whisker\n```\n\n## Quick start\n\n```ts\nimport { render } from '@agentine/whisker';\n\nrender('Hello {{name}}!', { name: 'World' });\n// => \"Hello World!\"\n\nrender('{{#items}}{{name}} {{/items}}', {\n  items: [{ name: 'Alice' }, { name: 'Bob' }],\n});\n// => \"Alice Bob \"\n```\n\n## Mustache features\n\nAll standard Mustache features are supported:\n\n```ts\n// Variables (HTML-escaped by default)\nrender('{{name}}', { name: '<b>World</b>' });\n// => \"&lt;b&gt;World&lt;/b&gt;\"\n\n// Unescaped\nrender('{{{name}}}', { name: '<b>World</b>' });\n// => \"<b>World</b>\"\n\n// Sections\nrender('{{#show}}Visible{{/show}}', { show: true });\n\n// Inverted sections\nrender('{{^items}}No items{{/items}}', { items: [] });\n\n// Partials\nrender('{{> header}}', { title: 'Hi' }, { header: '<h1>{{title}}</h1>' });\n\n// Comments\nrender('{{! this is ignored }}Hello');\n\n// Custom delimiters\nrender('{{=<% %>=}}<%name%>', { name: 'World' });\n```\n\n## Handlebars extensions\n\n```ts\nimport { render, HelperRegistry, SafeString } from '@agentine/whisker';\n\nconst helpers = new HelperRegistry();\n\n// Simple helper\nhelpers.register('uppercase', (args) => String(args[0]).toUpperCase());\n\nrender('{{uppercase name}}', { name: 'world' }, undefined, { helpers });\n// => \"WORLD\"\n\n// Block helper\nhelpers.register('bold', (args, options) => {\n  return new SafeString(`<b>${options.fn(options.context)}</b>`);\n});\n\n// Built-in helpers: if, unless, each, with, lookup, log\nrender('{{#each items}}{{@index}}: {{this}}\\n{{/each}}', {\n  items: ['a', 'b', 'c'],\n});\n// => \"0: a\\n1: b\\n2: c\\n\"\n```\n\n## Streaming\n\n```ts\nimport { renderStream } from '@agentine/whisker/stream';\n\nconst stream = renderStream('Hello {{name}}!', { name: 'World' }, undefined, {\n  chunkSize: 1024,\n});\nstream.pipe(process.stdout);\n```\n\n## Drop-in compat layers\n\n### Replacing mustache.js\n\n```ts\n// Before:\n// import Mustache from 'mustache';\n\n// After:\nimport Mustache from '@agentine/whisker/compat/mustache';\n\nMustache.render('Hello {{name}}!', { name: 'World' });\n```\n\n### Replacing handlebars\n\n```ts\n// Before:\n// import Handlebars from 'handlebars';\n\n// After:\nimport Handlebars from '@agentine/whisker/compat/handlebars';\n\nconst template = Handlebars.compile('Hello {{name}}!');\ntemplate({ name: 'World' });\n\nHandlebars.registerHelper('loud', (args) => String(args[0]).toUpperCase());\nHandlebars.registerPartial('header', '<h1>{{title}}</h1>');\n```\n\n## CLI\n\nPrecompile templates to JSON AST:\n\n```bash\nwhisker compile template.hbs\nwhisker compile template.hbs -o template.json\n```\n\n## Benchmarks\n\n```bash\nnpm run bench\n```\n\n```\nSimple interpolation                         639,674 ops/s\nSection iteration (100 items)                 20,922 ops/s\nHTML escaping                                511,901 ops/s\nNested sections                              369,423 ops/s\nPartials (50 items)                           27,967 ops/s\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-64465912e279bb37adaf6a24dcb01543"}