UNPKG

@glimmer/runtime

Version:

Minimal runtime needed to render Glimmer templates

144 lines (114 loc) 12.6 kB
import { assign } from '@glimmer/util'; import { UNDEFINED_REFERENCE } from '@glimmer/reference'; export class DynamicScopeImpl { constructor(bucket) { if (bucket) { this.bucket = 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); } } export function isScopeReference(s) { if (s === null || Array.isArray(s)) return false; return true; } export 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] = 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] = 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 === 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; } } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL3Njb3BlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVVBLFNBQVMsTUFBVCxRQUF1QixlQUF2QjtBQUNBLFNBQW9CLG1CQUFwQixRQUErQyxvQkFBL0M7QUFFQSxPQUFNLE1BQU8sZ0JBQVAsQ0FBdUI7QUFHM0IsRUFBQSxXQUFBLENBQVksTUFBWixFQUFvQztBQUNsQyxRQUFJLE1BQUosRUFBWTtBQUNWLFdBQUssTUFBTCxHQUFjLE1BQU0sQ0FBQyxFQUFELEVBQUssTUFBTCxDQUFwQjtBQUNELEtBRkQsTUFFTztBQUNMLFdBQUssTUFBTCxHQUFjLEVBQWQ7QUFDRDtBQUNGOztBQUVELEVBQUEsR0FBRyxDQUFDLEdBQUQsRUFBWTtBQUNiLFdBQU8sS0FBSyxNQUFMLENBQVksR0FBWixDQUFQO0FBQ0Q7O0FBRUQsRUFBQSxHQUFHLENBQUMsR0FBRCxFQUFjLFNBQWQsRUFBa0M7QUFDbkMsV0FBUSxLQUFLLE1BQUwsQ0FBWSxHQUFaLElBQW1CLFNBQTNCO0FBQ0Q7O0FBRUQsRUFBQSxLQUFLLEdBQUE7QUFDSCxXQUFPLElBQUksZ0JBQUosQ0FBcUIsS0FBSyxNQUExQixDQUFQO0FBQ0Q7O0FBckIwQjtBQXdCN0IsT0FBTSxTQUFVLGdCQUFWLENBQTJCLENBQTNCLEVBQXVDO0FBQzNDLE1BQUksQ0FBQyxLQUFLLElBQU4sSUFBYyxLQUFLLENBQUMsT0FBTixDQUFjLENBQWQsQ0FBbEIsRUFBb0MsT0FBTyxLQUFQO0FBQ3BDLFNBQU8sSUFBUDtBQUNEO0FBRUQsT0FBTSxNQUFPLGdCQUFQLENBQXVCO0FBcUIzQixFQUFBLFdBQUEsRUFDRTtBQUNTLEVBQUEsS0FGWCxFQUdXLEtBSFgsRUFJVSxXQUpWLEVBS0U7QUFDUSxFQUFBLFNBTlYsRUFPRTtBQUNRLEVBQUEsVUFSVixFQVFxRDtBQU4xQyxTQUFBLEtBQUEsR0FBQSxLQUFBO0FBQ0EsU0FBQSxLQUFBLEdBQUEsS0FBQTtB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Y0FBYyxHQUFBO0FBQ1osV0FBTyxLQUFLLFdBQVo7QUFDRDs7QUFFRCxFQUFBLEtBQUssR0FBQTtBQUNILFdBQU8sSUFBSSxnQkFBSixDQUNMLEtBQUssS0FBTCxDQUFXLEtBQVgsRUFESyxFQUVMLEtBQUssS0FGQSxFQUdMLEtBQUssV0FIQSxFQUlMLEtBQUssU0FKQSxFQUtMLEtBQUssVUFMQSxDQUFQO0FBT0Q7O0FBRU8sRUFBQSxHQUFHLENBQXNCLEtBQXRCLEVBQW1DO0FBQzVDLFFBQUksS0FBSyxJQUFJLEtBQUssS0FBTCxDQUFXLE1BQXhCLEVBQWdDO0FBQzlCLFlBQU0sSUFBSSxVQUFKLENBQWUsb0JBQW9CLEtBQUssdUJBQXVCLEtBQUssS0FBTCxDQUFXLE1BQU0sRUFBaEYsQ0FBTjtBQUNEOztBQUVELFdBQU8sS0FBSyxLQUFMLENBQVcsS0FBWCxDQUFQO0FBQ0Q7O0FBRU8sRUFBQSxHQUFHLENBQXNCLEtBQXRCLEVBQXFDLEtBQXJDLEVBQTZDO0FBQ3RELFFBQUksS0FBSyxJQUFJLEtBQUssS0FBTCxDQUFXLE1BQXhCLEVBQWdDO0FBQzlCLFlBQU0sSUFBSSxVQUFKLENBQWUsb0JBQW9CLEtBQUssdUJBQXVCLEtBQUssS0FBTCxDQUFXLE1BQU0sRUFBaEYsQ0FBTjtBQUNEOztBQUVELFNBQUssS0FBTCxDQUFXLEtBQVgsSUFBb0IsS0FBcEI7QUFDRDs7QUFsSDBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRHluYW1pY1Njb3BlLFxuICBEaWN0LFxuICBQYXJ0aWFsU2NvcGUsXG4gIFNjb3BlU2xvdCxcbiAgU2NvcGVCbG9jayxcbiAgT3B0aW9uLFxuICBTY29wZSxcbiAgT3duZXIsXG59IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgYXNzaWduIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBSZWZlcmVuY2UsIFVOREVGSU5FRF9SRUZFUkVOQ0UgfSBmcm9tICdAZ2xpbW1lci9yZWZlcmVuY2UnO1xuXG5leHBvcnQgY2xhc3MgRHluYW1pY1Njb3BlSW1wbCBpbXBsZW1lbnRzIER5bmFtaWNTY29wZSB7XG4gIHByaXZhdGUgYnVja2V0OiBEaWN0PFJlZmVyZW5jZT47XG5cbiAgY29uc3RydWN0b3IoYnVja2V0PzogRGljdDxSZWZlcmVuY2U+KSB7XG4gICAgaWYgKGJ1Y2tldCkge1xuICAgICAgdGhpcy5idWNrZXQgPSBhc3NpZ24oe30sIGJ1Y2tldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYnVja2V0ID0ge307XG4gICAgfVxuICB9XG5cbiAgZ2V0KGtleTogc3RyaW5nKTogUmVmZXJlbmNlIHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXRba2V5XTtcbiAgfVxuXG4gIHNldChrZXk6IHN0cmluZywgcmVmZXJlbmNlOiBSZWZlcmVuY2UpOiBSZWZlcmVuY2Uge1xuICAgIHJldHVybiAodGhpcy5idWNrZXRba2V5XSA9IHJlZmVyZW5jZSk7XG4gIH1cblxuICBjaGlsZCgpOiBEeW5hbWljU2NvcGVJbXBsIHtcbiAgICByZXR1cm4gbmV3IER5bmFtaWNTY29wZUltcGwodGhpcy5idWNrZXQpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Njb3BlUmVmZXJlbmNlKHM6IFNjb3BlU2xvdCk6IHMgaXMgUmVmZXJlbmNlIHtcbiAgaWYgKHMgPT09IG51bGwgfHwgQXJyYXkuaXNBcnJheShzKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGNsYXNzIFBhcnRpYWxTY29wZUltcGwgaW1wbGVtZW50cyBQYXJ0aWFsU2NvcGUge1xuICBzdGF0aWMgcm9vdChzZWxmOiBSZWZlcmVuY2U8dW5rbm93bj4sIHNpemUgPSAwLCBvd25lcjogT3duZXIpOiBQYXJ0aWFsU2NvcGUge1xuICAgIGxldCByZWZzOiBSZWZlcmVuY2U8dW5rbm93bj5bXSA9IG5ldyBBcnJheShzaXplICsgMSk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBzaXplOyBpKyspIHtcbiAgICAgIHJlZnNbaV0gPSBVTkRFRklORURfUkVGRVJFTkNFO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgUGFydGlhbFNjb3BlSW1wbChyZWZzLCBvd25lciwgbnVsbCwgbnVsbCwgbnVsbCkuaW5pdCh7IHNlbGYgfSk7XG4gIH1cblxuICBzdGF0aWMgc2l6ZWQoc2l6ZSA9IDAsIG93bmVyOiBPd25lcik6IFNjb3BlIHtcbiAgICBsZXQgcmVmczogUmVmZXJlbmNlPHVua25vd24+W10gPSBuZXcgQXJyYXkoc2l6ZSArIDEpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gc2l6ZTsgaSsrKSB7XG4gICAgICByZWZzW2ldID0gVU5ERUZJTkVEX1JFRkVSRU5DRTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFBhcnRpYWxTY29wZUltcGwocmVmcywgb3duZXIsIG51bGwsIG51bGwsIG51bGwpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgLy8gdGhlIDB0aCBzbG90IGlzIGBzZWxmYFxuICAgIHJlYWRvbmx5IHNsb3RzOiBBcnJheTxTY29wZVNsb3Q+LFxuICAgIHJlYWRvbmx5IG93bmVyOiBPd25lcixcbiAgICBwcml2YXRlIGNhbGxlclNjb3BlOiBTY29wZSB8IG51bGwsXG4gICAgLy8gbmFtZWQgYXJndW1lbnRzIGFuZCBibG9ja3MgcGFzc2VkIHRvIGEgbGF5b3V0IHRoYXQgdXNlcyBldmFsXG4gICAgcHJpdmF0ZSBldmFsU2NvcGU6IERpY3Q8U2NvcGVTbG90PiB8IG51bGwsXG4gICAgLy8gbG9jYWxzIGluIHNjb3BlIHdoZW4gdGhlIHBhcnRpYWwgd2FzIGludm9rZWRcbiAgICBwcml2YXRlIHBhcnRpYWxNYXA6IERpY3Q8UmVmZXJlbmNlPHVua25vd24+PiB8IG51bGxcbiAgKSB7fVxuXG4gIGluaXQoeyBzZWxmIH06IHsgc2VsZjogUmVmZXJlbmNlPHVua25vd24+IH0pOiB0aGlzIHtcbiAgICB0aGlzLnNsb3RzWzBdID0gc2VsZjtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldFNlbGYoKTogUmVmZXJlbmNlPHVua25vd24+IHtcbiAgICByZXR1cm4gdGhpcy5nZXQ8UmVmZXJlbmNlPHVua25vd24+PigwKTtcbiAgfVxuXG4gIGdldFN5bWJvbChzeW1ib2w6IG51bWJlcik6IFJlZmVyZW5jZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0PFJlZmVyZW5jZTx1bmtub3duPj4oc3ltYm9sKTtcbiAgfVxuXG4gIGdldEJsb2NrKHN5bWJvbDogbnVtYmVyKTogT3B0aW9uPFNjb3BlQmxvY2s+IHtcbiAgICBsZXQgYmxvY2sgPSB0aGlzLmdldChzeW1ib2wpO1xuICAgIHJldHVybiBibG9jayA9PT0gVU5ERUZJTkVEX1JFRkVSRU5DRSA/IG51bGwgOiAoYmxvY2sgYXMgU2NvcGVCbG9jayk7XG4gIH1cblxuICBnZXRFdmFsU2NvcGUoKTogT3B0aW9uPERpY3Q8U2NvcGVTbG90Pj4ge1xuICAgIHJldHVybiB0aGlzLmV2YWxTY29wZTtcbiAgfVxuXG4gIGdldFBhcnRpYWxNYXAoKTogT3B0aW9uPERpY3Q8UmVmZXJlbmNlPHVua25vd24+Pj4ge1xuICAgIHJldHVybiB0aGlzLnBhcnRpYWxNYXA7XG4gIH1cblxuICBiaW5kKHN5bWJvbDogbnVtYmVyLCB2YWx1ZTogU2NvcGVTbG90KSB7XG4gICAgdGhpcy5zZXQoc3ltYm9sLCB2YWx1ZSk7XG4gIH1cblxuICBiaW5kU2VsZihzZWxmOiBSZWZlcmVuY2U8dW5rbm93bj4pIHtcbiAgICB0aGlzLnNldDxSZWZlcmVuY2U8dW5rbm93bj4+KDAsIHNlbGYpO1xuICB9XG5cbiAgYmluZFN5bWJvbChzeW1ib2w6IG51bWJlciwgdmFsdWU6IFJlZmVyZW5jZTx1bmtub3duPikge1xuICAgIHRoaXMuc2V0KHN5bWJvbCwgdmFsdWUpO1xuICB9XG5cbiAgYmluZEJsb2NrKHN5bWJvbDogbnVtYmVyLCB2YWx1ZTogT3B0aW9uPFNjb3BlQmxvY2s+KSB7XG4gICAgdGhpcy5zZXQ8T3B0aW9uPFNjb3BlQmxvY2s+PihzeW1ib2wsIHZhbHVlKTtcbiAgfVxuXG4gIGJpbmRFdmFsU2NvcGUobWFwOiBPcHRpb248RGljdDxTY29wZVNsb3Q+Pikge1xuICAgIHRoaXMuZXZhbFNjb3BlID0gbWFwO1xuICB9XG5cbiAgYmluZFBhcnRpYWxNYXAobWFwOiBEaWN0PFJlZmVyZW5jZTx1bmtub3duPj4pIHtcbiAgICB0aGlzLnBhcnRpYWxNYXAgPSBtYXA7XG4gIH1cblxuICBiaW5kQ2FsbGVyU2NvcGUoc2NvcGU6IE9wdGlvbjxTY29wZT4pOiB2b2lkIHtcbiAgICB0aGlzLmNhbGxlclNjb3BlID0gc2NvcGU7XG4gIH1cblxuICBnZXRDYWxsZXJTY29wZSgpOiBPcHRpb248U2NvcGU+IHtcbiAgICByZXR1cm4gdGhpcy5jYWxsZXJTY29wZTtcbiAgfVxuXG4gIGNoaWxkKCk6IFNjb3BlIHtcbiAgICByZXR1cm4gbmV3IFBhcnRpYWxTY29wZUltcGwoXG4gICAgICB0aGlzLnNsb3RzLnNsaWNlKCksXG4gICAgICB0aGlzLm93bmVyLFxuICAgICAgdGhpcy5jYWxsZXJTY29wZSxcbiAgICAgIHRoaXMuZXZhbFNjb3BlLFxuICAgICAgdGhpcy5wYXJ0aWFsTWFwXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0PFQgZXh0ZW5kcyBTY29wZVNsb3Q+KGluZGV4OiBudW1iZXIpOiBUIHtcbiAgICBpZiAoaW5kZXggPj0gdGhpcy5zbG90cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBCVUc6IGNhbm5vdCBnZXQgJCR7aW5kZXh9IGZyb20gc2NvcGU7IGxlbmd0aD0ke3RoaXMuc2xvdHMubGVuZ3RofWApO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNsb3RzW2luZGV4XSBhcyBUO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXQ8VCBleHRlbmRzIFNjb3BlU2xvdD4oaW5kZXg6IG51bWJlciwgdmFsdWU6IFQpOiB2b2lkIHtcbiAgICBpZiAoaW5kZXggPj0gdGhpcy5zbG90cy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBCVUc6IGNhbm5vdCBnZXQgJCR7aW5kZXh9IGZyb20gc2NvcGU7IGxlbmd0aD0ke3RoaXMuc2xvdHMubGVuZ3RofWApO1xuICAgIH1cblxuICAgIHRoaXMuc2xvdHNbaW5kZXhdID0gdmFsdWU7XG4gIH1cbn1cbiJdLCJzb3VyY2VSb290IjoiIn0=