UNPKG

ember-legacy-class-transform

Version:
173 lines (164 loc) 18.7 kB
'use strict'; 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