1 | ;
|
2 |
|
3 | Object.defineProperty(exports, "__esModule", {
|
4 | value: true
|
5 | });
|
6 | exports.getTemplateLocals = getTemplateLocals;
|
7 |
|
8 | var _keywords = require("./keywords");
|
9 |
|
10 | var _tokenizerEventHandlers = require("./parser/tokenizer-event-handlers");
|
11 |
|
12 | var _traverse = _interopRequireDefault(require("./traversal/traverse"));
|
13 |
|
14 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
15 |
|
16 | /**
|
17 | * Gets the correct Token from the Node based on it's type
|
18 | */
|
19 | function tokensFromType(node, scopedTokens, options) {
|
20 | if (node.type === 'PathExpression') {
|
21 | if (node.head.type === 'AtHead' || node.head.type === 'ThisHead') {
|
22 | return;
|
23 | }
|
24 |
|
25 | var possbleToken = node.head.name;
|
26 |
|
27 | if (scopedTokens.indexOf(possbleToken) === -1) {
|
28 | return possbleToken;
|
29 | }
|
30 | } else if (node.type === 'ElementNode') {
|
31 | var tag = node.tag;
|
32 |
|
33 | var _char = tag.charAt(0);
|
34 |
|
35 | if (_char === ':' || _char === '@') {
|
36 | return;
|
37 | }
|
38 |
|
39 | if (!options.includeHtmlElements && tag.indexOf('.') === -1 && tag.toLowerCase() === tag) {
|
40 | return;
|
41 | }
|
42 |
|
43 | if (tag.substr(0, 5) === 'this.') {
|
44 | return;
|
45 | }
|
46 |
|
47 | if (scopedTokens.indexOf(tag) !== -1) {
|
48 | return;
|
49 | }
|
50 |
|
51 | return tag;
|
52 | }
|
53 | }
|
54 | /**
|
55 | * Adds tokens to the tokensSet based on their node.type
|
56 | */
|
57 |
|
58 |
|
59 | function addTokens(tokensSet, node, scopedTokens, options) {
|
60 | var maybeTokens = tokensFromType(node, scopedTokens, options);
|
61 | (Array.isArray(maybeTokens) ? maybeTokens : [maybeTokens]).forEach(function (maybeToken) {
|
62 | if (maybeToken !== undefined && maybeToken[0] !== '@') {
|
63 | tokensSet.add(maybeToken.split('.')[0]);
|
64 | }
|
65 | });
|
66 | }
|
67 | /**
|
68 | * Parses and traverses a given handlebars html template to extract all template locals
|
69 | * referenced that could possible come from the praent scope. Can exclude known keywords
|
70 | * optionally.
|
71 | */
|
72 |
|
73 |
|
74 | function getTemplateLocals(html, options) {
|
75 | if (options === void 0) {
|
76 | options = {
|
77 | includeHtmlElements: false,
|
78 | includeKeywords: false
|
79 | };
|
80 | }
|
81 |
|
82 | var ast = (0, _tokenizerEventHandlers.preprocess)(html);
|
83 | var tokensSet = new Set();
|
84 | var scopedTokens = [];
|
85 | (0, _traverse.default)(ast, {
|
86 | Block: {
|
87 | enter: function enter(_ref) {
|
88 | var blockParams = _ref.blockParams;
|
89 | blockParams.forEach(function (param) {
|
90 | scopedTokens.push(param);
|
91 | });
|
92 | },
|
93 | exit: function exit(_ref2) {
|
94 | var blockParams = _ref2.blockParams;
|
95 | blockParams.forEach(function () {
|
96 | scopedTokens.pop();
|
97 | });
|
98 | }
|
99 | },
|
100 | ElementNode: {
|
101 | enter: function enter(node) {
|
102 | node.blockParams.forEach(function (param) {
|
103 | scopedTokens.push(param);
|
104 | });
|
105 | addTokens(tokensSet, node, scopedTokens, options);
|
106 | },
|
107 | exit: function exit(_ref3) {
|
108 | var blockParams = _ref3.blockParams;
|
109 | blockParams.forEach(function () {
|
110 | scopedTokens.pop();
|
111 | });
|
112 | }
|
113 | },
|
114 | PathExpression: function PathExpression(node) {
|
115 | addTokens(tokensSet, node, scopedTokens, options);
|
116 | }
|
117 | });
|
118 | var tokens = [];
|
119 | tokensSet.forEach(function (s) {
|
120 | return tokens.push(s);
|
121 | });
|
122 |
|
123 | if (!(options === null || options === void 0 ? void 0 : options.includeKeywords)) {
|
124 | tokens = tokens.filter(function (token) {
|
125 | return !(0, _keywords.isKeyword)(token);
|
126 | });
|
127 | }
|
128 |
|
129 | return tokens;
|
130 | }
|
131 | //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvZ2V0LXRlbXBsYXRlLWxvY2Fscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7QUFRQTs7O0FBR0EsU0FBQSxjQUFBLENBQUEsSUFBQSxFQUFBLFlBQUEsRUFBQSxPQUFBLEVBR21DO0FBRWpDLE1BQUksSUFBSSxDQUFKLElBQUEsS0FBSixnQkFBQSxFQUFvQztBQUNsQyxRQUFJLElBQUksQ0FBSixJQUFBLENBQUEsSUFBQSxLQUFBLFFBQUEsSUFBK0IsSUFBSSxDQUFKLElBQUEsQ0FBQSxJQUFBLEtBQW5DLFVBQUEsRUFBa0U7QUFDaEU7QUFDRDs7QUFFRCxRQUFNLFlBQVksR0FBRyxJQUFJLENBQUosSUFBQSxDQUFyQixJQUFBOztBQUVBLFFBQUksWUFBWSxDQUFaLE9BQUEsQ0FBQSxZQUFBLE1BQXVDLENBQTNDLENBQUEsRUFBK0M7QUFDN0MsYUFBQSxZQUFBO0FBQ0Q7QUFUSCxHQUFBLE1BVU8sSUFBSSxJQUFJLENBQUosSUFBQSxLQUFKLGFBQUEsRUFBaUM7QUFBQSxRQUM5QixHQUQ4QixHQUN0QyxJQURzQyxDQUFBLEdBQUE7O0FBR3RDLFFBQU0sS0FBSSxHQUFHLEdBQUcsQ0FBSCxNQUFBLENBQWIsQ0FBYSxDQUFiOztBQUVBLFFBQUksS0FBSSxLQUFKLEdBQUEsSUFBZ0IsS0FBSSxLQUF4QixHQUFBLEVBQWtDO0FBQ2hDO0FBQ0Q7O0FBRUQsUUFBSSxDQUFDLE9BQU8sQ0FBUixtQkFBQSxJQUFnQyxHQUFHLENBQUgsT0FBQSxDQUFBLEdBQUEsTUFBcUIsQ0FBckQsQ0FBQSxJQUEyRCxHQUFHLENBQUgsV0FBQSxPQUEvRCxHQUFBLEVBQTBGO0FBQ3hGO0FBQ0Q7O0FBRUQsUUFBSSxHQUFHLENBQUgsTUFBQSxDQUFBLENBQUEsRUFBQSxDQUFBLE1BQUosT0FBQSxFQUFrQztBQUNoQztBQUNEOztBQUVELFFBQUksWUFBWSxD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QSxNQUFJLEVBQUMsT0FBTyxLQUFQLElBQUEsSUFBQSxPQUFPLEtBQUEsS0FBUCxDQUFBLEdBQU8sS0FBUCxDQUFBLEdBQUEsT0FBTyxDQUFaLGVBQUksQ0FBSixFQUErQjtBQUM3QixJQUFBLE1BQU0sR0FBRyxNQUFNLENBQU4sTUFBQSxDQUFlLFVBQUQsS0FBQyxFQUFEO0FBQUEsYUFBVyxDQUFDLHlCQUFuQyxLQUFtQyxDQUFaO0FBQXZCLEtBQVMsQ0FBVDtBQUNEOztBQUVELFNBQUEsTUFBQTtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNLZXl3b3JkIH0gZnJvbSAnLi9rZXl3b3Jkcyc7XG5pbXBvcnQgeyBwcmVwcm9jZXNzIH0gZnJvbSAnLi9wYXJzZXIvdG9rZW5pemVyLWV2ZW50LWhhbmRsZXJzJztcbmltcG9ydCB0cmF2ZXJzZSBmcm9tICcuL3RyYXZlcnNhbC90cmF2ZXJzZSc7XG5pbXBvcnQgKiBhcyBBU1R2MSBmcm9tICcuL3YxL2FwaSc7XG5cbmludGVyZmFjZSBHZXRUZW1wbGF0ZUxvY2Fsc09wdGlvbnMge1xuICBpbmNsdWRlS2V5d29yZHM/OiBib29sZWFuO1xuICBpbmNsdWRlSHRtbEVsZW1lbnRzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjb3JyZWN0IFRva2VuIGZyb20gdGhlIE5vZGUgYmFzZWQgb24gaXQncyB0eXBlXG4gKi9cbmZ1bmN0aW9uIHRva2Vuc0Zyb21UeXBlKFxuICBub2RlOiBBU1R2MS5Ob2RlLFxuICBzY29wZWRUb2tlbnM6IHN0cmluZ1tdLFxuICBvcHRpb25zOiBHZXRUZW1wbGF0ZUxvY2Fsc09wdGlvbnNcbik6IHN0cmluZyB8IHZvaWQge1xuICBpZiAobm9kZS50eXBlID09PSAnUGF0aEV4cHJlc3Npb24nKSB7XG4gICAgaWYgKG5vZGUuaGVhZC50eXBlID09PSAnQXRIZWFkJyB8fCBub2RlLmhlYWQudHlwZSA9PT0gJ1RoaXNIZWFkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBvc3NibGVUb2tlbiA9IG5vZGUuaGVhZC5uYW1lO1xuXG4gICAgaWYgKHNjb3BlZFRva2Vucy5pbmRleE9mKHBvc3NibGVUb2tlbikgPT09IC0xKSB7XG4gICAgICByZXR1cm4gcG9zc2JsZVRva2VuO1xuICAgIH1cbiAgfSBlbHNlIGlmIChub2RlLnR5cGUgPT09ICdFbGVtZW50Tm9kZScpIHtcbiAgICBjb25zdCB7IHRhZyB9ID0gbm9kZTtcblxuICAgIGNvbnN0IGNoYXIgPSB0YWcuY2hhckF0KDApO1xuXG4gICAgaWYgKGNoYXIgPT09ICc6JyB8fCBjaGFyID09PSAnQCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIW9wdGlvbnMuaW5jbHVkZUh0bWxFbGVtZW50cyAmJiB0YWcuaW5kZXhPZignLicpID09PSAtMSAmJiB0YWcudG9Mb3dlckNhc2UoKSA9PT0gdGFnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRhZy5zdWJzdHIoMCwgNSkgPT09ICd0aGlzLicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2NvcGVkVG9rZW5zLmluZGV4T2YodGFnKSAhPT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGFnO1xuICB9XG59XG5cbi8qKlxuICogQWRkcyB0b2tlbnMgdG8gdGhlIHRva2Vuc1NldCBiYXNlZCBvbiB0aGVpciBub2RlLnR5cGVcbiAqL1xuZnVuY3Rpb24gYWRkVG9rZW5zKFxuICB0b2tlbnNTZXQ6IFNldDxzdHJpbmc+LFxuICBub2RlOiBBU1R2MS5Ob2RlLFxuICBzY29wZWRUb2tlbnM6IHN0cmluZ1tdLFxuICBvcHRpb25zOiBHZXRUZW1wbGF0ZUxvY2Fsc09wdGlvbnNcbikge1xuICBjb25zdCBtYXliZVRva2VucyA9IHRva2Vuc0Zyb21UeXBlKG5vZGUsIHNjb3BlZFRva2Vucywgb3B0aW9ucyk7XG5cbiAgKEFycmF5LmlzQXJyYXkobWF5YmVUb2tlbnMpID8gbWF5YmVUb2tlbnMgOiBbbWF5YmVUb2tlbnNdKS5mb3JFYWNoKChtYXliZVRva2VuKSA9PiB7XG4gICAgaWYgKG1heWJlVG9rZW4gIT09IHVuZGVmaW5lZCAmJiBtYXliZVRva2VuWzBdICE9PSAnQCcpIHtcbiAgICAgIHRva2Vuc1NldC5hZGQobWF5YmVUb2tlbi5zcGxpdCgnLicpWzBdKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhbmQgdHJhdmVyc2VzIGEgZ2l2ZW4gaGFuZGxlYmFycyBodG1sIHRlbXBsYXRlIHRvIGV4dHJhY3QgYWxsIHRlbXBsYXRlIGxvY2Fsc1xuICogcmVmZXJlbmNlZCB0aGF0IGNvdWxkIHBvc3NpYmxlIGNvbWUgZnJvbSB0aGUgcHJhZW50IHNjb3BlLiBDYW4gZXhjbHVkZSBrbm93biBrZXl3b3Jkc1xuICogb3B0aW9uYWxseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbXBsYXRlTG9jYWxzKFxuICBodG1sOiBzdHJpbmcsXG4gIG9wdGlvbnM6IEdldFRlbXBsYXRlTG9jYWxzT3B0aW9ucyA9IHtcbiAgICBpbmNsdWRlSHRtbEVsZW1lbnRzOiBmYWxzZSxcbiAgICBpbmNsdWRlS2V5d29yZHM6IGZhbHNlLFxuICB9XG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGFzdCA9IHByZXByb2Nlc3MoaHRtbCk7XG4gIGNvbnN0IHRva2Vuc1NldCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBzY29wZWRUb2tlbnM6IHN0cmluZ1tdID0gW107XG5cbiAgdHJhdmVyc2UoYXN0LCB7XG4gICAgQmxvY2s6IHtcbiAgICAgIGVudGVyKHsgYmxvY2tQYXJhbXMgfSkge1xuICAgICAgICBibG9ja1BhcmFtcy5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICAgIHNjb3BlZFRva2Vucy5wdXNoKHBhcmFtKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICBleGl0KHsgYmxvY2tQYXJhbXMgfSkge1xuICAgICAgICBibG9ja1BhcmFtcy5mb3JFYWNoKCgpID0+IHtcbiAgICAgICAgICBzY29wZWRUb2tlbnMucG9wKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9LFxuXG4gICAgRWxlbWVudE5vZGU6IHtcbiAgICAgIGVudGVyKG5vZGUpIHtcbiAgICAgICAgbm9kZS5ibG9ja1BhcmFtcy5mb3JFYWNoKChwYXJhbSkgPT4ge1xuICAgICAgICAgIHNjb3BlZFRva2Vucy5wdXNoKHBhcmFtKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGFkZFRva2Vucyh0b2tlbnNTZXQsIG5vZGUsIHNjb3BlZFRva2Vucywgb3B0aW9ucyk7XG4gICAgICB9LFxuXG4gICAgICBleGl0KHsgYmxvY2tQYXJhbXMgfSkge1xuICAgICAgICBibG9ja1BhcmFtcy5mb3JFYWNoKCgpID0+IHtcbiAgICAgICAgICBzY29wZWRUb2tlbnMucG9wKCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9LFxuXG4gICAgUGF0aEV4cHJlc3Npb24obm9kZSkge1xuICAgICAgYWRkVG9rZW5zKHRva2Vuc1NldCwgbm9kZSwgc2NvcGVkVG9rZW5zLCBvcHRpb25zKTtcbiAgICB9LFxuICB9KTtcblxuICBsZXQgdG9rZW5zOiBzdHJpbmdbXSA9IFtdO1xuXG4gIHRva2Vuc1NldC5mb3JFYWNoKChzKSA9PiB0b2tlbnMucHVzaChzKSk7XG5cbiAgaWYgKCFvcHRpb25zPy5pbmNsdWRlS2V5d29yZHMpIHtcbiAgICB0b2tlbnMgPSB0b2tlbnMuZmlsdGVyKCh0b2tlbikgPT4gIWlzS2V5d29yZCh0b2tlbikpO1xuICB9XG5cbiAgcmV0dXJuIHRva2Vucztcbn1cbiJdLCJzb3VyY2VSb290IjoiIn0= |
\ | No newline at end of file |