@glimmer/runtime
Version:
Minimal runtime needed to render Glimmer templates
135 lines (127 loc) • 13.5 kB
JavaScript
import { isConstRef, valueForRef } from '@glimmer/reference';
import { isObject } from '@glimmer/util';
import { APPEND_OPCODES } from '../../opcodes';
import { isEmpty, isSafeString, isFragment, isNode, shouldCoerce } from '../../dom/normalize';
import DynamicTextContent from '../../vm/content/text';
import { AssertFilter } from './vm';
import { hasInternalComponentManager, hasInternalHelperManager } from '@glimmer/manager';
import { DEBUG } from '@glimmer/env';
import { isCurriedType } from '../../curried-value';
function toContentType(value) {
if (shouldCoerce(value)) {
return 2
/* String */
;
} else if (isCurriedType(value, 0
/* Component */
) || hasInternalComponentManager(value)) {
return 0
/* Component */
;
} else if (isCurriedType(value, 1
/* Helper */
) || hasInternalHelperManager(value)) {
return 1
/* Helper */
;
} else if (isSafeString(value)) {
return 4
/* SafeString */
;
} else if (isFragment(value)) {
return 5
/* Fragment */
;
} else if (isNode(value)) {
return 6
/* Node */
;
} else {
return 2
/* String */
;
}
}
function toDynamicContentType(value) {
if (!isObject(value)) {
return 2
/* String */
;
}
if (isCurriedType(value, 0
/* Component */
) || hasInternalComponentManager(value)) {
return 0
/* Component */
;
} else {
if (DEBUG && !isCurriedType(value, 1
/* Helper */
) && !hasInternalHelperManager(value)) {
throw new Error(`Attempted use a dynamic value as a component or helper, but that value did not have an associated component or helper manager. The value was: ${value}`);
}
return 1
/* Helper */
;
}
}
APPEND_OPCODES.add(76
/* ContentType */
, vm => {
let reference = vm.stack.peek();
vm.stack.push(toContentType(valueForRef(reference)));
if (!isConstRef(reference)) {
vm.updateWith(new AssertFilter(reference, toContentType));
}
});
APPEND_OPCODES.add(106
/* DynamicContentType */
, vm => {
let reference = vm.stack.peek();
vm.stack.push(toDynamicContentType(valueForRef(reference)));
if (!isConstRef(reference)) {
vm.updateWith(new AssertFilter(reference, toDynamicContentType));
}
});
APPEND_OPCODES.add(43
/* AppendHTML */
, vm => {
let reference = vm.stack.pop();
let rawValue = valueForRef(reference);
let value = isEmpty(rawValue) ? '' : String(rawValue);
vm.elements().appendDynamicHTML(value);
});
APPEND_OPCODES.add(44
/* AppendSafeHTML */
, vm => {
let reference = vm.stack.pop();
let rawValue = valueForRef(reference).toHTML();
let value = isEmpty(rawValue) ? '' : rawValue;
vm.elements().appendDynamicHTML(value);
});
APPEND_OPCODES.add(47
/* AppendText */
, vm => {
let reference = vm.stack.pop();
let rawValue = valueForRef(reference);
let value = isEmpty(rawValue) ? '' : String(rawValue);
let node = vm.elements().appendDynamicText(value);
if (!isConstRef(reference)) {
vm.updateWith(new DynamicTextContent(node, reference, value));
}
});
APPEND_OPCODES.add(45
/* AppendDocumentFragment */
, vm => {
let reference = vm.stack.pop();
let value = valueForRef(reference);
vm.elements().appendDynamicFragment(value);
});
APPEND_OPCODES.add(46
/* AppendNode */
, vm => {
let reference = vm.stack.pop();
let value = valueForRef(reference);
vm.elements().appendDynamicNode(value);
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL3J1bnRpbWUvbGliL2NvbXBpbGVkL29wY29kZXMvY29udGVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxTQUFTLFVBQVQsRUFBcUIsV0FBckIsUUFBd0Msb0JBQXhDO0FBUUEsU0FBUyxRQUFULFFBQXlCLGVBQXpCO0FBRUEsU0FBUyxjQUFULFFBQStCLGVBQS9CO0FBRUEsU0FBUyxPQUFULEVBQWtCLFlBQWxCLEVBQWdDLFVBQWhDLEVBQTRDLE1BQTVDLEVBQW9ELFlBQXBELFFBQXdFLHFCQUF4RTtBQUNBLE9BQU8sa0JBQVAsTUFBK0IsdUJBQS9CO0FBRUEsU0FBUyxZQUFULFFBQTZCLE1BQTdCO0FBQ0EsU0FBUywyQkFBVCxFQUFzQyx3QkFBdEMsUUFBc0Usa0JBQXRFO0FBQ0EsU0FBUyxLQUFULFFBQXNCLGNBQXRCO0FBQ0EsU0FBUyxhQUFULFFBQThCLHFCQUE5Qjs7QUFFQSxTQUFTLGFBQVQsQ0FBdUIsS0FBdkIsRUFBcUM7QUFDbkMsTUFBSSxZQUFZLENBQUMsS0FBRCxDQUFoQixFQUF5QjtBQUN2QixXQUFBO0FBQUE7QUFBQTtBQUNELEdBRkQsTUFFTyxJQUNMLGFBQWEsQ0FBQyxLQUFELEVBQU07QUFBQTtBQUFOLEdBQWIsSUFDQSwyQkFBMkIsQ0FBQyxLQUFELENBRnRCLEVBR0w7QUFDQSxXQUFBO0FBQUE7QUFBQTtBQUNELEdBTE0sTUFLQSxJQUNMLGFBQWEsQ0FBQyxLQUFELEVBQU07QUFBQTtBQUFOLEdBQWIsSUFDQSx3QkFBd0IsQ0FBQyxLQUFELENBRm5CLEVBR0w7QUFDQSxXQUFBO0FBQUE7QUFBQTtBQUNELEdBTE0sTUFLQSxJQUFJLFlBQVksQ0FBQyxLQUFELENBQWhCLEVBQXlCO0FBQzlCLFdBQUE7QUFBQTtBQUFBO0FBQ0QsR0FGTSxNQUVBLElBQUksVUFBVSxDQUFDLEtBQUQsQ0FBZCxFQUF1QjtBQUM1QixXQUFBO0FBQUE7QUFBQTtBQUNELEdB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QUFFQSxNQUFJLFFBQVEsR0FBRyxXQUFXLENBQUMsU0FBRCxDQUExQjtBQUNBLE1BQUksS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFELENBQVAsR0FBb0IsRUFBcEIsR0FBeUIsTUFBTSxDQUFDLFFBQUQsQ0FBM0M7QUFFQSxNQUFJLElBQUksR0FBRyxFQUFFLENBQUMsUUFBSCxHQUFjLGlCQUFkLENBQWdDLEtBQWhDLENBQVg7O0FBRUEsTUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFELENBQWYsRUFBNEI7QUFDMUIsSUFBQSxFQUFFLENBQUMsVUFBSCxDQUFjLElBQUksa0JBQUosQ0FBdUIsSUFBdkIsRUFBNkIsU0FBN0IsRUFBd0MsS0FBeEMsQ0FBZDtBQUNEO0FBQ0YsQ0FYRDtBQWFBLGNBQWMsQ0FBQyxHQUFmLENBQWtCO0FBQUE7QUFBbEIsRUFBK0MsRUFBRCxJQUFPO0FBQ25ELE1BQUksU0FBUyxHQUFTLEVBQUUsQ0FBQyxLQUFILENBQVMsR0FBVCxFQUF0QjtBQUVBLE1BQUksS0FBSyxHQUFTLFdBQVcsQ0FBQyxTQUFELENBQTdCO0FBRUEsRUFBQSxFQUFFLENBQUMsUUFBSCxHQUFjLHFCQUFkLENBQW9DLEtBQXBDO0FBQ0QsQ0FORDtBQVFBLGNBQWMsQ0FBQyxHQUFmLENBQWtCO0FBQUE7QUFBbEIsRUFBbUMsRUFBRCxJQUFPO0FBQ3ZDLE1BQUksU0FBUyxHQUFTLEVBQUUsQ0FBQyxLQUFILENBQVMsR0FBVCxFQUF0QjtBQUVBLE1BQUksS0FBSyxHQUFTLFdBQVcsQ0FBQyxTQUFELENBQTdCO0FBRUEsRUFBQSxFQUFFLENBQUMsUUFBSCxHQUFjLGlCQUFkLENBQWdDLEtBQWhDO0FBQ0QsQ0FORCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzQ29uc3RSZWYsIHZhbHVlRm9yUmVmIH0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7XG4gIGNoZWNrLFxuICBDaGVja1N0cmluZyxcbiAgQ2hlY2tTYWZlU3RyaW5nLFxuICBDaGVja05vZGUsXG4gIENoZWNrRG9jdW1lbnRGcmFnbWVudCxcbn0gZnJvbSAnQGdsaW1tZXIvZGVidWcnO1xuaW1wb3J0IHsgaXNPYmplY3QgfSBmcm9tICdAZ2xpbW1lci91dGlsJztcblxuaW1wb3J0IHsgQVBQRU5EX09QQ09ERVMgfSBmcm9tICcuLi8uLi9vcGNvZGVzJztcbmltcG9ydCB7IENoZWNrUmVmZXJlbmNlIH0gZnJvbSAnLi8tZGVidWctc3RyaXAnO1xuaW1wb3J0IHsgaXNFbXB0eSwgaXNTYWZlU3RyaW5nLCBpc0ZyYWdtZW50LCBpc05vZGUsIHNob3VsZENvZXJjZSB9IGZyb20gJy4uLy4uL2RvbS9ub3JtYWxpemUnO1xuaW1wb3J0IER5bmFtaWNUZXh0Q29udGVudCBmcm9tICcuLi8uLi92bS9jb250ZW50L3RleHQnO1xuaW1wb3J0IHsgQ29udGVudFR5cGUsIEN1cnJpZWRUeXBlLCBPcCB9IGZyb20gJ0BnbGltbWVyL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQXNzZXJ0RmlsdGVyIH0gZnJvbSAnLi92bSc7XG5pbXBvcnQgeyBoYXNJbnRlcm5hbENvbXBvbmVudE1hbmFnZXIsIGhhc0ludGVybmFsSGVscGVyTWFuYWdlciB9IGZyb20gJ0BnbGltbWVyL21hbmFnZXInO1xuaW1wb3J0IHsgREVCVUcgfSBmcm9tICdAZ2xpbW1lci9lbnYnO1xuaW1wb3J0IHsgaXNDdXJyaWVkVHlwZSB9IGZyb20gJy4uLy4uL2N1cnJpZWQtdmFsdWUnO1xuXG5mdW5jdGlvbiB0b0NvbnRlbnRUeXBlKHZhbHVlOiB1bmtub3duKSB7XG4gIGlmIChzaG91bGRDb2VyY2UodmFsdWUpKSB7XG4gICAgcmV0dXJuIENvbnRlbnRUeXBlLlN0cmluZztcbiAgfSBlbHNlIGlmIChcbiAgICBpc0N1cnJpZWRUeXBlKHZhbHVlLCBDdXJyaWVkVHlwZS5Db21wb25lbnQpIHx8XG4gICAgaGFzSW50ZXJuYWxDb21wb25lbnRNYW5hZ2VyKHZhbHVlIGFzIG9iamVjdClcbiAgKSB7XG4gICAgcmV0dXJuIENvbnRlbnRUeXBlLkNvbXBvbmVudDtcbiAgfSBlbHNlIGlmIChcbiAgICBpc0N1cnJpZWRUeXBlKHZhbHVlLCBDdXJyaWVkVHlwZS5IZWxwZXIpIHx8XG4gICAgaGFzSW50ZXJuYWxIZWxwZXJNYW5hZ2VyKHZhbHVlIGFzIG9iamVjdClcbiAgKSB7XG4gICAgcmV0dXJuIENvbnRlbnRUeXBlLkhlbHBlcjtcbiAgfSBlbHNlIGlmIChpc1NhZmVTdHJpbmcodmFsdWUpKSB7XG4gICAgcmV0dXJuIENvbnRlbnRUeXBlLlNhZmVTdHJpbmc7XG4gIH0gZWxzZSBpZiAoaXNGcmFnbWVudCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gQ29udGVudFR5cGUuRnJhZ21lbnQ7XG4gIH0gZWxzZSBpZiAoaXNOb2RlKHZhbHVlKSkge1xuICAgIHJldHVybiBDb250ZW50VHlwZS5Ob2RlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBDb250ZW50VHlwZS5TdHJpbmc7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9EeW5hbWljQ29udGVudFR5cGUodmFsdWU6IHVua25vd24pIHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gQ29udGVudFR5cGUuU3RyaW5nO1xuICB9XG5cbiAgaWYgKGlzQ3VycmllZFR5cGUodmFsdWUsIEN1cnJpZWRUeXBlLkNvbXBvbmVudCkgfHwgaGFzSW50ZXJuYWxDb21wb25lbnRNYW5hZ2VyKHZhbHVlIGFzIG9iamVjdCkpIHtcbiAgICByZXR1cm4gQ29udGVudFR5cGUuQ29tcG9uZW50O1xuICB9IGVsc2Uge1xuICAgIGlmIChcbiAgICAgIERFQlVHICYmXG4gICAgICAhaXNDdXJyaWVkVHlwZSh2YWx1ZSwgQ3VycmllZFR5cGUuSGVscGVyKSAmJlxuICAgICAgIWhhc0ludGVybmFsSGVscGVyTWFuYWdlcih2YWx1ZSBhcyBvYmplY3QpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBdHRlbXB0ZWQgdXNlIGEgZHluYW1pYyB2YWx1ZSBhcyBhIGNvbXBvbmVudCBvciBoZWxwZXIsIGJ1dCB0aGF0IHZhbHVlIGRpZCBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIGNvbXBvbmVudCBvciBoZWxwZXIgbWFuYWdlci4gVGhlIHZhbHVlIHdhczogJHt2YWx1ZX1gXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBDb250ZW50VHlwZS5IZWxwZXI7XG4gIH1cbn1cblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkNvbnRlbnRUeXBlLCAodm0pID0+IHtcbiAgbGV0IHJlZmVyZW5jZSA9IGNoZWNrKHZtLnN0YWNrLnBlZWsoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIHZtLnN0YWNrLnB1c2godG9Db250ZW50VHlwZSh2YWx1ZUZvclJlZihyZWZlcmVuY2UpKSk7XG5cbiAgaWYgKCFpc0NvbnN0UmVmKHJlZmVyZW5jZSkpIHtcbiAgICB2bS51cGRhdGVXaXRoKG5ldyBBc3NlcnRGaWx0ZXIocmVmZXJlbmNlLCB0b0NvbnRlbnRUeXBlKSk7XG4gIH1cbn0pO1xuXG5BUFBFTkRfT1BDT0RFUy5hZGQoT3AuRHluYW1pY0NvbnRlbnRUeXBlLCAodm0pID0+IHtcbiAgbGV0IHJlZmVyZW5jZSA9IGNoZWNrKHZtLnN0YWNrLnBlZWsoKSwgQ2hlY2tSZWZlcmVuY2UpO1xuXG4gIHZtLnN0YWNrLnB1c2godG9EeW5hbWljQ29udGVudFR5cGUodmFsdWVGb3JSZWYocmVmZXJlbmNlKSkpO1xuXG4gIGlmICghaXNDb25zdFJlZihyZWZlcmVuY2UpKSB7XG4gICAgdm0udXBkYXRlV2l0aChuZXcgQXNzZXJ0RmlsdGVyKHJlZmVyZW5jZSwgdG9EeW5hbWljQ29udGVudFR5cGUpKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5BcHBlbmRIVE1MLCAodm0pID0+IHtcbiAgbGV0IHJlZmVyZW5jZSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG5cbiAgbGV0IHJhd1ZhbHVlID0gdmFsdWVGb3JSZWYocmVmZXJlbmNlKTtcbiAgbGV0IHZhbHVlID0gaXNFbXB0eShyYXdWYWx1ZSkgPyAnJyA6IFN0cmluZyhyYXdWYWx1ZSk7XG5cbiAgdm0uZWxlbWVudHMoKS5hcHBlbmREeW5hbWljSFRNTCh2YWx1ZSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkFwcGVuZFNhZmVIVE1MLCAodm0pID0+IHtcbiAgbGV0IHJlZmVyZW5jZSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG5cbiAgbGV0IHJhd1ZhbHVlID0gY2hlY2sodmFsdWVGb3JSZWYocmVmZXJlbmNlKSwgQ2hlY2tTYWZlU3RyaW5nKS50b0hUTUwoKTtcbiAgbGV0IHZhbHVlID0gaXNFbXB0eShyYXdWYWx1ZSkgPyAnJyA6IGNoZWNrKHJhd1ZhbHVlLCBDaGVja1N0cmluZyk7XG5cbiAgdm0uZWxlbWVudHMoKS5hcHBlbmREeW5hbWljSFRNTCh2YWx1ZSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkFwcGVuZFRleHQsICh2bSkgPT4ge1xuICBsZXQgcmVmZXJlbmNlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcblxuICBsZXQgcmF3VmFsdWUgPSB2YWx1ZUZvclJlZihyZWZlcmVuY2UpO1xuICBsZXQgdmFsdWUgPSBpc0VtcHR5KHJhd1ZhbHVlKSA/ICcnIDogU3RyaW5nKHJhd1ZhbHVlKTtcblxuICBsZXQgbm9kZSA9IHZtLmVsZW1lbnRzKCkuYXBwZW5kRHluYW1pY1RleHQodmFsdWUpO1xuXG4gIGlmICghaXNDb25zdFJlZihyZWZlcmVuY2UpKSB7XG4gICAgdm0udXBkYXRlV2l0aChuZXcgRHluYW1pY1RleHRDb250ZW50KG5vZGUsIHJlZmVyZW5jZSwgdmFsdWUpKTtcbiAgfVxufSk7XG5cbkFQUEVORF9PUENPREVTLmFkZChPcC5BcHBlbmREb2N1bWVudEZyYWdtZW50LCAodm0pID0+IHtcbiAgbGV0IHJlZmVyZW5jZSA9IGNoZWNrKHZtLnN0YWNrLnBvcCgpLCBDaGVja1JlZmVyZW5jZSk7XG5cbiAgbGV0IHZhbHVlID0gY2hlY2sodmFsdWVGb3JSZWYocmVmZXJlbmNlKSwgQ2hlY2tEb2N1bWVudEZyYWdtZW50KTtcblxuICB2bS5lbGVtZW50cygpLmFwcGVuZER5bmFtaWNGcmFnbWVudCh2YWx1ZSk7XG59KTtcblxuQVBQRU5EX09QQ09ERVMuYWRkKE9wLkFwcGVuZE5vZGUsICh2bSkgPT4ge1xuICBsZXQgcmVmZXJlbmNlID0gY2hlY2sodm0uc3RhY2sucG9wKCksIENoZWNrUmVmZXJlbmNlKTtcblxuICBsZXQgdmFsdWUgPSBjaGVjayh2YWx1ZUZvclJlZihyZWZlcmVuY2UpLCBDaGVja05vZGUpO1xuXG4gIHZtLmVsZW1lbnRzKCkuYXBwZW5kRHluYW1pY05vZGUodmFsdWUpO1xufSk7XG4iXSwic291cmNlUm9vdCI6IiJ9