UNPKG

@glimmer/syntax

Version:
137 lines (111 loc) 11.4 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; } const possbleToken = node.head.name; if (scopedTokens.indexOf(possbleToken) === -1) { return possbleToken; } } else if (node.type === 'ElementNode') { const { tag } = node; const 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) { const maybeTokens = tokensFromType(node, scopedTokens, options); (Array.isArray(maybeTokens) ? maybeTokens : [maybeTokens]).forEach(maybeToken => { if (maybeToken !== undefined && maybeToken[0] !== '@') { const 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 = { includeHtmlElements: false, includeKeywords: false }) { const ast = (0, _tokenizerEventHandlers.preprocess)(html); const tokensSet = new Set(); const scopedTokens = []; (0, _traverse.default)(ast, { Block: { enter({ blockParams }) { blockParams.forEach(param => { scopedTokens.push(param); }); }, exit({ blockParams }) { blockParams.forEach(() => { scopedTokens.pop(); }); } }, ElementNode: { enter(node) { node.blockParams.forEach(param => { scopedTokens.push(param); }); addTokens(tokensSet, node, scopedTokens, options); }, exit({ blockParams }) { blockParams.forEach(() => { scopedTokens.pop(); }); } }, PathExpression(node) { addTokens(tokensSet, node, scopedTokens, options); } }); let tokens = []; tokensSet.forEach(s => tokens.push(s)); if (!(options === null || options === void 0 ? void 0 : options.includeKeywords)) { tokens = tokens.filter(token => !(0, _keywords.isKeyword)(token)); } return tokens; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvZ2V0LXRlbXBsYXRlLWxvY2Fscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7QUFRQTs7O0FBR0EsU0FBQSxjQUFBLENBQUEsSUFBQSxFQUFBLFlBQUEsRUFBQSxPQUFBLEVBR21DO0FBRWpDLE1BQUksSUFBSSxDQUFKLElBQUEsS0FBSixnQkFBQSxFQUFvQztBQUNsQyxRQUFJLElBQUksQ0FBSixJQUFBLENBQUEsSUFBQSxLQUFBLFFBQUEsSUFBK0IsSUFBSSxDQUFKLElBQUEsQ0FBQSxJQUFBLEtBQW5DLFVBQUEsRUFBa0U7QUFDaEU7QUFDRDs7QUFFRCxVQUFNLFlBQVksR0FBRyxJQUFJLENBQUosSUFBQSxDQUFyQixJQUFBOztBQUVBLFFBQUksWUFBWSxDQUFaLE9BQUEsQ0FBQSxZQUFBLE1BQXVDLENBQTNDLENBQUEsRUFBK0M7QUFDN0MsYUFBQSxZQUFBO0FBQ0Q7QUFUSCxHQUFBLE1BVU8sSUFBSSxJQUFJLENBQUosSUFBQSxLQUFKLGFBQUEsRUFBaUM7QUFDdEMsVUFBTTtBQUFFLE1BQUE7QUFBRixRQUFOLElBQUE7QUFFQSxVQUFNLElBQUksR0FBRyxHQUFHLENBQUgsTUFBQSxDQUFiLENBQWEsQ0FBYjs7QUFFQSxRQUFJLElBQUksS0FBSixHQUFBLElBQWdCLElBQUksS0FBeEIsR0FBQSxFQUFrQztBQUNoQztBQUNEOztBQUVELFFBQUksQ0FBQyxPQUFPLENBQVIsbUJBQUEsSUFBZ0MsR0FBRyxDQUFILE9BQUEsQ0FBQSxHQUFBLE1BQXFCLENBQXJELENBQUEsSUFBMkQsR0FBRyxDQUFILFdBQUEsT0FBL0QsR0FBQSxFQUEwRjtBQUN4RjtBQUNEOztBQUVELFFBQUksR0FBRyxDQUFILE1BQUEsQ0FBQSxDQUFBLEVBQUEsQ0FBQSxNQUFKLE9BQUEsRUFBa0M7QUFDaEM7QUFDRDs7QUFFRCxRQUFJLFlBQVksQ0FBWixP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QUEsTUFBTSxHQUFHLE1BQU0sQ0FBTixNQUFBLENBQWUsS0FBRCxJQUFXLENBQUMseUJBQW5DLEtBQW1DLENBQTFCLENBQVQ7QUFDRDs7QUFFRCxTQUFBLE1BQUE7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzS2V5d29yZCB9IGZyb20gJy4va2V5d29yZHMnO1xuaW1wb3J0IHsgcHJlcHJvY2VzcyB9IGZyb20gJy4vcGFyc2VyL3Rva2VuaXplci1ldmVudC1oYW5kbGVycyc7XG5pbXBvcnQgdHJhdmVyc2UgZnJvbSAnLi90cmF2ZXJzYWwvdHJhdmVyc2UnO1xuaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi92MS9hcGknO1xuXG5pbnRlcmZhY2UgR2V0VGVtcGxhdGVMb2NhbHNPcHRpb25zIHtcbiAgaW5jbHVkZUtleXdvcmRzPzogYm9vbGVhbjtcbiAgaW5jbHVkZUh0bWxFbGVtZW50cz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY29ycmVjdCBUb2tlbiBmcm9tIHRoZSBOb2RlIGJhc2VkIG9uIGl0J3MgdHlwZVxuICovXG5mdW5jdGlvbiB0b2tlbnNGcm9tVHlwZShcbiAgbm9kZTogQVNUdjEuTm9kZSxcbiAgc2NvcGVkVG9rZW5zOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogR2V0VGVtcGxhdGVMb2NhbHNPcHRpb25zXG4pOiBzdHJpbmcgfCB2b2lkIHtcbiAgaWYgKG5vZGUudHlwZSA9PT0gJ1BhdGhFeHByZXNzaW9uJykge1xuICAgIGlmIChub2RlLmhlYWQudHlwZSA9PT0gJ0F0SGVhZCcgfHwgbm9kZS5oZWFkLnR5cGUgPT09ICdUaGlzSGVhZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb3NzYmxlVG9rZW4gPSBub2RlLmhlYWQubmFtZTtcblxuICAgIGlmIChzY29wZWRUb2tlbnMuaW5kZXhPZihwb3NzYmxlVG9rZW4pID09PSAtMSkge1xuICAgICAgcmV0dXJuIHBvc3NibGVUb2tlbjtcbiAgICB9XG4gIH0gZWxzZSBpZiAobm9kZS50eXBlID09PSAnRWxlbWVudE5vZGUnKSB7XG4gICAgY29uc3QgeyB0YWcgfSA9IG5vZGU7XG5cbiAgICBjb25zdCBjaGFyID0gdGFnLmNoYXJBdCgwKTtcblxuICAgIGlmIChjaGFyID09PSAnOicgfHwgY2hhciA9PT0gJ0AnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFvcHRpb25zLmluY2x1ZGVIdG1sRWxlbWVudHMgJiYgdGFnLmluZGV4T2YoJy4nKSA9PT0gLTEgJiYgdGFnLnRvTG93ZXJDYXNlKCkgPT09IHRhZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0YWcuc3Vic3RyKDAsIDUpID09PSAndGhpcy4nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHNjb3BlZFRva2Vucy5pbmRleE9mKHRhZykgIT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcmV0dXJuIHRhZztcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgdG9rZW5zIHRvIHRoZSB0b2tlbnNTZXQgYmFzZWQgb24gdGhlaXIgbm9kZS50eXBlXG4gKi9cbmZ1bmN0aW9uIGFkZFRva2VucyhcbiAgdG9rZW5zU2V0OiBTZXQ8c3RyaW5nPixcbiAgbm9kZTogQVNUdjEuTm9kZSxcbiAgc2NvcGVkVG9rZW5zOiBzdHJpbmdbXSxcbiAgb3B0aW9uczogR2V0VGVtcGxhdGVMb2NhbHNPcHRpb25zXG4pIHtcbiAgY29uc3QgbWF5YmVUb2tlbnMgPSB0b2tlbnNGcm9tVHlwZShub2RlLCBzY29wZWRUb2tlbnMsIG9wdGlvbnMpO1xuXG4gIChBcnJheS5pc0FycmF5KG1heWJlVG9rZW5zKSA/IG1heWJlVG9rZW5zIDogW21heWJlVG9rZW5zXSkuZm9yRWFjaCgobWF5YmVUb2tlbikgPT4ge1xuICAgIGlmIChtYXliZVRva2VuICE9PSB1bmRlZmluZWQgJiYgbWF5YmVUb2tlblswXSAhPT0gJ0AnKSB7XG4gICAgICBjb25zdCBtYXliZVRva2VuRmlyc3RTZWdtZW50ID0gbWF5YmVUb2tlbi5zcGxpdCgnLicpWzBdO1xuICAgICAgaWYgKCFzY29wZWRUb2tlbnMuaW5jbHVkZXMobWF5YmVUb2tlbkZpcnN0U2VnbWVudCkpIHtcbiAgICAgICAgdG9rZW5zU2V0LmFkZChtYXliZVRva2VuLnNwbGl0KCcuJylbMF0pO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUGFyc2VzIGFuZCB0cmF2ZXJzZXMgYSBnaXZlbiBoYW5kbGViYXJzIGh0bWwgdGVtcGxhdGUgdG8gZXh0cmFjdCBhbGwgdGVtcGxhdGUgbG9jYWxzXG4gKiByZWZlcmVuY2VkIHRoYXQgY291bGQgcG9zc2libGUgY29tZSBmcm9tIHRoZSBwYXJlbnQgc2NvcGUuIENhbiBleGNsdWRlIGtub3duIGtleXdvcmRzXG4gKiBvcHRpb25hbGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcGxhdGVMb2NhbHMoXG4gIGh0bWw6IHN0cmluZyxcbiAgb3B0aW9uczogR2V0VGVtcGxhdGVMb2NhbHNPcHRpb25zID0ge1xuICAgIGluY2x1ZGVIdG1sRWxlbWVudHM6IGZhbHNlLFxuICAgIGluY2x1ZGVLZXl3b3JkczogZmFsc2UsXG4gIH1cbik6IHN0cmluZ1tdIHtcbiAgY29uc3QgYXN0ID0gcHJlcHJvY2VzcyhodG1sKTtcbiAgY29uc3QgdG9rZW5zU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHNjb3BlZFRva2Vuczogc3RyaW5nW10gPSBbXTtcblxuICB0cmF2ZXJzZShhc3QsIHtcbiAgICBCbG9jazoge1xuICAgICAgZW50ZXIoeyBibG9ja1BhcmFtcyB9KSB7XG4gICAgICAgIGJsb2NrUGFyYW1zLmZvckVhY2goKHBhcmFtKSA9PiB7XG4gICAgICAgICAgc2NvcGVkVG9rZW5zLnB1c2gocGFyYW0pO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGV4aXQoeyBibG9ja1BhcmFtcyB9KSB7XG4gICAgICAgIGJsb2NrUGFyYW1zLmZvckVhY2goKCkgPT4ge1xuICAgICAgICAgIHNjb3BlZFRva2Vucy5wb3AoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBFbGVtZW50Tm9kZToge1xuICAgICAgZW50ZXIobm9kZSkge1xuICAgICAgICBub2RlLmJsb2NrUGFyYW1zLmZvckVhY2goKHBhcmFtKSA9PiB7XG4gICAgICAgICAgc2NvcGVkVG9rZW5zLnB1c2gocGFyYW0pO1xuICAgICAgICB9KTtcbiAgICAgICAgYWRkVG9rZW5zKHRva2Vuc1NldCwgbm9kZSwgc2NvcGVkVG9rZW5zLCBvcHRpb25zKTtcbiAgICAgIH0sXG5cbiAgICAgIGV4aXQoeyBibG9ja1BhcmFtcyB9KSB7XG4gICAgICAgIGJsb2NrUGFyYW1zLmZvckVhY2goKCkgPT4ge1xuICAgICAgICAgIHNjb3BlZFRva2Vucy5wb3AoKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0sXG5cbiAgICBQYXRoRXhwcmVzc2lvbihub2RlKSB7XG4gICAgICBhZGRUb2tlbnModG9rZW5zU2V0LCBub2RlLCBzY29wZWRUb2tlbnMsIG9wdGlvbnMpO1xuICAgIH0sXG4gIH0pO1xuXG4gIGxldCB0b2tlbnM6IHN0cmluZ1tdID0gW107XG5cbiAgdG9rZW5zU2V0LmZvckVhY2goKHMpID0+IHRva2Vucy5wdXNoKHMpKTtcblxuICBpZiAoIW9wdGlvbnM/LmluY2x1ZGVLZXl3b3Jkcykge1xuICAgIHRva2VucyA9IHRva2Vucy5maWx0ZXIoKHRva2VuKSA9PiAhaXNLZXl3b3JkKHRva2VuKSk7XG4gIH1cblxuICByZXR1cm4gdG9rZW5zO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==