ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
141 lines (114 loc) • 15.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _util = require('@glimmer/util');
var _wireFormat = require('@glimmer/wire-format');
var WireFormat = _interopRequireWildcard(_wireFormat);
var _clientSide = require('./syntax/client-side');
var ClientSide = _interopRequireWildcard(_clientSide);
var _compilableTemplate = require('./syntax/compilable-template');
var _compilableTemplate2 = _interopRequireDefault(_compilableTemplate);
var _functions = require('./syntax/functions');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
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 _compilableTemplate2.default(statements, { meta: meta, symbols: symbols, hasEval: hasEval });
};
Scanner.prototype.scanBlock = function scanBlock(meta) {
var block = this.block;
var statements = block.statements;
return new _compilableTemplate2.default(statements, { meta: meta, parameters: _util.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 _compilableTemplate2.default(newStatements, symbolTable);
};
return Scanner;
}();
exports.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(_functions.ATTRS_BLOCK);
buffer.push([Ops.ClientSideStatement, ClientSide.Ops.OpenComponentElement, tagName]);
buffer.push([Ops.ClientSideStatement, ClientSide.Ops.DidCreateElement]);
buffer.push([Ops.Yield, attrsSymbol, _util.EMPTY_ARRAY]);
buffer.push.apply(buffer, attrs);
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9zY2FubmVyLmpzIl0sIm5hbWVzIjpbIkVNUFRZX0FSUkFZIiwiV2lyZUZvcm1hdCIsIkNsaWVudFNpZGUiLCJDb21waWxhYmxlVGVtcGxhdGUiLCJBVFRSU19CTE9DSyIsIk9wcyIsIlNjYW5uZXIiLCJibG9jayIsImVudiIsInNjYW5FbnRyeVBvaW50IiwibWV0YSIsInN0YXRlbWVudHMiLCJzeW1ib2xzIiwiaGFzRXZhbCIsInNjYW5CbG9jayIsInBhcmFtZXRlcnMiLCJzY2FuTGF5b3V0IiwiYXR0cnMiLCJjb21wb25lbnROYW1lIiwic3ltYm9sVGFibGUiLCJuZXdTdGF0ZW1lbnRzIiwidG9wbGV2ZWwiLCJpblRvcExldmVsIiwiaSIsImxlbmd0aCIsInN0YXRlbWVudCIsIlN0YXRlbWVudHMiLCJpc0NvbXBvbmVudCIsInRhZ05hbWUiLCJoYXNDb21wb25lbnREZWZpbml0aW9uIiwidGVtcGxhdGVNZXRhIiwidW5kZWZpbmVkIiwicHVzaCIsIk9wZW5FbGVtZW50IiwiZGVjb3JhdGVUb3BMZXZlbEVsZW1lbnQiLCJhZGRGYWxsYmFjayIsImlzT3BlbkVsZW1lbnQiLCJpc0ZsdXNoRWxlbWVudCIsImlzTW9kaWZpZXIiLCJFcnJvciIsIkNsaWVudFNpZGVTdGF0ZW1lbnQiLCJEaWRSZW5kZXJMYXlvdXQiLCJidWZmZXIiLCJGbHVzaEVsZW1lbnQiLCJDbG9zZUVsZW1lbnQiLCJhdHRyc1N5bWJvbCIsIk9wZW5Db21wb25lbnRFbGVtZW50IiwiRGlkQ3JlYXRlRWxlbWVudCIsIllpZWxkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxBQUFTLEFBQVQsQUFBNEIsQUFBNUI7O0FBQ0EsQUFBTzs7SUFBSyxBQUFaLEFBQTRCLEFBQTVCOztBQUNBLEFBQU87O0lBQUssQUFBWixBQUE0QixBQUE1Qjs7QUFDQSxBQUFPLEFBQVAsQUFBK0IsQUFBL0I7Ozs7QUFDQSxBQUFTLEFBQVQsQUFBNEIsQUFBNUI7Ozs7Ozs7Ozs7OztBQUNBLElBQUksTUFBTSxX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cUJBQTBCLFdBQVcsQUFBWCxJQUFlLEFBQXpDLHNCQUErRCxBQUEvRCxBQUFaLEFBQ0E7V0FBTyxBQUFQLEtBQVksQ0FBQyxJQUFJLEFBQUwscUJBQTBCLFdBQVcsQUFBWCxJQUFlLEFBQXpDLEFBQVosQUFDQTtXQUFPLEFBQVAsS0FBWSxDQUFDLElBQUksQUFBTCxPQUFZLEFBQVosQUFBeUIsQUFBekIsQUFBWixBQUNBO1dBQU8sQUFBUCxtQkFBZSxBQUFmLEFBQ0giLCJmaWxlIjoibGliL3NjYW5uZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFTVBUWV9BUlJBWSB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0ICogYXMgV2lyZUZvcm1hdCBmcm9tICdAZ2xpbW1lci93aXJlLWZvcm1hdCc7XG5pbXBvcnQgKiBhcyBDbGllbnRTaWRlIGZyb20gJy4vc3ludGF4L2NsaWVudC1zaWRlJztcbmltcG9ydCBDb21waWxhYmxlVGVtcGxhdGUgZnJvbSAnLi9zeW50YXgvY29tcGlsYWJsZS10ZW1wbGF0ZSc7XG5pbXBvcnQgeyBBVFRSU19CTE9DSyB9IGZyb20gJy4vc3ludGF4L2Z1bmN0aW9ucyc7XG52YXIgT3BzID0gV2lyZUZvcm1hdC5PcHM7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTY2FubmVyIHtcbiAgICBjb25zdHJ1Y3RvcihibG9jaywgZW52KSB7XG4gICAgICAgIHRoaXMuYmxvY2sgPSBibG9jaztcbiAgICAgICAgdGhpcy5lbnYgPSBlbnY7XG4gICAgfVxuICAgIHNjYW5FbnRyeVBvaW50KG1ldGEpIHtcbiAgICAgICAgbGV0IHsgYmxvY2sgfSA9IHRoaXM7XG4gICAgICAgIGxldCB7IHN0YXRlbWVudHMsIHN5bWJvbHMsIGhhc0V2YWwgfSA9IGJsb2NrO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBpbGFibGVUZW1wbGF0ZShzdGF0ZW1lbnRzLCB7IG1ldGEsIHN5bWJvbHMsIGhhc0V2YWwgfSk7XG4gICAgfVxuICAgIHNjYW5CbG9jayhtZXRhKSB7XG4gICAgICAgIGxldCB7IGJsb2NrIH0gPSB0aGlzO1xuICAgICAgICBsZXQgeyBzdGF0ZW1lbnRzIH0gPSBibG9jaztcbiAgICAgICAgcmV0dXJuIG5ldyBDb21waWxhYmxlVGVtcGxhdGUoc3RhdGVtZW50cywgeyBtZXRhLCBwYXJhbWV0ZXJzOiBFTVBUWV9BUlJBWSB9KTtcbiAgICB9XG4gICAgc2NhbkxheW91dChtZXRhLCBhdHRycywgY29tcG9uZW50TmFtZSkge1xuICAgICAgICBsZXQgeyBibG9jayB9ID0gdGhpcztcbiAgICAgICAgbGV0IHsgc3RhdGVtZW50cywgc3ltYm9scywgaGFzRXZhbCB9ID0gYmxvY2s7XG4gICAgICAgIGxldCBzeW1ib2xUYWJsZSA9IHsgbWV0YSwgaGFzRXZhbCwgc3ltYm9scyB9O1xuICAgICAgICBsZXQgbmV3U3RhdGVtZW50cyA9IFtdO1xuICAgICAgICBsZXQgdG9wbGV2ZWw7XG4gICAgICAgIGxldCBpblRvcExldmVsID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhdGVtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHN0YXRlbWVudCA9IHN0YXRlbWVudHNbaV07XG4gICAgICAgICAgICBpZiAoV2lyZUZvcm1hdC5TdGF0ZW1lbnRzLmlzQ29tcG9uZW50KHN0YXRlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGFnTmFtZSA9IHN0YXRlbWVudFsxXTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW52Lmhhc0NvbXBvbmVudERlZmluaXRpb24odGFnTmFtZSwgbWV0YS50ZW1wbGF0ZU1ldGEpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3BsZXZlbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdTdGF0ZW1lbnRzLnB1c2goW09wcy5PcGVuRWxlbWVudCwgdGFnTmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wbGV2ZWwgPSB0YWdOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb3JhdGVUb3BMZXZlbEVsZW1lbnQodGFnTmFtZSwgc3ltYm9scywgYXR0cnMsIG5ld1N0YXRlbWVudHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGFkZEZhbGxiYWNrKHN0YXRlbWVudCwgbmV3U3RhdGVtZW50cyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvcGxldmVsID09PSB1bmRlZmluZWQgJiYgdGFnTmFtZSA9PT0gY29tcG9uZW50TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wbGV2ZWwgPSB0YWdOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVjb3JhdGVUb3BMZXZlbEVsZW1lbnQodGFnTmFtZSwgc3ltYm9scywgYXR0cnMsIG5ld1N0YXRlbWVudHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkRmFsbGJhY2soc3RhdGVtZW50LCBuZXdTdGF0ZW1lbnRzKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1N0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodG9wbGV2ZWwgPT09IHVuZGVmaW5lZCAmJiBXaXJlRm9ybWF0LlN0YXRlbWVudHMuaXNPcGVuRWxlbWVudChzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcGxldmVsID0gc3RhdGVtZW50WzFdO1xuICAgICAgICAgICAgICAgICAgICBpblRvcExldmVsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgZGVjb3JhdGVUb3BMZXZlbEVsZW1lbnQodG9wbGV2ZWwsIHN5bWJvbHMsIGF0dHJzLCBuZXdTdGF0ZW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5Ub3BMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFdpcmVGb3JtYXQuU3RhdGVtZW50cy5pc0ZsdXNoRWxlbWVudChzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5Ub3BMZXZlbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChXaXJlRm9ybWF0LlN0YXRlbWVudHMuaXNNb2RpZmllcihzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYEZvdW5kIG1vZGlmaWVyIFwiJHtzdGF0ZW1lbnRbMV19XCIgb24gdGhlIHRvcC1sZXZlbCBlbGVtZW50IG9mIFwiJHtjb21wb25lbnROYW1lfVwiXFwuIE1vZGlmaWVycyBjYW5ub3QgYmUgb24gdGhlIHRvcC1sZXZlbCBlbGVtZW50YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbmV3U3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld1N0YXRlbWVudHMucHVzaChbT3BzLkNsaWVudFNpZGVTdGF0ZW1lbnQsIENsaWVudFNpZGUuT3BzLkRpZFJlbmRlckxheW91dF0pO1xuICAgICAgICByZXR1cm4gbmV3IENvbXBpbGFibGVUZW1wbGF0ZShuZXdTdGF0ZW1lbnRzLCBzeW1ib2xUYWJsZSk7XG4gICAgfVxufVxuZnVuY3Rpb24gYWRkRmFsbGJhY2soc3RhdGVtZW50LCBidWZmZXIpIHtcbiAgICBsZXQgWywsIGF0dHJzLCwgYmxvY2tdID0gc3RhdGVtZW50O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYnVmZmVyLnB1c2goYXR0cnNbaV0pO1xuICAgIH1cbiAgICBidWZmZXIucHVzaChbT3BzLkZsdXNoRWxlbWVudF0pO1xuICAgIGlmIChibG9jaykge1xuICAgICAgICBsZXQgeyBzdGF0ZW1lbnRzIH0gPSBibG9jaztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF0ZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBidWZmZXIucHVzaChzdGF0ZW1lbnRzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBidWZmZXIucHVzaChbT3BzLkNsb3NlRWxlbWVudF0pO1xufVxuZnVuY3Rpb24gZGVjb3JhdGVUb3BMZXZlbEVsZW1lbnQodGFnTmFtZSwgc3ltYm9scywgYXR0cnMsIGJ1ZmZlcikge1xuICAgIGxldCBhdHRyc1N5bWJvbCA9IHN5bWJvbHMucHVzaChBVFRSU19CTE9DSyk7XG4gICAgYnVmZmVyLnB1c2goW09wcy5DbGllbnRTaWRlU3RhdGVtZW50LCBDbGllbnRTaWRlLk9wcy5PcGVuQ29tcG9uZW50RWxlbWVudCwgdGFnTmFtZV0pO1xuICAgIGJ1ZmZlci5wdXNoKFtPcHMuQ2xpZW50U2lkZVN0YXRlbWVudCwgQ2xpZW50U2lkZS5PcHMuRGlkQ3JlYXRlRWxlbWVudF0pO1xuICAgIGJ1ZmZlci5wdXNoKFtPcHMuWWllbGQsIGF0dHJzU3ltYm9sLCBFTVBUWV9BUlJBWV0pO1xuICAgIGJ1ZmZlci5wdXNoKC4uLmF0dHJzKTtcbn0iXX0=