expand

Recursively resolve templates in an object, string or array.
Heads up!
v0.2.0 API 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'});
Install
Install with npm
$ npm i expand --save
Usage
var expand = require('expand')();
expand({a: '<%= b %>', b: 'c'});
expand({a: '<%= b.c.d %>', b: {c: {d: 'eee'}}});
Params
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.
Example
If an object is passed, only the first argument is strictly necessary.
expand({a: '<%= b %>', b: '<%= c %>', c: 'It worked!'});
More examples
process templates in objects
expand({a: {c: '<%= d %>'}, d: {f: 'g'}});
process a template in an array
expand(['<%= a %>'], {a: 'b'});
process templates in a string
expand('<%= a %>', {a: 'b'});
process multiple templates in an array
expand(['<%= a %>', '<%= b %>'], {a: 'b', b: 'c'});
expand nested templates in an object
var data = {a: {b: {c: 'd'}}};
expand({foo: '<%= a.b.c %>'}, data);
recursively expand templates
var data = {a: '<%= b %>', b: '<%= c %>', c: 'the end!'};
expand('<%= a %>', data);
process multiple templates in the same string
var str = '<%= a %>/<%= b %>';
expand(str, {a: 'foo', b: 'bar'});
process multiple templates in an object value
var data = {
a: {
c: '<%= d %>/<%= e %>'
},
d: 'ddd',
e: 'eee'
};
expand(data).a.c;
recursively process templates in object values
var data = {
a: '<%= b %>/<%= c %>',
b: 'xxx',
c: '<%= y %>',
y: 'zzz'
};
expand('<%= a %>', data);
call helpers in templates
var ctx = {
foo: 'bar',
c: {
d: {
e: function (str) {
return str.toUpperCase();
}
}
}
};
expand('abc <%= c.d.e(foo) %> xyz', ctx);
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 ),]+)/});
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 ),]+)/});
console.log(result.a.c);
Related 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
Alternatives
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:
Running tests
Install dev dependencies:
$ npm i -d && npm test
Contributing
Pull requests and stars are always welcome. For bugs and feature requests, please create an issue.
Author
Jon Schlinkert
License
Copyright © 2015 Jon Schlinkert
Released under the MIT license.
This file was generated by verb-cli on September 14, 2015.