@vulcan-sql/core
Version:
Core package of VulcanSQL
73 lines • 3.35 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BuildTimeCompilerEnvironment = void 0;
const tslib_1 = require("tslib");
const models_1 = require("../../../models/index");
const types_1 = require("../../../containers/types");
const inversify_1 = require("inversify");
const extension_utils_1 = require("../extension-utils");
const base_1 = require("./base");
/**
* Build phase environment is used when we compiling templates.
*/
let BuildTimeCompilerEnvironment = class BuildTimeCompilerEnvironment extends base_1.BaseCompilerEnvironment {
constructor(extensions = [], validatorLoader) {
super();
this.extensions = [];
this.astVisitors = [];
this.metadataProviders = [];
// We only need compile time extensions like filterBuilder, tagBuilder ...etc.
this.extensions = extensions.filter((extension) => extension instanceof models_1.CompileTimeExtension);
this.validatorLoader = validatorLoader;
this.loadExtensions();
}
getExtensions() {
return this.extensions;
}
traverseAst(ast) {
(0, extension_utils_1.walkAst)(ast, this.astVisitors.map((astVisitor) => (node) => {
astVisitor.onVisit(node, this);
}));
// After finished traverse, call finish() function for every single visitor
this.astVisitors.forEach((visitor) => { var _a; return (_a = visitor.finish) === null || _a === void 0 ? void 0 : _a.call(visitor); });
}
/** Get some metadata from the AST tree, e.g. the errors defined by templates.
* It'll help use to validate templates, validate schema ...etc. */
getMetadata() {
return (0, extension_utils_1.generateMetadata)(this.metadataProviders);
}
loadExtensions() {
this.extensions.forEach(this.loadExtension.bind(this));
// Validator filters
for (const validator of this.validatorLoader.getValidators()) {
this.addFilter((0, extension_utils_1.getValidationFilterName)(validator), () => null, // We don't need to implement transform function in compile time
false);
}
}
loadExtension(extension) {
// Extends
if (extension instanceof models_1.TagBuilder) {
this.addExtension(extension.getName(), extension);
}
else if (extension instanceof models_1.FilterBuilder) {
this.addFilter(extension.filterName, () => null, // We don't need to implement transform function in compile time
true);
}
// Implement
if ((0, extension_utils_1.implementedOnAstVisit)(extension)) {
this.astVisitors.push(extension);
}
if ((0, extension_utils_1.implementedProvideMetadata)(extension)) {
this.metadataProviders.push(extension);
}
}
};
BuildTimeCompilerEnvironment = tslib_1.__decorate([
(0, inversify_1.injectable)(),
tslib_1.__param(0, (0, inversify_1.multiInject)(types_1.TYPES.Extension_TemplateEngine)),
tslib_1.__param(0, (0, inversify_1.optional)()),
tslib_1.__param(1, (0, inversify_1.inject)(types_1.TYPES.ValidatorLoader)),
tslib_1.__metadata("design:paramtypes", [Array, Object])
], BuildTimeCompilerEnvironment);
exports.BuildTimeCompilerEnvironment = BuildTimeCompilerEnvironment;
//# sourceMappingURL=buildTime.js.map