All Projects → estools → Estemplate

estools / Estemplate

Proper (AST-based) JavaScript code templating with source maps support.

Programming Languages

javascript
184084 projects - #8 most used programming language
ecmascript
72 projects

Labels

Projects that are alternatives of or similar to Estemplate

Xcode Ast Dump
Dump the AST of your Swift Xcode project
Stars: ✭ 71 (-25.26%)
Mutual labels:  ast
Uaiso
A multi-language parsing infrastructure with an unified AST
Stars: ✭ 86 (-9.47%)
Mutual labels:  ast
Libdparse
Library for lexing and parsing D source code
Stars: ✭ 91 (-4.21%)
Mutual labels:  ast
Ts Transform Css Modules
Extract css class names from required css module files for TypeScript
Stars: ✭ 75 (-21.05%)
Mutual labels:  ast
Hippo
PHP standards checker.
Stars: ✭ 82 (-13.68%)
Mutual labels:  ast
Jsx Ast Utils
AST utility module for statically analyzing JSX
Stars: ✭ 89 (-6.32%)
Mutual labels:  ast
Astexplorer.app
https://astexplorer.net with ES Modules support and Hot Reloading
Stars: ✭ 65 (-31.58%)
Mutual labels:  ast
Redux Boilerplate Helpers
AST-based tool for automating Redux boilerplate
Stars: ✭ 94 (-1.05%)
Mutual labels:  ast
I Pascal
A free Object Pascal language plugin for IntelliJ IDEA
Stars: ✭ 85 (-10.53%)
Mutual labels:  ast
Babel Plugin React Persist
Automatically useCallback() & useMemo(); memoize inline functions
Stars: ✭ 91 (-4.21%)
Mutual labels:  ast
Deps Report
Generate reports about dependencies and dependents of your JavaScript/TypeScript files through an AST. It supports import and require statements.
Stars: ✭ 76 (-20%)
Mutual labels:  ast
Lang C
Lightweight C parser for Rust
Stars: ✭ 77 (-18.95%)
Mutual labels:  ast
Astq
Abstract Syntax Tree (AST) Query Engine
Stars: ✭ 89 (-6.32%)
Mutual labels:  ast
Method log
Trace the history of an individual method in a git repository (experimental)
Stars: ✭ 73 (-23.16%)
Mutual labels:  ast
Gorm2sql
auto generate sql from gorm model struct
Stars: ✭ 92 (-3.16%)
Mutual labels:  ast
Charly Vm
Fibers, Closures, C-Module System | NaN-boxing, bytecode-VM written in C++
Stars: ✭ 66 (-30.53%)
Mutual labels:  ast
Diffsitter
A tree-sitter based AST difftool to get meaningful semantic diffs
Stars: ✭ 89 (-6.32%)
Mutual labels:  ast
Astpretty
Pretty print the output of python stdlib `ast.parse`.
Stars: ✭ 93 (-2.11%)
Mutual labels:  ast
Pyast64
Compile a subset of the Python AST to x64-64 assembler
Stars: ✭ 93 (-2.11%)
Mutual labels:  ast
Ts Type Info
TypeScript AST and code generator [Deprecated]
Stars: ✭ 90 (-5.26%)
Mutual labels:  ast

estemplate Build Status

Proper JavaScript code templating with source maps support.

This module allows to generate JavaScript AST from code template and AST nodes as substitutions.

This is more proper way of code templating since it works on AST not on code string, and thus preserves locations which allow to generate source maps in future.

Getting Started

Install the module with: npm install estemplate and require it:

npm i estemplate --save
var estemplate = require('estemplate');

API

estemplate(tmplString, [options], data)

Generates SpiderMonkey AST from given template string, optional esprima options and data.

Supported template substitution markers:

  • Compile-time execution block: <% var localCounter = 0; %>
  • Node substitution: var x = <%= expr %> + 1;
  • Array elements: var a = [%= elements %];
  • Function parameters: function f(%= params %) {}
  • Call arguments: var x = f(%= args %);
  • Block statements: define(function () {%= body %});
  • Literals: var x = "%= 'alpha' + 'beta' %";

You can combine list substitutions with inline elements like:

  • var a = [0, %= numbers %, Infinity];
  • function f(%= params %, callback) {}
  • define(function () { console.time('Module'); %= body %; console.timeEnd('Module'); });

From template, you can access entire data object via it and estemplate itself via estemplate.

If you set options.fast to true, then passed data will be available only via it variable, but template function in general will be significantly faster.

estemplate.compile(tmplString, [options])

Same as above but returns function that can be reused for AST generation (just save result and call with data as argument whenever needed).

Examples

Simple generation

var ast = estemplate('var <%= varName %> = <%= value %> + 1;', {
  varName: {type: 'Identifier', name: 'myVar'},
  value: {type: 'Literal', value: 123}
});

console.log(escodegen.generate(ast));
// > var myVar = 123 + 1;

Advanced generation (with source map)

template.jst

define(function (require, exports, module) {% = body %});

index.js

var dependency1 = require('dependency1'),
    dependency2 = require('dependency2');

module.exports = function () {
	return dependency1() + dependency2();
};

main code

var templateCode = fs.readFileSync('template.jst', 'utf-8');
var template = estemplate.compile(templateCode, {attachComment: true});

var program = esprima.parse(fs.readFileSync('index.js', 'utf-8'), {
    loc: true,
    source: 'index.js'
});

var ast = template({body: program.body});

var output = escodegen.generate(ast, {
  sourceMap: true,
  sourceMapWithCode: true
});

console.log(output.code);

output

define(function (require, exports, module) {
    var dependency1 = require('dependency1'), dependency2 = require('dependency2');
    module.exports = function () {
        return dependency1() + dependency2();
    };
});

Contributing

In lieu of a formal styleguide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code using Grunt.

License

Copyright (c) 2014 Ingvar Stepanyan. Licensed under the MIT license.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].