UNPKG

@glimmer/syntax

Version:
124 lines (107 loc) 11.6 kB
import { isKeyword } from './keywords'; import { preprocess } from './parser/tokenizer-event-handlers'; import traverse from './traversal/traverse'; /** * Gets the correct Token from the Node based on it's type */ function tokensFromType(node, scopedTokens, options) { if (node.type === 'PathExpression') { if (node.head.type === 'AtHead' || node.head.type === 'ThisHead') { return; } var possbleToken = node.head.name; if (scopedTokens.indexOf(possbleToken) === -1) { return possbleToken; } } else if (node.type === 'ElementNode') { var tag = node.tag; var _char = tag.charAt(0); if (_char === ':' || _char === '@') { return; } if (!options.includeHtmlElements && tag.indexOf('.') === -1 && tag.toLowerCase() === tag) { return; } if (tag.substr(0, 5) === 'this.') { return; } if (scopedTokens.indexOf(tag) !== -1) { return; } return tag; } } /** * Adds tokens to the tokensSet based on their node.type */ function addTokens(tokensSet, node, scopedTokens, options) { var maybeTokens = tokensFromType(node, scopedTokens, options); (Array.isArray(maybeTokens) ? maybeTokens : [maybeTokens]).forEach(function (maybeToken) { if (maybeToken !== undefined && maybeToken[0] !== '@') { var maybeTokenFirstSegment = maybeToken.split('.')[0]; if (!scopedTokens.includes(maybeTokenFirstSegment)) { tokensSet.add(maybeToken.split('.')[0]); } } }); } /** * Parses and traverses a given handlebars html template to extract all template locals * referenced that could possible come from the parent scope. Can exclude known keywords * optionally. */ export function getTemplateLocals(html, options) { if (options === void 0) { options = { includeHtmlElements: false, includeKeywords: false }; } var ast = preprocess(html); var tokensSet = new Set(); var scopedTokens = []; traverse(ast, { Block: { enter: function enter(_ref) { var blockParams = _ref.blockParams; blockParams.forEach(function (param) { scopedTokens.push(param); }); }, exit: function exit(_ref2) { var blockParams = _ref2.blockParams; blockParams.forEach(function () { scopedTokens.pop(); }); } }, ElementNode: { enter: function enter(node) { node.blockParams.forEach(function (param) { scopedTokens.push(param); }); addTokens(tokensSet, node, scopedTokens, options); }, exit: function exit(_ref3) { var blockParams = _ref3.blockParams; blockParams.forEach(function () { scopedTokens.pop(); }); } }, PathExpression: function PathExpression(node) { addTokens(tokensSet, node, scopedTokens, options); } }); var tokens = []; tokensSet.forEach(function (s) { return tokens.push(s); }); if (!(options === null || options === void 0 ? void 0 : options.includeKeywords)) { tokens = tokens.filter(function (token) { return !isKeyword(token); }); } return tokens; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvZ2V0LXRlbXBsYXRlLWxvY2Fscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxTQUFBLFNBQUEsUUFBQSxZQUFBO0FBQ0EsU0FBQSxVQUFBLFFBQUEsbUNBQUE7QUFDQSxPQUFBLFFBQUEsTUFBQSxzQkFBQTtBQVFBOzs7O0FBR0EsU0FBQSxjQUFBLENBQUEsSUFBQSxFQUFBLFlBQUEsRUFBQSxPQUFBLEVBR21DO0FBRWpDLE1BQUksSUFBSSxDQUFKLElBQUEsS0FBSixnQkFBQSxFQUFvQztBQUNsQyxRQUFJLElBQUksQ0FBSixJQUFBLENBQUEsSUFBQSxLQUFBLFFBQUEsSUFBK0IsSUFBSSxDQUFKLElBQUEsQ0FBQSxJQUFBLEtBQW5DLFVBQUEsRUFBa0U7QUFDaEU7QUFDRDs7QUFFRCxRQUFNLFlBQVksR0FBRyxJQUFJLENBQUosSUFBQSxDQUFyQixJQUFBOztBQUVBLFFBQUksWUFBWSxDQUFaLE9BQUEsQ0FBQSxZQUFBLE1BQXVDLENBQTNDLENBQUEsRUFBK0M7QUFDN0MsYUFBQSxZQUFBO0FBQ0Q7QUFUSCxHQUFBLE1BVU8sSUFBSSxJQUFJLENBQUosSUFBQSxLQUFKLGFBQUEsRUFBaUM7QUFBQSxRQUM5QixHQUQ4QixHQUN0QyxJQURzQyxDQUM5QixHQUQ4Qjs7QUFHdEMsUUFBTSxLQUFJLEdBQUcsR0FBRyxDQUFILE1BQUEsQ0FBYixDQUFhLENBQWI7O0FBRUEsUUFBSSxLQUFJLEtBQUosR0FBQSxJQUFnQixLQUFJLEtBQXhCLEdBQUEsRUFBa0M7QUFDaEM7QUFDRDs7QUFFRCxRQUFJLENBQUMsT0FBTyxDQUFSLG1CQUFBLElBQWdDLEdBQUcsQ0FBSCxPQUFBLENBQUEsR0FBQSxNQUFxQixDQUFyRCxDQUFBLElBQTJELEdBQUcsQ0FBSCxXQUFBLE9BQS9ELEdBQUEsRUFBMEY7QUFDeEY7QUFDRDs7QUFFRCxRQUFJLEdBQUcsQ0FBSCxNQUFBLENBQUEsQ0FBQSxF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QU8sTUFBTSxDQUFOLElBQUEsQ0FBekIsQ0FBeUIsQ0FBUDtBQUFBLEdBQWxCOztBQUVBLE1BQUksRUFBQyxPQUFPLEtBQVAsSUFBQSxJQUFBLE9BQU8sS0FBQSxLQUFQLENBQUEsR0FBTyxLQUFQLENBQUEsR0FBQSxPQUFPLENBQVosZUFBSSxDQUFKLEVBQStCO0FBQzdCLElBQUEsTUFBTSxHQUFHLE1BQU0sQ0FBTixNQUFBLENBQWUsVUFBQSxLQUFEO0FBQUEsYUFBVyxDQUFDLFNBQVMsQ0FBNUMsS0FBNEMsQ0FBckI7QUFBQSxLQUFkLENBQVQ7QUFDRDs7QUFFRCxTQUFBLE1BQUE7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzS2V5d29yZCB9IGZyb20gJy4va2V5d29yZHMnO1xuaW1wb3J0IHsgcHJlcHJvY2VzcyB9IGZyb20gJy4vcGFyc2VyL3Rva2VuaXplci1ldmVudC1oYW5kbGVycyc7XG5pbXBvcnQgdHJhdmVyc2UgZnJvbSAnLi90cmF2ZXJzYWwvdHJhdmVyc2UnO1xuaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi92MS9hcGknO1xuXG5pbnRlcmZhY2UgR2V0VGVtcGxhdGVMb2NhbHNPcHRpb25zIHtcbiAgaW5jbHVkZUtleXdvcmRzPzogYm9vbGVhbjtcbiAgaW5jbHVkZUh0bWxFbGVtZW50cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29ycmVjdCBUb2tlbiBmcm9tIHRoZSBOb2RlIGJhc2VkIG9uIGl0J3MgdHlwZVxuICovXG5mdW5jdGlvbiB0b2tlbnNGcm9tVHlwZShcbiAgbm9kZTogQVNUdjEuTm9kZSxcbiAgc2NvcGVkVG9rZW5zOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogR2V0VGVtcGxhdGVMb2NhbHNPcHRpb25zXG4pOiBzdHJpbmcgfCB2b2lkIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1BhdGhFeHByZXNzaW9uJykge1xuICAgIGlmIChub2RlLmhlYWQudHlwZSA9PT0gJ0F0SGVhZCcgfHwgbm9kZS5oZWFkLnR5cGUgPT09ICdUaGlzSGVhZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb3NzYmxlVG9rZW4gPSBub2RlLmhlYWQubmFtZTtcblxuICAgIGlmIChzY29wZWRUb2tlbnMuaW5kZXhPZihwb3NzYmxlVG9rZW4pID09PSAtMSkge1xuICAgICAgcmV0dXJuIHBvc3NibGVUb2tlbjtcbiAgICB9XG4gIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAnRWxlbWVudE5vZGUnKSB7XG4gICAgY29uc3QgeyB0YWcgfSA9IG5vZGU7XG5cbiAgICBjb25zdCBjaGFyID0gdGFnLmNoYXJBdCgwKTtcblxuICAgIGlmIChjaGFyID09PSAnOicgfHwgY2hhciA9PT0gJ0AnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmluY2x1ZGVIdG1sRWxlbWVudHMgJiYgdGFnLmluZGV4T2YoJy4nKSA9PT0gLTEgJiYgdGFnLnRvTG93ZXJDYXNlKCkgPT09IHRhZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0YWcuc3Vic3RyKDAsIDUpID09PSAndGhpcy4nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNjb3BlZFRva2Vucy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhZztcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgdG9rZW5zIHRvIHRoZSB0b2tlbnNTZXQgYmFzZWQgb24gdGhlaXIgbm9kZS50eXBlXG4gKi9cbmZ1bmN0aW9uIGFkZFRva2VucyhcbiAgdG9rZW5zU2V0OiBTZXQ8c3RyaW5nPixcbiAgbm9kZTogQVNUdjEuTm9kZSxcbiAgc2NvcGVkVG9rZW5zOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogR2V0VGVtcGxhdGVMb2NhbHNPcHRpb25zXG4pIHtcbiAgY29uc3QgbWF5YmVUb2tlbnMgPSB0b2tlbnNGcm9tVHlwZShub2RlLCBzY29wZWRUb2tlbnMsIG9wdGlvbnMpO1xuXG4gIChBcnJheS5pc0FycmF5KG1heWJlVG9rZW5zKSA/IG1heWJlVG9rZW5zIDogW21heWJlVG9rZW5zXSkuZm9yRWFjaCgobWF5YmVUb2tlbikgPT4ge1xuICAgIGlmIChtYXliZVRva2VuICE9PSB1bmRlZmluZWQgJiYgbWF5YmVUb2tlblswXSAhPT0gJ0AnKSB7XG4gICAgICBjb25zdCBtYXliZVRva2VuRmlyc3RTZWdtZW50ID0gbWF5YmVUb2tlbi5zcGxpdCgnLicpWzBdO1xuICAgICAgaWYgKCFzY29wZWRUb2tlbnMuaW5jbHVkZXMobWF5YmVUb2tlbkZpcnN0U2VnbWVudCkpIHtcbiAgICAgICAgdG9rZW5zU2V0LmFkZChtYXliZVRva2VuLnNwbGl0KCcuJylbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUGFyc2VzIGFuZCB0cmF2ZXJzZXMgYSBnaXZlbiBoYW5kbGViYXJzIGh0bWwgdGVtcGxhdGUgdG8gZXh0cmFjdCBhbGwgdGVtcGxhdGUgbG9jYWxzXG4gKiByZWZlcmVuY2VkIHRoYXQgY291bGQgcG9zc2libGUgY29tZSBmcm9tIHRoZSBwYXJlbnQgc2NvcGUuIENhbiBleGNsdWRlIGtub3duIGtleXdvcmRzXG4gKiBvcHRpb25hbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcGxhdGVMb2NhbHMoXG4gIGh0bWw6IHN0cmluZyxcbiAgb3B0aW9uczogR2V0VGVtcGxhdGVMb2NhbHNPcHRpb25zID0ge1xuICAgIGluY2x1ZGVIdG1sRWxlbWVudHM6IGZhbHNlLFxuICAgIGluY2x1ZGVLZXl3b3JkczogZmFsc2UsXG4gIH1cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXN0ID0gcHJlcHJvY2VzcyhodG1sKTtcbiAgY29uc3QgdG9rZW5zU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHNjb3BlZFRva2Vuczogc3RyaW5nW10gPSBbXTtcblxuICB0cmF2ZXJzZShhc3QsIHtcbiAgICBCbG9jazoge1xuICAgICAgZW50ZXIoeyBibG9ja1BhcmFtcyB9KSB7XG4gICAgICAgIGJsb2NrUGFyYW1zLmZvckVhY2goKHBhcmFtKSA9PiB7XG4gICAgICAgICAgc2NvcGVkVG9rZW5zLnB1c2gocGFyYW0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGV4aXQoeyBibG9ja1BhcmFtcyB9KSB7XG4gICAgICAgIGJsb2NrUGFyYW1zLmZvckVhY2goKCkgPT4ge1xuICAgICAgICAgIHNjb3BlZFRva2Vucy5wb3AoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBFbGVtZW50Tm9kZToge1xuICAgICAgZW50ZXIobm9kZSkge1xuICAgICAgICBub2RlLmJsb2NrUGFyYW1zLmZvckVhY2goKHBhcmFtKSA9PiB7XG4gICAgICAgICAgc2NvcGVkVG9rZW5zLnB1c2gocGFyYW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYWRkVG9rZW5zKHRva2Vuc1NldCwgbm9kZSwgc2NvcGVkVG9rZW5zLCBvcHRpb25zKTtcbiAgICAgIH0sXG5cbiAgICAgIGV4aXQoeyBibG9ja1BhcmFtcyB9KSB7XG4gICAgICAgIGJsb2NrUGFyYW1zLmZvckVhY2goKCkgPT4ge1xuICAgICAgICAgIHNjb3BlZFRva2Vucy5wb3AoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBQYXRoRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICBhZGRUb2tlbnModG9rZW5zU2V0LCBub2RlLCBzY29wZWRUb2tlbnMsIG9wdGlvbnMpO1xuICAgIH0sXG4gIH0pO1xuXG4gIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG5cbiAgdG9rZW5zU2V0LmZvckVhY2goKHMpID0+IHRva2Vucy5wdXNoKHMpKTtcblxuICBpZiAoIW9wdGlvbnM/LmluY2x1ZGVLZXl3b3Jkcykge1xuICAgIHRva2VucyA9IHRva2Vucy5maWx0ZXIoKHRva2VuKSA9PiAhaXNLZXl3b3JkKHRva2VuKSk7XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==