UNPKG

@glimmer/syntax

Version:
135 lines (113 loc) 12.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getTemplateLocals = getTemplateLocals; var _keywords = require("./keywords"); var _tokenizerEventHandlers = require("./parser/tokenizer-event-handlers"); var _traverse = _interopRequireDefault(require("./traversal/traverse")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * 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. */ function getTemplateLocals(html, options) { if (options === void 0) { options = { includeHtmlElements: false, includeKeywords: false }; } var ast = (0, _tokenizerEventHandlers.preprocess)(html); var tokensSet = new Set(); var scopedTokens = []; (0, _traverse.default)(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 !(0, _keywords.isKeyword)(token); }); } return tokens; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvZ2V0LXRlbXBsYXRlLWxvY2Fscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7QUFRQTs7O0FBR0EsU0FBQSxjQUFBLENBQUEsSUFBQSxFQUFBLFlBQUEsRUFBQSxPQUFBLEVBR21DO0FBRWpDLE1BQUksSUFBSSxDQUFKLElBQUEsS0FBSixnQkFBQSxFQUFvQztBQUNsQyxRQUFJLElBQUksQ0FBSixJQUFBLENBQUEsSUFBQSxLQUFBLFFBQUEsSUFBK0IsSUFBSSxDQUFKLElBQUEsQ0FBQSxJQUFBLEtBQW5DLFVBQUEsRUFBa0U7QUFDaEU7QUFDRDs7QUFFRCxRQUFNLFlBQVksR0FBRyxJQUFJLENBQUosSUFBQSxDQUFyQixJQUFBOztBQUVBLFFBQUksWUFBWSxDQUFaLE9BQUEsQ0FBQSxZQUFBLE1BQXVDLENBQTNDLENBQUEsRUFBK0M7QUFDN0MsYUFBQSxZQUFBO0FBQ0Q7QUFUSCxHQUFBLE1BVU8sSUFBSSxJQUFJLENBQUosSUFBQSxLQUFKLGFBQUEsRUFBaUM7QUFBQSxRQUM5QixHQUQ4QixHQUN0QyxJQURzQyxDQUFBLEdBQUE7O0FBR3RDLFFBQU0sS0FBSSxHQUFHLEdBQUcsQ0FBSCxNQUFBLENBQWIsQ0FBYSxDQUFiOztBQUVBLFFBQUksS0FBSSxLQUFKLEdBQUEsSUFBZ0IsS0FBSSxLQUF4QixHQUFBLEVBQWtDO0FBQ2hDO0FBQ0Q7O0FBRUQsUUFBSSxDQUFDLE9BQU8sQ0FBUixtQkFBQSxJQUFnQyxHQUFHLENBQUgsT0FBQSxDQUFBLEdBQUEsTUFBcUIsQ0FBckQsQ0FBQSxJQUEyRCxHQUFHLENBQUgsV0FBQSxPQUEvRCxHQUFBLEVBQTBGO0FBQ3hGO0FBQ0Q7O0FBRUQsUUFBSSxHQUFHLENBQUgsTUFBQSxDQUFBLENBQUEsRUFBQSxDQUFBLE1BQUosT0FBQSxFQUFrQztBQUNoQztBQUNEOztBQUVELFFBQUksWUFBWSxD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LE1BQUksTUFBTSxHQUFWLEVBQUE7QUFFQSxFQUFBLFNBQVMsQ0FBVCxPQUFBLENBQW1CLFVBQUQsQ0FBQyxFQUFEO0FBQUEsV0FBTyxNQUFNLENBQU4sSUFBQSxDQUF6QixDQUF5QixDQUFQO0FBQWxCLEdBQUE7O0FBRUEsTUFBSSxFQUFDLE9BQU8sS0FBUCxJQUFBLElBQUEsT0FBTyxLQUFBLEtBQVAsQ0FBQSxHQUFPLEtBQVAsQ0FBQSxHQUFBLE9BQU8sQ0FBWixlQUFJLENBQUosRUFBK0I7QUFDN0IsSUFBQSxNQUFNLEdBQUcsTUFBTSxDQUFOLE1BQUEsQ0FBZSxVQUFELEtBQUMsRUFBRDtBQUFBLGFBQVcsQ0FBQyx5QkFBbkMsS0FBbUMsQ0FBWjtBQUF2QixLQUFTLENBQVQ7QUFDRDs7QUFFRCxTQUFBLE1BQUE7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzS2V5d29yZCB9IGZyb20gJy4va2V5d29yZHMnO1xuaW1wb3J0IHsgcHJlcHJvY2VzcyB9IGZyb20gJy4vcGFyc2VyL3Rva2VuaXplci1ldmVudC1oYW5kbGVycyc7XG5pbXBvcnQgdHJhdmVyc2UgZnJvbSAnLi90cmF2ZXJzYWwvdHJhdmVyc2UnO1xuaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi92MS9hcGknO1xuXG5pbnRlcmZhY2UgR2V0VGVtcGxhdGVMb2NhbHNPcHRpb25zIHtcbiAgaW5jbHVkZUtleXdvcmRzPzogYm9vbGVhbjtcbiAgaW5jbHVkZUh0bWxFbGVtZW50cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29ycmVjdCBUb2tlbiBmcm9tIHRoZSBOb2RlIGJhc2VkIG9uIGl0J3MgdHlwZVxuICovXG5mdW5jdGlvbiB0b2tlbnNGcm9tVHlwZShcbiAgbm9kZTogQVNUdjEuTm9kZSxcbiAgc2NvcGVkVG9rZW5zOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogR2V0VGVtcGxhdGVMb2NhbHNPcHRpb25zXG4pOiBzdHJpbmcgfCB2b2lkIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1BhdGhFeHByZXNzaW9uJykge1xuICAgIGlmIChub2RlLmhlYWQudHlwZSA9PT0gJ0F0SGVhZCcgfHwgbm9kZS5oZWFkLnR5cGUgPT09ICdUaGlzSGVhZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb3NzYmxlVG9rZW4gPSBub2RlLmhlYWQubmFtZTtcblxuICAgIGlmIChzY29wZWRUb2tlbnMuaW5kZXhPZihwb3NzYmxlVG9rZW4pID09PSAtMSkge1xuICAgICAgcmV0dXJuIHBvc3NibGVUb2tlbjtcbiAgICB9XG4gIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAnRWxlbWVudE5vZGUnKSB7XG4gICAgY29uc3QgeyB0YWcgfSA9IG5vZGU7XG5cbiAgICBjb25zdCBjaGFyID0gdGFnLmNoYXJBdCgwKTtcblxuICAgIGlmIChjaGFyID09PSAnOicgfHwgY2hhciA9PT0gJ0AnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmluY2x1ZGVIdG1sRWxlbWVudHMgJiYgdGFnLmluZGV4T2YoJy4nKSA9PT0gLTEgJiYgdGFnLnRvTG93ZXJDYXNlKCkgPT09IHRhZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0YWcuc3Vic3RyKDAsIDUpID09PSAndGhpcy4nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNjb3BlZFRva2Vucy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhZztcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgdG9rZW5zIHRvIHRoZSB0b2tlbnNTZXQgYmFzZWQgb24gdGhlaXIgbm9kZS50eXBlXG4gKi9cbmZ1bmN0aW9uIGFkZFRva2VucyhcbiAgdG9rZW5zU2V0OiBTZXQ8c3RyaW5nPixcbiAgbm9kZTogQVNUdjEuTm9kZSxcbiAgc2NvcGVkVG9rZW5zOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogR2V0VGVtcGxhdGVMb2NhbHNPcHRpb25zXG4pIHtcbiAgY29uc3QgbWF5YmVUb2tlbnMgPSB0b2tlbnNGcm9tVHlwZShub2RlLCBzY29wZWRUb2tlbnMsIG9wdGlvbnMpO1xuXG4gIChBcnJheS5pc0FycmF5KG1heWJlVG9rZW5zKSA/IG1heWJlVG9rZW5zIDogW21heWJlVG9rZW5zXSkuZm9yRWFjaCgobWF5YmVUb2tlbikgPT4ge1xuICAgIGlmIChtYXliZVRva2VuICE9PSB1bmRlZmluZWQgJiYgbWF5YmVUb2tlblswXSAhPT0gJ0AnKSB7XG4gICAgICBjb25zdCBtYXliZVRva2VuRmlyc3RTZWdtZW50ID0gbWF5YmVUb2tlbi5zcGxpdCgnLicpWzBdO1xuICAgICAgaWYgKCFzY29wZWRUb2tlbnMuaW5jbHVkZXMobWF5YmVUb2tlbkZpcnN0U2VnbWVudCkpIHtcbiAgICAgICAgdG9rZW5zU2V0LmFkZChtYXliZVRva2VuLnNwbGl0KCcuJylbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUGFyc2VzIGFuZCB0cmF2ZXJzZXMgYSBnaXZlbiBoYW5kbGViYXJzIGh0bWwgdGVtcGxhdGUgdG8gZXh0cmFjdCBhbGwgdGVtcGxhdGUgbG9jYWxzXG4gKiByZWZlcmVuY2VkIHRoYXQgY291bGQgcG9zc2libGUgY29tZSBmcm9tIHRoZSBwYXJlbnQgc2NvcGUuIENhbiBleGNsdWRlIGtub3duIGtleXdvcmRzXG4gKiBvcHRpb25hbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcGxhdGVMb2NhbHMoXG4gIGh0bWw6IHN0cmluZyxcbiAgb3B0aW9uczogR2V0VGVtcGxhdGVMb2NhbHNPcHRpb25zID0ge1xuICAgIGluY2x1ZGVIdG1sRWxlbWVudHM6IGZhbHNlLFxuICAgIGluY2x1ZGVLZXl3b3JkczogZmFsc2UsXG4gIH1cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXN0ID0gcHJlcHJvY2VzcyhodG1sKTtcbiAgY29uc3QgdG9rZW5zU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHNjb3BlZFRva2Vuczogc3RyaW5nW10gPSBbXTtcblxuICB0cmF2ZXJzZShhc3QsIHtcbiAgICBCbG9jazoge1xuICAgICAgZW50ZXIoeyBibG9ja1BhcmFtcyB9KSB7XG4gICAgICAgIGJsb2NrUGFyYW1zLmZvckVhY2goKHBhcmFtKSA9PiB7XG4gICAgICAgICAgc2NvcGVkVG9rZW5zLnB1c2gocGFyYW0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGV4aXQoeyBibG9ja1BhcmFtcyB9KSB7XG4gICAgICAgIGJsb2NrUGFyYW1zLmZvckVhY2goKCkgPT4ge1xuICAgICAgICAgIHNjb3BlZFRva2Vucy5wb3AoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBFbGVtZW50Tm9kZToge1xuICAgICAgZW50ZXIobm9kZSkge1xuICAgICAgICBub2RlLmJsb2NrUGFyYW1zLmZvckVhY2goKHBhcmFtKSA9PiB7XG4gICAgICAgICAgc2NvcGVkVG9rZW5zLnB1c2gocGFyYW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYWRkVG9rZW5zKHRva2Vuc1NldCwgbm9kZSwgc2NvcGVkVG9rZW5zLCBvcHRpb25zKTtcbiAgICAgIH0sXG5cbiAgICAgIGV4aXQoeyBibG9ja1BhcmFtcyB9KSB7XG4gICAgICAgIGJsb2NrUGFyYW1zLmZvckVhY2goKCkgPT4ge1xuICAgICAgICAgIHNjb3BlZFRva2Vucy5wb3AoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBQYXRoRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICBhZGRUb2tlbnModG9rZW5zU2V0LCBub2RlLCBzY29wZWRUb2tlbnMsIG9wdGlvbnMpO1xuICAgIH0sXG4gIH0pO1xuXG4gIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG5cbiAgdG9rZW5zU2V0LmZvckVhY2goKHMpID0+IHRva2Vucy5wdXNoKHMpKTtcblxuICBpZiAoIW9wdGlvbnM/LmluY2x1ZGVLZXl3b3Jkcykge1xuICAgIHRva2VucyA9IHRva2Vucy5maWx0ZXIoKHRva2VuKSA9PiAhaXNLZXl3b3JkKHRva2VuKSk7XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==