node package manager


Recursively resolve templates in an object, string or array.

expand NPM version NPM downloads Build Status

Recursively resolve templates in an object, string or array.


Install with npm:

$ npm install --save expand


Install with npm:

$ npm install --save expand


var expand = require('expand')();
expand({a: '<%= b %>', b: 'c'});
//=> {a: 'c', b: 'c'} 
expand({a: '<%= b.c.d %>', b: {c: {d: 'eee'}}});
//=> {a: 'eee', b: {c: {d: 'eee' }}} 


expand(valueToExpand, dataToUse, options);
  • value {String|Array|Object}: The value with templates to resolve.
  • data {Object}: Pass the data to use for resolving templates. If the first argument is an object, this is optional.
  • options {Object}: Pass the regex to use for matching templates.
  • returns {any}: Returns a string, object or array based on what was passed.


If an object is passed, only the first argument is strictly necessary.

expand({a: '<%= b %>', b: '<%= c %>', c: 'It worked!'});
//=> {a: 'It worked!', b: 'It worked!', c: 'It worked!'} 

More examples

process templates in objects

expand({a: {c: '<%= d %>'}, d: {f: 'g'}});
//=>  {a: {c: {f: 'g'}}, d: {f: 'g'}}; 

process a template in an array

expand(['<%= a %>'], {a: 'b'});
//=> ['b'] 

process templates in a string

expand('<%= a %>', {a: 'b'});
//=> 'b' 

process multiple templates in an array

expand(['<%= a %>', '<%= b %>'], {a: 'b', b: 'c'});
//=> ['b', 'c'] 

expand nested templates in an object

var data = {a: {b: {c: 'd'}}};
expand({foo: '<%= a.b.c %>'}, data);
//=> {foo: 'd'} 

recursively expand templates

var data = {a: '<%= b %>', b: '<%= c %>', c: 'the end!'};
expand('<%= a %>', data);
//=> 'the end!' 

process multiple templates in the same string

var str = '<%= a %>/<%= b %>';
expand(str, {a: 'foo', b: 'bar'});
//=> 'foo/bar' 

process multiple templates in an object value

var data = {
  a: {
    c: '<%= d %>/<%= e %>'
  d: 'ddd',
  e: 'eee'
//=> 'ddd/eee' 

recursively process templates in object values

var data = {
  a: '<%= b %>/<%= c %>',
  b: 'xxx',
  c: '<%= y %>',
  y: 'zzz'
expand('<%= a %>', data);
//=> 'xxx/zzz' 

call helpers in templates

var ctx = {
  foo: 'bar',
  c: {
    d: {
      e: function (str) {
        return str.toUpperCase();
expand('abc <%= c.d.e(foo) %> xyz', ctx);
//=> 'abc BAR xyz' 

use custom regex

Options may be passed as the third argument. Currently options.regex is the only option.

var data = {a: 'bbb', c: 'ddd', e: 'fff'};
expand({foo: ':c/:e'}, data, {regex: /:([(\w ),]+)/});
//=> {foo: 'ddd/fff'} 

call functions with custom regex.

var data = {
  a: {c: ':d/:e/:upper(f)'},
  d: 'ddd',
  e: 'eee',
  f: 'foo',
  upper: function (str) {
    return str.toUpperCase();
var result = expand(data, data, {regex: /:([(\w ),]+)/});
//=> 'ddd/eee/FOO' 


Here are some great libs by other authors. My needs for expand differed enough to create a new library, but these are definitely worth a look:


v0.2.0 - Breaking changes

The top-level export now returns a function that takes an options object, which then returns the function to use.

var expand = require('expand');
var resolve = expand({regex: /:(\w+)/});
resolve(':a/:b', {a: 'foo', b: 'bar'});
//=> 'foo/bar' 

Related projects

You might also be interested in these projects:

  • engine: Template engine based on Lo-Dash template, but adds features like the ability to register helpers… more | homepage
  • expand-object: Expand a string into a JavaScript object using a simple notation. Use the CLI or… more | homepage
  • get-value: Use property paths (a.b.c) to get a nested value from an object. | homepage
  • glob-object: Filter an object using glob patterns and dot notation. | homepage
  • set-value: Create nested values and any intermediaries using dot notation ('a.b.c') paths. | homepage


This document was generated by verb-readme-generator (a verb generator), please don't edit directly. Any changes to the readme must be made in See Building Docs.

Pull requests and stars are always welcome. For bugs and feature requests, please create an issue.

Or visit the verb-readme-generator project to submit bug reports or pull requests for the readme layout template.

Building docs

(This document was generated by verb-readme-generator (a verb generator), please don't edit the readme directly. Any changes to the readme must be made in

Generate readme and API documentation with verb:

$ npm install -g verb verb-readme-generator && verb

Running tests

Install dev dependencies:

$ npm install -d && npm test


Jon Schlinkert


Copyright © 2016, Jon Schlinkert. Released under the MIT license.

This file was generated by verb, v0.9.0, on July 11, 2016.