"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseElementBlockParams = parseElementBlockParams; exports.childrenFor = childrenFor; exports.appendChild = appendChild; exports.isHBSLiteral = isHBSLiteral; exports.printLiteral = printLiteral; exports.isUpperCase = isUpperCase; exports.isLowerCase = isLowerCase; var _syntaxError = require("./syntax-error"); // Regex to validate the identifier for block parameters. // Based on the ID validation regex in Handlebars. let ID_INVERSE_PATTERN = /[!"#%-,\.\/;->@\[-\^`\{-~]/; // Checks the element's attributes to see if it uses block params. // If it does, registers the block params with the program and // removes the corresponding attributes from the element. function parseElementBlockParams(element) { let params = parseBlockParams(element); if (params) element.blockParams = params; } function parseBlockParams(element) { let l = element.attributes.length; let attrNames = []; for (let i = 0; i < l; i++) { attrNames.push(element.attributes[i].name); } let asIndex = attrNames.indexOf('as'); if (asIndex === -1 && attrNames.length > 0 && attrNames[attrNames.length - 1].charAt(0) === '|') { throw (0, _syntaxError.generateSyntaxError)('Block parameters must be preceded by the `as` keyword, detected block parameters without `as`', element.loc); } if (asIndex !== -1 && l > asIndex && attrNames[asIndex + 1].charAt(0) === '|') { // Some basic validation, since we're doing the parsing ourselves let paramsString = attrNames.slice(asIndex).join(' '); if (paramsString.charAt(paramsString.length - 1) !== '|' || paramsString.match(/\|/g).length !== 2) { throw (0, _syntaxError.generateSyntaxError)("Invalid block parameters syntax, '" + paramsString + "'", element.loc); } let params = []; for (let i = asIndex + 1; i < l; i++) { let param = attrNames[i].replace(/\|/g, ''); if (param !== '') { if (ID_INVERSE_PATTERN.test(param)) { throw (0, _syntaxError.generateSyntaxError)("Invalid identifier for block parameters, '" + param + "'", element.loc); } params.push(param); } } if (params.length === 0) { throw (0, _syntaxError.generateSyntaxError)('Cannot use zero block parameters', element.loc); } element.attributes = element.attributes.slice(0, asIndex); return params; } return null; } function childrenFor(node) { switch (node.type) { case 'Block': case 'Template': return node.body; case 'ElementNode': return node.children; } } function appendChild(parent, node) { childrenFor(parent).push(node); } function isHBSLiteral(path) { return path.type === 'StringLiteral' || path.type === 'BooleanLiteral' || path.type === 'NumberLiteral' || path.type === 'NullLiteral' || path.type === 'UndefinedLiteral'; } function printLiteral(literal) { if (literal.type === 'UndefinedLiteral') { return 'undefined'; } else { return JSON.stringify(literal.value); } } function isUpperCase(tag) { return tag[0] === tag[0].toUpperCase() && tag[0] !== tag[0].toLowerCase(); } function isLowerCase(tag) { return tag[0] === tag[0].toLowerCase() && tag[0] !== tag[0].toUpperCase(); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUdBOztBQUlBO0FBQ0E7QUFFQSxJQUFJLGtCQUFrQixHQUF0Qiw0QkFBQSxDLENBRUE7QUFDQTtBQUNBOztBQUVNLFNBQUEsdUJBQUEsQ0FBQSxPQUFBLEVBQTREO0FBQ2hFLE1BQUksTUFBTSxHQUFHLGdCQUFnQixDQUE3QixPQUE2QixDQUE3QjtBQUNBLE1BQUEsTUFBQSxFQUFZLE9BQU8sQ0FBUCxXQUFBLEdBQUEsTUFBQTtBQUNiOztBQUVELFNBQUEsZ0JBQUEsQ0FBQSxPQUFBLEVBQW9EO0FBQ2xELE1BQUksQ0FBQyxHQUFHLE9BQU8sQ0FBUCxVQUFBLENBQVIsTUFBQTtBQUNBLE1BQUksU0FBUyxHQUFiLEVBQUE7O0FBRUEsT0FBSyxJQUFJLENBQUMsR0FBVixDQUFBLEVBQWdCLENBQUMsR0FBakIsQ0FBQSxFQUF1QixDQUF2QixFQUFBLEVBQTRCO0FBQzFCLElBQUEsU0FBUyxDQUFULElBQUEsQ0FBZSxPQUFPLENBQVAsVUFBQSxDQUFBLENBQUEsRUFBZixJQUFBO0FBQ0Q7O0FBRUQsTUFBSSxPQUFPLEdBQUcsU0FBUyxDQUFULE9BQUEsQ0FBZCxJQUFjLENBQWQ7O0FBRUEsTUFBSSxPQUFPLEtBQUssQ0FBWixDQUFBLElBQWtCLFNBQVMsQ0FBVCxNQUFBLEdBQWxCLENBQUEsSUFBMEMsU0FBUyxDQUFDLFNBQVMsQ0FBVCxNQUFBLEdBQVYsQ0FBUyxDQUFULENBQUEsTUFBQSxDQUFBLENBQUEsTUFBOUMsR0FBQSxFQUFpRztBQUMvRixVQUFNLHNDQUFtQiwrRkFBbkIsRUFFSixPQUFPLENBRlQsR0FBTSxDQUFOO0FBSUQ7O0FBRUQsTUFBSSxPQUFPLEtBQUssQ0FBWixDQUFBLElBQWtCLENBQUMsR0FBbkIsT0FBQSxJQUFpQyxTQUFTLENBQUMsT0FBTyxHQUFqQixDQUFTLENBQVQsQ0FB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RyxDQUFILENBQVgsV0FBVyxFQUFYLElBQW1DLEdBQUcsQ0FBSCxDQUFHLENBQUgsS0FBVyxHQUFHLENBQUgsQ0FBRyxDQUFILENBQXJELFdBQXFELEVBQXJEO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcHRpb24gfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGV4cGVjdCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVN5bnRheEVycm9yIH0gZnJvbSAnLi9zeW50YXgtZXJyb3InO1xuaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi92MS9hcGknO1xuaW1wb3J0ICogYXMgSEJTIGZyb20gJy4vdjEvaGFuZGxlYmFycy1hc3QnO1xuXG4vLyBSZWdleCB0byB2YWxpZGF0ZSB0aGUgaWRlbnRpZmllciBmb3IgYmxvY2sgcGFyYW1ldGVycy5cbi8vIEJhc2VkIG9uIHRoZSBJRCB2YWxpZGF0aW9uIHJlZ2V4IGluIEhhbmRsZWJhcnMuXG5cbmxldCBJRF9JTlZFUlNFX1BBVFRFUk4gPSAvWyFcIiMlLSxcXC5cXC87LT5AXFxbLVxcXmBcXHstfl0vO1xuXG4vLyBDaGVja3MgdGhlIGVsZW1lbnQncyBhdHRyaWJ1dGVzIHRvIHNlZSBpZiBpdCB1c2VzIGJsb2NrIHBhcmFtcy5cbi8vIElmIGl0IGRvZXMsIHJlZ2lzdGVycyB0aGUgYmxvY2sgcGFyYW1zIHdpdGggdGhlIHByb2dyYW0gYW5kXG4vLyByZW1vdmVzIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMgZnJvbSB0aGUgZWxlbWVudC5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRWxlbWVudEJsb2NrUGFyYW1zKGVsZW1lbnQ6IEFTVHYxLkVsZW1lbnROb2RlKTogdm9pZCB7XG4gIGxldCBwYXJhbXMgPSBwYXJzZUJsb2NrUGFyYW1zKGVsZW1lbnQpO1xuICBpZiAocGFyYW1zKSBlbGVtZW50LmJsb2NrUGFyYW1zID0gcGFyYW1zO1xufVxuXG5mdW5jdGlvbiBwYXJzZUJsb2NrUGFyYW1zKGVsZW1lbnQ6IEFTVHYxLkVsZW1lbnROb2RlKTogT3B0aW9uPHN0cmluZ1tdPiB7XG4gIGxldCBsID0gZWxlbWVudC5hdHRyaWJ1dGVzLmxlbmd0aDtcbiAgbGV0IGF0dHJOYW1lcyA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgYXR0ck5hbWVzLnB1c2goZWxlbWVudC5hdHRyaWJ1dGVzW2ldLm5hbWUpO1xuICB9XG5cbiAgbGV0IGFzSW5kZXggPSBhdHRyTmFtZXMuaW5kZXhPZignYXMnKTtcblxuICBpZiAoYXNJbmRleCA9PT0gLTEgJiYgYXR0ck5hbWVzLmxlbmd0aCA+IDAgJiYgYXR0ck5hbWVzW2F0dHJOYW1lcy5sZW5ndGggLSAxXS5jaGFyQXQoMCkgPT09ICd8Jykge1xuICAgIHRocm93IGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAnQmxvY2sgcGFyYW1ldGVycyBtdXN0IGJlIHByZWNlZGVkIGJ5IHRoZSBgYXNgIGtleXdvcmQsIGRldGVjdGVkIGJsb2NrIHBhcmFtZXRlcnMgd2l0aG91dCBgYXNgJyxcbiAgICAgIGVsZW1lbnQubG9jXG4gICAgKTtcbiAgfVxuXG4gIGlmIChhc0luZGV4ICE9PSAtMSAmJiBsID4gYXNJbmRleCAmJiBhdHRyTmFtZXNbYXNJbmRleCArIDFdLmNoYXJBdCgwKSA9PT0gJ3wnKSB7XG4gICAgLy8gU29tZSBiYXNpYyB2YWxpZGF0aW9uLCBzaW5jZSB3ZSdyZSBkb2luZyB0aGUgcGFyc2luZyBvdXJzZWx2ZXNcbiAgICBsZXQgcGFyYW1zU3RyaW5nID0gYXR0ck5hbWVzLnNsaWNlKGFzSW5kZXgpLmpvaW4oJyAnKTtcbiAgICBpZiAoXG4gICAgICBwYXJhbXNTdHJpbmcuY2hhckF0KHBhcmFtc1N0cmluZy5sZW5ndGggLSAxKSAhPT0gJ3wnIHx8XG4gICAgICBleHBlY3QocGFyYW1zU3RyaW5nLm1hdGNoKC9cXHwvZyksIGBibG9jayBwYXJhbXMgbXVzdCBleGlzdCBoZXJlYCkubGVuZ3RoICE9PSAyXG4gICAgKSB7XG4gICAgICB0aHJvdyBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICBcIkludmFsaWQgYmxvY2sgcGFyYW1ldGVycyBzeW50YXgsICdcIiArIHBhcmFtc1N0cmluZyArIFwiJ1wiLFxuICAgICAgICBlbGVtZW50LmxvY1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcGFyYW1zID0gW107XG4gICAgZm9yIChsZXQgaSA9IGFzSW5kZXggKyAxOyBpIDwgbDsgaSsrKSB7XG4gICAgICBsZXQgcGFyYW0gPSBhdHRyTmFtZXNbaV0ucmVwbGFjZSgvXFx8L2csICcnKTtcbiAgICAgIGlmIChwYXJhbSAhPT0gJycpIHtcbiAgICAgICAgaWYgKElEX0lOVkVSU0VfUEFUVEVSTi50ZXN0KHBhcmFtKSkge1xuICAgICAgICAgIHRocm93IGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBcIkludmFsaWQgaWRlbnRpZmllciBmb3IgYmxvY2sgcGFyYW1ldGVycywgJ1wiICsgcGFyYW0gKyBcIidcIixcbiAgICAgICAgICAgIGVsZW1lbnQubG9jXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJhbXMucHVzaChwYXJhbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IGdlbmVyYXRlU3ludGF4RXJyb3IoJ0Nhbm5vdCB1c2UgemVybyBibG9jayBwYXJhbWV0ZXJzJywgZWxlbWVudC5sb2MpO1xuICAgIH1cblxuICAgIGVsZW1lbnQuYXR0cmlidXRlcyA9IGVsZW1lbnQuYXR0cmlidXRlcy5zbGljZSgwLCBhc0luZGV4KTtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZHJlbkZvcihcbiAgbm9kZTogQVNUdjEuQmxvY2sgfCBBU1R2MS5UZW1wbGF0ZSB8IEFTVHYxLkVsZW1lbnROb2RlXG4pOiBBU1R2MS5Ub3BMZXZlbFN0YXRlbWVudFtdIHtcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlICdCbG9jayc6XG4gICAgY2FzZSAnVGVtcGxhdGUnOlxuICAgICAgcmV0dXJuIG5vZGUuYm9keTtcbiAgICBjYXNlICdFbGVtZW50Tm9kZSc6XG4gICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kQ2hpbGQoXG4gIHBhcmVudDogQVNUdjEuQmxvY2sgfCBBU1R2MS5UZW1wbGF0ZSB8IEFTVHYxLkVsZW1lbnROb2RlLFxuICBub2RlOiBBU1R2MS5TdGF0ZW1lbnRcbik6IHZvaWQge1xuICBjaGlsZHJlbkZvcihwYXJlbnQpLnB1c2gobm9kZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hCU0xpdGVyYWwocGF0aDogSEJTLkV4cHJlc3Npb24pOiBwYXRoIGlzIEhCUy5MaXRlcmFsO1xuZXhwb3J0IGZ1bmN0aW9uIGlzSEJTTGl0ZXJhbChwYXRoOiBBU1R2MS5FeHByZXNzaW9uKTogcGF0aCBpcyBBU1R2MS5MaXRlcmFsO1xuZXhwb3J0IGZ1bmN0aW9uIGlzSEJTTGl0ZXJhbChcbiAgcGF0aDogSEJTLkV4cHJlc3Npb24gfCBBU1R2MS5FeHByZXNzaW9uXG4pOiBwYXRoIGlzIEhCUy5MaXRlcmFsIHwgQVNUdjEuTGl0ZXJhbCB7XG4gIHJldHVybiAoXG4gICAgcGF0aC50eXBlID09PSAnU3RyaW5nTGl0ZXJhbCcgfHxcbiAgICBwYXRoLnR5cGUgPT09ICdCb29sZWFuTGl0ZXJhbCcgfHxcbiAgICBwYXRoLnR5cGUgPT09ICdOdW1iZXJMaXRlcmFsJyB8fFxuICAgIHBhdGgudHlwZSA9PT0gJ051bGxMaXRlcmFsJyB8fFxuICAgIHBhdGgudHlwZSA9PT0gJ1VuZGVmaW5lZExpdGVyYWwnXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludExpdGVyYWwobGl0ZXJhbDogQVNUdjEuTGl0ZXJhbCk6IHN0cmluZyB7XG4gIGlmIChsaXRlcmFsLnR5cGUgPT09ICdVbmRlZmluZWRMaXRlcmFsJykge1xuICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobGl0ZXJhbC52YWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVXBwZXJDYXNlKHRhZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0YWdbMF0gPT09IHRhZ1swXS50b1VwcGVyQ2FzZSgpICYmIHRhZ1swXSAhPT0gdGFnWzBdLnRvTG93ZXJDYXNlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvd2VyQ2FzZSh0YWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdGFnWzBdID09PSB0YWdbMF0udG9Mb3dlckNhc2UoKSAmJiB0YWdbMF0gIT09IHRhZ1swXS50b1VwcGVyQ2FzZSgpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==