UNPKG

12.3 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.parseElementBlockParams = parseElementBlockParams;
7exports.childrenFor = childrenFor;
8exports.appendChild = appendChild;
9exports.isHBSLiteral = isHBSLiteral;
10exports.printLiteral = printLiteral;
11exports.isUpperCase = isUpperCase;
12exports.isLowerCase = isLowerCase;
13
14var _syntaxError = require("./syntax-error");
15
16// Regex to validate the identifier for block parameters.
17// Based on the ID validation regex in Handlebars.
18var ID_INVERSE_PATTERN = /[!"#%-,\.\/;->@\[-\^`\{-~]/; // Checks the element's attributes to see if it uses block params.
19// If it does, registers the block params with the program and
20// removes the corresponding attributes from the element.
21
22function parseElementBlockParams(element) {
23 var params = parseBlockParams(element);
24 if (params) element.blockParams = params;
25}
26
27function parseBlockParams(element) {
28 var l = element.attributes.length;
29 var attrNames = [];
30
31 for (var i = 0; i < l; i++) {
32 attrNames.push(element.attributes[i].name);
33 }
34
35 var asIndex = attrNames.indexOf('as');
36
37 if (asIndex === -1 && attrNames.length > 0 && attrNames[attrNames.length - 1].charAt(0) === '|') {
38 throw (0, _syntaxError.generateSyntaxError)('Block parameters must be preceded by the `as` keyword, detected block parameters without `as`', element.loc);
39 }
40
41 if (asIndex !== -1 && l > asIndex && attrNames[asIndex + 1].charAt(0) === '|') {
42 // Some basic validation, since we're doing the parsing ourselves
43 var paramsString = attrNames.slice(asIndex).join(' ');
44
45 if (paramsString.charAt(paramsString.length - 1) !== '|' || paramsString.match(/\|/g).length !== 2) {
46 throw (0, _syntaxError.generateSyntaxError)("Invalid block parameters syntax, '" + paramsString + "'", element.loc);
47 }
48
49 var params = [];
50
51 for (var _i = asIndex + 1; _i < l; _i++) {
52 var param = attrNames[_i].replace(/\|/g, '');
53
54 if (param !== '') {
55 if (ID_INVERSE_PATTERN.test(param)) {
56 throw (0, _syntaxError.generateSyntaxError)("Invalid identifier for block parameters, '" + param + "'", element.loc);
57 }
58
59 params.push(param);
60 }
61 }
62
63 if (params.length === 0) {
64 throw (0, _syntaxError.generateSyntaxError)('Cannot use zero block parameters', element.loc);
65 }
66
67 element.attributes = element.attributes.slice(0, asIndex);
68 return params;
69 }
70
71 return null;
72}
73
74function childrenFor(node) {
75 switch (node.type) {
76 case 'Block':
77 case 'Template':
78 return node.body;
79
80 case 'ElementNode':
81 return node.children;
82 }
83}
84
85function appendChild(parent, node) {
86 childrenFor(parent).push(node);
87}
88
89function isHBSLiteral(path) {
90 return path.type === 'StringLiteral' || path.type === 'BooleanLiteral' || path.type === 'NumberLiteral' || path.type === 'NullLiteral' || path.type === 'UndefinedLiteral';
91}
92
93function printLiteral(literal) {
94 if (literal.type === 'UndefinedLiteral') {
95 return 'undefined';
96 } else {
97 return JSON.stringify(literal.value);
98 }
99}
100
101function isUpperCase(tag) {
102 return tag[0] === tag[0].toUpperCase() && tag[0] !== tag[0].toLowerCase();
103}
104
105function isLowerCase(tag) {
106 return tag[0] === tag[0].toLowerCase() && tag[0] !== tag[0].toUpperCase();
107}
108//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUdBOztBQUlBO0FBQ0E7QUFFQSxJQUFJLGtCQUFrQixHQUF0Qiw0QkFBQSxDLENBRUE7QUFDQTtBQUNBOztBQUVNLFNBQUEsdUJBQUEsQ0FBQSxPQUFBLEVBQTREO0FBQ2hFLE1BQUksTUFBTSxHQUFHLGdCQUFnQixDQUE3QixPQUE2QixDQUE3QjtBQUNBLE1BQUEsTUFBQSxFQUFZLE9BQU8sQ0FBUCxXQUFBLEdBQUEsTUFBQTtBQUNiOztBQUVELFNBQUEsZ0JBQUEsQ0FBQSxPQUFBLEVBQW9EO0FBQ2xELE1BQUksQ0FBQyxHQUFHLE9BQU8sQ0FBUCxVQUFBLENBQVIsTUFBQTtBQUNBLE1BQUksU0FBUyxHQUFiLEVBQUE7O0FBRUEsT0FBSyxJQUFJLENBQUMsR0FBVixDQUFBLEVBQWdCLENBQUMsR0FBakIsQ0FBQSxFQUF1QixDQUF2QixFQUFBLEVBQTRCO0FBQzFCLElBQUEsU0FBUyxDQUFULElBQUEsQ0FBZSxPQUFPLENBQVAsVUFBQSxDQUFBLENBQUEsRUFBZixJQUFBO0FBQ0Q7O0FBRUQsTUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFULE9BQUEsQ0FBZCxJQUFjLENBQWQ7O0FBRUEsTUFBSSxPQUFPLEtBQUssQ0FBWixDQUFBLElBQWtCLFNBQVMsQ0FBVCxNQUFBLEdBQWxCLENBQUEsSUFBMEMsU0FBUyxDQUFDLFNBQVMsQ0FBVCxNQUFBLEdBQVYsQ0FBUyxDQUFULENBQUEsTUFBQSxDQUFBLENBQUEsTUFBOUMsR0FBQSxFQUFpRztBQUMvRixVQUFNLHNDQUFtQiwrRkFBbkIsRUFFSixPQUFPLENBRlQsR0FBTSxDQUFOO0FBSUQ7O0FBRUQsTUFBSSxPQUFPLEtBQUssQ0FBWixDQUFBLElBQWtCLENBQUMsR0FBbkIsT0FBQSxJQUFpQyxTQUFTLENBQUMsT0FBTyxHQUFqQixDQUFTLENBQVQsQ0FB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RyxDQUFILENBQVgsV0FBVyxFQUFYLElBQW1DLEdBQUcsQ0FBSCxDQUFHLENBQUgsS0FBVyxHQUFHLENBQUgsQ0FBRyxDQUFILENBQXJELFdBQXFELEVBQXJEO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcHRpb24gfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGV4cGVjdCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVN5bnRheEVycm9yIH0gZnJvbSAnLi9zeW50YXgtZXJyb3InO1xuaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi92MS9hcGknO1xuaW1wb3J0ICogYXMgSEJTIGZyb20gJy4vdjEvaGFuZGxlYmFycy1hc3QnO1xuXG4vLyBSZWdleCB0byB2YWxpZGF0ZSB0aGUgaWRlbnRpZmllciBmb3IgYmxvY2sgcGFyYW1ldGVycy5cbi8vIEJhc2VkIG9uIHRoZSBJRCB2YWxpZGF0aW9uIHJlZ2V4IGluIEhhbmRsZWJhcnMuXG5cbmxldCBJRF9JTlZFUlNFX1BBVFRFUk4gPSAvWyFcIiMlLSxcXC5cXC87LT5AXFxbLVxcXmBcXHstfl0vO1xuXG4vLyBDaGVja3MgdGhlIGVsZW1lbnQncyBhdHRyaWJ1dGVzIHRvIHNlZSBpZiBpdCB1c2VzIGJsb2NrIHBhcmFtcy5cbi8vIElmIGl0IGRvZXMsIHJlZ2lzdGVycyB0aGUgYmxvY2sgcGFyYW1zIHdpdGggdGhlIHByb2dyYW0gYW5kXG4vLyByZW1vdmVzIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMgZnJvbSB0aGUgZWxlbWVudC5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRWxlbWVudEJsb2NrUGFyYW1zKGVsZW1lbnQ6IEFTVHYxLkVsZW1lbnROb2RlKTogdm9pZCB7XG4gIGxldCBwYXJhbXMgPSBwYXJzZUJsb2NrUGFyYW1zKGVsZW1lbnQpO1xuICBpZiAocGFyYW1zKSBlbGVtZW50LmJsb2NrUGFyYW1zID0gcGFyYW1zO1xufVxuXG5mdW5jdGlvbiBwYXJzZUJsb2NrUGFyYW1zKGVsZW1lbnQ6IEFTVHYxLkVsZW1lbnROb2RlKTogT3B0aW9uPHN0cmluZ1tdPiB7XG4gIGxldCBsID0gZWxlbWVudC5hdHRyaWJ1dGVzLmxlbmd0aDtcbiAgbGV0IGF0dHJOYW1lcyA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgYXR0ck5hbWVzLnB1c2goZWxlbWVudC5hdHRyaWJ1dGVzW2ldLm5hbWUpO1xuICB9XG5cbiAgbGV0IGFzSW5kZXggPSBhdHRyTmFtZXMuaW5kZXhPZignYXMnKTtcblxuICBpZiAoYXNJbmRleCA9PT0gLTEgJiYgYXR0ck5hbWVzLmxlbmd0aCA+IDAgJiYgYXR0ck5hbWVzW2F0dHJOYW1lcy5sZW5ndGggLSAxXS5jaGFyQXQoMCkgPT09ICd8Jykge1xuICAgIHRocm93IGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAnQmxvY2sgcGFyYW1ldGVycyBtdXN0IGJlIHByZWNlZGVkIGJ5IHRoZSBgYXNgIGtleXdvcmQsIGRldGVjdGVkIGJsb2NrIHBhcmFtZXRlcnMgd2l0aG91dCBgYXNgJyxcbiAgICAgIGVsZW1lbnQubG9jXG4gICAgKTtcbiAgfVxuXG4gIGlmIChhc0luZGV4ICE9PSAtMSAmJiBsID4gYXNJbmRleCAmJiBhdHRyTmFtZXNbYXNJbmRleCArIDFdLmNoYXJBdCgwKSA9PT0gJ3wnKSB7XG4gICAgLy8gU29tZSBiYXNpYyB2YWxpZGF0aW9uLCBzaW5jZSB3ZSdyZSBkb2luZyB0aGUgcGFyc2luZyBvdXJzZWx2ZXNcbiAgICBsZXQgcGFyYW1zU3RyaW5nID0gYXR0ck5hbWVzLnNsaWNlKGFzSW5kZXgpLmpvaW4oJyAnKTtcbiAgICBpZiAoXG4gICAgICBwYXJhbXNTdHJpbmcuY2hhckF0KHBhcmFtc1N0cmluZy5sZW5ndGggLSAxKSAhPT0gJ3wnIHx8XG4gICAgICBleHBlY3QocGFyYW1zU3RyaW5nLm1hdGNoKC9cXHwvZyksIGBibG9jayBwYXJhbXMgbXVzdCBleGlzdCBoZXJlYCkubGVuZ3RoICE9PSAyXG4gICAgKSB7XG4gICAgICB0aHJvdyBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICBcIkludmFsaWQgYmxvY2sgcGFyYW1ldGVycyBzeW50YXgsICdcIiArIHBhcmFtc1N0cmluZyArIFwiJ1wiLFxuICAgICAgICBlbGVtZW50LmxvY1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcGFyYW1zID0gW107XG4gICAgZm9yIChsZXQgaSA9IGFzSW5kZXggKyAxOyBpIDwgbDsgaSsrKSB7XG4gICAgICBsZXQgcGFyYW0gPSBhdHRyTmFtZXNbaV0ucmVwbGFjZSgvXFx8L2csICcnKTtcbiAgICAgIGlmIChwYXJhbSAhPT0gJycpIHtcbiAgICAgICAgaWYgKElEX0lOVkVSU0VfUEFUVEVSTi50ZXN0KHBhcmFtKSkge1xuICAgICAgICAgIHRocm93IGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBcIkludmFsaWQgaWRlbnRpZmllciBmb3IgYmxvY2sgcGFyYW1ldGVycywgJ1wiICsgcGFyYW0gKyBcIidcIixcbiAgICAgICAgICAgIGVsZW1lbnQubG9jXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJhbXMucHVzaChwYXJhbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IGdlbmVyYXRlU3ludGF4RXJyb3IoJ0Nhbm5vdCB1c2UgemVybyBibG9jayBwYXJhbWV0ZXJzJywgZWxlbWVudC5sb2MpO1xuICAgIH1cblxuICAgIGVsZW1lbnQuYXR0cmlidXRlcyA9IGVsZW1lbnQuYXR0cmlidXRlcy5zbGljZSgwLCBhc0luZGV4KTtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZHJlbkZvcihcbiAgbm9kZTogQVNUdjEuQmxvY2sgfCBBU1R2MS5UZW1wbGF0ZSB8IEFTVHYxLkVsZW1lbnROb2RlXG4pOiBBU1R2MS5Ub3BMZXZlbFN0YXRlbWVudFtdIHtcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlICdCbG9jayc6XG4gICAgY2FzZSAnVGVtcGxhdGUnOlxuICAgICAgcmV0dXJuIG5vZGUuYm9keTtcbiAgICBjYXNlICdFbGVtZW50Tm9kZSc6XG4gICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kQ2hpbGQoXG4gIHBhcmVudDogQVNUdjEuQmxvY2sgfCBBU1R2MS5UZW1wbGF0ZSB8IEFTVHYxLkVsZW1lbnROb2RlLFxuICBub2RlOiBBU1R2MS5TdGF0ZW1lbnRcbik6IHZvaWQge1xuICBjaGlsZHJlbkZvcihwYXJlbnQpLnB1c2gobm9kZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hCU0xpdGVyYWwocGF0aDogSEJTLkV4cHJlc3Npb24pOiBwYXRoIGlzIEhCUy5MaXRlcmFsO1xuZXhwb3J0IGZ1bmN0aW9uIGlzSEJTTGl0ZXJhbChwYXRoOiBBU1R2MS5FeHByZXNzaW9uKTogcGF0aCBpcyBBU1R2MS5MaXRlcmFsO1xuZXhwb3J0IGZ1bmN0aW9uIGlzSEJTTGl0ZXJhbChcbiAgcGF0aDogSEJTLkV4cHJlc3Npb24gfCBBU1R2MS5FeHByZXNzaW9uXG4pOiBwYXRoIGlzIEhCUy5MaXRlcmFsIHwgQVNUdjEuTGl0ZXJhbCB7XG4gIHJldHVybiAoXG4gICAgcGF0aC50eXBlID09PSAnU3RyaW5nTGl0ZXJhbCcgfHxcbiAgICBwYXRoLnR5cGUgPT09ICdCb29sZWFuTGl0ZXJhbCcgfHxcbiAgICBwYXRoLnR5cGUgPT09ICdOdW1iZXJMaXRlcmFsJyB8fFxuICAgIHBhdGgudHlwZSA9PT0gJ051bGxMaXRlcmFsJyB8fFxuICAgIHBhdGgudHlwZSA9PT0gJ1VuZGVmaW5lZExpdGVyYWwnXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludExpdGVyYWwobGl0ZXJhbDogQVNUdjEuTGl0ZXJhbCk6IHN0cmluZyB7XG4gIGlmIChsaXRlcmFsLnR5cGUgPT09ICdVbmRlZmluZWRMaXRlcmFsJykge1xuICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobGl0ZXJhbC52YWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVXBwZXJDYXNlKHRhZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0YWdbMF0gPT09IHRhZ1swXS50b1VwcGVyQ2FzZSgpICYmIHRhZ1swXSAhPT0gdGFnWzBdLnRvTG93ZXJDYXNlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvd2VyQ2FzZSh0YWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdGFnWzBdID09PSB0YWdbMF0udG9Mb3dlckNhc2UoKSAmJiB0YWdbMF0gIT09IHRhZ1swXS50b1VwcGVyQ2FzZSgpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==
\No newline at end of file