add Transformer class that deals with running a transformer against a File
This commit is contained in:
@@ -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)
|
||||
});
|
||||
};
|
||||
|
||||
@@ -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
62
lib/6to5/transformer.js
Normal 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;
|
||||
};
|
||||
Reference in New Issue
Block a user