discourse/app/assets/javascripts/ember-addons/utils/handle-descriptor.js.es6

68 lines
1.7 KiB
JavaScript

import Ember from 'ember';
import extractValue from './extract-value';
const { computed, get } = Ember;
export default function handleDescriptor(target, key, desc, params = []) {
return {
enumerable: desc.enumerable,
configurable: desc.configurable,
writeable: desc.writeable,
initializer: function() {
let computedDescriptor;
if (desc.writable) {
var val = extractValue(desc);
if (typeof val === 'object') {
let value = { };
if (val.get) { value.get = callUserSuppliedGet(params, val.get); }
if (val.set) { value.set = callUserSuppliedSet(params, val.set); }
computedDescriptor = value;
} else {
computedDescriptor = callUserSuppliedGet(params, val);
}
} else {
throw new Error('ember-computed-decorators does not support using getters and setters');
}
return computed.apply(null, params.concat(computedDescriptor));
}
};
}
function niceAttr(attr) {
const parts = attr.split('.');
let i;
for (i = 0; i < parts.length; i++) {
if (parts[i] === '@each' ||
parts[i] === '[]' ||
parts[i].indexOf('{') !== -1) {
break;
}
}
return parts.slice(0, i).join('.');
}
function callUserSuppliedGet(params, func) {
params = params.map(niceAttr);
return function() {
let paramValues = params.map(p => get(this, p));
return func.apply(this, paramValues);
};
}
function callUserSuppliedSet(params, func) {
params = params.map(niceAttr);
return function(key, value) {
let paramValues = params.map(p => get(this, p));
paramValues.unshift(value);
return func.apply(this, paramValues);
};
}