ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
173 lines (164 loc) • 18.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.OptimizedTrustingAppendOpcode = exports.OptimizedCautiousAppendOpcode = exports.IsComponentDefinitionReference = exports.AppendDynamicOpcode = undefined;
exports.normalizeTextValue = normalizeTextValue;
var _reference2 = require('@glimmer/reference');
var _bounds = require('../../bounds');
var _builder = require('../../builder');
var _interfaces = require('../../component/interfaces');
var _opcodes = require('../../opcodes');
var _references = require('../../references');
var _upsert = require('../../upsert');
_opcodes.APPEND_OPCODES.add(26 /* DynamicContent */, (vm, { op1: append }) => {
let opcode = vm.constants.getOther(append);
opcode.evaluate(vm);
});
function isEmpty(value) {
return value === null || value === undefined || typeof value.toString !== 'function';
}
function normalizeTextValue(value) {
if (isEmpty(value)) {
return '';
}
return String(value);
}
function normalizeTrustedValue(value) {
if (isEmpty(value)) {
return '';
}
if ((0, _upsert.isString)(value)) {
return value;
}
if ((0, _upsert.isSafeString)(value)) {
return value.toHTML();
}
if ((0, _upsert.isNode)(value)) {
return value;
}
return String(value);
}
function normalizeValue(value) {
if (isEmpty(value)) {
return '';
}
if ((0, _upsert.isString)(value)) {
return value;
}
if ((0, _upsert.isSafeString)(value) || (0, _upsert.isNode)(value)) {
return value;
}
return String(value);
}
class AppendDynamicOpcode {
evaluate(vm) {
let reference = vm.stack.pop();
let normalized = this.normalize(reference);
let value;
let cache;
if ((0, _reference2.isConst)(reference)) {
value = normalized.value();
} else {
cache = new _reference2.ReferenceCache(normalized);
value = cache.peek();
}
let stack = vm.elements();
let upsert = this.insert(vm.env.getAppendOperations(), stack, value);
let bounds = new _builder.Fragment(upsert.bounds);
stack.newBounds(bounds);
if (cache /* i.e. !isConst(reference) */) {
vm.updateWith(this.updateWith(vm, reference, cache, bounds, upsert));
}
}
}
exports.AppendDynamicOpcode = AppendDynamicOpcode;
class IsComponentDefinitionReference extends _references.ConditionalReference {
static create(inner) {
return new IsComponentDefinitionReference(inner);
}
toBool(value) {
return (0, _interfaces.isComponentDefinition)(value);
}
}
exports.IsComponentDefinitionReference = IsComponentDefinitionReference;
class UpdateOpcode extends _opcodes.UpdatingOpcode {
constructor(cache, bounds, upsert) {
super();
this.cache = cache;
this.bounds = bounds;
this.upsert = upsert;
this.tag = cache.tag;
}
evaluate(vm) {
let value = this.cache.revalidate();
if ((0, _reference2.isModified)(value)) {
let { bounds, upsert } = this;
let { dom } = vm;
if (!this.upsert.update(dom, value)) {
let cursor = new _bounds.Cursor(bounds.parentElement(), (0, _bounds.clear)(bounds));
upsert = this.upsert = this.insert(vm.env.getAppendOperations(), cursor, value);
}
bounds.update(upsert.bounds);
}
}
toJSON() {
let { _guid: guid, type, cache } = this;
return {
details: { lastValue: JSON.stringify(cache.peek()) },
guid,
type
};
}
}
class OptimizedCautiousAppendOpcode extends AppendDynamicOpcode {
constructor() {
super(...arguments);
this.type = 'optimized-cautious-append';
}
normalize(reference) {
return (0, _reference2.map)(reference, normalizeValue);
}
insert(dom, cursor, value) {
return (0, _upsert.cautiousInsert)(dom, cursor, value);
}
updateWith(_vm, _reference, cache, bounds, upsert) {
return new OptimizedCautiousUpdateOpcode(cache, bounds, upsert);
}
}
exports.OptimizedCautiousAppendOpcode = OptimizedCautiousAppendOpcode;
class OptimizedCautiousUpdateOpcode extends UpdateOpcode {
constructor() {
super(...arguments);
this.type = 'optimized-cautious-update';
}
insert(dom, cursor, value) {
return (0, _upsert.cautiousInsert)(dom, cursor, value);
}
}
class OptimizedTrustingAppendOpcode extends AppendDynamicOpcode {
constructor() {
super(...arguments);
this.type = 'optimized-trusting-append';
}
normalize(reference) {
return (0, _reference2.map)(reference, normalizeTrustedValue);
}
insert(dom, cursor, value) {
return (0, _upsert.trustingInsert)(dom, cursor, value);
}
updateWith(_vm, _reference, cache, bounds, upsert) {
return new OptimizedTrustingUpdateOpcode(cache, bounds, upsert);
}
}
exports.OptimizedTrustingAppendOpcode = OptimizedTrustingAppendOpcode;
class OptimizedTrustingUpdateOpcode extends UpdateOpcode {
constructor() {
super(...arguments);
this.type = 'optimized-trusting-update';
}
insert(dom, cursor, value) {
return (0, _upsert.trustingInsert)(dom, cursor, value);
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21waWxlZC9vcGNvZGVzL2NvbnRlbnQuanMiXSwibmFtZXMiOlsibm9ybWFsaXplVGV4dFZhbHVlIiwiYWRkIiwidm0iLCJvcDEiLCJhcHBlbmQiLCJvcGNvZGUiLCJjb25zdGFudHMiLCJnZXRPdGhlciIsImV2YWx1YXRlIiwiaXNFbXB0eSIsInZhbHVlIiwidW5kZWZpbmVkIiwidG9TdHJpbmciLCJTdHJpbmciLCJub3JtYWxpemVUcnVzdGVkVmFsdWUiLCJ0b0hUTUwiLCJub3JtYWxpemVWYWx1ZSIsIkFwcGVuZER5bmFtaWNPcGNvZGUiLCJyZWZlcmVuY2UiLCJzdGFjayIsInBvcCIsIm5vcm1hbGl6ZWQiLCJub3JtYWxpemUiLCJjYWNoZSIsInBlZWsiLCJlbGVtZW50cyIsInVwc2VydCIsImluc2VydCIsImVudiIsImdldEFwcGVuZE9wZXJhdGlvbnMiLCJib3VuZHMiLCJuZXdCb3VuZHMiLCJ1cGRhdGVXaXRoIiwiSXNDb21wb25lbnREZWZpbml0aW9uUmVmZXJlbmNlIiwiY3JlYXRlIiwiaW5uZXIiLCJ0b0Jvb2wiLCJVcGRhdGVPcGNvZGUiLCJjb25zdHJ1Y3RvciIsInRhZyIsInJldmFsaWRhdGUiLCJkb20iLCJ1cGRhdGUiLCJjdXJzb3IiLCJwYXJlbnRFbGVtZW50IiwidG9KU09OIiwiX2d1aWQiLCJndWlkIiwidHlwZSIsImRldGFpbHMiLCJsYXN0VmFsdWUiLCJKU09OIiwic3RyaW5naWZ5IiwiT3B0aW1pemVkQ2F1dGlvdXNBcHBlbmRPcGNvZGUiLCJhcmd1bWVudHMiLCJfdm0iLCJfcmVmZXJlbmNlIiwiT3B0aW1pemVkQ2F1dGlvdXNVcGRhdGVPcGNvZGUiLCJPcHRpbWl6ZWRUcnVzdGluZ0FwcGVuZE9wY29kZSIsIk9wdGltaXplZFRydXN0aW5nVXBkYXRlT3Bjb2RlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7UUFjZ0JBLGtCLEdBQUFBLGtCOztBQWRoQjs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFD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QUNIO0FBQ0RhLFdBQU9jLEdBQVAsRUFBWUUsTUFBWixFQUFvQmpDLEtBQXBCLEVBQTJCO0FBQ3ZCLGVBQU8sNEJBQWUrQixHQUFmLEVBQW9CRSxNQUFwQixFQUE0QmpDLEtBQTVCLENBQVA7QUFDSDtBQUNEc0IsZUFBV3VCLEdBQVgsRUFBZ0JDLFVBQWhCLEVBQTRCakMsS0FBNUIsRUFBbUNPLE1BQW5DLEVBQTJDSixNQUEzQyxFQUFtRDtBQUMvQyxlQUFPLElBQUlpQyw2QkFBSixDQUFrQ3BDLEtBQWxDLEVBQXlDTyxNQUF6QyxFQUFpREosTUFBakQsQ0FBUDtBQUNIO0FBYmtFO1FBQTFEZ0MsNkIsR0FBQUEsNkI7QUFlYixNQUFNQyw2QkFBTixTQUE0Q3RCLFlBQTVDLENBQXlEO0FBQ3JEQyxrQkFBYztBQUNWLGNBQU0sR0FBR2dCLFNBQVQ7QUFDQSxhQUFLTixJQUFMLEdBQVksMkJBQVo7QUFDSDtBQUNEckIsV0FBT2MsR0FBUCxFQUFZRSxNQUFaLEVBQW9CakMsS0FBcEIsRUFBMkI7QUFDdkIsZUFBTyw0QkFBZStCLEdBQWYsRUFBb0JFLE1BQXBCLEVBQTRCakMsS0FBNUIsQ0FBUDtBQUNIO0FBUG9EIiwiZmlsZSI6ImxpYi9jb21waWxlZC9vcGNvZGVzL2NvbnRlbnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc0NvbnN0LCBpc01vZGlmaWVkLCBtYXAsIFJlZmVyZW5jZUNhY2hlIH0gZnJvbSAnQGdsaW1tZXIvcmVmZXJlbmNlJztcbmltcG9ydCB7IGNsZWFyLCBDdXJzb3IgfSBmcm9tICcuLi8uLi9ib3VuZHMnO1xuaW1wb3J0IHsgRnJhZ21lbnQgfSBmcm9tICcuLi8uLi9idWlsZGVyJztcbmltcG9ydCB7IGlzQ29tcG9uZW50RGVmaW5pdGlvbiB9IGZyb20gJy4uLy4uL2NvbXBvbmVudC9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFQUEVORF9PUENPREVTLCBVcGRhdGluZ09wY29kZSB9IGZyb20gJy4uLy4uL29wY29kZXMnO1xuaW1wb3J0IHsgQ29uZGl0aW9uYWxSZWZlcmVuY2UgfSBmcm9tICcuLi8uLi9yZWZlcmVuY2VzJztcbmltcG9ydCB7IGNhdXRpb3VzSW5zZXJ0LCBpc05vZGUsIGlzU2FmZVN0cmluZywgaXNTdHJpbmcsIHRydXN0aW5nSW5zZXJ0IH0gZnJvbSAnLi4vLi4vdXBzZXJ0JztcbkFQUEVORF9PUENPREVTLmFkZCgyNiAvKiBEeW5hbWljQ29udGVudCAqLywgKHZtLCB7IG9wMTogYXBwZW5kIH0pID0+IHtcbiAgICBsZXQgb3Bjb2RlID0gdm0uY29uc3RhbnRzLmdldE90aGVyKGFwcGVuZCk7XG4gICAgb3Bjb2RlLmV2YWx1YXRlKHZtKTtcbn0pO1xuZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVUZXh0VmFsdWUodmFsdWUpIHtcbiAgICBpZiAoaXNFbXB0eSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRydXN0ZWRWYWx1ZSh2YWx1ZSkge1xuICAgIGlmIChpc0VtcHR5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNTYWZlU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gdmFsdWUudG9IVE1MKCk7XG4gICAgfVxuICAgIGlmIChpc05vZGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG5mdW5jdGlvbiBub3JtYWxpemVWYWx1ZSh2YWx1ZSkge1xuICAgIGlmIChpc0VtcHR5KHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICBpZiAoaXNTYWZlU3RyaW5nKHZhbHVlKSB8fCBpc05vZGUodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG59XG5leHBvcnQgY2xhc3MgQXBwZW5kRHluYW1pY09wY29kZSB7XG4gICAgZXZhbHVhdGUodm0pIHtcbiAgICAgICAgbGV0IHJlZmVyZW5jZSA9IHZtLnN0YWNrLnBvcCgpO1xuICAgICAgICBsZXQgbm9ybWFsaXplZCA9IHRoaXMubm9ybWFsaXplKHJlZmVyZW5jZSk7XG4gICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgbGV0IGNhY2hlO1xuICAgICAgICBpZiAoaXNDb25zdChyZWZlcmVuY2UpKSB7XG4gICAgICAgICAgICB2YWx1ZSA9IG5vcm1hbGl6ZWQudmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlID0gbmV3IFJlZmVyZW5jZUNhY2hlKG5vcm1hbGl6ZWQpO1xuICAgICAgICAgICAgdmFsdWUgPSBjYWNoZS5wZWVrKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0YWNrID0gdm0uZWxlbWVudHMoKTtcbiAgICAgICAgbGV0IHVwc2VydCA9IHRoaXMuaW5zZXJ0KHZtLmVudi5nZXRBcHBlbmRPcGVyYXRpb25zKCksIHN0YWNrLCB2YWx1ZSk7XG4gICAgICAgIGxldCBib3VuZHMgPSBuZXcgRnJhZ21lbnQodXBzZXJ0LmJvdW5kcyk7XG4gICAgICAgIHN0YWNrLm5ld0JvdW5kcyhib3VuZHMpO1xuICAgICAgICBpZiAoY2FjaGUgLyogaS5lLiAhaXNDb25zdChyZWZlcmVuY2UpICovKSB7XG4gICAgICAgICAgICAgICAgdm0udXBkYXRlV2l0aCh0aGlzLnVwZGF0ZVdpdGgodm0sIHJlZmVyZW5jZSwgY2FjaGUsIGJvdW5kcywgdXBzZXJ0KSk7XG4gICAgICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIElzQ29tcG9uZW50RGVmaW5pdGlvblJlZmVyZW5jZSBleHRlbmRzIENvbmRpdGlvbmFsUmVmZXJlbmNlIHtcbiAgICBzdGF0aWMgY3JlYXRlKGlubmVyKSB7XG4gICAgICAgIHJldHVybiBuZXcgSXNDb21wb25lbnREZWZpbml0aW9uUmVmZXJlbmNlKGlubmVyKTtcbiAgICB9XG4gICAgdG9Cb29sKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpc0NvbXBvbmVudERlZmluaXRpb24odmFsdWUpO1xuICAgIH1cbn1cbmNsYXNzIFVwZGF0ZU9wY29kZSBleHRlbmRzIFVwZGF0aW5nT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcihjYWNoZSwgYm91bmRzLCB1cHNlcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5jYWNoZSA9IGNhY2hlO1xuICAgICAgICB0aGlzLmJvdW5kcyA9IGJvdW5kcztcbiAgICAgICAgdGhpcy51cHNlcnQgPSB1cHNlcnQ7XG4gICAgICAgIHRoaXMudGFnID0gY2FjaGUudGFnO1xuICAgIH1cbiAgICBldmFsdWF0ZSh2bSkge1xuICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLmNhY2hlLnJldmFsaWRhdGUoKTtcbiAgICAgICAgaWYgKGlzTW9kaWZpZWQodmFsdWUpKSB7XG4gICAgICAgICAgICBsZXQgeyBib3VuZHMsIHVwc2VydCB9ID0gdGhpcztcbiAgICAgICAgICAgIGxldCB7IGRvbSB9ID0gdm07XG4gICAgICAgICAgICBpZiAoIXRoaXMudXBzZXJ0LnVwZGF0ZShkb20sIHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGxldCBjdXJzb3IgPSBuZXcgQ3Vyc29yKGJvdW5kcy5wYXJlbnRFbGVtZW50KCksIGNsZWFyKGJvdW5kcykpO1xuICAgICAgICAgICAgICAgIHVwc2VydCA9IHRoaXMudXBzZXJ0ID0gdGhpcy5pbnNlcnQodm0uZW52LmdldEFwcGVuZE9wZXJhdGlvbnMoKSwgY3Vyc29yLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBib3VuZHMudXBkYXRlKHVwc2VydC5ib3VuZHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgbGV0IHsgX2d1aWQ6IGd1aWQsIHR5cGUsIGNhY2hlIH0gPSB0aGlzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGV0YWlsczogeyBsYXN0VmFsdWU6IEpTT04uc3RyaW5naWZ5KGNhY2hlLnBlZWsoKSkgfSxcbiAgICAgICAgICAgIGd1aWQsXG4gICAgICAgICAgICB0eXBlXG4gICAgICAgIH07XG4gICAgfVxufVxuZXhwb3J0IGNsYXNzIE9wdGltaXplZENhdXRpb3VzQXBwZW5kT3Bjb2RlIGV4dGVuZHMgQXBwZW5kRHluYW1pY09wY29kZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdvcHRpbWl6ZWQtY2F1dGlvdXMtYXBwZW5kJztcbiAgICB9XG4gICAgbm9ybWFsaXplKHJlZmVyZW5jZSkge1xuICAgICAgICByZXR1cm4gbWFwKHJlZmVyZW5jZSwgbm9ybWFsaXplVmFsdWUpO1xuICAgIH1cbiAgICBpbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBjYXV0aW91c0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICAgIH1cbiAgICB1cGRhdGVXaXRoKF92bSwgX3JlZmVyZW5jZSwgY2FjaGUsIGJvdW5kcywgdXBzZXJ0KSB7XG4gICAgICAgIHJldHVybiBuZXcgT3B0aW1pemVkQ2F1dGlvdXNVcGRhdGVPcGNvZGUoY2FjaGUsIGJvdW5kcywgdXBzZXJ0KTtcbiAgICB9XG59XG5jbGFzcyBPcHRpbWl6ZWRDYXV0aW91c1VwZGF0ZU9wY29kZSBleHRlbmRzIFVwZGF0ZU9wY29kZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdvcHRpbWl6ZWQtY2F1dGlvdXMtdXBkYXRlJztcbiAgICB9XG4gICAgaW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gY2F1dGlvdXNJbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgICB9XG59XG5leHBvcnQgY2xhc3MgT3B0aW1pemVkVHJ1c3RpbmdBcHBlbmRPcGNvZGUgZXh0ZW5kcyBBcHBlbmREeW5hbWljT3Bjb2RlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ29wdGltaXplZC10cnVzdGluZy1hcHBlbmQnO1xuICAgIH1cbiAgICBub3JtYWxpemUocmVmZXJlbmNlKSB7XG4gICAgICAgIHJldHVybiBtYXAocmVmZXJlbmNlLCBub3JtYWxpemVUcnVzdGVkVmFsdWUpO1xuICAgIH1cbiAgICBpbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0cnVzdGluZ0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICAgIH1cbiAgICB1cGRhdGVXaXRoKF92bSwgX3JlZmVyZW5jZSwgY2FjaGUsIGJvdW5kcywgdXBzZXJ0KSB7XG4gICAgICAgIHJldHVybiBuZXcgT3B0aW1pemVkVHJ1c3RpbmdVcGRhdGVPcGNvZGUoY2FjaGUsIGJvdW5kcywgdXBzZXJ0KTtcbiAgICB9XG59XG5jbGFzcyBPcHRpbWl6ZWRUcnVzdGluZ1VwZGF0ZU9wY29kZSBleHRlbmRzIFVwZGF0ZU9wY29kZSB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdvcHRpbWl6ZWQtdHJ1c3RpbmctdXBkYXRlJztcbiAgICB9XG4gICAgaW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHJ1c3RpbmdJbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgICB9XG59Il19