ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
115 lines (101 loc) • 15.6 kB
JavaScript
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
import { EMPTY_ARRAY } from '@glimmer/util';
import * as WireFormat from '@glimmer/wire-format';
import * as ClientSide from './syntax/client-side';
import CompilableTemplate from './syntax/compilable-template';
import { ATTRS_BLOCK } from './syntax/functions';
var Ops = WireFormat.Ops;
var Scanner = function () {
function Scanner(block, env) {
_classCallCheck(this, Scanner);
this.block = block;
this.env = env;
}
Scanner.prototype.scanEntryPoint = function scanEntryPoint(meta) {
var block = this.block;
var statements = block.statements,
symbols = block.symbols,
hasEval = block.hasEval;
return new CompilableTemplate(statements, { meta: meta, symbols: symbols, hasEval: hasEval });
};
Scanner.prototype.scanBlock = function scanBlock(meta) {
var block = this.block;
var statements = block.statements;
return new CompilableTemplate(statements, { meta: meta, parameters: EMPTY_ARRAY });
};
Scanner.prototype.scanLayout = function scanLayout(meta, attrs, componentName) {
var block = this.block;
var statements = block.statements,
symbols = block.symbols,
hasEval = block.hasEval;
var symbolTable = { meta: meta, hasEval: hasEval, symbols: symbols };
var newStatements = [];
var toplevel = void 0;
var inTopLevel = false;
for (var i = 0; i < statements.length; i++) {
var statement = statements[i];
if (WireFormat.Statements.isComponent(statement)) {
var tagName = statement[1];
if (!this.env.hasComponentDefinition(tagName, meta.templateMeta)) {
if (toplevel !== undefined) {
newStatements.push([Ops.OpenElement, tagName]);
} else {
toplevel = tagName;
decorateTopLevelElement(tagName, symbols, attrs, newStatements);
}
addFallback(statement, newStatements);
} else {
if (toplevel === undefined && tagName === componentName) {
toplevel = tagName;
decorateTopLevelElement(tagName, symbols, attrs, newStatements);
addFallback(statement, newStatements);
} else {
newStatements.push(statement);
}
}
} else {
if (toplevel === undefined && WireFormat.Statements.isOpenElement(statement)) {
toplevel = statement[1];
inTopLevel = true;
decorateTopLevelElement(toplevel, symbols, attrs, newStatements);
} else {
if (inTopLevel) {
if (WireFormat.Statements.isFlushElement(statement)) {
inTopLevel = false;
} else if (WireFormat.Statements.isModifier(statement)) {
throw Error('Found modifier "' + statement[1] + '" on the top-level element of "' + componentName + '". Modifiers cannot be on the top-level element');
}
}
newStatements.push(statement);
}
}
}
newStatements.push([Ops.ClientSideStatement, ClientSide.Ops.DidRenderLayout]);
return new CompilableTemplate(newStatements, symbolTable);
};
return Scanner;
}();
export default Scanner;
function addFallback(statement, buffer) {
var attrs = statement[2],
block = statement[4];
for (var i = 0; i < attrs.length; i++) {
buffer.push(attrs[i]);
}
buffer.push([Ops.FlushElement]);
if (block) {
var statements = block.statements;
for (var _i = 0; _i < statements.length; _i++) {
buffer.push(statements[_i]);
}
}
buffer.push([Ops.CloseElement]);
}
function decorateTopLevelElement(tagName, symbols, attrs, buffer) {
var attrsSymbol = symbols.push(ATTRS_BLOCK);
buffer.push([Ops.ClientSideStatement, ClientSide.Ops.OpenComponentElement, tagName]);
buffer.push([Ops.ClientSideStatement, ClientSide.Ops.DidCreateElement]);
buffer.push([Ops.Yield, attrsSymbol, EMPTY_ARRAY]);
buffer.push.apply(buffer, attrs);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2FubmVyLmpzIl0sIm5hbWVzIjpbIkVNUFRZX0FSUkFZIiwiV2lyZUZvcm1hdCIsIkNsaWVudFNpZGUiLCJDb21waWxhYmxlVGVtcGxhdGUiLCJBVFRSU19CTE9DSyIsIk9wcyIsIlNjYW5uZXIiLCJibG9jayIsImVudiIsInNjYW5FbnRyeVBvaW50IiwibWV0YSIsInN0YXRlbWVudHMiLCJzeW1ib2xzIiwiaGFzRXZhbCIsInNjYW5CbG9jayIsInBhcmFtZXRlcnMiLCJzY2FuTGF5b3V0IiwiYXR0cnMiLCJjb21wb25lbnROYW1lIiwic3ltYm9sVGFibGUiLCJuZXdTdGF0ZW1lbnRzIiwidG9wbGV2ZWwiLCJpblRvcExldmVsIiwiaSIsImxlbmd0aCIsInN0YXRlbWVudCIsIlN0YXRlbWVudHMiLCJpc0NvbXBvbmVudCIsInRhZ05hbWUiLCJoYXNDb21wb25lbnREZWZpbml0aW9uIiwidGVtcGxhdGVNZXRhIiwidW5kZWZpbmVkIiwicHVzaCIsIk9wZW5FbGVtZW50IiwiZGVjb3JhdGVUb3BMZXZlbEVsZW1lbnQiLCJhZGRGYWxsYmFjayIsImlzT3BlbkVsZW1lbnQiLCJpc0ZsdXNoRWxlbWVudCIsImlzTW9kaWZpZXIiLCJFcnJvciIsIkNsaWVudFNpZGVTdGF0ZW1lbnQiLCJEaWRSZW5kZXJMYXlvdXQiLCJidWZmZXIiLCJGbHVzaEVsZW1lbnQiLCJDbG9zZUVsZW1lbnQiLCJhdHRyc1N5bWJvbCIsIk9wZW5Db21wb25lbnRFbGVtZW50IiwiRGlkQ3JlYXRlRWxlbWVudCIsIllpZWxkIl0sIm1hcHBpbmdzIjoiOztBQUFBLFNBQVNBLFdBQVQsUUFBNEIsZUFBNUI7QUFDQSxPQUFPLEtBQUtDLFVBQVosTUFBNEIsc0JBQTVCO0FBQ0EsT0FBTyxLQUFLQyxVQUFaLE1BQTRCLHNCQUE1QjtBQUNBLE9BQU9DLGtCQUFQLE1BQStCLDhCQUEvQjtBQUNBLFNBQVNDLFdBQVQsUUFBNEIsb0JBQTVCO0FBQ0EsSUFBSUMsTUFBTUosV0FBV0ksR0FBckI7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V2EsTUFBL0IsRUFBdUNELElBQXZDLEVBQTRDO0FBQ3hDbUIsbUJBQU9WLElBQVAsQ0FBWXJCLFdBQVdZLEVBQVgsQ0FBWjtBQUNIO0FBQ0o7QUFDRG1CLFdBQU9WLElBQVAsQ0FBWSxDQUFDM0IsSUFBSXVDLFlBQUwsQ0FBWjtBQUNIO0FBQ0QsU0FBU1YsdUJBQVQsQ0FBaUNOLE9BQWpDLEVBQTBDaEIsT0FBMUMsRUFBbURLLEtBQW5ELEVBQTBEeUIsTUFBMUQsRUFBa0U7QUFDOUQsUUFBSUcsY0FBY2pDLFFBQVFvQixJQUFSLENBQWE1QixXQUFiLENBQWxCO0FBQ0FzQyxXQUFPVixJQUFQLENBQVksQ0FBQzNCLElBQUltQyxtQkFBTCxFQUEwQnRDLFdBQVdHLEdBQVgsQ0FBZXlDLG9CQUF6QyxFQUErRGxCLE9BQS9ELENBQVo7QUFDQWMsV0FBT1YsSUFBUCxDQUFZLENBQUMzQixJQUFJbUMsbUJBQUwsRUFBMEJ0QyxXQUFXRyxHQUFYLENBQWUwQyxnQkFBekMsQ0FBWjtBQUNBTCxXQUFPVixJQUFQLENBQVksQ0FBQzNCLElBQUkyQyxLQUFMLEVBQVlILFdBQVosRUFBeUI3QyxXQUF6QixDQUFaO0FBQ0EwQyxXQUFPVixJQUFQLGVBQWVmLEtBQWY7QUFDSCIsImZpbGUiOiJsaWIvc2Nhbm5lci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVNUFRZX0FSUkFZIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgKiBhcyBXaXJlRm9ybWF0IGZyb20gJ0BnbGltbWVyL3dpcmUtZm9ybWF0JztcbmltcG9ydCAqIGFzIENsaWVudFNpZGUgZnJvbSAnLi9zeW50YXgvY2xpZW50LXNpZGUnO1xuaW1wb3J0IENvbXBpbGFibGVUZW1wbGF0ZSBmcm9tICcuL3N5bnRheC9jb21waWxhYmxlLXRlbXBsYXRlJztcbmltcG9ydCB7IEFUVFJTX0JMT0NLIH0gZnJvbSAnLi9zeW50YXgvZnVuY3Rpb25zJztcbnZhciBPcHMgPSBXaXJlRm9ybWF0Lk9wcztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNjYW5uZXIge1xuICAgIGNvbnN0cnVjdG9yKGJsb2NrLCBlbnYpIHtcbiAgICAgICAgdGhpcy5ibG9jayA9IGJsb2NrO1xuICAgICAgICB0aGlzLmVudiA9IGVudjtcbiAgICB9XG4gICAgc2NhbkVudHJ5UG9pbnQobWV0YSkge1xuICAgICAgICBsZXQgeyBibG9jayB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgc3RhdGVtZW50cywgc3ltYm9scywgaGFzRXZhbCB9ID0gYmxvY2s7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcGlsYWJsZVRlbXBsYXRlKHN0YXRlbWVudHMsIHsgbWV0YSwgc3ltYm9scywgaGFzRXZhbCB9KTtcbiAgICB9XG4gICAgc2NhbkJsb2NrKG1ldGEpIHtcbiAgICAgICAgbGV0IHsgYmxvY2sgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IHN0YXRlbWVudHMgfSA9IGJsb2NrO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBpbGFibGVUZW1wbGF0ZShzdGF0ZW1lbnRzLCB7IG1ldGEsIHBhcmFtZXRlcnM6IEVNUFRZX0FSUkFZIH0pO1xuICAgIH1cbiAgICBzY2FuTGF5b3V0KG1ldGEsIGF0dHJzLCBjb21wb25lbnROYW1lKSB7XG4gICAgICAgIGxldCB7IGJsb2NrIH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBzdGF0ZW1lbnRzLCBzeW1ib2xzLCBoYXNFdmFsIH0gPSBibG9jaztcbiAgICAgICAgbGV0IHN5bWJvbFRhYmxlID0geyBtZXRhLCBoYXNFdmFsLCBzeW1ib2xzIH07XG4gICAgICAgIGxldCBuZXdTdGF0ZW1lbnRzID0gW107XG4gICAgICAgIGxldCB0b3BsZXZlbDtcbiAgICAgICAgbGV0IGluVG9wTGV2ZWwgPSBmYWxzZTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF0ZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgc3RhdGVtZW50ID0gc3RhdGVtZW50c1tpXTtcbiAgICAgICAgICAgIGlmIChXaXJlRm9ybWF0LlN0YXRlbWVudHMuaXNDb21wb25lbnQoc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGxldCB0YWdOYW1lID0gc3RhdGVtZW50WzFdO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5lbnYuaGFzQ29tcG9uZW50RGVmaW5pdGlvbih0YWdOYW1lLCBtZXRhLnRlbXBsYXRlTWV0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvcGxldmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlbWVudHMucHVzaChbT3BzLk9wZW5FbGVtZW50LCB0YWdOYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3BsZXZlbCA9IHRhZ05hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvcmF0ZVRvcExldmVsRWxlbWVudCh0YWdOYW1lLCBzeW1ib2xzLCBhdHRycywgbmV3U3RhdGVtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYWRkRmFsbGJhY2soc3RhdGVtZW50LCBuZXdTdGF0ZW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAodG9wbGV2ZWwgPT09IHVuZGVmaW5lZCAmJiB0YWdOYW1lID09PSBjb21wb25lbnROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3BsZXZlbCA9IHRhZ05hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWNvcmF0ZVRvcExldmVsRWxlbWVudCh0YWdOYW1lLCBzeW1ib2xzLCBhdHRycywgbmV3U3RhdGVtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRGYWxsYmFjayhzdGF0ZW1lbnQsIG5ld1N0YXRlbWVudHMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICh0b3BsZXZlbCA9PT0gdW5kZWZpbmVkICYmIFdpcmVGb3JtYXQuU3RhdGVtZW50cy5pc09wZW5FbGVtZW50KHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9wbGV2ZWwgPSBzdGF0ZW1lbnRbMV07XG4gICAgICAgICAgICAgICAgICAgIGluVG9wTGV2ZWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBkZWNvcmF0ZVRvcExldmVsRWxlbWVudCh0b3BsZXZlbCwgc3ltYm9scywgYXR0cnMsIG5ld1N0YXRlbWVudHMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpblRvcExldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoV2lyZUZvcm1hdC5TdGF0ZW1lbnRzLmlzRmx1c2hFbGVtZW50KHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblRvcExldmVsID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFdpcmVGb3JtYXQuU3RhdGVtZW50cy5pc01vZGlmaWVyKHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgRm91bmQgbW9kaWZpZXIgXCIke3N0YXRlbWVudFsxXX1cIiBvbiB0aGUgdG9wLWxldmVsIGVsZW1lbnQgb2YgXCIke2NvbXBvbmVudE5hbWV9XCJcXC4gTW9kaWZpZXJzIGNhbm5vdCBiZSBvbiB0aGUgdG9wLWxldmVsIGVsZW1lbnRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3U3RhdGVtZW50cy5wdXNoKFtPcHMuQ2xpZW50U2lkZVN0YXRlbWVudCwgQ2xpZW50U2lkZS5PcHMuRGlkUmVuZGVyTGF5b3V0XSk7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcGlsYWJsZVRlbXBsYXRlKG5ld1N0YXRlbWVudHMsIHN5bWJvbFRhYmxlKTtcbiAgICB9XG59XG5mdW5jdGlvbiBhZGRGYWxsYmFjayhzdGF0ZW1lbnQsIGJ1ZmZlcikge1xuICAgIGxldCBbLCwgYXR0cnMsLCBibG9ja10gPSBzdGF0ZW1lbnQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBidWZmZXIucHVzaChhdHRyc1tpXSk7XG4gICAgfVxuICAgIGJ1ZmZlci5wdXNoKFtPcHMuRmx1c2hFbGVtZW50XSk7XG4gICAgaWYgKGJsb2NrKSB7XG4gICAgICAgIGxldCB7IHN0YXRlbWVudHMgfSA9IGJsb2NrO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YXRlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGJ1ZmZlci5wdXNoKHN0YXRlbWVudHNbaV0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGJ1ZmZlci5wdXNoKFtPcHMuQ2xvc2VFbGVtZW50XSk7XG59XG5mdW5jdGlvbiBkZWNvcmF0ZVRvcExldmVsRWxlbWVudCh0YWdOYW1lLCBzeW1ib2xzLCBhdHRycywgYnVmZmVyKSB7XG4gICAgbGV0IGF0dHJzU3ltYm9sID0gc3ltYm9scy5wdXNoKEFUVFJTX0JMT0NLKTtcbiAgICBidWZmZXIucHVzaChbT3BzLkNsaWVudFNpZGVTdGF0ZW1lbnQsIENsaWVudFNpZGUuT3BzLk9wZW5Db21wb25lbnRFbGVtZW50LCB0YWdOYW1lXSk7XG4gICAgYnVmZmVyLnB1c2goW09wcy5DbGllbnRTaWRlU3RhdGVtZW50LCBDbGllbnRTaWRlLk9wcy5EaWRDcmVhdGVFbGVtZW50XSk7XG4gICAgYnVmZmVyLnB1c2goW09wcy5ZaWVsZCwgYXR0cnNTeW1ib2wsIEVNUFRZX0FSUkFZXSk7XG4gICAgYnVmZmVyLnB1c2goLi4uYXR0cnMpO1xufSJdfQ==