2015-09-01 04:56:03 +01:00

43 lines
1.3 KiB
JavaScript

import type Transformer from "./transformer";
import traverse from "babel-traverse";
import type File from "./file";
/**
* This class is responsible for traversing over the provided `File`s
* AST and running it's parent transformers handlers over it.
*/
export default class PluginPass {
constructor(file: File, plugin: Transformer) {
this.plugin = plugin;
this.file = file;
this.key = plugin.key;
if (this.canTransform() && plugin.metadata.experimental && !file.opts.experimental) {
file.log.warn(`THE TRANSFORMER ${this.key} HAS BEEN MARKED AS EXPERIMENTAL AND IS WIP. USE AT YOUR OWN RISK. ` +
"THIS WILL HIGHLY LIKELY BREAK YOUR CODE SO USE WITH **EXTREME** CAUTION. ENABLE THE " +
"`experimental` OPTION TO IGNORE THIS WARNING.");
}
}
canTransform(): boolean {
if (this.plugin.metadata.mode !== this.file.opts.mode) {
return false;
} else {
return this.canRun();
}
}
canRun() {
return this.file.transformerDependencies[this.key] ||
this.file.pipeline.canRun(this.plugin, this.file.opts);
}
transform() {
var file = this.file;
file.log.debug(`Start transformer ${this.key}`);
traverse(file.ast, this.plugin.visitor, file.scope, file);
file.log.debug(`Finish transformer ${this.key}`);
}
}