72 lines
1.6 KiB
JavaScript
72 lines
1.6 KiB
JavaScript
module.exports = Transformer;
|
|
|
|
var traverse = require("./traverse");
|
|
var _ = require("lodash");
|
|
|
|
function Transformer(key, transformer) {
|
|
this.transformer = Transformer.normalise(transformer);
|
|
this.key = key;
|
|
}
|
|
|
|
Transformer.normalise = function (transformer) {
|
|
if (_.isFunction(transformer)) {
|
|
transformer = { ast: transformer };
|
|
} else {
|
|
_.each(transformer, function (fns, type) {
|
|
if (_.isFunction(fns)) fns = { enter: fns };
|
|
transformer[type] = fns;
|
|
});
|
|
}
|
|
return transformer;
|
|
};
|
|
|
|
Transformer.prototype.transform = function (file) {
|
|
if (!this.canRun(file)) return;
|
|
|
|
var transformer = this.transformer;
|
|
var ast = file.ast;
|
|
|
|
if (transformer.ast) {
|
|
transformer.ast(ast);
|
|
}
|
|
|
|
var build = function (exit) {
|
|
return function (node, parent) {
|
|
// add any node type aliases that exist
|
|
var types = [node.type].concat(traverse.aliases[node.type] || []);
|
|
|
|
var fns = transformer.all;
|
|
|
|
_.each(types, function (type) {
|
|
fns = transformer[type] || fns;
|
|
});
|
|
|
|
// this transformer cannot deal with this node type
|
|
if (!fns) return;
|
|
|
|
var fn = fns.enter;
|
|
if (exit) fn = fns.exit;
|
|
if (!fn) return;
|
|
|
|
return fn(node, parent, file);
|
|
};
|
|
};
|
|
|
|
traverse(ast, {
|
|
enter: build(),
|
|
exit: build(true)
|
|
});
|
|
};
|
|
|
|
Transformer.prototype.canRun = function (file) {
|
|
var opts = file.opts;
|
|
|
|
var blacklist = opts.blacklist;
|
|
if (blacklist.length && _.contains(blacklist, this.key)) return false;
|
|
|
|
var whitelist = opts.whitelist;
|
|
if (whitelist.length && !_.contains(whitelist, this.key)) return false;
|
|
|
|
return true;
|
|
};
|