add Transformer class that deals with running a transformer against a File

This commit is contained in:
Sebastian McKenzie
2014-10-13 14:45:15 +11:00
parent 39959e5549
commit 453502b4f2
3 changed files with 72 additions and 56 deletions

View File

@@ -1,7 +1,6 @@
module.exports = File;
var transform = require("./transform");
var traverse = require("./traverse");
var util = require("./util");
var _ = require("lodash");
@@ -50,8 +49,8 @@ File.prototype.transform = function (ast) {
var self = this;
var opts = this.opts;
_.each(transform.transformers, function (transformer, name) {
self.runTransformer(name, transformer);
_.each(transform.transformers, function (transformer) {
transformer.transform(self);
});
var result = util.generate(ast, opts);
@@ -75,46 +74,3 @@ File.prototype.generateUid = function (name) {
uids[name] = i + 1;
return "_" + id;
};
File.prototype.canRunTransformer = function (name) {
var opts = this.opts;
var blacklist = opts.blacklist;
if (blacklist.length && _.contains(blacklist, name)) return false;
var whitelist = opts.whitelist;
if (whitelist.length && !_.contains(whitelist, name)) return false;
return true;
};
File.prototype.runTransformer = function (name, transformer) {
if (!this.canRunTransformer(name)) return;
var self = this;
var build = function (exit) {
return function (node, parent) {
var types = [node.type].concat(traverse.aliases[node.type] || []);
var fns = transformer.all;
_.each(types, function (type) {
fns = transformer[type] || fns;
});
if (!fns) return;
var fn = fns.enter;
if (exit) fn = fns.exit;
if (!fn) return;
return fn(node, parent, self);
};
};
traverse(this.ast, {
enter: build(),
exit: build(true)
});
};

View File

@@ -1,10 +1,11 @@
module.exports = transform;
var sourceMap = require("source-map");
var recast = require("recast");
var File = require("./file");
var util = require("./util");
var _ = require("lodash");
var Transformer = require("./transformer");
var sourceMap = require("source-map");
var recast = require("recast");
var File = require("./file");
var util = require("./util");
var _ = require("lodash");
function transform(code, opts) {
opts = opts || {};
@@ -87,9 +88,6 @@ transform.transformers = {
_aliasFunctions: require("./transformers/_alias-functions")
};
_.each(transform.transformers, function (transformer) {
_.each(transformer, function (fns, type) {
if (_.isFunction(fns)) fns = { enter: fns };
transformer[type] = fns;
});
_.each(transform.transformers, function (transformer, key) {
transform.transformers[key] = new Transformer(key, transformer);
});

62
lib/6to5/transformer.js Normal file
View File

@@ -0,0 +1,62 @@
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) {
_.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 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(file.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;
};