@glimmer/syntax
Version:
135 lines (113 loc) • 12.1 kB
JavaScript
;
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==