glimmer-analyzer
Version:
Statically analyzes Handlebars templates and components for dependency trees and other information.
105 lines • 8.56 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const syntax_1 = require("@glimmer/syntax");
const specifiers_1 = require("./specifiers");
function discoverTemplateDependencies(templateName, project) {
let resolver = project.resolver;
let template = project.templateFor(templateName);
let ast = syntax_1.preprocess(template.string);
let components = new Set();
let helpers = new Set();
let hasComponentHelper = false;
syntax_1.traverse(ast, {
MustacheCommentStatement(node) {
if (isImportComment(node)) {
extractComponentsFromComment(node.value)
.map(c => resolver.identify(`template:${c}`, template.specifier))
.filter(Boolean)
.map(specifier => specifiers_1.pathFromSpecifier(specifier))
.forEach(path => components.add(path));
}
},
MustacheStatement(node) {
if (isComponentHelper(node)) {
hasComponentHelper = true;
}
else {
let specifier = resolver.identify(specifierForHelper(node), template.specifier);
if (specifier) {
helpers.add(specifiers_1.pathFromSpecifier(specifier));
}
}
},
SubExpression(node) {
if (isComponentHelper(node)) {
hasComponentHelper = true;
}
else {
let specifier = resolver.identify(specifierForHelper(node), template.specifier);
if (specifier) {
helpers.add(specifiers_1.pathFromSpecifier(specifier));
}
}
},
ElementNode(node) {
let { tag } = node;
let specifier = resolver.identify(`template:${tag}`, template.specifier);
if (specifier) {
components.add(specifiers_1.pathFromSpecifier(specifier));
}
}
});
let path = specifiers_1.pathFromSpecifier(template.specifier);
return {
path,
hasComponentHelper,
components,
helpers
};
}
exports.discoverTemplateDependencies = discoverTemplateDependencies;
function specifierForHelper({ path }) {
return `helper:${path.original}`;
}
function isComponentHelper({ path }) {
return path.type === 'PathExpression'
&& path.parts.length === 1
&& path.parts[0] === 'component';
}
function extractComponentsFromComment(comment) {
return comment.trim().substr(7).split(' ');
}
function isImportComment({ value }) {
return value.trim().substr(0, 7) === 'import ';
}
function discoverRecursiveTemplateDependencies(templateName, project) {
let entryPoint = project.templateFor(templateName);
let entryPointPath = specifiers_1.pathFromSpecifier(entryPoint.specifier);
let components = new Set([entryPointPath]);
let helpers = new Set();
let queue = [entryPointPath];
let hasComponentHelper = false;
let current;
while (current = queue.pop()) {
let dependencies = discoverTemplateDependencies(current, project);
hasComponentHelper = hasComponentHelper || dependencies.hasComponentHelper;
for (let component of dependencies.components) {
if (!components.has(component)) {
components.add(component);
queue.push(component);
}
}
for (let helper of dependencies.helpers) {
helpers.add(helper);
}
}
components.delete(entryPointPath);
return {
path: entryPointPath,
hasComponentHelper,
components,
helpers
};
}
exports.discoverRecursiveTemplateDependencies = discoverRecursiveTemplateDependencies;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlYmFycy1hbmFseXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9oYW5kbGViYXJzLWFuYWx5emVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNENBQTREO0FBRTVELDZDQUFpRDtBQVNqRCxzQ0FBNkMsWUFBb0IsRUFBRSxPQUFnQjtJQUNqRixJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQ2hDLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFakQsSUFBSSxHQUFHLEdBQUcsbUJBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNuQyxJQUFJLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2hDLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBRS9CLGlCQUFRLENBQUMsR0FBRyxFQUFFO1FBQ1osd0JBQXdCLENBQUMsSUFBSTtZQUMzQixFQUFFLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxQiw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO3FCQUNyQyxHQUFHLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7cUJBQ2hFLE1BQU0sQ0FBQyxPQUFPLENBQUM7cUJBQ2YsR0FBRyxDQUFDLFNBQVMsSUFBSSw4QkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztxQkFDOUMsT0FBTyxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDM0MsQ0FBQztRQUNILENBQUM7UUFFRCxpQkFBaUIsQ0FBQyxJQUFJO1lBQ3BCLEVBQUUsQ0FBQyxDQUFD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