npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

lote

v0.3.0

Published

A minimalistic, whitespace-sensitive template language for writing HTML, XML and similar types of structured documents.

Readme

LoTe

A minimalistic, whitespace-sensitive template engine for writing HTML, XML and similar types of structured documents. Written in typescript for Node.js and (probably) browsers.

Why another template engine?

LoTe was developed as a robust replacement for Pug (Jade) language after it's gluttony became unbearable. LoTe has plain declarative syntax and relies on typescript mixins to implement complex logic.

Syntax

Template:

html("en")
  head("LoTe")
    keywords/("LoTe, template engine, typescript, javascript, nodejs")
  body
    h1\Lote - node template engine
    -this is a comment
    p
      \A minimalistic, whitespace-sensitive template language for writing
      \ HTML, XML and similar types of structured documents.
      \ Implemented with typescript for 
      a("http://nodejs.org")\node
      \ and (probably) browsers.

Render output (pretty-printed):

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8"/>
    <meta name="keywords" content="LoTe, template engine, typescript, javascript, nodejs"/>
    <title>LoTe</title>
  </head>
  <body>
    <h1>Lote - node template engine</h1>
    <p>
      A minimalistic, whitespace-sensitive template engine for writing
      HTML, XML and similar types of structured documents.
      Implemented with typescript for
      <a href="http://nodejs.org">node</a>
      and (probably) browsers.
    </p>
  </body>
</html>

API

import * as lote from 'lote';
import {pack as emitters} from 'lote-basic-html-emitters';

const template: string = 'strings of LoTe...';
let renderer: lote.TRenderer;
try
{
    //  Product of template compilation.
    //  Might be safely and efficiently (de)serialized.
    let commands_sequence: lote.TCommandsSequence;
    //  Compile template with default options.
    //  An instance of lote.TCompilationErrorException may be thrown.
    commands_sequence = lote.Compile(template);
    //  Wrap command sequence into utility class.
    renderer = new lote.TRenderer(commands_sequence);
    //  Check that template can be rendered with given emitters.
    //  An instance of lote.TValidationErrorException may be thrown.
    renderer.Validate(emitters);
}
catch(e) 
{
    console.log(e);
    process.exit(1);
}
//  Prerender document. This optional pass will speedup final rendering
//  by invoking emitters that make no use of runtime data.
renderer.Advance(html_emitters);
//  Container with some runtime data.
let locals: any = {whatever:42};
//  Render document.
const document: string = renderer.Render(html_emitters, locals);

Node.js Support

LoTe works fine in Node.js 4.5 and newer. Distributed as lote npm module. Typings are included.

Browser Support

Technically LoTe should work in browsers but right now it only exists as Node.js module.

Dependencies

None.