UNPKG

ember-legacy-class-transform

Version:
211 lines (184 loc) 18.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ComputedBlueprint = undefined; exports.computed = computed; exports.observer = observer; var _objectReference = require("@glimmer/object-reference"); var _object = require("./object"); var _mixin = require("./mixin"); 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 _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } 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); } var ComputedBlueprint = exports.ComputedBlueprint = function (_Blueprint) { _inherits(ComputedBlueprint, _Blueprint); function ComputedBlueprint(accessor) { var deps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; _classCallCheck(this, ComputedBlueprint); var _this = _possibleConstructorReturn(this, _Blueprint.call(this)); _this.metadata = {}; _this.accessor = accessor; _this.deps = deps; return _this; } ComputedBlueprint.prototype.descriptor = function descriptor(_target, key, classMeta) { classMeta.addReferenceTypeFor(key, (0, _objectReference.ComputedReferenceBlueprint)(key, this.deps)); classMeta.addPropertyMetadata(key, this.metadata); classMeta.addSlotFor(key); return new Computed(this.accessor); }; ComputedBlueprint.prototype.property = function property() { for (var _len = arguments.length, paths = Array(_len), _key = 0; _key < _len; _key++) { paths[_key] = arguments[_key]; } this.deps = paths.map(function (d) { return d.split('.'); }); return this; }; ComputedBlueprint.prototype.meta = function meta(object) { this.metadata = object; return this; }; ComputedBlueprint.prototype.volatile = function volatile() { return this; }; return ComputedBlueprint; }(_mixin.Blueprint); var Computed = function () { function Computed(accessor) { _classCallCheck(this, Computed); this["5d90f84f-908e-4a42-9749-3d0f523c262c"] = true; this.accessor = accessor; } Computed.prototype.define = function define(prototype, key, home) { Object.defineProperty(prototype, key, wrapAccessor(home, key, this.accessor)); }; return Computed; }(); function wrapAccessor(home, accessorName, _desc) { var superDesc = getPropertyDescriptor(home, accessorName); var originalGet = void 0; var originalSet = void 0; var desc = { enumerable: true, configurable: true }; var get = _desc.get; if (get && get.length > 0) { originalGet = function () { return get.call(this, accessorName); }; } else { originalGet = _desc.get; } var set = _desc.set; if (set && set.length > 1) { originalSet = function (value) { return set.call(this, accessorName, value); }; } else { originalSet = _desc.set; } var cacheGet = function () { if (_objectReference.Meta.exists(this)) { var slot = _objectReference.Meta.for(this).getSlots()[accessorName]; if (slot !== _object.EMPTY_CACHE) return slot; } return originalGet.call(this); }; var cacheSet = void 0; if (originalSet) { cacheSet = function (value) { var meta = _objectReference.Meta.for(this); var slots = meta.getSlots(); var ret = originalSet.call(this, value); if (ret !== undefined) { slots[accessorName] = ret; } }; } else { cacheSet = function (value) { var meta = _objectReference.Meta.for(this); var slots = meta.getSlots(); if (value !== undefined) slots[accessorName] = value; }; } if (!superDesc || 'value' in superDesc) { desc.get = cacheGet; desc.set = cacheSet; return desc; } desc.get = function () { var lastSuper = this._super; this._super = function () { return superDesc.get.call(this); }; try { return cacheGet.call(this); } finally { this._super = lastSuper; } }; desc.set = function (val) { var lastSuper = this._super; this._super = function () { return superDesc.set.call(this, val); }; try { return cacheSet.call(this, val); } finally { this._super = lastSuper; } }; return desc; } function getPropertyDescriptor(subject, name) { var pd = Object.getOwnPropertyDescriptor(subject, name); var proto = Object.getPrototypeOf(subject); while (typeof pd === 'undefined' && proto !== null) { pd = Object.getOwnPropertyDescriptor(proto, name); proto = Object.getPrototypeOf(proto); } return pd; } function computed() { for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } var last = args.pop(); var deps = args; if (typeof last === 'function') { var _ref; return (_ref = new ComputedBlueprint({ get: last })).property.apply(_ref, deps); } else if (typeof last === 'object') { var _ref2; return (_ref2 = new ComputedBlueprint(last)).property.apply(_ref2, deps); } else { throw new TypeError("computed expects a function or an object as last argument"); } } function observer() {} //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi9jb21wdXRlZC5qcyJdLCJuYW1lcyI6WyJDb21wdXRlZFJlZmVyZW5jZUJsdWVwcmludCIsIk1ldGEiLCJFTVBUWV9DQUNIRSIsIkJsdWVwcmludCIsIkNvbXB1dGVkQmx1ZXByaW50IiwiYWNjZXNzb3IiLCJkZXBzIiwibWV0YWRhdGEiLCJkZXNjcmlwdG9yIiwiX3RhcmdldCIsImtleSIsImNsYXNzTWV0YSIsImFkZFJlZmVyZW5jZVR5cGVGb3IiLCJhZGRQcm9wZXJ0eU1ldGFkYXRhIiwiYWRkU2xvdEZvciIsIkNvbXB1dGVkIiwicHJvcGVydHkiLCJwYXRocyIsIm1hcCIsImQiLCJzcGxpdCIsIm1ldGEiLCJvYmplY3QiLCJ2b2xhdGlsZSIsImRlZmluZSIsInByb3RvdHlwZSIsImhvbWUiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsIndyYXBBY2Nlc3NvciIsImFjY2Vzc29yTmFtZSIsIl9kZXNjIiwic3VwZXJEZXNjIiwiZ2V0UHJvcGVydHlEZXNjcmlwdG9yIiwib3JpZ2luYWxHZXQiLCJvcmlnaW5hbFNldCIsImRlc2MiLCJlbnVtZXJhYmxlIiwiY29uZmlndXJhYmxlIiwiZ2V0IiwibGVuZ3RoIiwiY2FsbCIsInNldCIsInZhbHVlIiwiY2FjaGVHZXQiLCJleGlzdHMiLCJzbG90IiwiZm9yIiwiZ2V0U2xvdHMiLCJjYWNoZVNldCIsInNsb3RzIiwicmV0IiwidW5kZWZpbmVkIiwibGFzdFN1cGVyIiwiX3N1cGVyIiwidmFsIiwic3ViamVjdCIsIm5hbWUiLCJwZCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInByb3RvIiwiZ2V0UHJvdG90eXBlT2YiLCJjb21wdXRlZCIsImFyZ3MiLCJsYXN0IiwicG9wIiwiVHlwZUVycm9yIiwib2JzZXJ2ZXIiXSwibWFwcGluZ3MiOiI7Ozs7OztRQTJITyxBQUFTO1FBYVQsQUFBUzs7QUF4SWhCLEFBQVMsQUFBNEIsQUFBWTs7QUFDakQsQUFBUyxBQUFtQjs7QUFDNUIsQUFBUyxBQUFpQixB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QUFPLG9CQUE0QixBQUFFIiwiZmlsZSI6ImxpYi9jb21wdXRlZC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXB1dGVkUmVmZXJlbmNlQmx1ZXByaW50LCBNZXRhIH0gZnJvbSAnQGdsaW1tZXIvb2JqZWN0LXJlZmVyZW5jZSc7XG5pbXBvcnQgeyBFTVBUWV9DQUNIRSB9IGZyb20gJy4vb2JqZWN0JztcbmltcG9ydCB7IEJsdWVwcmludCB9IGZyb20gJy4vbWl4aW4nO1xuZXhwb3J0IGNsYXNzIENvbXB1dGVkQmx1ZXByaW50IGV4dGVuZHMgQmx1ZXByaW50IHtcbiAgICBjb25zdHJ1Y3RvcihhY2Nlc3NvciwgZGVwcyA9IFtdKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSB7fTtcbiAgICAgICAgdGhpcy5hY2Nlc3NvciA9IGFjY2Vzc29yO1xuICAgICAgICB0aGlzLmRlcHMgPSBkZXBzO1xuICAgIH1cbiAgICBkZXNjcmlwdG9yKF90YXJnZXQsIGtleSwgY2xhc3NNZXRhKSB7XG4gICAgICAgIGNsYXNzTWV0YS5hZGRSZWZlcmVuY2VUeXBlRm9yKGtleSwgQ29tcHV0ZWRSZWZlcmVuY2VCbHVlcHJpbnQoa2V5LCB0aGlzLmRlcHMpKTtcbiAgICAgICAgY2xhc3NNZXRhLmFkZFByb3BlcnR5TWV0YWRhdGEoa2V5LCB0aGlzLm1ldGFkYXRhKTtcbiAgICAgICAgY2xhc3NNZXRhLmFkZFNsb3RGb3Ioa2V5KTtcbiAgICAgICAgcmV0dXJuIG5ldyBDb21wdXRlZCh0aGlzLmFjY2Vzc29yKTtcbiAgICB9XG4gICAgcHJvcGVydHkoLi4ucGF0aHMpIHtcbiAgICAgICAgdGhpcy5kZXBzID0gcGF0aHMubWFwKGQgPT4gZC5zcGxpdCgnLicpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIG1ldGEob2JqZWN0KSB7XG4gICAgICAgIHRoaXMubWV0YWRhdGEgPSBvYmplY3Q7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cbiAgICB2b2xhdGlsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuY2xhc3MgQ29tcHV0ZWQge1xuICAgIGNvbnN0cnVjdG9yKGFjY2Vzc29yKSB7XG4gICAgICAgIHRoaXNbXCI1ZDkwZjg0Zi05MDhlLTRhNDItOTc0OS0zZDBmNTIzYzI2MmNcIl0gPSB0cnVlO1xuICAgICAgICB0aGlzLmFjY2Vzc29yID0gYWNjZXNzb3I7XG4gICAgfVxuICAgIGRlZmluZShwcm90b3R5cGUsIGtleSwgaG9tZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBrZXksIHdyYXBBY2Nlc3Nvcihob21lLCBrZXksIHRoaXMuYWNjZXNzb3IpKTtcbiAgICB9XG59XG5mdW5jdGlvbiB3cmFwQWNjZXNzb3IoaG9tZSwgYWNjZXNzb3JOYW1lLCBfZGVzYykge1xuICAgIGxldCBzdXBlckRlc2MgPSBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoaG9tZSwgYWNjZXNzb3JOYW1lKTtcbiAgICBsZXQgb3JpZ2luYWxHZXQ7XG4gICAgbGV0IG9yaWdpbmFsU2V0O1xuICAgIGxldCBkZXNjID0ge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9O1xuICAgIGxldCBnZXQgPSBfZGVzYy5nZXQ7XG4gICAgaWYgKGdldCAmJiBnZXQubGVuZ3RoID4gMCkge1xuICAgICAgICBvcmlnaW5hbEdldCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXQuY2FsbCh0aGlzLCBhY2Nlc3Nvck5hbWUpO1xuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIG9yaWdpbmFsR2V0ID0gX2Rlc2MuZ2V0O1xuICAgIH1cbiAgICBsZXQgc2V0ID0gX2Rlc2Muc2V0O1xuICAgIGlmIChzZXQgJiYgc2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgb3JpZ2luYWxTZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBzZXQuY2FsbCh0aGlzLCBhY2Nlc3Nvck5hbWUsIHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBvcmlnaW5hbFNldCA9IF9kZXNjLnNldDtcbiAgICB9XG4gICAgbGV0IGNhY2hlR2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoTWV0YS5leGlzdHModGhpcykpIHtcbiAgICAgICAgICAgIGxldCBzbG90ID0gTWV0YS5mb3IodGhpcykuZ2V0U2xvdHMoKVthY2Nlc3Nvck5hbWVdO1xuICAgICAgICAgICAgaWYgKHNsb3QgIT09IEVNUFRZX0NBQ0hFKSByZXR1cm4gc2xvdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3JpZ2luYWxHZXQuY2FsbCh0aGlzKTtcbiAgICB9O1xuICAgIGxldCBjYWNoZVNldDtcbiAgICBpZiAob3JpZ2luYWxTZXQpIHtcbiAgICAgICAgY2FjaGVTZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGxldCBtZXRhID0gTWV0YS5mb3IodGhpcyk7XG4gICAgICAgICAgICBsZXQgc2xvdHMgPSBtZXRhLmdldFNsb3RzKCk7XG4gICAgICAgICAgICBsZXQgcmV0ID0gb3JpZ2luYWxTZXQuY2FsbCh0aGlzLCB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAocmV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBzbG90c1thY2Nlc3Nvck5hbWVdID0gcmV0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGNhY2hlU2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgbWV0YSA9IE1ldGEuZm9yKHRoaXMpO1xuICAgICAgICAgICAgbGV0IHNsb3RzID0gbWV0YS5nZXRTbG90cygpO1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHNsb3RzW2FjY2Vzc29yTmFtZV0gPSB2YWx1ZTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgaWYgKCFzdXBlckRlc2MgfHwgJ3ZhbHVlJyBpbiBzdXBlckRlc2MpIHtcbiAgICAgICAgZGVzYy5nZXQgPSBjYWNoZUdldDtcbiAgICAgICAgZGVzYy5zZXQgPSBjYWNoZVNldDtcbiAgICAgICAgcmV0dXJuIGRlc2M7XG4gICAgfVxuICAgIGRlc2MuZ2V0ID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgbGFzdFN1cGVyID0gdGhpcy5fc3VwZXI7XG4gICAgICAgIHRoaXMuX3N1cGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyRGVzYy5nZXQuY2FsbCh0aGlzKTtcbiAgICAgICAgfTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZUdldC5jYWxsKHRoaXMpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgdGhpcy5fc3VwZXIgPSBsYXN0U3VwZXI7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGRlc2Muc2V0ID0gZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICBsZXQgbGFzdFN1cGVyID0gdGhpcy5fc3VwZXI7XG4gICAgICAgIHRoaXMuX3N1cGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1cGVyRGVzYy5zZXQuY2FsbCh0aGlzLCB2YWwpO1xuICAgICAgICB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlU2V0LmNhbGwodGhpcywgdmFsKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIHRoaXMuX3N1cGVyID0gbGFzdFN1cGVyO1xuICAgICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gZGVzYztcbn1cbmZ1bmN0aW9uIGdldFByb3BlcnR5RGVzY3JpcHRvcihzdWJqZWN0LCBuYW1lKSB7XG4gICAgbGV0IHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzdWJqZWN0LCBuYW1lKTtcbiAgICBsZXQgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Yoc3ViamVjdCk7XG4gICAgd2hpbGUgKHR5cGVvZiBwZCA9PT0gJ3VuZGVmaW5lZCcgJiYgcHJvdG8gIT09IG51bGwpIHtcbiAgICAgICAgcGQgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBuYW1lKTtcbiAgICAgICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIH1cbiAgICByZXR1cm4gcGQ7XG59XG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZWQoLi4uYXJncykge1xuICAgIGxldCBsYXN0ID0gYXJncy5wb3AoKTtcbiAgICBsZXQgZGVwcyA9IGFyZ3M7XG4gICAgaWYgKHR5cGVvZiBsYXN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcHV0ZWRCbHVlcHJpbnQoe1xuICAgICAgICAgICAgZ2V0OiBsYXN0XG4gICAgICAgIH0pLnByb3BlcnR5KC4uLmRlcHMpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGxhc3QgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBuZXcgQ29tcHV0ZWRCbHVlcHJpbnQobGFzdCkucHJvcGVydHkoLi4uZGVwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNvbXB1dGVkIGV4cGVjdHMgYSBmdW5jdGlvbiBvciBhbiBvYmplY3QgYXMgbGFzdCBhcmd1bWVudFwiKTtcbiAgICB9XG59XG5leHBvcnQgZnVuY3Rpb24gb2JzZXJ2ZXIoLi4uX2FyZ3MpIHt9Il19