43 lines
1.3 KiB
JavaScript
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}`);
|
|
}
|
|
}
|