mirror of
https://github.com/discourse/discourse.git
synced 2024-11-25 01:32:23 +08:00
68 lines
1.7 KiB
JavaScript
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);
|
|
};
|
|
}
|
|
|