UNPKG

glimmer-analyzer

Version:

Statically analyzes Handlebars templates and components for dependency trees and other information.

105 lines 8.56 kB
"use strict"; 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlYmFycy1hbmFseXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9oYW5kbGViYXJzLWFuYWx5emVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsNENBQTREO0FBRTVELDZDQUFpRDtBQVNqRCxzQ0FBNkMsWUFBb0IsRUFBRSxPQUFnQjtJQUNqRixJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQ2hDLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFakQsSUFBSSxHQUFHLEdBQUcsbUJBQVUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsSUFBSSxVQUFVLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNuQyxJQUFJLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2hDLElBQUksa0JBQWtCLEdBQUcsS0FBSyxDQUFDO0lBRS9CLGlCQUFRLENBQUMsR0FBRyxFQUFFO1FBQ1osd0JBQXdCLENBQUMsSUFBSTtZQUMzQixFQUFFLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMxQiw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO3FCQUNyQyxHQUFHLENBQUMsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUM7cUJBQ2hFLE1BQU0sQ0FBQyxPQUFPLENBQUM7cUJBQ2YsR0FBRyxDQUFDLFNBQVMsSUFBSSw4QkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztxQkFDOUMsT0FBTyxDQUFDLElBQUksSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDM0MsQ0FBQztRQUNILENBQUM7UUFFRCxpQkFBaUIsQ0FBQyxJQUFJO1lBQ3BCLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1lBQzVCLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFaEYsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELGFBQWEsQ0FBQyxJQUFJO1lBQ2hCLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1lBQzVCLENBQUM7WUFBQyxJQUFJLENBQUMsQ0FBQztnQkFDTixJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFFaEYsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztvQkFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELFdBQVcsQ0FBQyxJQUFJO1lBQ2QsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztZQUNuQixJQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLFlBQVksR0FBRyxFQUFFLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBRXpFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2QsVUFBVSxDQUFDLEdBQUcsQ0FBQyw4QkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQy9DLENBQUM7UUFDSCxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsSUFBSSxJQUFJLEdBQUcsOEJBQWlCLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRWpELE1BQU0sQ0FBQztRQUNMLElBQUk7UUFDSixrQkFBa0I7UUFDbEIsVUFBVTtRQUNWLE9BQU87S0FDUixDQUFDO0FBQ0osQ0FBQztBQTlERCxvRUE4REM7QUFFRCw0QkFBNEIsRUFBRSxJQUFJLEVBQTZDO0lBQzdFLE1BQU0sQ0FBQyxVQUFVLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNuQyxDQUFDO0FBRUQsMkJBQTJCLEVBQUUsSUFBSSxFQUE2QztJQUM1RSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxnQkFBZ0I7V0FDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztXQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsQ0FBQztBQUNyQyxDQUFDO0FBRUQsc0NBQXNDLE9BQWU7SUFDbkQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRCx5QkFBeUIsRUFBRSxLQUFLLEVBQWdDO0lBQzlELE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxTQUFTLENBQUM7QUFDakQsQ0FBQztBQUVELCtDQUFzRCxZQUFvQixFQUFFLE9BQWdCO0lBQzFGLElBQUksVUFBVSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkQsSUFBSSxjQUFjLEdBQUcsOEJBQWlCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRTdELElBQUksVUFBVSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUMzQyxJQUFJLE9BQU8sR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQ2hDLElBQUksS0FBSyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDN0IsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFFL0IsSUFBSSxPQUFPLENBQUM7SUFDWixPQUFPLE9BQU8sR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUM3QixJQUFJLFlBQVksR0FBRyw0QkFBNEIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbEUsa0JBQWtCLEdBQUcsa0JBQWtCLElBQUksWUFBWSxDQUFDLGtCQUFrQixDQUFDO1FBRTNFLEdBQUcsQ0FBQyxDQUFDLElBQUksU0FBUyxJQUFJLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzlDLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQy9CLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzFCLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDeEIsQ0FBQztRQUNILENBQUM7UUFFRCxHQUFHLENBQUMsQ0FBQyxJQUFJLE1BQU0sSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUVsQyxNQUFNLENBQUM7UUFDTCxJQUFJLEVBQUUsY0FBYztRQUNwQixrQkFBa0I7UUFDbEIsVUFBVTtRQUNWLE9BQU87S0FDUixDQUFDO0FBQ0osQ0FBQztBQWxDRCxzRkFrQ0MifQ==