ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
133 lines (129 loc) • 15.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.isSafeString = isSafeString;
exports.isNode = isNode;
exports.isString = isString;
exports.cautiousInsert = cautiousInsert;
exports.trustingInsert = trustingInsert;
var _util = require('@glimmer/util');
var _bounds = require('./bounds');
function isSafeString(value) {
return typeof value === 'object' && value !== null && typeof value.toHTML === 'function';
}
function isNode(value) {
return typeof value === 'object' && value !== null && typeof value.nodeType === 'number';
}
function isString(value) {
return typeof value === 'string';
}
class Upsert {
constructor(bounds) {
this.bounds = bounds;
}
}
exports.default = Upsert;
function cautiousInsert(dom, cursor, value) {
if (isString(value)) {
return TextUpsert.insert(dom, cursor, value);
}
if (isSafeString(value)) {
return SafeStringUpsert.insert(dom, cursor, value);
}
if (isNode(value)) {
return NodeUpsert.insert(dom, cursor, value);
}
throw (0, _util.unreachable)();
}
function trustingInsert(dom, cursor, value) {
if (isString(value)) {
return HTMLUpsert.insert(dom, cursor, value);
}
if (isNode(value)) {
return NodeUpsert.insert(dom, cursor, value);
}
throw (0, _util.unreachable)();
}
class TextUpsert extends Upsert {
static insert(dom, cursor, value) {
let textNode = dom.createTextNode(value);
dom.insertBefore(cursor.element, textNode, cursor.nextSibling);
let bounds = new _bounds.SingleNodeBounds(cursor.element, textNode);
return new TextUpsert(bounds, textNode);
}
constructor(bounds, textNode) {
super(bounds);
this.textNode = textNode;
}
update(_dom, value) {
if (isString(value)) {
let { textNode } = this;
textNode.nodeValue = value;
return true;
} else {
return false;
}
}
}
class HTMLUpsert extends Upsert {
static insert(dom, cursor, value) {
let bounds = dom.insertHTMLBefore(cursor.element, cursor.nextSibling, value);
return new HTMLUpsert(bounds);
}
update(dom, value) {
if (isString(value)) {
let { bounds } = this;
let parentElement = bounds.parentElement();
let nextSibling = (0, _bounds.clear)(bounds);
this.bounds = dom.insertHTMLBefore(parentElement, nextSibling, value);
return true;
} else {
return false;
}
}
}
class SafeStringUpsert extends Upsert {
constructor(bounds, lastStringValue) {
super(bounds);
this.lastStringValue = lastStringValue;
}
static insert(dom, cursor, value) {
let stringValue = value.toHTML();
let bounds = dom.insertHTMLBefore(cursor.element, cursor.nextSibling, stringValue);
return new SafeStringUpsert(bounds, stringValue);
}
update(dom, value) {
if (isSafeString(value)) {
let stringValue = value.toHTML();
if (stringValue !== this.lastStringValue) {
let { bounds } = this;
let parentElement = bounds.parentElement();
let nextSibling = (0, _bounds.clear)(bounds);
this.bounds = dom.insertHTMLBefore(parentElement, nextSibling, stringValue);
this.lastStringValue = stringValue;
}
return true;
} else {
return false;
}
}
}
class NodeUpsert extends Upsert {
static insert(dom, cursor, node) {
dom.insertBefore(cursor.element, node, cursor.nextSibling);
return new NodeUpsert((0, _bounds.single)(cursor.element, node));
}
update(dom, value) {
if (isNode(value)) {
let { bounds } = this;
let parentElement = bounds.parentElement();
let nextSibling = (0, _bounds.clear)(bounds);
this.bounds = dom.insertNodeBefore(parentElement, value, nextSibling);
return true;
} else {
return false;
}
}
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91cHNlcnQuanMiXSwibmFtZXMiOlsiaXNTYWZlU3RyaW5nIiwiaXNOb2RlIiwiaXNTdHJpbmciLCJjYXV0aW91c0luc2VydCIsInRydXN0aW5nSW5zZXJ0IiwidmFsdWUiLCJ0b0hUTUwiLCJub2RlVHlwZSIsIlVwc2VydCIsImNvbnN0cnVjdG9yIiwiYm91bmRzIiwiZG9tIiwiY3Vyc29yIiwiVGV4dFVwc2VydCIsImluc2VydCIsIlNhZmVTdHJpbmdVcHNlcnQiLCJOb2RlVXBzZXJ0IiwiSFRNTFVwc2VydCIsInRleHROb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJlbGVtZW50IiwibmV4dFNpYmxpbmciLCJ1cGRhdGUiLCJfZG9tIiwibm9kZVZhbHVlIiwiaW5zZXJ0SFRNTEJlZm9yZSIsInBhcmVudEVsZW1lbnQiLCJsYXN0U3RyaW5nVmFsdWUiLCJzdHJpbmdWYWx1ZSIsIm5vZGUiLCJpbnNlcnROb2RlQmVmb3JlIl0sIm1hcHBpbmdzIjoiOzs7OztRQUVnQkEsWSxHQUFBQSxZO1FBR0FDLE0sR0FBQUEsTTtRQUdBQyxRLEdBQUFBLFE7UUFTQUMsYyxHQUFBQSxjO1FBWUFDLGMsR0FBQUEsYzs7QUE3QmhCOztBQUNBOztBQUNPLFNBQVNKLFlBQVQsQ0FBc0JLLEtBQXRCLEVBQTZCO0FBQ2hDLFdBQU8sT0FBT0EsS0FBUCxLQUFpQixRQUFqQixJQUE2QkEsVUFBVSxJQUF2QyxJQUErQyxPQUFPQSxNQUFNQyxNQUFiLEtBQXdCLFVBQTlFO0FBQ0g7QUFDTSxTQUFTTCxNQUFULENBQWdCSSxLQUFoQixFQUF1QjtBQUMxQixXQUFPLE9BQU9BLEtBQVAsS0FBaUIsUUFBakIsSUFBNkJBLFVBQVUsSUFBdkMsSUFBK0MsT0FBT0EsTUFBTUUsUUFBYixLQUEwQixRQUFoRjtBQUNIO0FBQ00sU0FBU0wsUUFBVCxDQUFrQkcsS0FBbEIsRUFBeUI7QUFDNUIsV0FBTyxPQUFPQSxLQUFQLEtBQWlCLFFBQXhCO0FBQ0g7QUFDRCxNQUFN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QkFBTyxLQUFQO0FBQ0g7QUFDSjtBQXhCaUM7QUEwQnRDLE1BQU1iLFVBQU4sU0FBeUJSLE1BQXpCLENBQWdDO0FBQzVCLFdBQU9NLE1BQVAsQ0FBY0gsR0FBZCxFQUFtQkMsTUFBbkIsRUFBMkJrQixJQUEzQixFQUFpQztBQUM3Qm5CLFlBQUlTLFlBQUosQ0FBaUJSLE9BQU9TLE9BQXhCLEVBQWlDUyxJQUFqQyxFQUF1Q2xCLE9BQU9VLFdBQTlDO0FBQ0EsZUFBTyxJQUFJTixVQUFKLENBQWUsb0JBQU9KLE9BQU9TLE9BQWQsRUFBdUJTLElBQXZCLENBQWYsQ0FBUDtBQUNIO0FBQ0RQLFdBQU9aLEdBQVAsRUFBWU4sS0FBWixFQUFtQjtBQUNmLFlBQUlKLE9BQU9JLEtBQVAsQ0FBSixFQUFtQjtBQUNmLGdCQUFJLEVBQUVLLE1BQUYsS0FBYSxJQUFqQjtBQUNBLGdCQUFJaUIsZ0JBQWdCakIsT0FBT2lCLGFBQVAsRUFBcEI7QUFDQSxnQkFBSUwsY0FBYyxtQkFBTVosTUFBTixDQUFsQjtBQUNBLGlCQUFLQSxNQUFMLEdBQWNDLElBQUlvQixnQkFBSixDQUFxQkosYUFBckIsRUFBb0N0QixLQUFwQyxFQUEyQ2lCLFdBQTNDLENBQWQ7QUFDQSxtQkFBTyxJQUFQO0FBQ0gsU0FORCxNQU1PO0FBQ0gsbUJBQU8sS0FBUDtBQUNIO0FBQ0o7QUFmMkIiLCJmaWxlIjoibGliL3Vwc2VydC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHVucmVhY2hhYmxlIH0gZnJvbSAnQGdsaW1tZXIvdXRpbCc7XG5pbXBvcnQgeyBjbGVhciwgc2luZ2xlLCBTaW5nbGVOb2RlQm91bmRzIH0gZnJvbSAnLi9ib3VuZHMnO1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2FmZVN0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS50b0hUTUwgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb2RlKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlLm5vZGVUeXBlID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xufVxuY2xhc3MgVXBzZXJ0IHtcbiAgICBjb25zdHJ1Y3Rvcihib3VuZHMpIHtcbiAgICAgICAgdGhpcy5ib3VuZHMgPSBib3VuZHM7XG4gICAgfVxufVxuZXhwb3J0IGRlZmF1bHQgVXBzZXJ0O1xuZXhwb3J0IGZ1bmN0aW9uIGNhdXRpb3VzSW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSkge1xuICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIFRleHRVcHNlcnQuaW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpc1NhZmVTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBTYWZlU3RyaW5nVXBzZXJ0Lmluc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaXNOb2RlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTm9kZVVwc2VydC5pbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgICB9XG4gICAgdGhyb3cgdW5yZWFjaGFibGUoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cnVzdGluZ0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpIHtcbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBIVE1MVXBzZXJ0Lmluc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaXNOb2RlKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gTm9kZVVwc2VydC5pbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgICB9XG4gICAgdGhyb3cgdW5yZWFjaGFibGUoKTtcbn1cbmNsYXNzIFRleHRVcHNlcnQgZXh0ZW5kcyBVcHNlcnQge1xuICAgIHN0YXRpYyBpbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIGxldCB0ZXh0Tm9kZSA9IGRvbS5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7XG4gICAgICAgIGRvbS5pbnNlcnRCZWZvcmUoY3Vyc29yLmVsZW1lbnQsIHRleHROb2RlLCBjdXJzb3IubmV4dFNpYmxpbmcpO1xuICAgICAgICBsZXQgYm91bmRzID0gbmV3IFNpbmdsZU5vZGVCb3VuZHMoY3Vyc29yLmVsZW1lbnQsIHRleHROb2RlKTtcbiAgICAgICAgcmV0dXJuIG5ldyBUZXh0VXBzZXJ0KGJvdW5kcywgdGV4dE5vZGUpO1xuICAgIH1cbiAgICBjb25zdHJ1Y3Rvcihib3VuZHMsIHRleHROb2RlKSB7XG4gICAgICAgIHN1cGVyKGJvdW5kcyk7XG4gICAgICAgIHRoaXMudGV4dE5vZGUgPSB0ZXh0Tm9kZTtcbiAgICB9XG4gICAgdXBkYXRlKF9kb20sIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGxldCB7IHRleHROb2RlIH0gPSB0aGlzO1xuICAgICAgICAgICAgdGV4dE5vZGUubm9kZVZhbHVlID0gdmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIEhUTUxVcHNlcnQgZXh0ZW5kcyBVcHNlcnQge1xuICAgIHN0YXRpYyBpbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIGxldCBib3VuZHMgPSBkb20uaW5zZXJ0SFRNTEJlZm9yZShjdXJzb3IuZWxlbWVudCwgY3Vyc29yLm5leHRTaWJsaW5nLCB2YWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgSFRNTFVwc2VydChib3VuZHMpO1xuICAgIH1cbiAgICB1cGRhdGUoZG9tLCB2YWx1ZSkge1xuICAgICAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICBsZXQgeyBib3VuZHMgfSA9IHRoaXM7XG4gICAgICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IGJvdW5kcy5wYXJlbnRFbGVtZW50KCk7XG4gICAgICAgICAgICBsZXQgbmV4dFNpYmxpbmcgPSBjbGVhcihib3VuZHMpO1xuICAgICAgICAgICAgdGhpcy5ib3VuZHMgPSBkb20uaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnRFbGVtZW50LCBuZXh0U2libGluZywgdmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBTYWZlU3RyaW5nVXBzZXJ0IGV4dGVuZHMgVXBzZXJ0IHtcbiAgICBjb25zdHJ1Y3Rvcihib3VuZHMsIGxhc3RTdHJpbmdWYWx1ZSkge1xuICAgICAgICBzdXBlcihib3VuZHMpO1xuICAgICAgICB0aGlzLmxhc3RTdHJpbmdWYWx1ZSA9IGxhc3RTdHJpbmdWYWx1ZTtcbiAgICB9XG4gICAgc3RhdGljIGluc2VydChkb20sIGN1cnNvciwgdmFsdWUpIHtcbiAgICAgICAgbGV0IHN0cmluZ1ZhbHVlID0gdmFsdWUudG9IVE1MKCk7XG4gICAgICAgIGxldCBib3VuZHMgPSBkb20uaW5zZXJ0SFRNTEJlZm9yZShjdXJzb3IuZWxlbWVudCwgY3Vyc29yLm5leHRTaWJsaW5nLCBzdHJpbmdWYWx1ZSk7XG4gICAgICAgIHJldHVybiBuZXcgU2FmZVN0cmluZ1Vwc2VydChib3VuZHMsIHN0cmluZ1ZhbHVlKTtcbiAgICB9XG4gICAgdXBkYXRlKGRvbSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGlzU2FmZVN0cmluZyh2YWx1ZSkpIHtcbiAgICAgICAgICAgIGxldCBzdHJpbmdWYWx1ZSA9IHZhbHVlLnRvSFRNTCgpO1xuICAgICAgICAgICAgaWYgKHN0cmluZ1ZhbHVlICE9PSB0aGlzLmxhc3RTdHJpbmdWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGxldCB7IGJvdW5kcyB9ID0gdGhpcztcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IGJvdW5kcy5wYXJlbnRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgbGV0IG5leHRTaWJsaW5nID0gY2xlYXIoYm91bmRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJvdW5kcyA9IGRvbS5pbnNlcnRIVE1MQmVmb3JlKHBhcmVudEVsZW1lbnQsIG5leHRTaWJsaW5nLCBzdHJpbmdWYWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U3RyaW5nVmFsdWUgPSBzdHJpbmdWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgTm9kZVVwc2VydCBleHRlbmRzIFVwc2VydCB7XG4gICAgc3RhdGljIGluc2VydChkb20sIGN1cnNvciwgbm9kZSkge1xuICAgICAgICBkb20uaW5zZXJ0QmVmb3JlKGN1cnNvci5lbGVtZW50LCBub2RlLCBjdXJzb3IubmV4dFNpYmxpbmcpO1xuICAgICAgICByZXR1cm4gbmV3IE5vZGVVcHNlcnQoc2luZ2xlKGN1cnNvci5lbGVtZW50LCBub2RlKSk7XG4gICAgfVxuICAgIHVwZGF0ZShkb20sIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc05vZGUodmFsdWUpKSB7XG4gICAgICAgICAgICBsZXQgeyBib3VuZHMgfSA9IHRoaXM7XG4gICAgICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IGJvdW5kcy5wYXJlbnRFbGVtZW50KCk7XG4gICAgICAgICAgICBsZXQgbmV4dFNpYmxpbmcgPSBjbGVhcihib3VuZHMpO1xuICAgICAgICAgICAgdGhpcy5ib3VuZHMgPSBkb20uaW5zZXJ0Tm9kZUJlZm9yZShwYXJlbnRFbGVtZW50LCB2YWx1ZSwgbmV4dFNpYmxpbmcpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59Il19