dslify

Rewrites functions or modules in terms of a DSL

dslify

Rewrites a JavaScript function, such that any global property access is transformed to call a member of a new dsl argument. Use dslify to interpret domain-specific languages without messing about in global scope.

npm install dslify
var dslify = require('dslify');

var fn = function() { return shout(word); };
var shouter = dslify.transform(fn);

var dsl = {
    shout: function(something) {
        return something + "!!";
    },
    word: "unicorns"
};
shouter(dsl); // unicorns!!

Sometimes you might want to operate with strings instead of JavaScript functions. For example if you are generating templates or want to send JavaScript to the client.

var dslify = require('dslify');

var input = "function(input) { return shout(input, globalValue); };";
var output = dslify.transform(input, {asString: true});

output // function(input) { return shout(input, _dsl.globalValue); };

dslify parses functions using esprima, rewriting them as new functions using escodegen.

Yes. But 'with' is leaky and dangerous, wheras dslify is like a sandbox because it rewrites access to global scope, e.g:

var dslify = require('dslify');

var dsl = {};

var withWith = function(dsl) {
    with (dsl) {
        y = 'leaks into global!';
    }
};
var withDslify = dslify.transform(function() {
    z = 'global is safe!';
});

withWith(dsl);
withDslify(dsl);

console.log(global.y);  // leaks into global!
console.log(global.z);  // undefined
console.log(dsl.z);     // global is safe!

Yes. And dynamically generating functions is relatively slow, compared to calling functions. Therefore consider transforming functions at build time instead of run time.

BSD