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 🙏

© 2024 – Pkg Stats / Ryan Hefner

@vikr01/soynode

v2.1.0

Published

Utility for working with Closure Templates, aka Soy, from within a node.js application.

Downloads

1

Readme

soynode

Build Status Greenkeeper badge David Dependency Status David DevDependency Status

Utility for working with Closure Templates, aka Soy, from within a node.js application. Supports dynamic recompilation and loading for fast iteration during development.

Installing

Either:

  1. Fork, clone or download the source from GitHub, or
  2. Install via Yarn using yarn install soynode

Usage

import { SoyCompiler } from 'soynode';

const soynode = new SoyCompiler({
  outputDir: '/tmp/soynode-example',
  allowDynamicRecompile: true,
});

(async () => {
  await soynode.compileTemplates(__dirname);

  // Templates are now ready to use.
  console.log(
    soynode.render('example.message.hello', {
      name: process.env.USER,
      date: new Date().toLocaleTimeString(),
    })
  );
})().catch(err => {
  throw err;
});

Also, see examples/example.js.

soynode.get(templatename) - Returns a JS function corresponding to the template name.

soynode.render(templatename, data) - Returns a string that results from executing a template.

soynode.setOptions(opts) - Change the options, see section below.

soynode.compileTemplates(dir) - Asynchronously compiles and loads all .soy files in the directory.

soynode.compileTemplateFiles(files) - Asynchronously compiles and loads all .soy files.

soynode.loadCompiledTemplates(dir) - Asynchronously loads already compiled templates.

soynode.loadCompiledTemplateFiles(files) - Asynchronously loads already compiled templates.

Where "template name" is referred to, it means the namespace + template name as defined in the Soy file, and the full JS name that the Soy Compiler generates, for example project.section.screen. See the Hello World JS doc on the Closure site for more background.

Options

Options can be set via new SoyCompiler(options) or soynode.setOptions(options). Most of these mirror the command-line arguments for SoyToJsSrcCompiler. The keys can contain the following:

  • tmpDir {string} Path to a directory where temporary files will be written during compilation. {Deprecated: use outputDir} [Default: /tmp/soynode]
  • inputDir {string} Optional path to a directory where files will be read. When compiled from a directory, this option will be overwritten with the caller inputDir. [Default: process.cwd()]
  • outputDir {string} Path to a directory where files will be written. [Default: null]
  • uniqueDir {boolean} Determines whether the compiled files will be placed in a unique directory. [Default: true]
  • allowDynamicRecompile {boolean} Whether to watch for changes to the templates. [Default: false]
  • loadCompiledTemplates {boolean} Whether or not to load the compiled templates. Relevant when you only need to build templates. [Default: true]
  • eraseTemporaryFiles {boolean} Whether to erase temporary files after a compilation. This option does nothing if allowDynamicRecompile is on, because allowDynamicRecompile reuses the files. [Default: false]
  • concatOutput {boolean} Whether the compiled soy.js files should be joined into a single file. This is helpful for loading templates in a browser and simplest to use when outputDir is explicitly set and uniqueDir is false. [Default: false]
  • concatFileName {string} File name used for concatenated files, only relevant when concatOutput is true, ".soy.concat.js" is appended, so don't include ".js" yourself. [Default: compiled]
  • locales {Array.} List of locales to translate the templates to.
  • messageFilePathFormat {string} Path to the translation file to use, which can contain any of the placeholders allowed on the --messageFilePathFormat option of SoyToJsSrcCompiler.jar.
  • cssHandlingScheme {string} Processing options for the css command. More info
  • useClosureStyle {boolean} Whether or not to use goog.provide and goog.require for JS functions and Soy namespaces.
  • shouldGenerateJsdoc {boolean} Whether or not to generate JSDoc on each template function, with type info for the Closure Compiler. More info
  • shouldProvideRequireSoyNamespaces {boolean} Use this option to enable usage with Closure Library. More info
  • shouldProvideRequireJsFunctions {boolean} Use this option to enable usage with Closure Library. More info
  • precompiledDir {string} A directory of precompiled soy.js files. Soynode will check these first and use them if available. You can set this to the same value as outputDir to re-use results from previous runs.

NOTE: Options should be set before templates are loaded or compiled.

Internationalizion

To take advantage of soy's translation features through soynode, you should set the locales and messageFilePathFormat options, like in the example below:

import { SoyCompiler } from 'soynode';

const soynode = new SoyCompiler({
  locales: ['pt-BR', 'es'],
  messageFilePathFormat: '/tmp/soynode-example/translations.xlf',
  outputDir: '/tmp/soynode-example',
});

(async () => {
  await soynode.compileTemplates(__dirname);

  // Templates are now ready to use, render specifying the desired locale.
  console.log(soynode.render('example.message.hello', {}, {}, 'pt-BR'));
  console.log(soynode.render('example.message.hello', {}, {}, 'es'));
})().catch(err => {
  throw err;
});

Implementation Notes

The templates are loaded using Node's VM Module. This allows us to execute the generated .soy.js files as is without a post processing step and without leaking the template functions into the global scope.

Calling soynode.get executes code which returns a reference to the template function within the VM Context. The reference is cached, providing a 10x speed up over fetching the template function each time, or evaluating it in place and returning the template output over the VM boundary.

Contributing

Questions, comments, bug reports, and pull requests are all welcome. Submit them at the project on GitHub.

Bug reports that include steps-to-reproduce (including code) are the best. Even better, make them in the form of pull requests.

Author

Dan Pupius (personal website), supported by The Obvious Corporation.

License

Copyright 2012 The Obvious Corporation.

Licensed under the Apache License, Version 2.0. See the top-level file LICENSE.txt and (http://www.apache.org/licenses/LICENSE-2.0).