/
attributes.js
153 lines (121 loc) · 3.83 KB
/
attributes.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
var get = Ember.get, getPath = Ember.getPath;
require("ember-data/system/model/model");
DS.Model.reopenClass({
attributes: Ember.computed(function() {
var map = Ember.Map.create();
this.eachComputedProperty(function(name, meta) {
if (meta.isAttribute) { map.set(name, meta); }
});
return map;
}).cacheable(),
processAttributeKeys: function() {
if (this.processedAttributeKeys) { return; }
var namingConvention = this.proto().namingConvention;
this.eachComputedProperty(function(name, meta) {
if (meta.isAttribute && !meta.options.key) {
meta.options.key = namingConvention.keyToJSONKey(name, this);
}
}, this);
}
});
DS.attr = function(type, options) {
var transform = DS.attr.transforms[type];
Ember.assert("Could not find model attribute of type " + type, !!transform);
var transformFrom = transform.from;
var transformTo = transform.to;
options = options || {};
var meta = {
type: type,
isAttribute: true,
options: options,
// this will ensure that the key always takes naming
// conventions into consideration.
key: function(recordType) {
recordType.processAttributeKeys();
return options.key;
}
};
return Ember.computed(function(key, value) {
var data;
key = meta.key(this.constructor);
if (arguments.length === 2) {
value = transformTo(value);
this.setProperty(key, value);
} else {
data = get(this, 'data');
value = get(data, key);
if (value === undefined) {
value = options.defaultValue;
}
}
return transformFrom(value);
// `data` is never set directly. However, it may be
// invalidated from the state manager's setData
// event.
}).property('data').cacheable().meta(meta);
};
DS.attr.transforms = {
string: {
from: function(serialized) {
return Ember.none(serialized) ? null : String(serialized);
},
to: function(deserialized) {
return Ember.none(deserialized) ? null : String(deserialized);
}
},
number: {
from: function(serialized) {
return Ember.none(serialized) ? null : Number(serialized);
},
to: function(deserialized) {
return Ember.none(deserialized) ? null : Number(deserialized);
}
},
'boolean': {
from: function(serialized) {
return Boolean(serialized);
},
to: function(deserialized) {
return Boolean(deserialized);
}
},
date: {
from: function(serialized) {
var type = typeof serialized;
if (type === "string" || type === "number") {
return new Date(serialized);
} else if (serialized === null || serialized === undefined) {
// if the value is not present in the data,
// return undefined, not null.
return serialized;
} else {
return null;
}
},
to: function(date) {
if (date instanceof Date) {
var days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var pad = function(num) {
return num < 10 ? "0"+num : ""+num;
};
var utcYear = date.getUTCFullYear(),
utcMonth = date.getUTCMonth(),
utcDayOfMonth = date.getUTCDate(),
utcDay = date.getUTCDay(),
utcHours = date.getUTCHours(),
utcMinutes = date.getUTCMinutes(),
utcSeconds = date.getUTCSeconds();
var dayOfWeek = days[utcDay];
var dayOfMonth = pad(utcDayOfMonth);
var month = months[utcMonth];
return dayOfWeek + ", " + dayOfMonth + " " + month + " " + utcYear + " " +
pad(utcHours) + ":" + pad(utcMinutes) + ":" + pad(utcSeconds) + " GMT";
} else if (date === undefined) {
return undefined;
} else {
return null;
}
}
}
};