@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
160 lines (122 loc) • 12.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isScopeReference = isScopeReference;
exports.PartialScopeImpl = exports.DynamicScopeImpl = void 0;
var _util = require("@glimmer/util");
var _reference = require("@glimmer/reference");
class DynamicScopeImpl {
constructor(bucket) {
if (bucket) {
this.bucket = (0, _util.assign)({}, bucket);
} else {
this.bucket = {};
}
}
get(key) {
return this.bucket[key];
}
set(key, reference) {
return this.bucket[key] = reference;
}
child() {
return new DynamicScopeImpl(this.bucket);
}
}
exports.DynamicScopeImpl = DynamicScopeImpl;
function isScopeReference(s) {
if (s === null || Array.isArray(s)) return false;
return true;
}
class PartialScopeImpl {
constructor( // the 0th slot is `self`
slots, owner, callerScope, // named arguments and blocks passed to a layout that uses eval
evalScope, // locals in scope when the partial was invoked
partialMap) {
this.slots = slots;
this.owner = owner;
this.callerScope = callerScope;
this.evalScope = evalScope;
this.partialMap = partialMap;
}
static root(self, size = 0, owner) {
let refs = new Array(size + 1);
for (let i = 0; i <= size; i++) {
refs[i] = _reference.UNDEFINED_REFERENCE;
}
return new PartialScopeImpl(refs, owner, null, null, null).init({
self
});
}
static sized(size = 0, owner) {
let refs = new Array(size + 1);
for (let i = 0; i <= size; i++) {
refs[i] = _reference.UNDEFINED_REFERENCE;
}
return new PartialScopeImpl(refs, owner, null, null, null);
}
init({
self
}) {
this.slots[0] = self;
return this;
}
getSelf() {
return this.get(0);
}
getSymbol(symbol) {
return this.get(symbol);
}
getBlock(symbol) {
let block = this.get(symbol);
return block === _reference.UNDEFINED_REFERENCE ? null : block;
}
getEvalScope() {
return this.evalScope;
}
getPartialMap() {
return this.partialMap;
}
bind(symbol, value) {
this.set(symbol, value);
}
bindSelf(self) {
this.set(0, self);
}
bindSymbol(symbol, value) {
this.set(symbol, value);
}
bindBlock(symbol, value) {
this.set(symbol, value);
}
bindEvalScope(map) {
this.evalScope = map;
}
bindPartialMap(map) {
this.partialMap = map;
}
bindCallerScope(scope) {
this.callerScope = scope;
}
getCallerScope() {
return this.callerScope;
}
child() {
return new PartialScopeImpl(this.slots.slice(), this.owner, this.callerScope, this.evalScope, this.partialMap);
}
get(index) {
if (index >= this.slots.length) {
throw new RangeError(`BUG: cannot get $${index} from scope; length=${this.slots.length}`);
}
return this.slots[index];
}
set(index, value) {
if (index >= this.slots.length) {
throw new RangeError(`BUG: cannot get $${index} from scope; length=${this.slots.length}`);
}
this.slots[index] = value;
}
}
exports.PartialScopeImpl = PartialScopeImpl;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3Njb3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBVUE7O0FBQ0E7O0FBRU0sTUFBQSxnQkFBQSxDQUF1QjtBQUczQixFQUFBLFdBQUEsQ0FBQSxNQUFBLEVBQW9DO0FBQ2xDLFFBQUEsTUFBQSxFQUFZO0FBQ1YsV0FBQSxNQUFBLEdBQWMsa0JBQU0sRUFBTixFQUFkLE1BQWMsQ0FBZDtBQURGLEtBQUEsTUFFTztBQUNMLFdBQUEsTUFBQSxHQUFBLEVBQUE7QUFDRDtBQUNGOztBQUVELEVBQUEsR0FBRyxDQUFBLEdBQUEsRUFBWTtBQUNiLFdBQU8sS0FBQSxNQUFBLENBQVAsR0FBTyxDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxHQUFHLENBQUEsR0FBQSxFQUFBLFNBQUEsRUFBa0M7QUFDbkMsV0FBUSxLQUFBLE1BQUEsQ0FBQSxHQUFBLElBQVIsU0FBQTtBQUNEOztBQUVELEVBQUEsS0FBSyxHQUFBO0FBQ0gsV0FBTyxJQUFBLGdCQUFBLENBQXFCLEtBQTVCLE1BQU8sQ0FBUDtBQUNEOztBQXJCMEI7Ozs7QUF3QnZCLFNBQUEsZ0JBQUEsQ0FBQSxDQUFBLEVBQXVDO0FBQzNDLE1BQUksQ0FBQyxLQUFELElBQUEsSUFBYyxLQUFLLENBQUwsT0FBQSxDQUFsQixDQUFrQixDQUFsQixFQUFvQyxPQUFBLEtBQUE7QUFDcEMsU0FBQSxJQUFBO0FBQ0Q7O0FBRUssTUFBQSxnQkFBQSxDQUF1QjtBQXFCM0IsRUFBQSxXQUFBLEVBQ0U7QUFERixFQUFBLEtBQUEsRUFBQSxLQUFBLEVBQUEsV0FBQSxFQUtFO0FBTEYsRUFBQSxTQUFBLEVBT0U7QUFQRixFQUFBLFVBQUEsRUFRcUQ7QUFOMUMsU0FBQSxLQUFBLEdBQUEsS0FBQTtBQUNBLFNBQUEsS0FBQSxHQUFBLEtBQUE7QUFDRCxTQUFBLFdBQUEsR0FBQSxXQUFBO0FBRUEsU0FBQSxTQUFBLEdBQUEsU0FBQTtBQUVBLFNB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RkssS0FBQSxFQUdMLEtBSEssV0FBQSxFQUlMLEtBSkssU0FBQSxFQUtMLEtBTEYsVUFBTyxDQUFQO0FBT0Q7O0FBRU8sRUFBQSxHQUFHLENBQUEsS0FBQSxFQUFtQztBQUM1QyxRQUFJLEtBQUssSUFBSSxLQUFBLEtBQUEsQ0FBYixNQUFBLEVBQWdDO0FBQzlCLFlBQU0sSUFBQSxVQUFBLENBQWUsb0JBQW9CLEtBQUssdUJBQXVCLEtBQUEsS0FBQSxDQUFXLE1BQWhGLEVBQU0sQ0FBTjtBQUNEOztBQUVELFdBQU8sS0FBQSxLQUFBLENBQVAsS0FBTyxDQUFQO0FBQ0Q7O0FBRU8sRUFBQSxHQUFHLENBQUEsS0FBQSxFQUFBLEtBQUEsRUFBNkM7QUFDdEQsUUFBSSxLQUFLLElBQUksS0FBQSxLQUFBLENBQWIsTUFBQSxFQUFnQztBQUM5QixZQUFNLElBQUEsVUFBQSxDQUFlLG9CQUFvQixLQUFLLHVCQUF1QixLQUFBLEtBQUEsQ0FBVyxNQUFoRixFQUFNLENBQU47QUFDRDs7QUFFRCxTQUFBLEtBQUEsQ0FBQSxLQUFBLElBQUEsS0FBQTtBQUNEOztBQWxIMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEeW5hbWljU2NvcGUsXG4gIERpY3QsXG4gIFBhcnRpYWxTY29wZSxcbiAgU2NvcGVTbG90LFxuICBTY29wZUJsb2NrLFxuICBPcHRpb24sXG4gIFNjb3BlLFxuICBPd25lcixcbn0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBhc3NpZ24gfSBmcm9tICdAZ2xpbW1lci91dGlsJztcbmltcG9ydCB7IFJlZmVyZW5jZSwgVU5ERUZJTkVEX1JFRkVSRU5DRSB9IGZyb20gJ0BnbGltbWVyL3JlZmVyZW5jZSc7XG5cbmV4cG9ydCBjbGFzcyBEeW5hbWljU2NvcGVJbXBsIGltcGxlbWVudHMgRHluYW1pY1Njb3BlIHtcbiAgcHJpdmF0ZSBidWNrZXQ6IERpY3Q8UmVmZXJlbmNlPjtcblxuICBjb25zdHJ1Y3RvcihidWNrZXQ/OiBEaWN0PFJlZmVyZW5jZT4pIHtcbiAgICBpZiAoYnVja2V0KSB7XG4gICAgICB0aGlzLmJ1Y2tldCA9IGFzc2lnbih7fSwgYnVja2V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5idWNrZXQgPSB7fTtcbiAgICB9XG4gIH1cblxuICBnZXQoa2V5OiBzdHJpbmcpOiBSZWZlcmVuY2Uge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldFtrZXldO1xuICB9XG5cbiAgc2V0KGtleTogc3RyaW5nLCByZWZlcmVuY2U6IFJlZmVyZW5jZSk6IFJlZmVyZW5jZSB7XG4gICAgcmV0dXJuICh0aGlzLmJ1Y2tldFtrZXldID0gcmVmZXJlbmNlKTtcbiAgfVxuXG4gIGNoaWxkKCk6IER5bmFtaWNTY29wZUltcGwge1xuICAgIHJldHVybiBuZXcgRHluYW1pY1Njb3BlSW1wbCh0aGlzLmJ1Y2tldCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU2NvcGVSZWZlcmVuY2UoczogU2NvcGVTbG90KTogcyBpcyBSZWZlcmVuY2Uge1xuICBpZiAocyA9PT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KHMpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgY2xhc3MgUGFydGlhbFNjb3BlSW1wbCBpbXBsZW1lbnRzIFBhcnRpYWxTY29wZSB7XG4gIHN0YXRpYyByb290KHNlbGY6IFJlZmVyZW5jZTx1bmtub3duPiwgc2l6ZSA9IDAsIG93bmVyOiBPd25lcik6IFBhcnRpYWxTY29wZSB7XG4gICAgbGV0IHJlZnM6IFJlZmVyZW5jZTx1bmtub3duPltdID0gbmV3IEFycmF5KHNpemUgKyAxKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHNpemU7IGkrKykge1xuICAgICAgcmVmc1tpXSA9IFVOREVGSU5FRF9SRUZFUkVOQ0U7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQYXJ0aWFsU2NvcGVJbXBsKHJlZnMsIG93bmVyLCBudWxsLCBudWxsLCBudWxsKS5pbml0KHsgc2VsZiB9KTtcbiAgfVxuXG4gIHN0YXRpYyBzaXplZChzaXplID0gMCwgb3duZXI6IE93bmVyKTogU2NvcGUge1xuICAgIGxldCByZWZzOiBSZWZlcmVuY2U8dW5rbm93bj5bXSA9IG5ldyBBcnJheShzaXplICsgMSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBzaXplOyBpKyspIHtcbiAgICAgIHJlZnNbaV0gPSBVTkRFRklORURfUkVGRVJFTkNFO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUGFydGlhbFNjb3BlSW1wbChyZWZzLCBvd25lciwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICAvLyB0aGUgMHRoIHNsb3QgaXMgYHNlbGZgXG4gICAgcmVhZG9ubHkgc2xvdHM6IEFycmF5PFNjb3BlU2xvdD4sXG4gICAgcmVhZG9ubHkgb3duZXI6IE93bmVyLFxuICAgIHByaXZhdGUgY2FsbGVyU2NvcGU6IFNjb3BlIHwgbnVsbCxcbiAgICAvLyBuYW1lZCBhcmd1bWVudHMgYW5kIGJsb2NrcyBwYXNzZWQgdG8gYSBsYXlvdXQgdGhhdCB1c2VzIGV2YWxcbiAgICBwcml2YXRlIGV2YWxTY29wZTogRGljdDxTY29wZVNsb3Q+IHwgbnVsbCxcbiAgICAvLyBsb2NhbHMgaW4gc2NvcGUgd2hlbiB0aGUgcGFydGlhbCB3YXMgaW52b2tlZFxuICAgIHByaXZhdGUgcGFydGlhbE1hcDogRGljdDxSZWZlcmVuY2U8dW5rbm93bj4+IHwgbnVsbFxuICApIHt9XG5cbiAgaW5pdCh7IHNlbGYgfTogeyBzZWxmOiBSZWZlcmVuY2U8dW5rbm93bj4gfSk6IHRoaXMge1xuICAgIHRoaXMuc2xvdHNbMF0gPSBzZWxmO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0U2VsZigpOiBSZWZlcmVuY2U8dW5rbm93bj4ge1xuICAgIHJldHVybiB0aGlzLmdldDxSZWZlcmVuY2U8dW5rbm93bj4+KDApO1xuICB9XG5cbiAgZ2V0U3ltYm9sKHN5bWJvbDogbnVtYmVyKTogUmVmZXJlbmNlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQ8UmVmZXJlbmNlPHVua25vd24+PihzeW1ib2wpO1xuICB9XG5cbiAgZ2V0QmxvY2soc3ltYm9sOiBudW1iZXIpOiBPcHRpb248U2NvcGVCbG9jaz4ge1xuICAgIGxldCBibG9jayA9IHRoaXMuZ2V0KHN5bWJvbCk7XG4gICAgcmV0dXJuIGJsb2NrID09PSBVTkRFRklORURfUkVGRVJFTkNFID8gbnVsbCA6IChibG9jayBhcyBTY29wZUJsb2NrKTtcbiAgfVxuXG4gIGdldEV2YWxTY29wZSgpOiBPcHRpb248RGljdDxTY29wZVNsb3Q+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXZhbFNjb3BlO1xuICB9XG5cbiAgZ2V0UGFydGlhbE1hcCgpOiBPcHRpb248RGljdDxSZWZlcmVuY2U8dW5rbm93bj4+PiB7XG4gICAgcmV0dXJuIHRoaXMucGFydGlhbE1hcDtcbiAgfVxuXG4gIGJpbmQoc3ltYm9sOiBudW1iZXIsIHZhbHVlOiBTY29wZVNsb3QpIHtcbiAgICB0aGlzLnNldChzeW1ib2wsIHZhbHVlKTtcbiAgfVxuXG4gIGJpbmRTZWxmKHNlbGY6IFJlZmVyZW5jZTx1bmtub3duPikge1xuICAgIHRoaXMuc2V0PFJlZmVyZW5jZTx1bmtub3duPj4oMCwgc2VsZik7XG4gIH1cblxuICBiaW5kU3ltYm9sKHN5bWJvbDogbnVtYmVyLCB2YWx1ZTogUmVmZXJlbmNlPHVua25vd24+KSB7XG4gICAgdGhpcy5zZXQoc3ltYm9sLCB2YWx1ZSk7XG4gIH1cblxuICBiaW5kQmxvY2soc3ltYm9sOiBudW1iZXIsIHZhbHVlOiBPcHRpb248U2NvcGVCbG9jaz4pIHtcbiAgICB0aGlzLnNldDxPcHRpb248U2NvcGVCbG9jaz4+KHN5bWJvbCwgdmFsdWUpO1xuICB9XG5cbiAgYmluZEV2YWxTY29wZShtYXA6IE9wdGlvbjxEaWN0PFNjb3BlU2xvdD4+KSB7XG4gICAgdGhpcy5ldmFsU2NvcGUgPSBtYXA7XG4gIH1cblxuICBiaW5kUGFydGlhbE1hcChtYXA6IERpY3Q8UmVmZXJlbmNlPHVua25vd24+Pikge1xuICAgIHRoaXMucGFydGlhbE1hcCA9IG1hcDtcbiAgfVxuXG4gIGJpbmRDYWxsZXJTY29wZShzY29wZTogT3B0aW9uPFNjb3BlPik6IHZvaWQge1xuICAgIHRoaXMuY2FsbGVyU2NvcGUgPSBzY29wZTtcbiAgfVxuXG4gIGdldENhbGxlclNjb3BlKCk6IE9wdGlvbjxTY29wZT4ge1xuICAgIHJldHVybiB0aGlzLmNhbGxlclNjb3BlO1xuICB9XG5cbiAgY2hpbGQoKTogU2NvcGUge1xuICAgIHJldHVybiBuZXcgUGFydGlhbFNjb3BlSW1wbChcbiAgICAgIHRoaXMuc2xvdHMuc2xpY2UoKSxcbiAgICAgIHRoaXMub3duZXIsXG4gICAgICB0aGlzLmNhbGxlclNjb3BlLFxuICAgICAgdGhpcy5ldmFsU2NvcGUsXG4gICAgICB0aGlzLnBhcnRpYWxNYXBcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQ8VCBleHRlbmRzIFNjb3BlU2xvdD4oaW5kZXg6IG51bWJlcik6IFQge1xuICAgIGlmIChpbmRleCA+PSB0aGlzLnNsb3RzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEJVRzogY2Fubm90IGdldCAkJHtpbmRleH0gZnJvbSBzY29wZTsgbGVuZ3RoPSR7dGhpcy5zbG90cy5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2xvdHNbaW5kZXhdIGFzIFQ7XG4gIH1cblxuICBwcml2YXRlIHNldDxUIGV4dGVuZHMgU2NvcGVTbG90PihpbmRleDogbnVtYmVyLCB2YWx1ZTogVCk6IHZvaWQge1xuICAgIGlmIChpbmRleCA+PSB0aGlzLnNsb3RzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEJVRzogY2Fubm90IGdldCAkJHtpbmRleH0gZnJvbSBzY29wZTsgbGVuZ3RoPSR7dGhpcy5zbG90cy5sZW5ndGh9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5zbG90c1tpbmRleF0gPSB2YWx1ZTtcbiAgfVxufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==