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] !== '@') { 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 praent 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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QU8sQ0FBWixlQUFJLENBQUosRUFBK0I7QUFDN0IsSUFBQSxNQUFNLEdBQUcsTUFBTSxDQUFOLE1BQUEsQ0FBZSxVQUFBLEtBQUQ7QUFBQSxhQUFXLENBQUMsU0FBUyxDQUE1QyxLQUE0QyxDQUFyQjtBQUFBLEtBQWQsQ0FBVDtBQUNEOztBQUVELFNBQUEsTUFBQTtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNLZXl3b3JkIH0gZnJvbSAnLi9rZXl3b3Jkcyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzIH0gZnJvbSAnLi9wYXJzZXIvdG9rZW5pemVyLWV2ZW50LWhhbmRsZXJzJztcbmltcG9ydCB0cmF2ZXJzZSBmcm9tICcuL3RyYXZlcnNhbC90cmF2ZXJzZSc7XG5pbXBvcnQgKiBhcyBBU1R2MSBmcm9tICcuL3YxL2FwaSc7XG5cbmludGVyZmFjZSBHZXRUZW1wbGF0ZUxvY2Fsc09wdGlvbnMge1xuICBpbmNsdWRlS2V5d29yZHM/OiBib29sZWFuO1xuICBpbmNsdWRlSHRtbEVsZW1lbnRzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb3JyZWN0IFRva2VuIGZyb20gdGhlIE5vZGUgYmFzZWQgb24gaXQncyB0eXBlXG4gKi9cbmZ1bmN0aW9uIHRva2Vuc0Zyb21UeXBlKFxuICBub2RlOiBBU1R2MS5Ob2RlLFxuICBzY29wZWRUb2tlbnM6IHN0cmluZ1tdLFxuICBvcHRpb25zOiBHZXRUZW1wbGF0ZUxvY2Fsc09wdGlvbnNcbik6IHN0cmluZyB8IHZvaWQge1xuICBpZiAobm9kZS50eXBlID09PSAnUGF0aEV4cHJlc3Npb24nKSB7XG4gICAgaWYgKG5vZGUuaGVhZC50eXBlID09PSAnQXRIZWFkJyB8fCBub2RlLmhlYWQudHlwZSA9PT0gJ1RoaXNIZWFkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc3NibGVUb2tlbiA9IG5vZGUuaGVhZC5uYW1lO1xuXG4gICAgaWYgKHNjb3BlZFRva2Vucy5pbmRleE9mKHBvc3NibGVUb2tlbikgPT09IC0xKSB7XG4gICAgICByZXR1cm4gcG9zc2JsZVRva2VuO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdFbGVtZW50Tm9kZScpIHtcbiAgICBjb25zdCB7IHRhZyB9ID0gbm9kZTtcblxuICAgIGNvbnN0IGNoYXIgPSB0YWcuY2hhckF0KDApO1xuXG4gICAgaWYgKGNoYXIgPT09ICc6JyB8fCBjaGFyID09PSAnQCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuaW5jbHVkZUh0bWxFbGVtZW50cyAmJiB0YWcuaW5kZXhPZignLicpID09PSAtMSAmJiB0YWcudG9Mb3dlckNhc2UoKSA9PT0gdGFnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRhZy5zdWJzdHIoMCwgNSkgPT09ICd0aGlzLicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2NvcGVkVG9rZW5zLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFnO1xuICB9XG59XG5cbi8qKlxuICogQWRkcyB0b2tlbnMgdG8gdGhlIHRva2Vuc1NldCBiYXNlZCBvbiB0aGVpciBub2RlLnR5cGVcbiAqL1xuZnVuY3Rpb24gYWRkVG9rZW5zKFxuICB0b2tlbnNTZXQ6IFNldDxzdHJpbmc+LFxuICBub2RlOiBBU1R2MS5Ob2RlLFxuICBzY29wZWRUb2tlbnM6IHN0cmluZ1tdLFxuICBvcHRpb25zOiBHZXRUZW1wbGF0ZUxvY2Fsc09wdGlvbnNcbikge1xuICBjb25zdCBtYXliZVRva2VucyA9IHRva2Vuc0Zyb21UeXBlKG5vZGUsIHNjb3BlZFRva2Vucywgb3B0aW9ucyk7XG5cbiAgKEFycmF5LmlzQXJyYXkobWF5YmVUb2tlbnMpID8gbWF5YmVUb2tlbnMgOiBbbWF5YmVUb2tlbnNdKS5mb3JFYWNoKChtYXliZVRva2VuKSA9PiB7XG4gICAgaWYgKG1heWJlVG9rZW4gIT09IHVuZGVmaW5lZCAmJiBtYXliZVRva2VuWzBdICE9PSAnQCcpIHtcbiAgICAgIHRva2Vuc1NldC5hZGQobWF5YmVUb2tlbi5zcGxpdCgnLicpWzBdKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhbmQgdHJhdmVyc2VzIGEgZ2l2ZW4gaGFuZGxlYmFycyBodG1sIHRlbXBsYXRlIHRvIGV4dHJhY3QgYWxsIHRlbXBsYXRlIGxvY2Fsc1xuICogcmVmZXJlbmNlZCB0aGF0IGNvdWxkIHBvc3NpYmxlIGNvbWUgZnJvbSB0aGUgcHJhZW50IHNjb3BlLiBDYW4gZXhjbHVkZSBrbm93biBrZXl3b3Jkc1xuICogb3B0aW9uYWxseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbXBsYXRlTG9jYWxzKFxuICBodG1sOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEdldFRlbXBsYXRlTG9jYWxzT3B0aW9ucyA9IHtcbiAgICBpbmNsdWRlSHRtbEVsZW1lbnRzOiBmYWxzZSxcbiAgICBpbmNsdWRlS2V5d29yZHM6IGZhbHNlLFxuICB9XG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFzdCA9IHByZXByb2Nlc3MoaHRtbCk7XG4gIGNvbnN0IHRva2Vuc1NldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBzY29wZWRUb2tlbnM6IHN0cmluZ1tdID0gW107XG5cbiAgdHJhdmVyc2UoYXN0LCB7XG4gICAgQmxvY2s6IHtcbiAgICAgIGVudGVyKHsgYmxvY2tQYXJhbXMgfSkge1xuICAgICAgICBibG9ja1BhcmFtcy5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICAgIHNjb3BlZFRva2Vucy5wdXNoKHBhcmFtKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICBleGl0KHsgYmxvY2tQYXJhbXMgfSkge1xuICAgICAgICBibG9ja1BhcmFtcy5mb3JFYWNoKCgpID0+IHtcbiAgICAgICAgICBzY29wZWRUb2tlbnMucG9wKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9LFxuXG4gICAgRWxlbWVudE5vZGU6IHtcbiAgICAgIGVudGVyKG5vZGUpIHtcbiAgICAgICAgbm9kZS5ibG9ja1BhcmFtcy5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICAgIHNjb3BlZFRva2Vucy5wdXNoKHBhcmFtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGFkZFRva2Vucyh0b2tlbnNTZXQsIG5vZGUsIHNjb3BlZFRva2Vucywgb3B0aW9ucyk7XG4gICAgICB9LFxuXG4gICAgICBleGl0KHsgYmxvY2tQYXJhbXMgfSkge1xuICAgICAgICBibG9ja1BhcmFtcy5mb3JFYWNoKCgpID0+IHtcbiAgICAgICAgICBzY29wZWRUb2tlbnMucG9wKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9LFxuXG4gICAgUGF0aEV4cHJlc3Npb24obm9kZSkge1xuICAgICAgYWRkVG9rZW5zKHRva2Vuc1NldCwgbm9kZSwgc2NvcGVkVG9rZW5zLCBvcHRpb25zKTtcbiAgICB9LFxuICB9KTtcblxuICBsZXQgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHRva2Vuc1NldC5mb3JFYWNoKChzKSA9PiB0b2tlbnMucHVzaChzKSk7XG5cbiAgaWYgKCFvcHRpb25zPy5pbmNsdWRlS2V5d29yZHMpIHtcbiAgICB0b2tlbnMgPSB0b2tlbnMuZmlsdGVyKCh0b2tlbikgPT4gIWlzS2V5d29yZCh0b2tlbikpO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=