ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
80 lines (75 loc) • 10.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.parseElementBlockParams = parseElementBlockParams;
exports.childrenFor = childrenFor;
exports.appendChild = appendChild;
exports.isLiteral = isLiteral;
exports.printLiteral = printLiteral;
var _syntaxError = require('./errors/syntax-error');
var _syntaxError2 = _interopRequireDefault(_syntaxError);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
// 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 && 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 new _syntaxError2.default('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 new _syntaxError2.default('Invalid identifier for block parameters: \'' + param + '\' in \'' + paramsString + '\'', element.loc);
}
params.push(param);
}
}
if (params.length === 0) {
throw new _syntaxError2.default('Cannot use zero block parameters: \'' + paramsString + '\'', element.loc);
}
element.attributes = element.attributes.slice(0, asIndex);
return params;
}
return null;
}
function childrenFor(node) {
switch (node.type) {
case 'Program':
return node.body;
case 'ElementNode':
return node.children;
}
}
function appendChild(parent, node) {
childrenFor(parent).push(node);
}
function isLiteral(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);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91dGlscy5qcyJdLCJuYW1lcyI6WyJwYXJzZUVsZW1lbnRCbG9ja1BhcmFtcyIsImNoaWxkcmVuRm9yIiwiYXBwZW5kQ2hpbGQiLCJpc0xpdGVyYWwiLCJwcmludExpdGVyYWwiLCJJRF9JTlZFUlNFX1BBVFRFUk4iLCJlbGVtZW50IiwicGFyYW1zIiwicGFyc2VCbG9ja1BhcmFtcyIsImJsb2NrUGFyYW1zIiwibCIsImF0dHJpYnV0ZXMiLCJsZW5ndGgiLCJhdHRyTmFtZXMiLCJpIiwicHVzaCIsIm5hbWUiLCJhc0luZGV4IiwiaW5kZXhPZiIsImNoYXJBdCIsInBhcmFtc1N0cmluZyIsInNsaWNlIiwiam9pbiIsIm1hdGNoIiwibG9jIiwicGFyYW0iLCJyZXBsYWNlIiwidGVzdCIsIm5vZGUiLCJ0eXBlIiwiYm9keSIsImNoaWxkcmVuIiwicGFyZW50IiwicGF0aCIsImxpdGVyYWwiLCJKU09OIiwic3RyaW5naWZ5IiwidmFsdWUiXSwibWFwcGluZ3MiOiI7Ozs7O1FBT2dCQSx1QixHQUFBQSx1QjtRQW1DQUMsVyxHQUFBQSxXO1FBUUFDLFcsR0FBQUEsVztRQUdBQyxTLEdBQUFBLFM7UUFHQUMsWSxHQUFBQSxZOztBQXhEaEI7Ozs7OztBQUNBO0FBQ0E7QUFDQSxJQUFJQyxxQkFBcUIsNEJBQXpCO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBU0wsdUJBQVQsQ0FBaUNNLE9BQWpDLEVBQTBDO0FBQzdDLFFBQUlDLFNBQVNDLGlCQUFpQkYsT0FBakIsQ0FBYjtBQUNBLFFBQUlDLE1BQUosRUFBWUQsUUFBUUcsV0FBUixHQUFzQkYsTUFBdEI7QUFDZjtBQUNELFNBQVNDLGdCQUFULENBQTBCRixPQUExQixFQUFtQztBQUMvQixRQUFJSSxJQUFJSixRQUFRSyxVQUFSLENBQW1CQyxNQUEzQjtBQUNBLFFBQUlDLFlBQVksRUFBaEI7QUFDQSxTQUFLLElBQUlDLElBQUksQ0FBYixFQUFnQkEsSUFBSUosQ0FBcEIsRUFBdUJJLEdBQXZCLEVBQTRCO0FBQ3hCRCxrQkFBVUUsSUFBVixDQUFlVCxRQUFRSyxVQUFSLENBQW1CRyxDQUFuQixFQUFzQkUsSUFBckM7QUFDSDtBQUNELFFBQUlDLFVBQVVKLFVBQVVLLE9BQVYsQ0FBa0IsSUFBbEIsQ0FBZDtBQUNBLFFBQUlELFlBQVksQ0FBQyxDQUFiLElBQWtCUCxJQUFJTyxPQUF0QixJQUFpQ0osVUFBVUksVUFBVSxDQUFwQixFQUF1QkUsTUFBdkIsQ0FBOEIsQ0FBOUIsTUFBcUMsR0FBMUUsRUFBK0U7QUFDM0U7QUFDQSxZQUFJQyxlQUFlUCxVQUFVUSxLQUFWLENBQWdCSixPQUFoQixFQUF5QkssSUFBekIsQ0FBOEIsR0FBOUIsQ0FBbkI7QUFDQSxZQUFJRixhQUFhRCxNQUFiLENBQW9CQyxhQUFhUixNQUFiLEdBQXNCLENBQTFDLE1BQWlELEdBQWpELElBQXdEUSxhQUFhRyxLQUFiLENBQW1CLEtBQW5CLEVBQTBCWCxNQUExQixLQUFxQyxDQUFqRyxFQUFvRztBQUNoRyxrQkFBTSwwQkFBZ0Isd0NBQXdDUSxZQUF4QyxHQUF1RCxJQUF2RSxFQUE2RWQsUUFBUWtCLEdBQXJGLENBQU47QUFDSDtBQUNELFlBQUlqQixTQUFTLEVBQWI7QUFDQSxhQUFLLElBQUlPLElBQUlHLFVBQVUsQ0FBdkIsRUFBMEJILElBQUlKLENBQTlCLEVBQWlDSSxHQUFqQyxFQUFzQztBQUNsQyxnQkFBSVcsUUFBUVosVUFBVUMsQ0FBVixFQUFhWSxPQUFiLENBQXFCLEtBQXJCLEVBQTRCLEVBQTVCLENBQVo7QUFDQSxnQkFBSUQsVUFBVSxFQUFkLEVBQWtCO0FBQ2Qsb0JBQUlwQixtQkFBbUJzQixJQUFuQixDQUF3QkYsS0FBeEIsQ0FBSixFQUFvQztBQUNoQywwQkFBTSwwQkFBZ0IsZ0RBQWdEQSxLQUFoRCxHQUF3RCxVQUF4RCxHQUFxRUwsWUFBckUsR0FBb0YsSUFBcEcsRUFBMEdkLFFBQVFrQixHQUFsSCxDQUFOO0FBQ0g7QUFDRGpCLHVCQUFPUSxJQUFQLENBQVlVLEtBQVo7QUFDSDtBQUNKO0FBQ0QsWUFBSWxCLE9BQU9LLE1BQVAsS0FBa0IsQ0FBdEIsRUFBeUI7QUFDckIsa0JBQU0sMEJBQWdCLHlDQUF5Q1EsWUFBekMsR0FBd0QsSUFBeEUsRUFBOEVkLFFBQVFrQixHQUF0RixDQUFOO0FBQ0g7QUFDRGxCLGdCQUFRSyxVQUFSLEdBQXFCTCxRQUFRSyxVQUFSLENBQW1CVSxLQUFuQixDQUF5QixDQUF6QixFQUE0QkosT0FBNUIsQ0FBckI7QUFDQSxlQUFPVixNQUFQO0FBQ0g7QUFDRCxXQUFPLElBQVA7QUFDSDtBQUNNLFNBQVNOLFdBQVQsQ0FBcUIyQixJQUFyQixFQUEyQjtBQUM5QixZQUFRQSxLQUFLQyxJQUFiO0FBQ0ksYUFBSyxTQUFMO0FBQ0ksbUJBQU9ELEtBQUtFLElBQVo7QUFDSixhQUFLLGFBQUw7QUFDSSxtQkFBT0YsS0FBS0csUUFBWjtBQUpSO0FBTUg7QUFDTSxTQUFTN0IsV0FBVCxDQUFxQjhCLE1BQXJCLEVBQTZCSixJQUE3QixFQUFtQztBQUN0QzNCLGdCQUFZK0IsTUFBWixFQUFvQmpCLElBQXBCLENBQXlCYSxJQUF6QjtBQUNIO0FBQ00sU0FBU3pCLFNBQVQsQ0FBbUI4QixJQUFuQixFQUF5QjtBQUM1QixXQUFPQSxLQUFLSixJQUFMLEtBQWMsZUFBZCxJQUFpQ0ksS0FBS0osSUFBTCxLQUFjLGdCQUEvQyxJQUFtRUksS0FBS0osSUFBTCxLQUFjLGVBQWpGLElBQW9HSSxLQUFLSixJQUFMLEtBQWMsYUFBbEgsSUFBbUlJLEtBQUtKLElBQUwsS0FBYyxrQkFBeEo7QUFDSDtBQUNNLFNBQVN6QixZQUFULENBQXNCOEIsT0FBdEIsRUFBK0I7QUFDbEMsUUFBSUEsUUFBUUwsSUFBUixLQUFpQixrQkFBckIsRUFBeUM7QUFDckMsZUFBTyxXQUFQO0FBQ0gsS0FGRCxNQUVPO0FBQ0gsZUFBT00sS0FBS0MsU0FBTCxDQUFlRixRQUFRRyxLQUF2QixDQUFQO0FBQ0g7QUFDSiIsImZpbGUiOiJsaWIvdXRpbHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgU3ludGF4RXJyb3IgZnJvbSAnLi9lcnJvcnMvc3ludGF4LWVycm9yJztcbi8vIFJlZ2V4IHRvIHZhbGlkYXRlIHRoZSBpZGVudGlmaWVyIGZvciBibG9jayBwYXJhbWV0ZXJzLlxuLy8gQmFzZWQgb24gdGhlIElEIHZhbGlkYXRpb24gcmVnZXggaW4gSGFuZGxlYmFycy5cbmxldCBJRF9JTlZFUlNFX1BBVFRFUk4gPSAvWyFcIiMlLSxcXC5cXC87LT5AXFxbLVxcXmBcXHstfl0vO1xuLy8gQ2hlY2tzIHRoZSBlbGVtZW50J3MgYXR0cmlidXRlcyB0byBzZWUgaWYgaXQgdXNlcyBibG9jayBwYXJhbXMuXG4vLyBJZiBpdCBkb2VzLCByZWdpc3RlcnMgdGhlIGJsb2NrIHBhcmFtcyB3aXRoIHRoZSBwcm9ncmFtIGFuZFxuLy8gcmVtb3ZlcyB0aGUgY29ycmVzcG9uZGluZyBhdHRyaWJ1dGVzIGZyb20gdGhlIGVsZW1lbnQuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFbGVtZW50QmxvY2tQYXJhbXMoZWxlbWVudCkge1xuICAgIGxldCBwYXJhbXMgPSBwYXJzZUJsb2NrUGFyYW1zKGVsZW1lbnQpO1xuICAgIGlmIChwYXJhbXMpIGVsZW1lbnQuYmxvY2tQYXJhbXMgPSBwYXJhbXM7XG59XG5mdW5jdGlvbiBwYXJzZUJsb2NrUGFyYW1zKGVsZW1lbnQpIHtcbiAgICBsZXQgbCA9IGVsZW1lbnQuYXR0cmlidXRlcy5sZW5ndGg7XG4gICAgbGV0IGF0dHJOYW1lcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgIGF0dHJOYW1lcy5wdXNoKGVsZW1lbnQuYXR0cmlidXRlc1tpXS5uYW1lKTtcbiAgICB9XG4gICAgbGV0IGFzSW5kZXggPSBhdHRyTmFtZXMuaW5kZXhPZignYXMnKTtcbiAgICBpZiAoYXNJbmRleCAhPT0gLTEgJiYgbCA+IGFzSW5kZXggJiYgYXR0ck5hbWVzW2FzSW5kZXggKyAxXS5jaGFyQXQoMCkgPT09ICd8Jykge1xuICAgICAgICAvLyBTb21lIGJhc2ljIHZhbGlkYXRpb24sIHNpbmNlIHdlJ3JlIGRvaW5nIHRoZSBwYXJzaW5nIG91cnNlbHZlc1xuICAgICAgICBsZXQgcGFyYW1zU3RyaW5nID0gYXR0ck5hbWVzLnNsaWNlKGFzSW5kZXgpLmpvaW4oJyAnKTtcbiAgICAgICAgaWYgKHBhcmFtc1N0cmluZy5jaGFyQXQocGFyYW1zU3RyaW5nLmxlbmd0aCAtIDEpICE9PSAnfCcgfHwgcGFyYW1zU3RyaW5nLm1hdGNoKC9cXHwvZykubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0ludmFsaWQgYmxvY2sgcGFyYW1ldGVycyBzeW50YXg6IFxcJycgKyBwYXJhbXNTdHJpbmcgKyAnXFwnJywgZWxlbWVudC5sb2MpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwYXJhbXMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IGFzSW5kZXggKyAxOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgcGFyYW0gPSBhdHRyTmFtZXNbaV0ucmVwbGFjZSgvXFx8L2csICcnKTtcbiAgICAgICAgICAgIGlmIChwYXJhbSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBpZiAoSURfSU5WRVJTRV9QQVRURVJOLnRlc3QocGFyYW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignSW52YWxpZCBpZGVudGlmaWVyIGZvciBibG9jayBwYXJhbWV0ZXJzOiBcXCcnICsgcGFyYW0gKyAnXFwnIGluIFxcJycgKyBwYXJhbXNTdHJpbmcgKyAnXFwnJywgZWxlbWVudC5sb2MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwYXJhbXMucHVzaChwYXJhbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBTeW50YXhFcnJvcignQ2Fubm90IHVzZSB6ZXJvIGJsb2NrIHBhcmFtZXRlcnM6IFxcJycgKyBwYXJhbXNTdHJpbmcgKyAnXFwnJywgZWxlbWVudC5sb2MpO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnQuYXR0cmlidXRlcyA9IGVsZW1lbnQuYXR0cmlidXRlcy5zbGljZSgwLCBhc0luZGV4KTtcbiAgICAgICAgcmV0dXJuIHBhcmFtcztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gY2hpbGRyZW5Gb3Iobm9kZSkge1xuICAgIHN3aXRjaCAobm9kZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ1Byb2dyYW0nOlxuICAgICAgICAgICAgcmV0dXJuIG5vZGUuYm9keTtcbiAgICAgICAgY2FzZSAnRWxlbWVudE5vZGUnOlxuICAgICAgICAgICAgcmV0dXJuIG5vZGUuY2hpbGRyZW47XG4gICAgfVxufVxuZXhwb3J0IGZ1bmN0aW9uIGFwcGVuZENoaWxkKHBhcmVudCwgbm9kZSkge1xuICAgIGNoaWxkcmVuRm9yKHBhcmVudCkucHVzaChub2RlKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0xpdGVyYWwocGF0aCkge1xuICAgIHJldHVybiBwYXRoLnR5cGUgPT09ICdTdHJpbmdMaXRlcmFsJyB8fCBwYXRoLnR5cGUgPT09ICdCb29sZWFuTGl0ZXJhbCcgfHwgcGF0aC50eXBlID09PSAnTnVtYmVyTGl0ZXJhbCcgfHwgcGF0aC50eXBlID09PSAnTnVsbExpdGVyYWwnIHx8IHBhdGgudHlwZSA9PT0gJ1VuZGVmaW5lZExpdGVyYWwnO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHByaW50TGl0ZXJhbChsaXRlcmFsKSB7XG4gICAgaWYgKGxpdGVyYWwudHlwZSA9PT0gJ1VuZGVmaW5lZExpdGVyYWwnKSB7XG4gICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobGl0ZXJhbC52YWx1ZSk7XG4gICAgfVxufSJdfQ==