ember-legacy-class-transform
Version:
The default blueprint for ember-cli addons.
211 lines (170 loc) • 17.3 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 _defaults(obj, defaults) {
var keys = Object.getOwnPropertyNames(defaults);for (var i = 0; i < keys.length; i++) {
var key = keys[i];var value = Object.getOwnPropertyDescriptor(defaults, key);if (value && value.configurable && obj[key] === undefined) {
Object.defineProperty(obj, key, value);
}
}return obj;
}
function _possibleConstructorReturn(self, call) {
if (!self) {
throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
}return call && (typeof call === "object" || typeof call === "function") ? call : self;
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function, not " + typeof superClass);
}subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } });if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass);
}
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
}
}
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';
}
var Upsert = function Upsert(bounds) {
_classCallCheck(this, Upsert);
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)();
}
var TextUpsert = function (_Upsert) {
_inherits(TextUpsert, _Upsert);
TextUpsert.insert = function insert(dom, cursor, value) {
var textNode = dom.createTextNode(value);
dom.insertBefore(cursor.element, textNode, cursor.nextSibling);
var bounds = new _bounds.SingleNodeBounds(cursor.element, textNode);
return new TextUpsert(bounds, textNode);
};
function TextUpsert(bounds, textNode) {
_classCallCheck(this, TextUpsert);
var _this = _possibleConstructorReturn(this, _Upsert.call(this, bounds));
_this.textNode = textNode;
return _this;
}
TextUpsert.prototype.update = function update(_dom, value) {
if (isString(value)) {
var textNode = this.textNode;
textNode.nodeValue = value;
return true;
} else {
return false;
}
};
return TextUpsert;
}(Upsert);
var HTMLUpsert = function (_Upsert2) {
_inherits(HTMLUpsert, _Upsert2);
function HTMLUpsert() {
_classCallCheck(this, HTMLUpsert);
return _possibleConstructorReturn(this, _Upsert2.apply(this, arguments));
}
HTMLUpsert.insert = function insert(dom, cursor, value) {
var bounds = dom.insertHTMLBefore(cursor.element, cursor.nextSibling, value);
return new HTMLUpsert(bounds);
};
HTMLUpsert.prototype.update = function update(dom, value) {
if (isString(value)) {
var bounds = this.bounds;
var parentElement = bounds.parentElement();
var nextSibling = (0, _bounds.clear)(bounds);
this.bounds = dom.insertHTMLBefore(parentElement, nextSibling, value);
return true;
} else {
return false;
}
};
return HTMLUpsert;
}(Upsert);
var SafeStringUpsert = function (_Upsert3) {
_inherits(SafeStringUpsert, _Upsert3);
function SafeStringUpsert(bounds, lastStringValue) {
_classCallCheck(this, SafeStringUpsert);
var _this3 = _possibleConstructorReturn(this, _Upsert3.call(this, bounds));
_this3.lastStringValue = lastStringValue;
return _this3;
}
SafeStringUpsert.insert = function insert(dom, cursor, value) {
var stringValue = value.toHTML();
var bounds = dom.insertHTMLBefore(cursor.element, cursor.nextSibling, stringValue);
return new SafeStringUpsert(bounds, stringValue);
};
SafeStringUpsert.prototype.update = function update(dom, value) {
if (isSafeString(value)) {
var stringValue = value.toHTML();
if (stringValue !== this.lastStringValue) {
var bounds = this.bounds;
var parentElement = bounds.parentElement();
var nextSibling = (0, _bounds.clear)(bounds);
this.bounds = dom.insertHTMLBefore(parentElement, nextSibling, stringValue);
this.lastStringValue = stringValue;
}
return true;
} else {
return false;
}
};
return SafeStringUpsert;
}(Upsert);
var NodeUpsert = function (_Upsert4) {
_inherits(NodeUpsert, _Upsert4);
function NodeUpsert() {
_classCallCheck(this, NodeUpsert);
return _possibleConstructorReturn(this, _Upsert4.apply(this, arguments));
}
NodeUpsert.insert = function insert(dom, cursor, node) {
dom.insertBefore(cursor.element, node, cursor.nextSibling);
return new NodeUpsert((0, _bounds.single)(cursor.element, node));
};
NodeUpsert.prototype.update = function update(dom, value) {
if (isNode(value)) {
var bounds = this.bounds;
var parentElement = bounds.parentElement();
var nextSibling = (0, _bounds.clear)(bounds);
this.bounds = dom.insertNodeBefore(parentElement, value, nextSibling);
return true;
} else {
return false;
}
};
return NodeUpsert;
}(Upsert);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi91cHNlcnQuanMiXSwibmFtZXMiOlsidW5yZWFjaGFibGUiLCJjbGVhciIsInNpbmdsZSIsIlNpbmdsZU5vZGVCb3VuZHMiLCJpc1NhZmVTdHJpbmciLCJ2YWx1ZSIsInRvSFRNTCIsImlzTm9kZSIsIm5vZGVUeXBlIiwiaXNTdHJpbmciLCJVcHNlcnQiLCJib3VuZHMiLCJjYXV0aW91c0luc2VydCIsImRvbSIsImN1cnNvciIsIlRleHRVcHNlcnQiLCJpbnNlcnQiLCJTYWZlU3RyaW5nVXBzZXJ0IiwiTm9kZVVwc2VydCIsInRydXN0aW5nSW5zZXJ0IiwiSFRNTFVwc2VydCIsInRleHROb2RlIiwiY3JlYXRlVGV4dE5vZGUiLCJpbnNlcnRCZWZvcmUiLCJlbGVtZW50IiwibmV4dFNpYmxpbmciLCJ1cGRhdGUiLCJfZG9tIiwibm9kZVZhbHVlIiwiaW5zZXJ0SFRNTEJlZm9yZSIsInBhcmVudEVsZW1lbnQiLCJsYXN0U3RyaW5nVmFsdWUiLCJzdHJpbmdWYWx1ZSIsIm5vZGUiLCJpbnNlcnROb2RlQmVmb3JlIl0sIm1hcHBpbmdzIjoiOzs7OztRQUVPLEFBQVM7UUFHVCxBQUFTO1FBR1QsQUFBUztRQVNULEFBQVM7UUFZVCxBQUFTOztBQTdCaEIsQUFBUyxBQUFtQjs7QUFDNUIsQUFBUyxBQUFPLEFBQVEsQUFBd0IsQUFDaEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBTyxzQkFBQSxBQUFzQixPQUFPLEFBQ2hDO1dBQU8sT0FBQSxBQUFPLFVBQVAsQUFBaUIsWUFBWSxVQUE3QixBQUF1QyxRQUFRLE9BQU8sTUFBUCxBQUFhLFdBQW5FLEFBQThFLEFBQ2pGO0FBQ0Q7QUFBTyxnQkFBQSxBQUFnQixPQUFPLEFBQzFCO1dBQU8sT0FBQSxBQUFPLFVBQVAsQUFBaUIsWUFBWSxVQUE3QixBQUF1QyxRQUFRLE9BQU8sTUFBUCxBQUFhLGFBQW5FLEFBQWdGLEFBQ25GO0FBQ0Q7QUFBTyxrQkFBQSxBQUFrQixPQUFPLEFBQzVCO1dBQU8sT0FBQSxB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O3lCLEFBQ0QseUIsQUFBTyxLLEFBQUssT0FBTyxBQUNmO1lBQUksT0FBSixBQUFJLEFBQU8sUUFBUTtnQkFBQSxBQUNULFNBRFMsQUFDRSxLQURGLEFBQ1QsQUFDTjs7Z0JBQUksZ0JBQWdCLE9BQXBCLEFBQW9CLEFBQU8sQUFDM0I7Z0JBQUksY0FBYyxtQkFBbEIsQUFBa0IsQUFBTSxBQUN4QjtpQkFBQSxBQUFLLFNBQVMsSUFBQSxBQUFJLGlCQUFKLEFBQXFCLGVBQXJCLEFBQW9DLE9BQWxELEFBQWMsQUFBMkMsQUFDekQ7bUJBQUEsQUFBTyxBQUNWO0FBTkQsZUFNTyxBQUNIO21CQUFBLEFBQU8sQUFDVjtBQUNKO0E7OztFQWZvQixBIiwiZmlsZSI6ImxpYi91cHNlcnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB1bnJlYWNoYWJsZSB9IGZyb20gJ0BnbGltbWVyL3V0aWwnO1xuaW1wb3J0IHsgY2xlYXIsIHNpbmdsZSwgU2luZ2xlTm9kZUJvdW5kcyB9IGZyb20gJy4vYm91bmRzJztcbmV4cG9ydCBmdW5jdGlvbiBpc1NhZmVTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUudG9IVE1MID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm9kZSh2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZS5ub2RlVHlwZSA9PT0gJ251bWJlcic7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbn1cbmNsYXNzIFVwc2VydCB7XG4gICAgY29uc3RydWN0b3IoYm91bmRzKSB7XG4gICAgICAgIHRoaXMuYm91bmRzID0gYm91bmRzO1xuICAgIH1cbn1cbmV4cG9ydCBkZWZhdWx0IFVwc2VydDtcbmV4cG9ydCBmdW5jdGlvbiBjYXV0aW91c0luc2VydChkb20sIGN1cnNvciwgdmFsdWUpIHtcbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBUZXh0VXBzZXJ0Lmluc2VydChkb20sIGN1cnNvciwgdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaXNTYWZlU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gU2FmZVN0cmluZ1Vwc2VydC5pbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGlzTm9kZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5vZGVVcHNlcnQuaW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSk7XG4gICAgfVxuICAgIHRocm93IHVucmVhY2hhYmxlKCk7XG59XG5leHBvcnQgZnVuY3Rpb24gdHJ1c3RpbmdJbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKSB7XG4gICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICByZXR1cm4gSFRNTFVwc2VydC5pbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKGlzTm9kZSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIE5vZGVVcHNlcnQuaW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSk7XG4gICAgfVxuICAgIHRocm93IHVucmVhY2hhYmxlKCk7XG59XG5jbGFzcyBUZXh0VXBzZXJ0IGV4dGVuZHMgVXBzZXJ0IHtcbiAgICBzdGF0aWMgaW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSkge1xuICAgICAgICBsZXQgdGV4dE5vZGUgPSBkb20uY3JlYXRlVGV4dE5vZGUodmFsdWUpO1xuICAgICAgICBkb20uaW5zZXJ0QmVmb3JlKGN1cnNvci5lbGVtZW50LCB0ZXh0Tm9kZSwgY3Vyc29yLm5leHRTaWJsaW5nKTtcbiAgICAgICAgbGV0IGJvdW5kcyA9IG5ldyBTaW5nbGVOb2RlQm91bmRzKGN1cnNvci5lbGVtZW50LCB0ZXh0Tm9kZSk7XG4gICAgICAgIHJldHVybiBuZXcgVGV4dFVwc2VydChib3VuZHMsIHRleHROb2RlKTtcbiAgICB9XG4gICAgY29uc3RydWN0b3IoYm91bmRzLCB0ZXh0Tm9kZSkge1xuICAgICAgICBzdXBlcihib3VuZHMpO1xuICAgICAgICB0aGlzLnRleHROb2RlID0gdGV4dE5vZGU7XG4gICAgfVxuICAgIHVwZGF0ZShfZG9tLCB2YWx1ZSkge1xuICAgICAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICBsZXQgeyB0ZXh0Tm9kZSB9ID0gdGhpcztcbiAgICAgICAgICAgIHRleHROb2RlLm5vZGVWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBIVE1MVXBzZXJ0IGV4dGVuZHMgVXBzZXJ0IHtcbiAgICBzdGF0aWMgaW5zZXJ0KGRvbSwgY3Vyc29yLCB2YWx1ZSkge1xuICAgICAgICBsZXQgYm91bmRzID0gZG9tLmluc2VydEhUTUxCZWZvcmUoY3Vyc29yLmVsZW1lbnQsIGN1cnNvci5uZXh0U2libGluZywgdmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IEhUTUxVcHNlcnQoYm91bmRzKTtcbiAgICB9XG4gICAgdXBkYXRlKGRvbSwgdmFsdWUpIHtcbiAgICAgICAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgbGV0IHsgYm91bmRzIH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSBib3VuZHMucGFyZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgbGV0IG5leHRTaWJsaW5nID0gY2xlYXIoYm91bmRzKTtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzID0gZG9tLmluc2VydEhUTUxCZWZvcmUocGFyZW50RWxlbWVudCwgbmV4dFNpYmxpbmcsIHZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuY2xhc3MgU2FmZVN0cmluZ1Vwc2VydCBleHRlbmRzIFVwc2VydCB7XG4gICAgY29uc3RydWN0b3IoYm91bmRzLCBsYXN0U3RyaW5nVmFsdWUpIHtcbiAgICAgICAgc3VwZXIoYm91bmRzKTtcbiAgICAgICAgdGhpcy5sYXN0U3RyaW5nVmFsdWUgPSBsYXN0U3RyaW5nVmFsdWU7XG4gICAgfVxuICAgIHN0YXRpYyBpbnNlcnQoZG9tLCBjdXJzb3IsIHZhbHVlKSB7XG4gICAgICAgIGxldCBzdHJpbmdWYWx1ZSA9IHZhbHVlLnRvSFRNTCgpO1xuICAgICAgICBsZXQgYm91bmRzID0gZG9tLmluc2VydEhUTUxCZWZvcmUoY3Vyc29yLmVsZW1lbnQsIGN1cnNvci5uZXh0U2libGluZywgc3RyaW5nVmFsdWUpO1xuICAgICAgICByZXR1cm4gbmV3IFNhZmVTdHJpbmdVcHNlcnQoYm91bmRzLCBzdHJpbmdWYWx1ZSk7XG4gICAgfVxuICAgIHVwZGF0ZShkb20sIHZhbHVlKSB7XG4gICAgICAgIGlmIChpc1NhZmVTdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICBsZXQgc3RyaW5nVmFsdWUgPSB2YWx1ZS50b0hUTUwoKTtcbiAgICAgICAgICAgIGlmIChzdHJpbmdWYWx1ZSAhPT0gdGhpcy5sYXN0U3RyaW5nVmFsdWUpIHtcbiAgICAgICAgICAgICAgICBsZXQgeyBib3VuZHMgfSA9IHRoaXM7XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSBib3VuZHMucGFyZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGxldCBuZXh0U2libGluZyA9IGNsZWFyKGJvdW5kcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5ib3VuZHMgPSBkb20uaW5zZXJ0SFRNTEJlZm9yZShwYXJlbnRFbGVtZW50LCBuZXh0U2libGluZywgc3RyaW5nVmFsdWUpO1xuICAgICAgICAgICAgICAgIHRoaXMubGFzdFN0cmluZ1ZhbHVlID0gc3RyaW5nVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmNsYXNzIE5vZGVVcHNlcnQgZXh0ZW5kcyBVcHNlcnQge1xuICAgIHN0YXRpYyBpbnNlcnQoZG9tLCBjdXJzb3IsIG5vZGUpIHtcbiAgICAgICAgZG9tLmluc2VydEJlZm9yZShjdXJzb3IuZWxlbWVudCwgbm9kZSwgY3Vyc29yLm5leHRTaWJsaW5nKTtcbiAgICAgICAgcmV0dXJuIG5ldyBOb2RlVXBzZXJ0KHNpbmdsZShjdXJzb3IuZWxlbWVudCwgbm9kZSkpO1xuICAgIH1cbiAgICB1cGRhdGUoZG9tLCB2YWx1ZSkge1xuICAgICAgICBpZiAoaXNOb2RlKHZhbHVlKSkge1xuICAgICAgICAgICAgbGV0IHsgYm91bmRzIH0gPSB0aGlzO1xuICAgICAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSBib3VuZHMucGFyZW50RWxlbWVudCgpO1xuICAgICAgICAgICAgbGV0IG5leHRTaWJsaW5nID0gY2xlYXIoYm91bmRzKTtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzID0gZG9tLmluc2VydE5vZGVCZWZvcmUocGFyZW50RWxlbWVudCwgdmFsdWUsIG5leHRTaWJsaW5nKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufSJdfQ==