utils.js 12 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import { generateSyntaxError } from './syntax-error'; // Regex to validate the identifier for block parameters.
  2. // Based on the ID validation regex in Handlebars.
  3. var ID_INVERSE_PATTERN = /[!"#%-,\.\/;->@\[-\^`\{-~]/; // Checks the element's attributes to see if it uses block params.
  4. // If it does, registers the block params with the program and
  5. // removes the corresponding attributes from the element.
  6. export function parseElementBlockParams(element) {
  7. var params = parseBlockParams(element);
  8. if (params) element.blockParams = params;
  9. }
  10. function parseBlockParams(element) {
  11. var l = element.attributes.length;
  12. var attrNames = [];
  13. for (var i = 0; i < l; i++) {
  14. attrNames.push(element.attributes[i].name);
  15. }
  16. var asIndex = attrNames.indexOf('as');
  17. if (asIndex === -1 && attrNames.length > 0 && attrNames[attrNames.length - 1].charAt(0) === '|') {
  18. throw generateSyntaxError('Block parameters must be preceded by the `as` keyword, detected block parameters without `as`', element.loc);
  19. }
  20. if (asIndex !== -1 && l > asIndex && attrNames[asIndex + 1].charAt(0) === '|') {
  21. // Some basic validation, since we're doing the parsing ourselves
  22. var paramsString = attrNames.slice(asIndex).join(' ');
  23. if (paramsString.charAt(paramsString.length - 1) !== '|' || paramsString.match(/\|/g).length !== 2) {
  24. throw generateSyntaxError("Invalid block parameters syntax, '" + paramsString + "'", element.loc);
  25. }
  26. var params = [];
  27. for (var _i = asIndex + 1; _i < l; _i++) {
  28. var param = attrNames[_i].replace(/\|/g, '');
  29. if (param !== '') {
  30. if (ID_INVERSE_PATTERN.test(param)) {
  31. throw generateSyntaxError("Invalid identifier for block parameters, '" + param + "'", element.loc);
  32. }
  33. params.push(param);
  34. }
  35. }
  36. if (params.length === 0) {
  37. throw generateSyntaxError('Cannot use zero block parameters', element.loc);
  38. }
  39. element.attributes = element.attributes.slice(0, asIndex);
  40. return params;
  41. }
  42. return null;
  43. }
  44. export function childrenFor(node) {
  45. switch (node.type) {
  46. case 'Block':
  47. case 'Template':
  48. return node.body;
  49. case 'ElementNode':
  50. return node.children;
  51. }
  52. }
  53. export function appendChild(parent, node) {
  54. childrenFor(parent).push(node);
  55. }
  56. export function isHBSLiteral(path) {
  57. return path.type === 'StringLiteral' || path.type === 'BooleanLiteral' || path.type === 'NumberLiteral' || path.type === 'NullLiteral' || path.type === 'UndefinedLiteral';
  58. }
  59. export function printLiteral(literal) {
  60. if (literal.type === 'UndefinedLiteral') {
  61. return 'undefined';
  62. } else {
  63. return JSON.stringify(literal.value);
  64. }
  65. }
  66. export function isUpperCase(tag) {
  67. return tag[0] === tag[0].toUpperCase() && tag[0] !== tag[0].toLowerCase();
  68. }
  69. export function isLowerCase(tag) {
  70. return tag[0] === tag[0].toLowerCase() && tag[0] !== tag[0].toUpperCase();
  71. }
  72. //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3N5bnRheC9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsU0FBQSxtQkFBQSxRQUFBLGdCQUFBLEMsQ0FJQTtBQUNBOztBQUVBLElBQUksa0JBQWtCLEdBQXRCLDRCQUFBLEMsQ0FFQTtBQUNBO0FBQ0E7O0FBRUEsT0FBTSxTQUFBLHVCQUFBLENBQUEsT0FBQSxFQUE0RDtBQUNoRSxNQUFJLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBN0IsT0FBNkIsQ0FBN0I7QUFDQSxNQUFBLE1BQUEsRUFBWSxPQUFPLENBQVAsV0FBQSxHQUFBLE1BQUE7QUFDYjs7QUFFRCxTQUFBLGdCQUFBLENBQUEsT0FBQSxFQUFvRDtBQUNsRCxNQUFJLENBQUMsR0FBRyxPQUFPLENBQVAsVUFBQSxDQUFSLE1BQUE7QUFDQSxNQUFJLFNBQVMsR0FBYixFQUFBOztBQUVBLE9BQUssSUFBSSxDQUFDLEdBQVYsQ0FBQSxFQUFnQixDQUFDLEdBQWpCLENBQUEsRUFBdUIsQ0FBdkIsRUFBQSxFQUE0QjtBQUMxQixJQUFBLFNBQVMsQ0FBVCxJQUFBLENBQWUsT0FBTyxDQUFQLFVBQUEsQ0FBQSxDQUFBLEVBQWYsSUFBQTtBQUNEOztBQUVELE1BQUksT0FBTyxHQUFHLFNBQVMsQ0FBVCxPQUFBLENBQWQsSUFBYyxDQUFkOztBQUVBLE1BQUksT0FBTyxLQUFLLENBQVosQ0FBQSxJQUFrQixTQUFTLENBQVQsTUFBQSxHQUFsQixDQUFBLElBQTBDLFNBQVMsQ0FBQyxTQUFTLENBQVQsTUFBQSxHQUFWLENBQVMsQ0FBVCxDQUFBLE1BQUEsQ0FBQSxDQUFBLE1BQTlDLEdBQUEsRUFBaUc7QUFDL0YsVUFBTSxtQkFBbUIsQ0FBQSwrRkFBQSxFQUV2QixPQUFPLENBRlQsR0FBeUIsQ0FBekI7QUFJRDs7QUFFRCxNQUFJLE9BQU8sS0FBSyxDQUFaLENBQUEsSUFBa0IsQ0FBQyxHQUFuQixPQUFBLElBQWlDLFNBQVMsQ0FBQyxP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QSxXQUFBLENBQUEsR0FBQSxFQUFpQztBQUNyQyxTQUFPLEdBQUcsQ0FBSCxDQUFHLENBQUgsS0FBVyxHQUFHLENBQUgsQ0FBRyxDQUFILENBQVgsV0FBVyxFQUFYLElBQW1DLEdBQUcsQ0FBSCxDQUFHLENBQUgsS0FBVyxHQUFHLENBQUgsQ0FBRyxDQUFILENBQXJELFdBQXFELEVBQXJEO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPcHRpb24gfSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGV4cGVjdCB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuXG5pbXBvcnQgeyBnZW5lcmF0ZVN5bnRheEVycm9yIH0gZnJvbSAnLi9zeW50YXgtZXJyb3InO1xuaW1wb3J0ICogYXMgQVNUdjEgZnJvbSAnLi92MS9hcGknO1xuaW1wb3J0ICogYXMgSEJTIGZyb20gJy4vdjEvaGFuZGxlYmFycy1hc3QnO1xuXG4vLyBSZWdleCB0byB2YWxpZGF0ZSB0aGUgaWRlbnRpZmllciBmb3IgYmxvY2sgcGFyYW1ldGVycy5cbi8vIEJhc2VkIG9uIHRoZSBJRCB2YWxpZGF0aW9uIHJlZ2V4IGluIEhhbmRsZWJhcnMuXG5cbmxldCBJRF9JTlZFUlNFX1BBVFRFUk4gPSAvWyFcIiMlLSxcXC5cXC87LT5AXFxbLVxcXmBcXHstfl0vO1xuXG4vLyBDaGVja3MgdGhlIGVsZW1lbnQncyBhdHRyaWJ1dGVzIHRvIHNlZSBpZiBpdCB1c2VzIGJsb2NrIHBhcmFtcy5cbi8vIElmIGl0IGRvZXMsIHJlZ2lzdGVycyB0aGUgYmxvY2sgcGFyYW1zIHdpdGggdGhlIHByb2dyYW0gYW5kXG4vLyByZW1vdmVzIHRoZSBjb3JyZXNwb25kaW5nIGF0dHJpYnV0ZXMgZnJvbSB0aGUgZWxlbWVudC5cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRWxlbWVudEJsb2NrUGFyYW1zKGVsZW1lbnQ6IEFTVHYxLkVsZW1lbnROb2RlKTogdm9pZCB7XG4gIGxldCBwYXJhbXMgPSBwYXJzZUJsb2NrUGFyYW1zKGVsZW1lbnQpO1xuICBpZiAocGFyYW1zKSBlbGVtZW50LmJsb2NrUGFyYW1zID0gcGFyYW1zO1xufVxuXG5mdW5jdGlvbiBwYXJzZUJsb2NrUGFyYW1zKGVsZW1lbnQ6IEFTVHYxLkVsZW1lbnROb2RlKTogT3B0aW9uPHN0cmluZ1tdPiB7XG4gIGxldCBsID0gZWxlbWVudC5hdHRyaWJ1dGVzLmxlbmd0aDtcbiAgbGV0IGF0dHJOYW1lcyA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgYXR0ck5hbWVzLnB1c2goZWxlbWVudC5hdHRyaWJ1dGVzW2ldLm5hbWUpO1xuICB9XG5cbiAgbGV0IGFzSW5kZXggPSBhdHRyTmFtZXMuaW5kZXhPZignYXMnKTtcblxuICBpZiAoYXNJbmRleCA9PT0gLTEgJiYgYXR0ck5hbWVzLmxlbmd0aCA+IDAgJiYgYXR0ck5hbWVzW2F0dHJOYW1lcy5sZW5ndGggLSAxXS5jaGFyQXQoMCkgPT09ICd8Jykge1xuICAgIHRocm93IGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAnQmxvY2sgcGFyYW1ldGVycyBtdXN0IGJlIHByZWNlZGVkIGJ5IHRoZSBgYXNgIGtleXdvcmQsIGRldGVjdGVkIGJsb2NrIHBhcmFtZXRlcnMgd2l0aG91dCBgYXNgJyxcbiAgICAgIGVsZW1lbnQubG9jXG4gICAgKTtcbiAgfVxuXG4gIGlmIChhc0luZGV4ICE9PSAtMSAmJiBsID4gYXNJbmRleCAmJiBhdHRyTmFtZXNbYXNJbmRleCArIDFdLmNoYXJBdCgwKSA9PT0gJ3wnKSB7XG4gICAgLy8gU29tZSBiYXNpYyB2YWxpZGF0aW9uLCBzaW5jZSB3ZSdyZSBkb2luZyB0aGUgcGFyc2luZyBvdXJzZWx2ZXNcbiAgICBsZXQgcGFyYW1zU3RyaW5nID0gYXR0ck5hbWVzLnNsaWNlKGFzSW5kZXgpLmpvaW4oJyAnKTtcbiAgICBpZiAoXG4gICAgICBwYXJhbXNTdHJpbmcuY2hhckF0KHBhcmFtc1N0cmluZy5sZW5ndGggLSAxKSAhPT0gJ3wnIHx8XG4gICAgICBleHBlY3QocGFyYW1zU3RyaW5nLm1hdGNoKC9cXHwvZyksIGBibG9jayBwYXJhbXMgbXVzdCBleGlzdCBoZXJlYCkubGVuZ3RoICE9PSAyXG4gICAgKSB7XG4gICAgICB0aHJvdyBnZW5lcmF0ZVN5bnRheEVycm9yKFxuICAgICAgICBcIkludmFsaWQgYmxvY2sgcGFyYW1ldGVycyBzeW50YXgsICdcIiArIHBhcmFtc1N0cmluZyArIFwiJ1wiLFxuICAgICAgICBlbGVtZW50LmxvY1xuICAgICAgKTtcbiAgICB9XG5cbiAgICBsZXQgcGFyYW1zID0gW107XG4gICAgZm9yIChsZXQgaSA9IGFzSW5kZXggKyAxOyBpIDwgbDsgaSsrKSB7XG4gICAgICBsZXQgcGFyYW0gPSBhdHRyTmFtZXNbaV0ucmVwbGFjZSgvXFx8L2csICcnKTtcbiAgICAgIGlmIChwYXJhbSAhPT0gJycpIHtcbiAgICAgICAgaWYgKElEX0lOVkVSU0VfUEFUVEVSTi50ZXN0KHBhcmFtKSkge1xuICAgICAgICAgIHRocm93IGdlbmVyYXRlU3ludGF4RXJyb3IoXG4gICAgICAgICAgICBcIkludmFsaWQgaWRlbnRpZmllciBmb3IgYmxvY2sgcGFyYW1ldGVycywgJ1wiICsgcGFyYW0gKyBcIidcIixcbiAgICAgICAgICAgIGVsZW1lbnQubG9jXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBwYXJhbXMucHVzaChwYXJhbSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IGdlbmVyYXRlU3ludGF4RXJyb3IoJ0Nhbm5vdCB1c2UgemVybyBibG9jayBwYXJhbWV0ZXJzJywgZWxlbWVudC5sb2MpO1xuICAgIH1cblxuICAgIGVsZW1lbnQuYXR0cmlidXRlcyA9IGVsZW1lbnQuYXR0cmlidXRlcy5zbGljZSgwLCBhc0luZGV4KTtcbiAgICByZXR1cm4gcGFyYW1zO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGlsZHJlbkZvcihcbiAgbm9kZTogQVNUdjEuQmxvY2sgfCBBU1R2MS5UZW1wbGF0ZSB8IEFTVHYxLkVsZW1lbnROb2RlXG4pOiBBU1R2MS5Ub3BMZXZlbFN0YXRlbWVudFtdIHtcbiAgc3dpdGNoIChub2RlLnR5cGUpIHtcbiAgICBjYXNlICdCbG9jayc6XG4gICAgY2FzZSAnVGVtcGxhdGUnOlxuICAgICAgcmV0dXJuIG5vZGUuYm9keTtcbiAgICBjYXNlICdFbGVtZW50Tm9kZSc6XG4gICAgICByZXR1cm4gbm9kZS5jaGlsZHJlbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwZW5kQ2hpbGQoXG4gIHBhcmVudDogQVNUdjEuQmxvY2sgfCBBU1R2MS5UZW1wbGF0ZSB8IEFTVHYxLkVsZW1lbnROb2RlLFxuICBub2RlOiBBU1R2MS5TdGF0ZW1lbnRcbik6IHZvaWQge1xuICBjaGlsZHJlbkZvcihwYXJlbnQpLnB1c2gobm9kZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hCU0xpdGVyYWwocGF0aDogSEJTLkV4cHJlc3Npb24pOiBwYXRoIGlzIEhCUy5MaXRlcmFsO1xuZXhwb3J0IGZ1bmN0aW9uIGlzSEJTTGl0ZXJhbChwYXRoOiBBU1R2MS5FeHByZXNzaW9uKTogcGF0aCBpcyBBU1R2MS5MaXRlcmFsO1xuZXhwb3J0IGZ1bmN0aW9uIGlzSEJTTGl0ZXJhbChcbiAgcGF0aDogSEJTLkV4cHJlc3Npb24gfCBBU1R2MS5FeHByZXNzaW9uXG4pOiBwYXRoIGlzIEhCUy5MaXRlcmFsIHwgQVNUdjEuTGl0ZXJhbCB7XG4gIHJldHVybiAoXG4gICAgcGF0aC50eXBlID09PSAnU3RyaW5nTGl0ZXJhbCcgfHxcbiAgICBwYXRoLnR5cGUgPT09ICdCb29sZWFuTGl0ZXJhbCcgfHxcbiAgICBwYXRoLnR5cGUgPT09ICdOdW1iZXJMaXRlcmFsJyB8fFxuICAgIHBhdGgudHlwZSA9PT0gJ051bGxMaXRlcmFsJyB8fFxuICAgIHBhdGgudHlwZSA9PT0gJ1VuZGVmaW5lZExpdGVyYWwnXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludExpdGVyYWwobGl0ZXJhbDogQVNUdjEuTGl0ZXJhbCk6IHN0cmluZyB7XG4gIGlmIChsaXRlcmFsLnR5cGUgPT09ICdVbmRlZmluZWRMaXRlcmFsJykge1xuICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobGl0ZXJhbC52YWx1ZSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVXBwZXJDYXNlKHRhZzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiB0YWdbMF0gPT09IHRhZ1swXS50b1VwcGVyQ2FzZSgpICYmIHRhZ1swXSAhPT0gdGFnWzBdLnRvTG93ZXJDYXNlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0xvd2VyQ2FzZSh0YWc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdGFnWzBdID09PSB0YWdbMF0udG9Mb3dlckNhc2UoKSAmJiB0YWdbMF0gIT09IHRhZ1swXS50b1VwcGVyQ2FzZSgpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==