@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
152 lines (116 loc) • 14.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.renderSync = renderSync;
exports.renderMain = renderMain;
exports.renderComponent = renderComponent;
var _reference = require("@glimmer/reference");
var _util = require("@glimmer/util");
var _symbols = require("./symbols");
var _append = _interopRequireDefault(require("./vm/append"));
var _scope = require("./scope");
var _environment = require("./environment");
var _env = require("@glimmer/env");
var _validator = require("@glimmer/validator");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var TemplateIteratorImpl = /*#__PURE__*/function () {
function TemplateIteratorImpl(vm) {
this.vm = vm;
}
var _proto = TemplateIteratorImpl.prototype;
_proto.next = function next() {
return this.vm.next();
};
_proto.sync = function sync() {
var _this = this;
if (_env.DEBUG) {
return (0, _validator.runInTrackingTransaction)(function () {
return _this.vm.execute();
}, '- While rendering:');
} else {
return this.vm.execute();
}
};
return TemplateIteratorImpl;
}();
function renderSync(env, iterator) {
var result;
(0, _environment.inTransaction)(env, function () {
return result = iterator.sync();
});
return result;
}
function renderMain(runtime, context, owner, self, treeBuilder, layout, dynamicScope) {
if (dynamicScope === void 0) {
dynamicScope = new _scope.DynamicScopeImpl();
}
var handle = (0, _util.unwrapHandle)(layout.compile(context));
var numSymbols = layout.symbolTable.symbols.length;
var vm = _append.default.initial(runtime, context, {
self: self,
dynamicScope: dynamicScope,
treeBuilder: treeBuilder,
handle: handle,
numSymbols: numSymbols,
owner: owner
});
return new TemplateIteratorImpl(vm);
}
function renderInvocation(vm, context, owner, definition, args) {
// Get a list of tuples of argument names and references, like
// [['title', reference], ['name', reference]]
var argList = Object.keys(args).map(function (key) {
return [key, args[key]];
});
var blockNames = ['main', 'else', 'attrs']; // Prefix argument names with `@` symbol
var argNames = argList.map(function (_ref) {
var name = _ref[0];
return "@" + name;
});
var reified = vm[_symbols.CONSTANTS].component(definition, owner);
vm.pushFrame(); // Push blocks on to the stack, three stack values per block
for (var i = 0; i < 3 * blockNames.length; i++) {
vm.stack.push(null);
}
vm.stack.push(null); // For each argument, push its backing reference on to the stack
argList.forEach(function (_ref2) {
var reference = _ref2[1];
vm.stack.push(reference);
}); // Configure VM based on blocks and args just pushed on to the stack.
vm[_symbols.ARGS].setup(vm.stack, argNames, blockNames, 0, true);
var compilable = reified.compilable;
var layoutHandle = (0, _util.unwrapHandle)(compilable.compile(context));
var invocation = {
handle: layoutHandle,
symbolTable: compilable.symbolTable
}; // Needed for the Op.Main opcode: arguments, component invocation object, and
// component definition.
vm.stack.push(vm[_symbols.ARGS]);
vm.stack.push(invocation);
vm.stack.push(reified);
return new TemplateIteratorImpl(vm);
}
function renderComponent(runtime, treeBuilder, context, owner, definition, args, dynamicScope) {
if (args === void 0) {
args = {};
}
if (dynamicScope === void 0) {
dynamicScope = new _scope.DynamicScopeImpl();
}
var vm = _append.default.empty(runtime, {
treeBuilder: treeBuilder,
handle: context.stdlib.main,
dynamicScope: dynamicScope,
owner: owner
}, context);
return renderInvocation(vm, context, owner, definition, recordToReference(args));
}
function recordToReference(record) {
var root = (0, _reference.createConstRef)(record, 'args');
return Object.keys(record).reduce(function (acc, key) {
acc[key] = (0, _reference.childRefFor)(root, key);
return acc;
}, {});
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3JlbmRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFhQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztJQUVBLG9CO0FBQ0UsV0FBQSxvQkFBQSxDQUFBLEVBQUEsRUFBa0M7QUFBZCxTQUFBLEVBQUEsR0FBQSxFQUFBO0FBQWtCOzs7O1NBQ3RDLEksR0FBQSxTQUFBLElBQUEsR0FBSTtBQUNGLFdBQU8sS0FBQSxFQUFBLENBQVAsSUFBTyxFQUFQOzs7U0FHRixJLEdBQUEsU0FBQSxJQUFBLEdBQUk7QUFBQSxRQUFBLEtBQUEsR0FBQSxJQUFBOztBQUNGLFFBQUEsVUFBQSxFQUFXO0FBQ1QsYUFBTyx5Q0FBMEIsWUFBQTtBQUFBLGVBQU0sS0FBQSxDQUFBLEVBQUEsQ0FBUCxPQUFPLEVBQU47QUFBRCxPQUF6QixFQUFQLG9CQUFPLENBQVA7QUFERixLQUFBLE1BRU87QUFDTCxhQUFPLEtBQUEsRUFBQSxDQUFQLE9BQU8sRUFBUDtBQUNEOzs7Ozs7QUFJQyxTQUFBLFVBQUEsQ0FBQSxHQUFBLEVBQUEsUUFBQSxFQUFpRTtBQUNyRSxNQUFBLE1BQUE7QUFFQSxrQ0FBYSxHQUFiLEVBQW1CLFlBQUE7QUFBQSxXQUFPLE1BQU0sR0FBRyxRQUFRLENBQTNDLElBQW1DLEVBQWhCO0FBQW5CLEdBQUE7QUFFQSxTQUFBLE1BQUE7QUFDRDs7QUFFSyxTQUFBLFVBQUEsQ0FBQSxPQUFBLEVBQUEsT0FBQSxFQUFBLEtBQUEsRUFBQSxJQUFBLEVBQUEsV0FBQSxFQUFBLE1BQUEsRUFBQSxZQUFBLEVBTytDO0FBQUEsTUFBbkQsWUFBbUQsS0FBQSxLQUFBLENBQUEsRUFBQTtBQUFuRCxJQUFBLFlBQW1ELEdBQXRCLElBUHpCLHVCQU95QixFQUE3QjtBQUFtRDs7QUFFbkQsTUFBSSxNQUFNLEdBQUcsd0JBQWEsTUFBTSxDQUFOLE9BQUEs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QSxFQUFBLFdBQUEsRUFBQSxPQUFBLEVBQUEsS0FBQSxFQUFBLFVBQUEsRUFBQSxJQUFBLEVBQUEsWUFBQSxFQU8rQztBQUFBLE1BRG5ELElBQ21ELEtBQUEsS0FBQSxDQUFBLEVBQUE7QUFEbkQsSUFBQSxJQUNtRCxHQVAvQyxFQU1KO0FBQ21EOztBQUFBLE1BQW5ELFlBQW1ELEtBQUEsS0FBQSxDQUFBLEVBQUE7QUFBbkQsSUFBQSxZQUFtRCxHQUF0QixJQVB6Qix1QkFPeUIsRUFBN0I7QUFBbUQ7O0FBRW5ELE1BQUksRUFBRSxHQUFHLGdCQUFBLEtBQUEsQ0FBQSxPQUFBLEVBRVA7QUFBRSxJQUFBLFdBQUYsRUFBQSxXQUFBO0FBQWUsSUFBQSxNQUFNLEVBQUUsT0FBTyxDQUFQLE1BQUEsQ0FBdkIsSUFBQTtBQUE0QyxJQUFBLFlBQTVDLEVBQUEsWUFBQTtBQUEwRCxJQUFBLEtBQUEsRUFBQTtBQUExRCxHQUZPLEVBQVQsT0FBUyxDQUFUOztBQUtBLFNBQU8sZ0JBQWdCLENBQUEsRUFBQSxFQUFBLE9BQUEsRUFBQSxLQUFBLEVBQUEsVUFBQSxFQUFpQyxpQkFBaUIsQ0FBekUsSUFBeUUsQ0FBbEQsQ0FBdkI7QUFDRDs7QUFFRCxTQUFBLGlCQUFBLENBQUEsTUFBQSxFQUEwRDtBQUN4RCxNQUFNLElBQUksR0FBRywrQkFBYyxNQUFkLEVBQWIsTUFBYSxDQUFiO0FBRUEsU0FBTyxNQUFNLENBQU4sSUFBQSxDQUFBLE1BQUEsRUFBQSxNQUFBLENBQTJCLFVBQUEsR0FBQSxFQUFBLEdBQUEsRUFBYTtBQUM3QyxJQUFBLEdBQUcsQ0FBSCxHQUFHLENBQUgsR0FBVyw0QkFBVyxJQUFYLEVBQVgsR0FBVyxDQUFYO0FBQ0EsV0FBQSxHQUFBO0FBRkssR0FBQSxFQUFQLEVBQU8sQ0FBUDtBQUlEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRHluYW1pY1Njb3BlLFxuICBFbnZpcm9ubWVudCxcbiAgUmVuZGVyUmVzdWx0LFxuICBSaWNoSXRlcmF0b3JSZXN1bHQsXG4gIFRlbXBsYXRlSXRlcmF0b3IsXG4gIFJ1bnRpbWVDb250ZXh0LFxuICBFbGVtZW50QnVpbGRlcixcbiAgQ29tcGlsYWJsZVByb2dyYW0sXG4gIENvbXBpbGVUaW1lQ29tcGlsYXRpb25Db250ZXh0LFxuICBDb21wb25lbnREZWZpbml0aW9uU3RhdGUsXG4gIE93bmVyLFxufSBmcm9tICdAZ2xpbW1lci9pbnRlcmZhY2VzJztcbmltcG9ydCB7IGNoaWxkUmVmRm9yLCBjcmVhdGVDb25zdFJlZiwgUmVmZXJlbmNlIH0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IGV4cGVjdCwgdW53cmFwSGFuZGxlIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBBUkdTLCBDT05TVEFOVFMgfSBmcm9tICcuL3N5bWJvbHMnO1xuaW1wb3J0IFZNLCB7IEludGVybmFsVk0gfSBmcm9tICcuL3ZtL2FwcGVuZCc7XG5pbXBvcnQgeyBEeW5hbWljU2NvcGVJbXBsIH0gZnJvbSAnLi9zY29wZSc7XG5pbXBvcnQgeyBpblRyYW5zYWN0aW9uIH0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBERUJVRyB9IGZyb20gJ0BnbGltbWVyL2Vudic7XG5pbXBvcnQgeyBydW5JblRyYWNraW5nVHJhbnNhY3Rpb24gfSBmcm9tICdAZ2xpbW1lci92YWxpZGF0b3InO1xuXG5jbGFzcyBUZW1wbGF0ZUl0ZXJhdG9ySW1wbCBpbXBsZW1lbnRzIFRlbXBsYXRlSXRlcmF0b3Ige1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHZtOiBJbnRlcm5hbFZNKSB7fVxuICBuZXh0KCk6IFJpY2hJdGVyYXRvclJlc3VsdDxudWxsLCBSZW5kZXJSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy52bS5uZXh0KCk7XG4gIH1cblxuICBzeW5jKCk6IFJlbmRlclJlc3VsdCB7XG4gICAgaWYgKERFQlVHKSB7XG4gICAgICByZXR1cm4gcnVuSW5UcmFja2luZ1RyYW5zYWN0aW9uISgoKSA9PiB0aGlzLnZtLmV4ZWN1dGUoKSwgJy0gV2hpbGUgcmVuZGVyaW5nOicpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy52bS5leGVjdXRlKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJTeW5jKGVudjogRW52aXJvbm1lbnQsIGl0ZXJhdG9yOiBUZW1wbGF0ZUl0ZXJhdG9yKTogUmVuZGVyUmVzdWx0IHtcbiAgbGV0IHJlc3VsdDogUmVuZGVyUmVzdWx0O1xuXG4gIGluVHJhbnNhY3Rpb24oZW52LCAoKSA9PiAocmVzdWx0ID0gaXRlcmF0b3Iuc3luYygpKSk7XG5cbiAgcmV0dXJuIHJlc3VsdCE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJNYWluKFxuICBydW50aW1lOiBSdW50aW1lQ29udGV4dCxcbiAgY29udGV4dDogQ29tcGlsZVRpbWVDb21waWxhdGlvbkNvbnRleHQsXG4gIG93bmVyOiBPd25lcixcbiAgc2VsZjogUmVmZXJlbmNlLFxuICB0cmVlQnVpbGRlcjogRWxlbWVudEJ1aWxkZXIsXG4gIGxheW91dDogQ29tcGlsYWJsZVByb2dyYW0sXG4gIGR5bmFtaWNTY29wZTogRHluYW1pY1Njb3BlID0gbmV3IER5bmFtaWNTY29wZUltcGwoKVxuKTogVGVtcGxhdGVJdGVyYXRvciB7XG4gIGxldCBoYW5kbGUgPSB1bndyYXBIYW5kbGUobGF5b3V0LmNvbXBpbGUoY29udGV4dCkpO1xuICBsZXQgbnVtU3ltYm9scyA9IGxheW91dC5zeW1ib2xUYWJsZS5zeW1ib2xzLmxlbmd0aDtcbiAgbGV0IHZtID0gVk0uaW5pdGlhbChydW50aW1lLCBjb250ZXh0LCB7XG4gICAgc2VsZixcbiAgICBkeW5hbWljU2NvcGUsXG4gICAgdHJlZUJ1aWxkZXIsXG4gICAgaGFuZGxlLFxuICAgIG51bVN5bWJvbHMsXG4gICAgb3duZXIsXG4gIH0pO1xuICByZXR1cm4gbmV3IFRlbXBsYXRlSXRlcmF0b3JJbXBsKHZtKTtcbn1cblxuZnVuY3Rpb24gcmVuZGVySW52b2NhdGlvbihcbiAgdm06IEludGVybmFsVk0sXG4gIGNvbnRleHQ6IENvbXBpbGVUaW1lQ29tcGlsYXRpb25Db250ZXh0LFxuICBvd25lcjogT3duZXIsXG4gIGRlZmluaXRpb246IENvbXBvbmVudERlZmluaXRpb25TdGF0ZSxcbiAgYXJnczogUmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPlxuKTogVGVtcGxhdGVJdGVyYXRvciB7XG4gIC8vIEdldCBhIGxpc3Qgb2YgdHVwbGVzIG9mIGFyZ3VtZW50IG5hbWVzIGFuZCByZWZlcmVuY2VzLCBsaWtlXG4gIC8vIFtbJ3RpdGxlJywgcmVmZXJlbmNlXSwgWyduYW1lJywgcmVmZXJlbmNlXV1cbiAgY29uc3QgYXJnTGlzdCA9IE9iamVjdC5rZXlzKGFyZ3MpLm1hcCgoa2V5KSA9PiBba2V5LCBhcmdzW2tleV1dKTtcblxuICBjb25zdCBibG9ja05hbWVzID0gWydtYWluJywgJ2Vsc2UnLCAnYXR0cnMnXTtcbiAgLy8gUHJlZml4IGFyZ3VtZW50IG5hbWVzIHdpdGggYEBgIHN5bWJvbFxuICBjb25zdCBhcmdOYW1lcyA9IGFyZ0xpc3QubWFwKChbbmFtZV0pID0+IGBAJHtuYW1lfWApO1xuXG4gIGxldCByZWlmaWVkID0gdm1bQ09OU1RBTlRTXS5jb21wb25lbnQoZGVmaW5pdGlvbiwgb3duZXIpO1xuXG4gIHZtLnB1c2hGcmFtZSgpO1xuXG4gIC8vIFB1c2ggYmxvY2tzIG9uIHRvIHRoZSBzdGFjaywgdGhyZWUgc3RhY2sgdmFsdWVzIHBlciBibG9ja1xuICBmb3IgKGxldCBpID0gMDsgaSA8IDMgKiBibG9ja05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdm0uc3RhY2sucHVzaChudWxsKTtcbiAgfVxuXG4gIHZtLnN0YWNrLnB1c2gobnVsbCk7XG5cbiAgLy8gRm9yIGVhY2ggYXJndW1lbnQsIHB1c2ggaXRzIGJhY2tpbmcgcmVmZXJlbmNlIG9uIHRvIHRoZSBzdGFja1xuICBhcmdMaXN0LmZvckVhY2goKFssIHJlZmVyZW5jZV0pID0+IHtcbiAgICB2bS5zdGFjay5wdXNoKHJlZmVyZW5jZSk7XG4gIH0pO1xuXG4gIC8vIENvbmZpZ3VyZSBWTSBiYXNlZCBvbiBibG9ja3MgYW5kIGFyZ3MganVzdCBwdXNoZWQgb24gdG8gdGhlIHN0YWNrLlxuICB2bVtBUkdTXS5zZXR1cCh2bS5zdGFjaywgYXJnTmFtZXMsIGJsb2NrTmFtZXMsIDAsIHRydWUpO1xuXG4gIGNvbnN0IGNvbXBpbGFibGUgPSBleHBlY3QoXG4gICAgcmVpZmllZC5jb21waWxhYmxlLFxuICAgICdCVUc6IEV4cGVjdGVkIHRoZSByb290IGNvbXBvbmVudCByZW5kZXJlZCB3aXRoIHJlbmRlckNvbXBvbmVudCB0byBoYXZlIGFuIGFzc29jaWF0ZWQgdGVtcGxhdGUsIHNldCB3aXRoIHNldENvbXBvbmVudFRlbXBsYXRlJ1xuICApO1xuICBjb25zdCBsYXlvdXRIYW5kbGUgPSB1bndyYXBIYW5kbGUoY29tcGlsYWJsZS5jb21waWxlKGNvbnRleHQpKTtcbiAgY29uc3QgaW52b2NhdGlvbiA9IHsgaGFuZGxlOiBsYXlvdXRIYW5kbGUsIHN5bWJvbFRhYmxlOiBjb21waWxhYmxlLnN5bWJvbFRhYmxlIH07XG5cbiAgLy8gTmVlZGVkIGZvciB0aGUgT3AuTWFpbiBvcGNvZGU6IGFyZ3VtZW50cywgY29tcG9uZW50IGludm9jYXRpb24gb2JqZWN0LCBhbmRcbiAgLy8gY29tcG9uZW50IGRlZmluaXRpb24uXG4gIHZtLnN0YWNrLnB1c2godm1bQVJHU10pO1xuICB2bS5zdGFjay5wdXNoKGludm9jYXRpb24pO1xuICB2bS5zdGFjay5wdXNoKHJlaWZpZWQpO1xuXG4gIHJldHVybiBuZXcgVGVtcGxhdGVJdGVyYXRvckltcGwodm0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQ29tcG9uZW50KFxuICBydW50aW1lOiBSdW50aW1lQ29udGV4dCxcbiAgdHJlZUJ1aWxkZXI6IEVsZW1lbnRCdWlsZGVyLFxuICBjb250ZXh0OiBDb21waWxlVGltZUNvbXBpbGF0aW9uQ29udGV4dCxcbiAgb3duZXI6IE93bmVyLFxuICBkZWZpbml0aW9uOiBDb21wb25lbnREZWZpbml0aW9uU3RhdGUsXG4gIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4gIGR5bmFtaWNTY29wZTogRHluYW1pY1Njb3BlID0gbmV3IER5bmFtaWNTY29wZUltcGwoKVxuKTogVGVtcGxhdGVJdGVyYXRvciB7XG4gIGxldCB2bSA9IFZNLmVtcHR5KFxuICAgIHJ1bnRpbWUsXG4gICAgeyB0cmVlQnVpbGRlciwgaGFuZGxlOiBjb250ZXh0LnN0ZGxpYi5tYWluLCBkeW5hbWljU2NvcGUsIG93bmVyIH0sXG4gICAgY29udGV4dFxuICApO1xuICByZXR1cm4gcmVuZGVySW52b2NhdGlvbih2bSwgY29udGV4dCwgb3duZXIsIGRlZmluaXRpb24sIHJlY29yZFRvUmVmZXJlbmNlKGFyZ3MpKTtcbn1cblxuZnVuY3Rpb24gcmVjb3JkVG9SZWZlcmVuY2UocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIFJlZmVyZW5jZT4ge1xuICBjb25zdCByb290ID0gY3JlYXRlQ29uc3RSZWYocmVjb3JkLCAnYXJncycpO1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhyZWNvcmQpLnJlZHVjZSgoYWNjLCBrZXkpID0+IHtcbiAgICBhY2Nba2V5XSA9IGNoaWxkUmVmRm9yKHJvb3QsIGtleSk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgUmVmZXJlbmNlPik7XG59XG4iXSwic291cmNlUm9vdCI6IiJ9