ember-source 1.3.0.beta.4 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of ember-source might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/dist/ember-data-deps.js +1797 -1029
- data/dist/ember-data-deps.min.js +6 -6
- data/dist/ember-data-deps.prod.js +1755 -1044
- data/dist/ember-debug.js +21 -3
- data/dist/ember-runtime.js +1797 -1029
- data/dist/ember-runtime.min.js +6 -6
- data/dist/ember-runtime.prod.js +1755 -1044
- data/dist/ember-spade.js +3 -3
- data/dist/ember-template-compiler.js +13 -10
- data/dist/ember-template-compiler.min.js +2 -2
- data/dist/ember-template-compiler.prod.js +7 -12
- data/dist/ember-tests.js +3 -3
- data/dist/ember.js +2488 -1694
- data/dist/ember.min.js +10 -10
- data/dist/ember.prod.js +2426 -1731
- metadata +10 -11
data/dist/ember-debug.js
CHANGED
@@ -2,12 +2,12 @@
|
|
2
2
|
var Ember = { assert: function() {}, FEATURES: { isEnabled: function() {} } };
|
3
3
|
/*!
|
4
4
|
* @overview Ember - JavaScript Application Framework
|
5
|
-
* @copyright Copyright 2011-
|
5
|
+
* @copyright Copyright 2011-2014 Tilde Inc. and contributors
|
6
6
|
* Portions Copyright 2006-2011 Strobe Inc.
|
7
7
|
* Portions Copyright 2008-2011 Apple Inc. All rights reserved.
|
8
8
|
* @license Licensed under MIT license
|
9
9
|
* See https://raw.github.com/emberjs/ember.js/master/LICENSE
|
10
|
-
* @version 1.
|
10
|
+
* @version 1.3.0
|
11
11
|
*/
|
12
12
|
|
13
13
|
|
@@ -33,7 +33,20 @@ if ('undefined' === typeof Ember) {
|
|
33
33
|
}
|
34
34
|
}
|
35
35
|
|
36
|
-
|
36
|
+
// This needs to be kept in sync with the logic in
|
37
|
+
// `packages/ember-metal/lib/core.js`.
|
38
|
+
//
|
39
|
+
// This is duplicated here to ensure that `Ember.ENV`
|
40
|
+
// is setup even if `Ember` is not loaded yet.
|
41
|
+
if (Ember.ENV) {
|
42
|
+
// do nothing if Ember.ENV is already setup
|
43
|
+
} else if ('undefined' !== typeof EmberENV) {
|
44
|
+
Ember.ENV = EmberENV;
|
45
|
+
} else if('undefined' !== typeof ENV) {
|
46
|
+
Ember.ENV = ENV;
|
47
|
+
} else {
|
48
|
+
Ember.ENV = {};
|
49
|
+
}
|
37
50
|
|
38
51
|
if (!('MANDATORY_SETTER' in Ember.ENV)) {
|
39
52
|
Ember.ENV.MANDATORY_SETTER = true; // default to true for debug dist
|
@@ -59,6 +72,11 @@ if (!('MANDATORY_SETTER' in Ember.ENV)) {
|
|
59
72
|
*/
|
60
73
|
Ember.assert = function(desc, test) {
|
61
74
|
if (!test) {
|
75
|
+
Ember.Logger.assert(test, desc);
|
76
|
+
}
|
77
|
+
|
78
|
+
if (Ember.testing && !test) {
|
79
|
+
// when testing, ensure test failures when assertions fail
|
62
80
|
throw new Ember.Error("Assertion Failed: " + desc);
|
63
81
|
}
|
64
82
|
};
|
data/dist/ember-runtime.js
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
/*!
|
2
2
|
* @overview Ember - JavaScript Application Framework
|
3
|
-
* @copyright Copyright 2011-
|
3
|
+
* @copyright Copyright 2011-2014 Tilde Inc. and contributors
|
4
4
|
* Portions Copyright 2006-2011 Strobe Inc.
|
5
5
|
* Portions Copyright 2008-2011 Apple Inc. All rights reserved.
|
6
6
|
* @license Licensed under MIT license
|
7
7
|
* See https://raw.github.com/emberjs/ember.js/master/LICENSE
|
8
|
-
* @version 1.
|
8
|
+
* @version 1.3.0
|
9
9
|
*/
|
10
10
|
|
11
11
|
|
@@ -31,7 +31,20 @@ if ('undefined' === typeof Ember) {
|
|
31
31
|
}
|
32
32
|
}
|
33
33
|
|
34
|
-
|
34
|
+
// This needs to be kept in sync with the logic in
|
35
|
+
// `packages/ember-metal/lib/core.js`.
|
36
|
+
//
|
37
|
+
// This is duplicated here to ensure that `Ember.ENV`
|
38
|
+
// is setup even if `Ember` is not loaded yet.
|
39
|
+
if (Ember.ENV) {
|
40
|
+
// do nothing if Ember.ENV is already setup
|
41
|
+
} else if ('undefined' !== typeof EmberENV) {
|
42
|
+
Ember.ENV = EmberENV;
|
43
|
+
} else if('undefined' !== typeof ENV) {
|
44
|
+
Ember.ENV = ENV;
|
45
|
+
} else {
|
46
|
+
Ember.ENV = {};
|
47
|
+
}
|
35
48
|
|
36
49
|
if (!('MANDATORY_SETTER' in Ember.ENV)) {
|
37
50
|
Ember.ENV.MANDATORY_SETTER = true; // default to true for debug dist
|
@@ -57,6 +70,11 @@ if (!('MANDATORY_SETTER' in Ember.ENV)) {
|
|
57
70
|
*/
|
58
71
|
Ember.assert = function(desc, test) {
|
59
72
|
if (!test) {
|
73
|
+
Ember.Logger.assert(test, desc);
|
74
|
+
}
|
75
|
+
|
76
|
+
if (Ember.testing && !test) {
|
77
|
+
// when testing, ensure test failures when assertions fail
|
60
78
|
throw new Ember.Error("Assertion Failed: " + desc);
|
61
79
|
}
|
62
80
|
};
|
@@ -180,12 +198,12 @@ if (!Ember.testing) {
|
|
180
198
|
|
181
199
|
/*!
|
182
200
|
* @overview Ember - JavaScript Application Framework
|
183
|
-
* @copyright Copyright 2011-
|
201
|
+
* @copyright Copyright 2011-2014 Tilde Inc. and contributors
|
184
202
|
* Portions Copyright 2006-2011 Strobe Inc.
|
185
203
|
* Portions Copyright 2008-2011 Apple Inc. All rights reserved.
|
186
204
|
* @license Licensed under MIT license
|
187
205
|
* See https://raw.github.com/emberjs/ember.js/master/LICENSE
|
188
|
-
* @version 1.
|
206
|
+
* @version 1.3.0
|
189
207
|
*/
|
190
208
|
|
191
209
|
|
@@ -244,7 +262,7 @@ var define, requireModule, require, requirejs;
|
|
244
262
|
};
|
245
263
|
})();
|
246
264
|
(function() {
|
247
|
-
/*globals Em:true ENV */
|
265
|
+
/*globals Em:true ENV EmberENV MetamorphENV:true */
|
248
266
|
|
249
267
|
/**
|
250
268
|
@module ember
|
@@ -268,7 +286,7 @@ var define, requireModule, require, requirejs;
|
|
268
286
|
|
269
287
|
@class Ember
|
270
288
|
@static
|
271
|
-
@version 1.
|
289
|
+
@version 1.3.0
|
272
290
|
*/
|
273
291
|
|
274
292
|
if ('undefined' === typeof Ember) {
|
@@ -295,33 +313,46 @@ Ember.toString = function() { return "Ember"; };
|
|
295
313
|
/**
|
296
314
|
@property VERSION
|
297
315
|
@type String
|
298
|
-
@default '1.
|
299
|
-
@
|
316
|
+
@default '1.3.0'
|
317
|
+
@static
|
300
318
|
*/
|
301
|
-
Ember.VERSION = '1.
|
319
|
+
Ember.VERSION = '1.3.0';
|
302
320
|
|
303
321
|
/**
|
304
|
-
Standard environmental variables. You can define these in a global `
|
305
|
-
variable before loading Ember to control various configuration
|
306
|
-
|
322
|
+
Standard environmental variables. You can define these in a global `EmberENV`
|
323
|
+
variable before loading Ember to control various configuration settings.
|
324
|
+
|
325
|
+
For backwards compatibility with earlier versions of Ember the global `ENV`
|
326
|
+
variable will be used if `EmberENV` is not defined.
|
307
327
|
|
308
328
|
@property ENV
|
309
329
|
@type Hash
|
310
330
|
*/
|
311
331
|
|
312
|
-
|
313
|
-
|
332
|
+
// This needs to be kept in sync with the logic in
|
333
|
+
// `packages/ember-debug/lib/main.js`.
|
334
|
+
if (Ember.ENV) {
|
335
|
+
// do nothing if Ember.ENV is already setup
|
336
|
+
} else if ('undefined' !== typeof EmberENV) {
|
337
|
+
Ember.ENV = EmberENV;
|
338
|
+
} else if('undefined' !== typeof ENV) {
|
339
|
+
Ember.ENV = ENV;
|
340
|
+
} else {
|
341
|
+
Ember.ENV = {};
|
314
342
|
}
|
315
343
|
|
344
|
+
Ember.config = Ember.config || {};
|
345
|
+
|
316
346
|
// We disable the RANGE API by default for performance reasons
|
317
|
-
if ('undefined' === typeof ENV.DISABLE_RANGE_API) {
|
318
|
-
ENV.DISABLE_RANGE_API = true;
|
347
|
+
if ('undefined' === typeof Ember.ENV.DISABLE_RANGE_API) {
|
348
|
+
Ember.ENV.DISABLE_RANGE_API = true;
|
319
349
|
}
|
320
350
|
|
351
|
+
if ("undefined" === typeof MetamorphENV) {
|
352
|
+
exports.MetamorphENV = {};
|
353
|
+
}
|
321
354
|
|
322
|
-
|
323
|
-
|
324
|
-
Ember.config = Ember.config || {};
|
355
|
+
MetamorphENV.DISABLE_RANGE_API = Ember.ENV.DISABLE_RANGE_API;
|
325
356
|
|
326
357
|
/**
|
327
358
|
Hash of enabled Canary features. Add to before creating your application.
|
@@ -847,10 +878,9 @@ Ember.Error.prototype = Ember.create(Error.prototype);
|
|
847
878
|
Ember.onerror = null;
|
848
879
|
|
849
880
|
/**
|
850
|
-
@private
|
851
|
-
|
852
881
|
Wrap code block in a try/catch if `Ember.onerror` is set.
|
853
882
|
|
883
|
+
@private
|
854
884
|
@method handleErrors
|
855
885
|
@for Ember
|
856
886
|
@param {Function} func
|
@@ -880,10 +910,8 @@ Ember.handleErrors = function(func, context) {
|
|
880
910
|
*/
|
881
911
|
|
882
912
|
/**
|
883
|
-
@private
|
884
|
-
|
885
913
|
Prefix used for guids through out Ember.
|
886
|
-
|
914
|
+
@private
|
887
915
|
*/
|
888
916
|
Ember.GUID_PREFIX = 'ember';
|
889
917
|
|
@@ -899,8 +927,6 @@ var o_defineProperty = Ember.platform.defineProperty,
|
|
899
927
|
var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER;
|
900
928
|
|
901
929
|
/**
|
902
|
-
@private
|
903
|
-
|
904
930
|
A unique key used to assign guids and other private metadata to objects.
|
905
931
|
If you inspect an object in your browser debugger you will often see these.
|
906
932
|
They can be safely ignored.
|
@@ -908,6 +934,7 @@ var MANDATORY_SETTER = Ember.ENV.MANDATORY_SETTER;
|
|
908
934
|
On browsers that support it, these properties are added with enumeration
|
909
935
|
disabled so they won't show up when you iterate over your properties.
|
910
936
|
|
937
|
+
@private
|
911
938
|
@property GUID_KEY
|
912
939
|
@for Ember
|
913
940
|
@type String
|
@@ -923,12 +950,11 @@ var GUID_DESC = {
|
|
923
950
|
};
|
924
951
|
|
925
952
|
/**
|
926
|
-
@private
|
927
|
-
|
928
953
|
Generates a new guid, optionally saving the guid to the object that you
|
929
954
|
pass in. You will rarely need to use this method. Instead you should
|
930
955
|
call `Ember.guidFor(obj)`, which return an existing guid if available.
|
931
956
|
|
957
|
+
@private
|
932
958
|
@method generateGuid
|
933
959
|
@for Ember
|
934
960
|
@param {Object} [obj] Object the guid will be used for. If passed in, the guid will
|
@@ -951,8 +977,6 @@ Ember.generateGuid = function generateGuid(obj, prefix) {
|
|
951
977
|
};
|
952
978
|
|
953
979
|
/**
|
954
|
-
@private
|
955
|
-
|
956
980
|
Returns a unique id for the object. If the object does not yet have a guid,
|
957
981
|
one will be assigned to it. You can call this on any object,
|
958
982
|
`Ember.Object`-based or not, but be aware that it will add a `_guid`
|
@@ -960,6 +984,7 @@ Ember.generateGuid = function generateGuid(obj, prefix) {
|
|
960
984
|
|
961
985
|
You can also use this method on DOM Element objects.
|
962
986
|
|
987
|
+
@private
|
963
988
|
@method guidFor
|
964
989
|
@for Ember
|
965
990
|
@param {Object} obj any object, string, number, Element, or primitive
|
@@ -1024,18 +1049,6 @@ var META_KEY = Ember.GUID_KEY+'_meta';
|
|
1024
1049
|
*/
|
1025
1050
|
Ember.META_KEY = META_KEY;
|
1026
1051
|
|
1027
|
-
// Placeholder for non-writable metas.
|
1028
|
-
var EMPTY_META = {
|
1029
|
-
descs: {},
|
1030
|
-
watching: {}
|
1031
|
-
};
|
1032
|
-
|
1033
|
-
if (MANDATORY_SETTER) { EMPTY_META.values = {}; }
|
1034
|
-
|
1035
|
-
Ember.EMPTY_META = EMPTY_META;
|
1036
|
-
|
1037
|
-
if (Object.freeze) Object.freeze(EMPTY_META);
|
1038
|
-
|
1039
1052
|
var isDefinePropertySimulated = Ember.platform.defineProperty.isSimulated;
|
1040
1053
|
|
1041
1054
|
function Meta(obj) {
|
@@ -1045,6 +1058,20 @@ function Meta(obj) {
|
|
1045
1058
|
this.source = obj;
|
1046
1059
|
}
|
1047
1060
|
|
1061
|
+
Meta.prototype = {
|
1062
|
+
descs: null,
|
1063
|
+
deps: null,
|
1064
|
+
watching: null,
|
1065
|
+
listeners: null,
|
1066
|
+
cache: null,
|
1067
|
+
source: null,
|
1068
|
+
mixins: null,
|
1069
|
+
bindings: null,
|
1070
|
+
chains: null,
|
1071
|
+
chainWatchers: null,
|
1072
|
+
values: null
|
1073
|
+
};
|
1074
|
+
|
1048
1075
|
if (isDefinePropertySimulated) {
|
1049
1076
|
// on platforms that don't support enumerable false
|
1050
1077
|
// make meta fail jQuery.isPlainObject() to hide from
|
@@ -1057,6 +1084,13 @@ if (isDefinePropertySimulated) {
|
|
1057
1084
|
Meta.prototype.toJSON = function () { };
|
1058
1085
|
}
|
1059
1086
|
|
1087
|
+
// Placeholder for non-writable metas.
|
1088
|
+
var EMPTY_META = new Meta(null);
|
1089
|
+
|
1090
|
+
if (MANDATORY_SETTER) { EMPTY_META.values = {}; }
|
1091
|
+
|
1092
|
+
Ember.EMPTY_META = EMPTY_META;
|
1093
|
+
|
1060
1094
|
/**
|
1061
1095
|
Retrieves the meta hash for an object. If `writable` is true ensures the
|
1062
1096
|
hash is writable for this object as well.
|
@@ -1176,12 +1210,11 @@ Ember.metaPath = function metaPath(obj, path, writable) {
|
|
1176
1210
|
};
|
1177
1211
|
|
1178
1212
|
/**
|
1179
|
-
@private
|
1180
|
-
|
1181
1213
|
Wraps the passed function so that `this._super` will point to the superFunc
|
1182
1214
|
when the function is invoked. This is the primitive we use to implement
|
1183
1215
|
calls to super.
|
1184
1216
|
|
1217
|
+
@private
|
1185
1218
|
@method wrap
|
1186
1219
|
@for Ember
|
1187
1220
|
@param {Function} func The function to call
|
@@ -1491,6 +1524,8 @@ var toString = Object.prototype.toString;
|
|
1491
1524
|
| 'undefined' | Undefined value |
|
1492
1525
|
| 'function' | A function |
|
1493
1526
|
| 'array' | An instance of Array |
|
1527
|
+
| 'regexp' | An instance of RegExp |
|
1528
|
+
| 'date' | An instance of Date |
|
1494
1529
|
| 'class' | An Ember class (created using Ember.Object.extend()) |
|
1495
1530
|
| 'instance' | An Ember object instance |
|
1496
1531
|
| 'error' | An instance of the Error object |
|
@@ -1510,6 +1545,8 @@ var toString = Object.prototype.toString;
|
|
1510
1545
|
Ember.typeOf(new Boolean(true)); // 'boolean'
|
1511
1546
|
Ember.typeOf(Ember.makeArray); // 'function'
|
1512
1547
|
Ember.typeOf([1,2,90]); // 'array'
|
1548
|
+
Ember.typeOf(/abc/); // 'regexp'
|
1549
|
+
Ember.typeOf(new Date()); // 'date'
|
1513
1550
|
Ember.typeOf(Ember.Object.extend()); // 'class'
|
1514
1551
|
Ember.typeOf(Ember.Object.create()); // 'instance'
|
1515
1552
|
Ember.typeOf(new Error('teamocil')); // 'error'
|
@@ -1533,47 +1570,12 @@ Ember.typeOf = function(item) {
|
|
1533
1570
|
} else if (ret === 'object') {
|
1534
1571
|
if (item instanceof Error) ret = 'error';
|
1535
1572
|
else if (Ember.Object && item instanceof Ember.Object) ret = 'instance';
|
1536
|
-
else ret = '
|
1573
|
+
else if (item instanceof Date) ret = 'date';
|
1537
1574
|
}
|
1538
1575
|
|
1539
1576
|
return ret;
|
1540
1577
|
};
|
1541
1578
|
|
1542
|
-
/**
|
1543
|
-
Convenience method to inspect an object. This method will attempt to
|
1544
|
-
convert the object into a useful string description.
|
1545
|
-
|
1546
|
-
It is a pretty simple implementation. If you want something more robust,
|
1547
|
-
use something like JSDump: https://github.com/NV/jsDump
|
1548
|
-
|
1549
|
-
@method inspect
|
1550
|
-
@for Ember
|
1551
|
-
@param {Object} obj The object you want to inspect.
|
1552
|
-
@return {String} A description of the object
|
1553
|
-
*/
|
1554
|
-
Ember.inspect = function(obj) {
|
1555
|
-
var type = Ember.typeOf(obj);
|
1556
|
-
if (type === 'array') {
|
1557
|
-
return '[' + obj + ']';
|
1558
|
-
}
|
1559
|
-
if (type !== 'object') {
|
1560
|
-
return obj + '';
|
1561
|
-
}
|
1562
|
-
|
1563
|
-
var v, ret = [];
|
1564
|
-
for(var key in obj) {
|
1565
|
-
if (obj.hasOwnProperty(key)) {
|
1566
|
-
v = obj[key];
|
1567
|
-
if (v === 'toString') { continue; } // ignore useless items
|
1568
|
-
if (Ember.typeOf(v) === 'function') { v = "function() { ... }"; }
|
1569
|
-
ret.push(key + ": " + v);
|
1570
|
-
}
|
1571
|
-
}
|
1572
|
-
return "{" + ret.join(", ") + "}";
|
1573
|
-
};
|
1574
|
-
|
1575
|
-
|
1576
|
-
|
1577
1579
|
})();
|
1578
1580
|
|
1579
1581
|
|
@@ -1957,13 +1959,12 @@ if (Ember.config.overrideAccessors) {
|
|
1957
1959
|
}
|
1958
1960
|
|
1959
1961
|
/**
|
1960
|
-
@private
|
1961
|
-
|
1962
1962
|
Normalizes a target/path pair to reflect that actual target/path that should
|
1963
1963
|
be observed, etc. This takes into account passing in global property
|
1964
1964
|
paths (i.e. a path beginning with a captial letter not defined on the
|
1965
1965
|
target) and * separators.
|
1966
1966
|
|
1967
|
+
@private
|
1967
1968
|
@method normalizeTuple
|
1968
1969
|
@for Ember
|
1969
1970
|
@param {Object} target The current target. May be `null`.
|
@@ -1985,7 +1986,7 @@ var normalizeTuple = Ember.normalizeTuple = function(target, path) {
|
|
1985
1986
|
}
|
1986
1987
|
|
1987
1988
|
// must return some kind of path to be valid else other things will break.
|
1988
|
-
if (!path || path.length===0) throw new Ember.Error('Path
|
1989
|
+
if (!path || path.length===0) throw new Ember.Error('Invalid Path');
|
1989
1990
|
|
1990
1991
|
return [ target, path ];
|
1991
1992
|
};
|
@@ -2212,8 +2213,6 @@ function removeListener(obj, eventName, target, method) {
|
|
2212
2213
|
}
|
2213
2214
|
|
2214
2215
|
/**
|
2215
|
-
@private
|
2216
|
-
|
2217
2216
|
Suspend listener during callback.
|
2218
2217
|
|
2219
2218
|
This should only be used by the target of the event listener
|
@@ -2221,6 +2220,7 @@ function removeListener(obj, eventName, target, method) {
|
|
2221
2220
|
an object might suspend its property change listener while it is
|
2222
2221
|
setting that property.
|
2223
2222
|
|
2223
|
+
@private
|
2224
2224
|
@method suspendListener
|
2225
2225
|
@for Ember
|
2226
2226
|
@param obj
|
@@ -2249,11 +2249,9 @@ function suspendListener(obj, eventName, target, method, callback) {
|
|
2249
2249
|
}
|
2250
2250
|
|
2251
2251
|
/**
|
2252
|
-
@private
|
2253
|
-
|
2254
2252
|
Suspends multiple listeners during a callback.
|
2255
2253
|
|
2256
|
-
|
2254
|
+
@private
|
2257
2255
|
@method suspendListeners
|
2258
2256
|
@for Ember
|
2259
2257
|
@param obj
|
@@ -2297,10 +2295,9 @@ function suspendListeners(obj, eventNames, target, method, callback) {
|
|
2297
2295
|
}
|
2298
2296
|
|
2299
2297
|
/**
|
2300
|
-
@private
|
2301
|
-
|
2302
2298
|
Return a list of currently watched events
|
2303
2299
|
|
2300
|
+
@private
|
2304
2301
|
@method watchedEvents
|
2305
2302
|
@for Ember
|
2306
2303
|
@param obj
|
@@ -2817,7 +2814,7 @@ var set = function set(obj, keyName, value, tolerant) {
|
|
2817
2814
|
if (value !== currentValue) {
|
2818
2815
|
Ember.propertyWillChange(obj, keyName);
|
2819
2816
|
if (MANDATORY_SETTER) {
|
2820
|
-
if (currentValue === undefined && !(keyName in obj)) {
|
2817
|
+
if ((currentValue === undefined && !(keyName in obj)) || !obj.propertyIsEnumerable(keyName)) {
|
2821
2818
|
Ember.defineProperty(obj, keyName, null, value); // setup mandatory setter
|
2822
2819
|
} else {
|
2823
2820
|
meta.values[keyName] = value;
|
@@ -3456,8 +3453,6 @@ var DEFAULT_GETTER_FUNCTION = Ember.DEFAULT_GETTER_FUNCTION = function(name) {
|
|
3456
3453
|
};
|
3457
3454
|
|
3458
3455
|
/**
|
3459
|
-
@private
|
3460
|
-
|
3461
3456
|
NOTE: This is a low-level method used by other parts of the API. You almost
|
3462
3457
|
never want to call this method directly. Instead you should use
|
3463
3458
|
`Ember.mixin()` to define new properties.
|
@@ -3491,6 +3486,7 @@ var DEFAULT_GETTER_FUNCTION = Ember.DEFAULT_GETTER_FUNCTION = function(name) {
|
|
3491
3486
|
}).property('firstName', 'lastName'));
|
3492
3487
|
```
|
3493
3488
|
|
3489
|
+
@private
|
3494
3490
|
@method defineProperty
|
3495
3491
|
@for Ember
|
3496
3492
|
@param {Object} obj the object to define this property on. This may be a prototype.
|
@@ -3667,7 +3663,7 @@ Ember.watchKey = function(obj, keyName) {
|
|
3667
3663
|
m.values[keyName] = obj[keyName];
|
3668
3664
|
o_defineProperty(obj, keyName, {
|
3669
3665
|
configurable: true,
|
3670
|
-
enumerable:
|
3666
|
+
enumerable: obj.propertyIsEnumerable(keyName),
|
3671
3667
|
set: Ember.MANDATORY_SETTER_FUNCTION,
|
3672
3668
|
get: Ember.DEFAULT_GETTER_FUNCTION(keyName)
|
3673
3669
|
});
|
@@ -3691,11 +3687,19 @@ Ember.unwatchKey = function(obj, keyName) {
|
|
3691
3687
|
if (MANDATORY_SETTER && keyName in obj) {
|
3692
3688
|
o_defineProperty(obj, keyName, {
|
3693
3689
|
configurable: true,
|
3694
|
-
enumerable:
|
3695
|
-
|
3696
|
-
|
3690
|
+
enumerable: obj.propertyIsEnumerable(keyName),
|
3691
|
+
set: function(val) {
|
3692
|
+
// redefine to set as enumerable
|
3693
|
+
o_defineProperty(obj, keyName, {
|
3694
|
+
configurable: true,
|
3695
|
+
writable: true,
|
3696
|
+
enumerable: true,
|
3697
|
+
value: val
|
3698
|
+
});
|
3699
|
+
delete m.values[keyName];
|
3700
|
+
},
|
3701
|
+
get: Ember.DEFAULT_GETTER_FUNCTION(keyName)
|
3697
3702
|
});
|
3698
|
-
delete m.values[keyName];
|
3699
3703
|
}
|
3700
3704
|
} else if (watching[keyName] > 1) {
|
3701
3705
|
watching[keyName]--;
|
@@ -4038,52 +4042,6 @@ Ember.finishChains = function(obj) {
|
|
4038
4042
|
|
4039
4043
|
|
4040
4044
|
(function() {
|
4041
|
-
if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
|
4042
|
-
/**
|
4043
|
-
@module ember-metal
|
4044
|
-
*/
|
4045
|
-
|
4046
|
-
var forEach = Ember.EnumerableUtils.forEach,
|
4047
|
-
BRACE_EXPANSION = /^((?:[^\.]*\.)*)\{(.*)\}$/;
|
4048
|
-
|
4049
|
-
/**
|
4050
|
-
Expands `pattern`, invoking `callback` for each expansion.
|
4051
|
-
|
4052
|
-
The only pattern supported is brace-expansion, anything else will be passed
|
4053
|
-
once to `callback` directly. Brace expansion can only appear at the end of a
|
4054
|
-
pattern, for example as the last item in a chain.
|
4055
|
-
|
4056
|
-
Example
|
4057
|
-
```js
|
4058
|
-
function echo(arg){ console.log(arg); }
|
4059
|
-
|
4060
|
-
Ember.expandProperties('foo.bar', echo); //=> 'foo.bar'
|
4061
|
-
Ember.expandProperties('{foo,bar}', echo); //=> 'foo', 'bar'
|
4062
|
-
Ember.expandProperties('foo.{bar,baz}', echo); //=> 'foo.bar', 'foo.baz'
|
4063
|
-
Ember.expandProperties('{foo,bar}.baz', echo); //=> '{foo,bar}.baz'
|
4064
|
-
```
|
4065
|
-
|
4066
|
-
@method
|
4067
|
-
@private
|
4068
|
-
@param {string} pattern The property pattern to expand.
|
4069
|
-
@param {function} callback The callback to invoke. It is invoked once per
|
4070
|
-
expansion, and is passed the expansion.
|
4071
|
-
*/
|
4072
|
-
Ember.expandProperties = function (pattern, callback) {
|
4073
|
-
var match, prefix, list;
|
4074
|
-
|
4075
|
-
if (match = BRACE_EXPANSION.exec(pattern)) {
|
4076
|
-
prefix = match[1];
|
4077
|
-
list = match[2];
|
4078
|
-
|
4079
|
-
forEach(list.split(','), function (suffix) {
|
4080
|
-
callback(prefix + suffix);
|
4081
|
-
});
|
4082
|
-
} else {
|
4083
|
-
callback(pattern);
|
4084
|
-
}
|
4085
|
-
};
|
4086
|
-
}
|
4087
4045
|
|
4088
4046
|
})();
|
4089
4047
|
|
@@ -4158,14 +4116,13 @@ function isKeyName(path) {
|
|
4158
4116
|
}
|
4159
4117
|
|
4160
4118
|
/**
|
4161
|
-
@private
|
4162
|
-
|
4163
4119
|
Starts watching a property on an object. Whenever the property changes,
|
4164
4120
|
invokes `Ember.propertyWillChange` and `Ember.propertyDidChange`. This is the
|
4165
4121
|
primitive used by observers and dependent keys; usually you will never call
|
4166
4122
|
this method directly but instead use higher level methods like
|
4167
4123
|
`Ember.addObserver()`
|
4168
4124
|
|
4125
|
+
@private
|
4169
4126
|
@method watch
|
4170
4127
|
@for Ember
|
4171
4128
|
@param obj
|
@@ -4201,12 +4158,11 @@ Ember.unwatch = function(obj, _keyPath) {
|
|
4201
4158
|
};
|
4202
4159
|
|
4203
4160
|
/**
|
4204
|
-
@private
|
4205
|
-
|
4206
4161
|
Call on an object when you first beget it from another object. This will
|
4207
4162
|
setup any chained watchers on the object instance as needed. This method is
|
4208
4163
|
safe to call multiple times.
|
4209
4164
|
|
4165
|
+
@private
|
4210
4166
|
@method rewatch
|
4211
4167
|
@for Ember
|
4212
4168
|
@param obj
|
@@ -4289,9 +4245,6 @@ var get = Ember.get,
|
|
4289
4245
|
watch = Ember.watch,
|
4290
4246
|
unwatch = Ember.unwatch;
|
4291
4247
|
|
4292
|
-
if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
|
4293
|
-
var expandProperties = Ember.expandProperties;
|
4294
|
-
}
|
4295
4248
|
|
4296
4249
|
// ..........................................................
|
4297
4250
|
// DEPENDENT KEYS
|
@@ -4556,18 +4509,9 @@ ComputedPropertyPrototype.readOnly = function(readOnly) {
|
|
4556
4509
|
ComputedPropertyPrototype.property = function() {
|
4557
4510
|
var args;
|
4558
4511
|
|
4559
|
-
|
4560
|
-
var addArg = function (property) {
|
4561
|
-
args.push(property);
|
4562
|
-
};
|
4563
|
-
|
4564
|
-
args = [];
|
4565
|
-
for (var i = 0, l = arguments.length; i < l; i++) {
|
4566
|
-
expandProperties(arguments[i], addArg);
|
4567
|
-
}
|
4568
|
-
} else {
|
4512
|
+
|
4569
4513
|
args = a_slice.call(arguments);
|
4570
|
-
|
4514
|
+
|
4571
4515
|
|
4572
4516
|
this._dependentKeys = args;
|
4573
4517
|
return this;
|
@@ -4696,7 +4640,7 @@ ComputedPropertyPrototype.set = function(obj, keyName, value) {
|
|
4696
4640
|
funcArgLength, cachedValue, ret;
|
4697
4641
|
|
4698
4642
|
if (this._readOnly) {
|
4699
|
-
throw new Ember.Error('Cannot Set: ' + keyName + ' on: ' +
|
4643
|
+
throw new Ember.Error('Cannot Set: ' + keyName + ' on: ' + obj.toString() );
|
4700
4644
|
}
|
4701
4645
|
|
4702
4646
|
this._suspended = obj;
|
@@ -4882,11 +4826,15 @@ registerComputed('empty', function(dependentKey) {
|
|
4882
4826
|
A computed property that returns true if the value of the dependent
|
4883
4827
|
property is NOT null, an empty string, empty array, or empty function.
|
4884
4828
|
|
4829
|
+
Note: When using `Ember.computed.notEmpty` to watch an array make sure to
|
4830
|
+
use the `array.[]` syntax so the computed can subscribe to transitions
|
4831
|
+
from empty to non-empty states.
|
4832
|
+
|
4885
4833
|
Example
|
4886
4834
|
|
4887
4835
|
```javascript
|
4888
4836
|
var Hamster = Ember.Object.extend({
|
4889
|
-
hasStuff: Ember.computed.notEmpty('backpack')
|
4837
|
+
hasStuff: Ember.computed.notEmpty('backpack.[]')
|
4890
4838
|
});
|
4891
4839
|
var hamster = Hamster.create({backpack: ['Food', 'Sleeping Bag', 'Tent']});
|
4892
4840
|
hamster.get('hasStuff'); // true
|
@@ -5266,7 +5214,7 @@ registerComputedWithProperties('any', function(properties) {
|
|
5266
5214
|
|
5267
5215
|
```javascript
|
5268
5216
|
var Hamster = Ember.Object.extend({
|
5269
|
-
clothes: Ember.computed.
|
5217
|
+
clothes: Ember.computed.collect('hat', 'shirt')
|
5270
5218
|
});
|
5271
5219
|
var hamster = Hamster.create();
|
5272
5220
|
hamster.get('clothes'); // [null, null]
|
@@ -5275,7 +5223,7 @@ registerComputedWithProperties('any', function(properties) {
|
|
5275
5223
|
hamster.get('clothes'); // ['Camp Hat', 'Camp Shirt']
|
5276
5224
|
```
|
5277
5225
|
|
5278
|
-
@method computed.
|
5226
|
+
@method computed.collect
|
5279
5227
|
@for Ember
|
5280
5228
|
@param {String} dependentKey*
|
5281
5229
|
@return {Ember.ComputedProperty} computed property which maps
|
@@ -5373,51 +5321,7 @@ Ember.computed.oneWay = function(dependentKey) {
|
|
5373
5321
|
});
|
5374
5322
|
};
|
5375
5323
|
|
5376
|
-
if (Ember.FEATURES.isEnabled('computed-read-only')) {
|
5377
|
-
/**
|
5378
|
-
Where `computed.oneWay` provides oneWay bindings, `computed.readOnly` provides
|
5379
|
-
a readOnly one way binding. Very often when using `computed.oneWay` one does
|
5380
|
-
not also want changes to propogate back up, as they will replace the value.
|
5381
|
-
|
5382
|
-
This prevents the reverse flow, and also throws an exception when it occurs.
|
5383
|
-
|
5384
|
-
Example
|
5385
|
-
|
5386
|
-
```javascript
|
5387
|
-
User = Ember.Object.extend({
|
5388
|
-
firstName: null,
|
5389
|
-
lastName: null,
|
5390
|
-
nickName: Ember.computed.readOnly('firstName')
|
5391
|
-
});
|
5392
|
-
|
5393
|
-
user = User.create({
|
5394
|
-
firstName: 'Teddy',
|
5395
|
-
lastName: 'Zeenny'
|
5396
|
-
});
|
5397
|
-
|
5398
|
-
user.get('nickName');
|
5399
|
-
# 'Teddy'
|
5400
|
-
|
5401
|
-
user.set('nickName', 'TeddyBear');
|
5402
|
-
# throws Exception
|
5403
|
-
# throw new Ember.Error('Cannot Set: nickName on: <User:ember27288>' );`
|
5404
|
-
|
5405
|
-
user.get('firstName');
|
5406
|
-
# 'Teddy'
|
5407
|
-
```
|
5408
5324
|
|
5409
|
-
@method computed.readOnly
|
5410
|
-
@for Ember
|
5411
|
-
@param {String} dependentKey
|
5412
|
-
@return {Ember.ComputedProperty} computed property which creates a
|
5413
|
-
one way computed property to the original value for property.
|
5414
|
-
*/
|
5415
|
-
Ember.computed.readOnly = function(dependentKey) {
|
5416
|
-
return Ember.computed(dependentKey, function() {
|
5417
|
-
return get(this, dependentKey);
|
5418
|
-
}).readOnly();
|
5419
|
-
};
|
5420
|
-
}
|
5421
5325
|
/**
|
5422
5326
|
A computed property that acts like a standard getter and setter,
|
5423
5327
|
but returns the value at the provided `defaultPath` if the
|
@@ -5566,7 +5470,7 @@ Ember.removeBeforeObserver = function(obj, _path, target, method) {
|
|
5566
5470
|
|
5567
5471
|
|
5568
5472
|
(function() {
|
5569
|
-
define("backburner/queue",
|
5473
|
+
define("backburner/queue",
|
5570
5474
|
["exports"],
|
5571
5475
|
function(__exports__) {
|
5572
5476
|
"use strict";
|
@@ -5673,10 +5577,11 @@ define("backburner/queue",
|
|
5673
5577
|
}
|
5674
5578
|
};
|
5675
5579
|
|
5580
|
+
|
5676
5581
|
__exports__.Queue = Queue;
|
5677
5582
|
});
|
5678
5583
|
|
5679
|
-
define("backburner/deferred_action_queues",
|
5584
|
+
define("backburner/deferred_action_queues",
|
5680
5585
|
["backburner/queue","exports"],
|
5681
5586
|
function(__dependency1__, __exports__) {
|
5682
5587
|
"use strict";
|
@@ -5775,10 +5680,11 @@ define("backburner/deferred_action_queues",
|
|
5775
5680
|
return -1;
|
5776
5681
|
}
|
5777
5682
|
|
5683
|
+
|
5778
5684
|
__exports__.DeferredActionQueues = DeferredActionQueues;
|
5779
5685
|
});
|
5780
5686
|
|
5781
|
-
define("backburner",
|
5687
|
+
define("backburner",
|
5782
5688
|
["backburner/deferred_action_queues","exports"],
|
5783
5689
|
function(__dependency1__, __exports__) {
|
5784
5690
|
"use strict";
|
@@ -5887,7 +5793,7 @@ define("backburner",
|
|
5887
5793
|
method = target[method];
|
5888
5794
|
}
|
5889
5795
|
|
5890
|
-
var stack = this.DEBUG ? new Error()
|
5796
|
+
var stack = this.DEBUG ? new Error() : undefined,
|
5891
5797
|
args = arguments.length > 3 ? slice.call(arguments, 3) : undefined;
|
5892
5798
|
if (!this.currentInstance) { createAutorun(this); }
|
5893
5799
|
return this.currentInstance.schedule(queueName, target, method, args, false, stack);
|
@@ -5903,7 +5809,7 @@ define("backburner",
|
|
5903
5809
|
method = target[method];
|
5904
5810
|
}
|
5905
5811
|
|
5906
|
-
var stack = this.DEBUG ? new Error()
|
5812
|
+
var stack = this.DEBUG ? new Error() : undefined,
|
5907
5813
|
args = arguments.length > 3 ? slice.call(arguments, 3) : undefined;
|
5908
5814
|
if (!this.currentInstance) { createAutorun(this); }
|
5909
5815
|
return this.currentInstance.schedule(queueName, target, method, args, true, stack);
|
@@ -6203,9 +6109,9 @@ define("backburner",
|
|
6203
6109
|
return index;
|
6204
6110
|
}
|
6205
6111
|
|
6112
|
+
|
6206
6113
|
__exports__.Backburner = Backburner;
|
6207
6114
|
});
|
6208
|
-
|
6209
6115
|
})();
|
6210
6116
|
|
6211
6117
|
|
@@ -6287,7 +6193,6 @@ Ember.run = function(target, method) {
|
|
6287
6193
|
|
6288
6194
|
If invoked when not within a run loop:
|
6289
6195
|
|
6290
|
-
|
6291
6196
|
```javascript
|
6292
6197
|
Ember.run.join(function() {
|
6293
6198
|
// creates a new run-loop
|
@@ -6296,7 +6201,6 @@ Ember.run = function(target, method) {
|
|
6296
6201
|
|
6297
6202
|
Alternatively, if called within an existing run loop:
|
6298
6203
|
|
6299
|
-
|
6300
6204
|
```javascript
|
6301
6205
|
Ember.run(function() {
|
6302
6206
|
// creates a new run-loop
|
@@ -6314,7 +6218,7 @@ Ember.run = function(target, method) {
|
|
6314
6218
|
May be a function or a string. If you pass a string
|
6315
6219
|
then it will be looked up on the passed target.
|
6316
6220
|
@param {Object} [args*] Any additional arguments you wish to pass to the method.
|
6317
|
-
@return {Object}
|
6221
|
+
@return {Object} Return value from invoking the passed function. Please note,
|
6318
6222
|
when called within an existing loop, no return value is possible.
|
6319
6223
|
*/
|
6320
6224
|
Ember.run.join = function(target, method) {
|
@@ -6403,7 +6307,8 @@ Ember.run.end = function() {
|
|
6403
6307
|
console.log("scheduled on actions queue");
|
6404
6308
|
});
|
6405
6309
|
|
6406
|
-
// Note the functions will be run in order based on the run queues order.
|
6310
|
+
// Note the functions will be run in order based on the run queues order.
|
6311
|
+
// Output would be:
|
6407
6312
|
// scheduled on sync queue
|
6408
6313
|
// scheduled on actions queue
|
6409
6314
|
```
|
@@ -6495,7 +6400,7 @@ Ember.run.later = function(target, method) {
|
|
6495
6400
|
If you pass a string it will be resolved on the
|
6496
6401
|
target at the time the method is invoked.
|
6497
6402
|
@param {Object} [args*] Optional arguments to pass to the timeout.
|
6498
|
-
@return {Object}
|
6403
|
+
@return {Object} timer
|
6499
6404
|
*/
|
6500
6405
|
Ember.run.once = function(target, method) {
|
6501
6406
|
checkAutoRun();
|
@@ -6546,7 +6451,7 @@ Ember.run.once = function(target, method) {
|
|
6546
6451
|
If you pass a string it will be resolved on the
|
6547
6452
|
target at the time the method is invoked.
|
6548
6453
|
@param {Object} [args*] Optional arguments to pass to the timeout.
|
6549
|
-
@return {Object}
|
6454
|
+
@return {Object} timer
|
6550
6455
|
*/
|
6551
6456
|
Ember.run.scheduleOnce = function(queue, target, method) {
|
6552
6457
|
checkAutoRun();
|
@@ -6560,7 +6465,8 @@ Ember.run.scheduleOnce = function(queue, target, method) {
|
|
6560
6465
|
|
6561
6466
|
```javascript
|
6562
6467
|
Ember.run.next(myContext, function() {
|
6563
|
-
// code to be executed in the next run loop,
|
6468
|
+
// code to be executed in the next run loop,
|
6469
|
+
// which will be scheduled after the current one
|
6564
6470
|
});
|
6565
6471
|
```
|
6566
6472
|
|
@@ -6608,7 +6514,7 @@ Ember.run.scheduleOnce = function(queue, target, method) {
|
|
6608
6514
|
If you pass a string it will be resolved on the
|
6609
6515
|
target at the time the method is invoked.
|
6610
6516
|
@param {Object} [args*] Optional arguments to pass to the timeout.
|
6611
|
-
@return {Object}
|
6517
|
+
@return {Object} timer
|
6612
6518
|
*/
|
6613
6519
|
Ember.run.next = function() {
|
6614
6520
|
var args = slice.call(arguments);
|
@@ -6618,8 +6524,7 @@ Ember.run.next = function() {
|
|
6618
6524
|
|
6619
6525
|
/**
|
6620
6526
|
Cancels a scheduled item. Must be a value returned by `Ember.run.later()`,
|
6621
|
-
`Ember.run.once()`, `Ember.run.next()
|
6622
|
-
`Ember.run.throttle()`.
|
6527
|
+
`Ember.run.once()`, or `Ember.run.next()`.
|
6623
6528
|
|
6624
6529
|
```javascript
|
6625
6530
|
var runNext = Ember.run.next(myContext, function() {
|
@@ -6636,29 +6541,11 @@ Ember.run.next = function() {
|
|
6636
6541
|
// will not be executed
|
6637
6542
|
});
|
6638
6543
|
Ember.run.cancel(runOnce);
|
6639
|
-
|
6640
|
-
var throttle = Ember.run.throttle(myContext, function() {
|
6641
|
-
// will not be executed
|
6642
|
-
}, 1);
|
6643
|
-
Ember.run.cancel(throttle);
|
6644
|
-
|
6645
|
-
var debounce = Ember.run.debounce(myContext, function() {
|
6646
|
-
// will not be executed
|
6647
|
-
}, 1);
|
6648
|
-
Ember.run.cancel(debounce);
|
6649
|
-
|
6650
|
-
var debounceImmediate = Ember.run.debounce(myContext, function() {
|
6651
|
-
// will be executed since we passed in true (immediate)
|
6652
|
-
}, 100, true);
|
6653
|
-
// the 100ms delay until this method can be called again will be cancelled
|
6654
|
-
Ember.run.cancel(debounceImmediate);
|
6655
|
-
```
|
6656
|
-
```
|
6657
6544
|
```
|
6658
6545
|
|
6659
6546
|
@method cancel
|
6660
6547
|
@param {Object} timer Timer object to cancel
|
6661
|
-
@return {
|
6548
|
+
@return {void}
|
6662
6549
|
*/
|
6663
6550
|
Ember.run.cancel = function(timer) {
|
6664
6551
|
return backburner.cancel(timer);
|
@@ -6690,34 +6577,6 @@ Ember.run.cancel = function(timer) {
|
|
6690
6577
|
// console logs 'debounce ran.' one time.
|
6691
6578
|
```
|
6692
6579
|
|
6693
|
-
Immediate allows you to run the function immediately, but debounce
|
6694
|
-
other calls for this function until the wait time has elapsed. If
|
6695
|
-
`debounce` is called again before the specified time has elapsed,
|
6696
|
-
the timer is reset and the entire period msut pass again before
|
6697
|
-
the method can be called again.
|
6698
|
-
|
6699
|
-
```javascript
|
6700
|
-
var myFunc = function() { console.log(this.name + ' ran.'); };
|
6701
|
-
var myContext = {name: 'debounce'};
|
6702
|
-
|
6703
|
-
Ember.run.debounce(myContext, myFunc, 150, true);
|
6704
|
-
|
6705
|
-
// console logs 'debounce ran.' one time immediately.
|
6706
|
-
// 100ms passes
|
6707
|
-
|
6708
|
-
Ember.run.debounce(myContext, myFunc, 150, true);
|
6709
|
-
|
6710
|
-
// 150ms passes and nothing else is logged to the console and
|
6711
|
-
// the debouncee is no longer being watched
|
6712
|
-
|
6713
|
-
Ember.run.debounce(myContext, myFunc, 150, true);
|
6714
|
-
|
6715
|
-
// console logs 'debounce ran.' one time immediately.
|
6716
|
-
// 150ms passes and nothing else is logged tot he console and
|
6717
|
-
// the debouncee is no longer being watched
|
6718
|
-
|
6719
|
-
```
|
6720
|
-
|
6721
6580
|
@method debounce
|
6722
6581
|
@param {Object} [target] target of method to invoke
|
6723
6582
|
@param {Function|String} method The method to invoke.
|
@@ -6726,7 +6585,7 @@ Ember.run.cancel = function(timer) {
|
|
6726
6585
|
@param {Object} [args*] Optional arguments to pass to the timeout.
|
6727
6586
|
@param {Number} wait Number of milliseconds to wait.
|
6728
6587
|
@param {Boolean} immediate Trigger the function on the leading instead of the trailing edge of the wait interval.
|
6729
|
-
@return {
|
6588
|
+
@return {void}
|
6730
6589
|
*/
|
6731
6590
|
Ember.run.debounce = function() {
|
6732
6591
|
return backburner.debounce.apply(backburner, arguments);
|
@@ -6763,7 +6622,7 @@ Ember.run.debounce = function() {
|
|
6763
6622
|
then it will be looked up on the passed target.
|
6764
6623
|
@param {Object} [args*] Optional arguments to pass to the timeout.
|
6765
6624
|
@param {Number} spacing Number of milliseconds to space out requests.
|
6766
|
-
@return {
|
6625
|
+
@return {void}
|
6767
6626
|
*/
|
6768
6627
|
Ember.run.throttle = function() {
|
6769
6628
|
return backburner.throttle.apply(backburner, arguments);
|
@@ -7273,9 +7132,6 @@ var Mixin, REQUIRED, Alias,
|
|
7273
7132
|
defineProperty = Ember.defineProperty,
|
7274
7133
|
guidFor = Ember.guidFor;
|
7275
7134
|
|
7276
|
-
if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
|
7277
|
-
var expandProperties = Ember.expandProperties;
|
7278
|
-
}
|
7279
7135
|
|
7280
7136
|
function mixinsMeta(obj) {
|
7281
7137
|
var m = Ember.meta(obj, true), ret = m.mixins;
|
@@ -7456,7 +7312,8 @@ function mergeMixins(mixins, m, descs, values, base, keys) {
|
|
7456
7312
|
|
7457
7313
|
for(var i=0, l=mixins.length; i<l; i++) {
|
7458
7314
|
mixin = mixins[i];
|
7459
|
-
Ember.assert('Expected hash or Mixin instance, got ' + Object.prototype.toString.call(mixin),
|
7315
|
+
Ember.assert('Expected hash or Mixin instance, got ' + Object.prototype.toString.call(mixin),
|
7316
|
+
typeof mixin === 'object' && mixin !== null && Object.prototype.toString.call(mixin) !== '[object Array]');
|
7460
7317
|
|
7461
7318
|
props = mixinProperties(m, mixin);
|
7462
7319
|
if (props === CONTINUE) { continue; }
|
@@ -7729,7 +7586,8 @@ MixinPrototype.reopen = function() {
|
|
7729
7586
|
|
7730
7587
|
for(idx=0; idx < len; idx++) {
|
7731
7588
|
mixin = arguments[idx];
|
7732
|
-
Ember.assert('Expected hash or Mixin instance, got ' + Object.prototype.toString.call(mixin),
|
7589
|
+
Ember.assert('Expected hash or Mixin instance, got ' + Object.prototype.toString.call(mixin),
|
7590
|
+
typeof mixin === 'object' && mixin !== null && Object.prototype.toString.call(mixin) !== '[object Array]');
|
7733
7591
|
|
7734
7592
|
if (mixin instanceof Mixin) {
|
7735
7593
|
mixins.push(mixin);
|
@@ -7849,6 +7707,35 @@ Alias = function(methodName) {
|
|
7849
7707
|
};
|
7850
7708
|
Alias.prototype = new Ember.Descriptor();
|
7851
7709
|
|
7710
|
+
/**
|
7711
|
+
Makes a property or method available via an additional name.
|
7712
|
+
|
7713
|
+
```javascript
|
7714
|
+
App.PaintSample = Ember.Object.extend({
|
7715
|
+
color: 'red',
|
7716
|
+
colour: Ember.alias('color'),
|
7717
|
+
name: function() {
|
7718
|
+
return "Zed";
|
7719
|
+
},
|
7720
|
+
moniker: Ember.alias("name")
|
7721
|
+
});
|
7722
|
+
|
7723
|
+
var paintSample = App.PaintSample.create()
|
7724
|
+
paintSample.get('colour'); // 'red'
|
7725
|
+
paintSample.moniker(); // 'Zed'
|
7726
|
+
```
|
7727
|
+
|
7728
|
+
@method alias
|
7729
|
+
@for Ember
|
7730
|
+
@param {String} methodName name of the method or property to alias
|
7731
|
+
@return {Ember.Descriptor}
|
7732
|
+
@deprecated Use `Ember.aliasMethod` or `Ember.computed.alias` instead
|
7733
|
+
*/
|
7734
|
+
Ember.alias = function(methodName) {
|
7735
|
+
Ember.deprecate("Ember.alias is deprecated. Please use Ember.aliasMethod or Ember.computed.alias instead.");
|
7736
|
+
return new Alias(methodName);
|
7737
|
+
};
|
7738
|
+
|
7852
7739
|
/**
|
7853
7740
|
Makes a method available via an additional name.
|
7854
7741
|
|
@@ -7903,23 +7790,7 @@ Ember.observer = function() {
|
|
7903
7790
|
var func = a_slice.call(arguments, -1)[0];
|
7904
7791
|
var paths;
|
7905
7792
|
|
7906
|
-
|
7907
|
-
var addWatchedProperty = function (path) { paths.push(path); };
|
7908
|
-
var _paths = a_slice.call(arguments, 0, -1);
|
7909
|
-
|
7910
|
-
if (typeof func !== "function") {
|
7911
|
-
// revert to old, soft-deprecated argument ordering
|
7912
|
-
|
7913
|
-
func = arguments[0];
|
7914
|
-
_paths = a_slice.call(arguments, 1);
|
7915
|
-
}
|
7916
|
-
|
7917
|
-
paths = [];
|
7918
|
-
|
7919
|
-
for (var i=0; i<_paths.length; ++i) {
|
7920
|
-
expandProperties(_paths[i], addWatchedProperty);
|
7921
|
-
}
|
7922
|
-
} else {
|
7793
|
+
|
7923
7794
|
paths = a_slice.call(arguments, 0, -1);
|
7924
7795
|
|
7925
7796
|
if (typeof func !== "function") {
|
@@ -7928,7 +7799,7 @@ Ember.observer = function() {
|
|
7928
7799
|
func = arguments[0];
|
7929
7800
|
paths = a_slice.call(arguments, 1);
|
7930
7801
|
}
|
7931
|
-
|
7802
|
+
|
7932
7803
|
|
7933
7804
|
if (typeof func !== "function") {
|
7934
7805
|
throw new Ember.Error("Ember.observer called without a function");
|
@@ -8017,24 +7888,7 @@ Ember.beforeObserver = function() {
|
|
8017
7888
|
var func = a_slice.call(arguments, -1)[0];
|
8018
7889
|
var paths;
|
8019
7890
|
|
8020
|
-
|
8021
|
-
var addWatchedProperty = function(path) { paths.push(path); };
|
8022
|
-
|
8023
|
-
var _paths = a_slice.call(arguments, 0, -1);
|
8024
|
-
|
8025
|
-
if (typeof func !== "function") {
|
8026
|
-
// revert to old, soft-deprecated argument ordering
|
8027
|
-
|
8028
|
-
func = arguments[0];
|
8029
|
-
_paths = a_slice.call(arguments, 1);
|
8030
|
-
}
|
8031
|
-
|
8032
|
-
paths = [];
|
8033
|
-
|
8034
|
-
for (var i=0; i<_paths.length; ++i) {
|
8035
|
-
expandProperties(_paths[i], addWatchedProperty);
|
8036
|
-
}
|
8037
|
-
} else {
|
7891
|
+
|
8038
7892
|
paths = a_slice.call(arguments, 0, -1);
|
8039
7893
|
|
8040
7894
|
if (typeof func !== "function") {
|
@@ -8043,7 +7897,7 @@ Ember.beforeObserver = function() {
|
|
8043
7897
|
func = arguments[0];
|
8044
7898
|
paths = a_slice.call(arguments, 1);
|
8045
7899
|
}
|
8046
|
-
|
7900
|
+
|
8047
7901
|
|
8048
7902
|
if (typeof func !== "function") {
|
8049
7903
|
throw new Ember.Error("Ember.beforeObserver called without a function");
|
@@ -8122,76 +7976,110 @@ Ember Metal
|
|
8122
7976
|
@module RSVP
|
8123
7977
|
*/
|
8124
7978
|
define("rsvp/all",
|
8125
|
-
["./promise","
|
8126
|
-
function(__dependency1__,
|
7979
|
+
["./promise","exports"],
|
7980
|
+
function(__dependency1__, __exports__) {
|
8127
7981
|
"use strict";
|
8128
|
-
|
8129
|
-
|
8130
|
-
var Promise = __dependency1__.Promise;
|
8131
|
-
var isArray = __dependency2__.isArray;
|
8132
|
-
var isFunction = __dependency2__.isFunction;
|
7982
|
+
var Promise = __dependency1__["default"];
|
8133
7983
|
|
8134
7984
|
/**
|
8135
|
-
|
8136
|
-
fulfilled, or rejected if any of them become rejected. The return promise
|
8137
|
-
is fulfilled with an array that gives all the values in the order they were
|
8138
|
-
passed in the `promises` array argument.
|
7985
|
+
This is a convenient alias for `RSVP.Promise.all`.
|
8139
7986
|
|
8140
|
-
|
7987
|
+
@method all
|
7988
|
+
@for RSVP
|
7989
|
+
@param {Array} array Array of promises.
|
7990
|
+
@param {String} label An optional label. This is useful
|
7991
|
+
for tooling.
|
7992
|
+
@static
|
7993
|
+
*/
|
7994
|
+
__exports__["default"] = function all(array, label) {
|
7995
|
+
return Promise.all(array, label);
|
7996
|
+
};
|
7997
|
+
});
|
7998
|
+
define("rsvp/all_settled",
|
7999
|
+
["./promise","./utils","exports"],
|
8000
|
+
function(__dependency1__, __dependency2__, __exports__) {
|
8001
|
+
"use strict";
|
8002
|
+
var Promise = __dependency1__["default"];
|
8003
|
+
var isArray = __dependency2__.isArray;
|
8004
|
+
var isNonThenable = __dependency2__.isNonThenable;
|
8141
8005
|
|
8142
|
-
|
8143
|
-
|
8144
|
-
|
8145
|
-
|
8146
|
-
|
8006
|
+
/**
|
8007
|
+
`RSVP.allSettled` is similar to `RSVP.all`, but instead of implementing
|
8008
|
+
a fail-fast method, it waits until all the promises have returned and
|
8009
|
+
shows you all the results. This is useful if you want to handle multiple
|
8010
|
+
promises' failure states together as a set.
|
8147
8011
|
|
8148
|
-
|
8149
|
-
|
8150
|
-
|
8151
|
-
```
|
8012
|
+
Returns a promise that is fulfilled when all the given promises have been
|
8013
|
+
settled. The return promise is fulfilled with an array of the states of
|
8014
|
+
the promises passed into the `promises` array argument.
|
8152
8015
|
|
8153
|
-
|
8154
|
-
|
8155
|
-
|
8016
|
+
Each state object will either indicate fulfillment or rejection, and
|
8017
|
+
provide the corresponding value or reason. The states will take one of
|
8018
|
+
the following formats:
|
8019
|
+
|
8020
|
+
```javascript
|
8021
|
+
{ state: 'fulfilled', value: value }
|
8022
|
+
or
|
8023
|
+
{ state: 'rejected', reason: reason }
|
8024
|
+
```
|
8156
8025
|
|
8157
8026
|
Example:
|
8158
8027
|
|
8159
8028
|
```javascript
|
8160
|
-
var promise1 = RSVP.resolve(1);
|
8161
|
-
var promise2 = RSVP.reject(new Error(
|
8162
|
-
var promise3 = RSVP.reject(new Error(
|
8029
|
+
var promise1 = RSVP.Promise.resolve(1);
|
8030
|
+
var promise2 = RSVP.Promise.reject(new Error('2'));
|
8031
|
+
var promise3 = RSVP.Promise.reject(new Error('3'));
|
8163
8032
|
var promises = [ promise1, promise2, promise3 ];
|
8164
8033
|
|
8165
|
-
RSVP.
|
8166
|
-
//
|
8034
|
+
RSVP.allSettled(promises).then(function(array){
|
8035
|
+
// array == [
|
8036
|
+
// { state: 'fulfilled', value: 1 },
|
8037
|
+
// { state: 'rejected', reason: Error },
|
8038
|
+
// { state: 'rejected', reason: Error }
|
8039
|
+
// ]
|
8040
|
+
// Note that for the second item, reason.message will be "2", and for the
|
8041
|
+
// third item, reason.message will be "3".
|
8167
8042
|
}, function(error) {
|
8168
|
-
//
|
8043
|
+
// Not run. (This block would only be called if allSettled had failed,
|
8044
|
+
// for instance if passed an incorrect argument type.)
|
8169
8045
|
});
|
8170
8046
|
```
|
8171
8047
|
|
8172
|
-
@method
|
8048
|
+
@method allSettled
|
8173
8049
|
@for RSVP
|
8174
8050
|
@param {Array} promises
|
8175
|
-
@param {String} label
|
8176
|
-
|
8177
|
-
fulfilled
|
8051
|
+
@param {String} label - optional string that describes the promise.
|
8052
|
+
Useful for tooling.
|
8053
|
+
@return {Promise} promise that is fulfilled with an array of the settled
|
8054
|
+
states of the constituent promises.
|
8055
|
+
@static
|
8178
8056
|
*/
|
8179
|
-
function all(promises, label) {
|
8180
|
-
if (!isArray(promises)) {
|
8181
|
-
throw new TypeError('You must pass an array to all.');
|
8182
|
-
}
|
8183
8057
|
|
8058
|
+
__exports__["default"] = function allSettled(entries, label) {
|
8184
8059
|
return new Promise(function(resolve, reject) {
|
8185
|
-
|
8186
|
-
|
8060
|
+
if (!isArray(entries)) {
|
8061
|
+
throw new TypeError('You must pass an array to allSettled.');
|
8062
|
+
}
|
8063
|
+
|
8064
|
+
var remaining = entries.length;
|
8065
|
+
var entry;
|
8187
8066
|
|
8188
8067
|
if (remaining === 0) {
|
8189
8068
|
resolve([]);
|
8069
|
+
return;
|
8190
8070
|
}
|
8191
8071
|
|
8192
|
-
|
8072
|
+
var results = new Array(remaining);
|
8073
|
+
|
8074
|
+
function fulfilledResolver(index) {
|
8193
8075
|
return function(value) {
|
8194
|
-
resolveAll(index, value);
|
8076
|
+
resolveAll(index, fulfilled(value));
|
8077
|
+
};
|
8078
|
+
}
|
8079
|
+
|
8080
|
+
function rejectedResolver(index) {
|
8081
|
+
return function(reason) {
|
8082
|
+
resolveAll(index, rejected(reason));
|
8195
8083
|
};
|
8196
8084
|
}
|
8197
8085
|
|
@@ -8202,97 +8090,31 @@ define("rsvp/all",
|
|
8202
8090
|
}
|
8203
8091
|
}
|
8204
8092
|
|
8205
|
-
for (var
|
8206
|
-
|
8093
|
+
for (var index = 0; index < entries.length; index++) {
|
8094
|
+
entry = entries[index];
|
8207
8095
|
|
8208
|
-
if (
|
8209
|
-
|
8096
|
+
if (isNonThenable(entry)) {
|
8097
|
+
resolveAll(index, fulfilled(entry));
|
8210
8098
|
} else {
|
8211
|
-
|
8099
|
+
Promise.cast(entry).then(fulfilledResolver(index), rejectedResolver(index));
|
8212
8100
|
}
|
8213
8101
|
}
|
8214
8102
|
}, label);
|
8215
|
-
}
|
8216
|
-
|
8217
|
-
__exports__.all = all;
|
8218
|
-
});
|
8219
|
-
|
8220
|
-
define("rsvp/cast",
|
8221
|
-
["exports"],
|
8222
|
-
function(__exports__) {
|
8223
|
-
"use strict";
|
8224
|
-
/**
|
8225
|
-
`RSVP.Promise.cast` returns the same promise if that promise shares a constructor
|
8226
|
-
with the promise being casted.
|
8227
|
-
|
8228
|
-
Example:
|
8229
|
-
|
8230
|
-
```javascript
|
8231
|
-
var promise = RSVP.resolve(1);
|
8232
|
-
var casted = RSVP.Promise.cast(promise);
|
8233
|
-
|
8234
|
-
console.log(promise === casted); // true
|
8235
|
-
```
|
8236
|
-
|
8237
|
-
In the case of a promise whose constructor does not match, it is assimilated.
|
8238
|
-
The resulting promise will fulfill or reject based on the outcome of the
|
8239
|
-
promise being casted.
|
8240
|
-
|
8241
|
-
In the case of a non-promise, a promise which will fulfill with that value is
|
8242
|
-
returned.
|
8243
|
-
|
8244
|
-
Example:
|
8245
|
-
|
8246
|
-
```javascript
|
8247
|
-
var value = 1; // could be a number, boolean, string, undefined...
|
8248
|
-
var casted = RSVP.Promise.cast(value);
|
8249
|
-
|
8250
|
-
console.log(value === casted); // false
|
8251
|
-
console.log(casted instanceof RSVP.Promise) // true
|
8252
|
-
|
8253
|
-
casted.then(function(val) {
|
8254
|
-
val === value // => true
|
8255
|
-
});
|
8256
|
-
```
|
8257
|
-
|
8258
|
-
`RSVP.Promise.cast` is similar to `RSVP.resolve`, but `RSVP.Promise.cast` differs in the
|
8259
|
-
following ways:
|
8260
|
-
* `RSVP.Promise.cast` serves as a memory-efficient way of getting a promise, when you
|
8261
|
-
have something that could either be a promise or a value. RSVP.resolve
|
8262
|
-
will have the same effect but will create a new promise wrapper if the
|
8263
|
-
argument is a promise.
|
8264
|
-
* `RSVP.Promise.cast` is a way of casting incoming thenables or promise subclasses to
|
8265
|
-
promises of the exact class specified, so that the resulting object's `then` is
|
8266
|
-
ensured to have the behavior of the constructor you are calling cast on (i.e., RSVP.Promise).
|
8267
|
-
|
8268
|
-
@method cast
|
8269
|
-
@for RSVP
|
8270
|
-
@param {Object} object to be casted
|
8271
|
-
@return {Promise} promise that is fulfilled when all properties of `promises`
|
8272
|
-
have been fulfilled, or rejected if any of them become rejected.
|
8273
|
-
*/
|
8274
|
-
|
8275
|
-
|
8276
|
-
function cast(object) {
|
8277
|
-
/*jshint validthis:true */
|
8278
|
-
if (object && typeof object === 'object' && object.constructor === this) {
|
8279
|
-
return object;
|
8280
|
-
}
|
8281
|
-
|
8282
|
-
var Promise = this;
|
8103
|
+
};
|
8283
8104
|
|
8284
|
-
|
8285
|
-
|
8286
|
-
});
|
8105
|
+
function fulfilled(value) {
|
8106
|
+
return { state: 'fulfilled', value: value };
|
8287
8107
|
}
|
8288
8108
|
|
8289
|
-
|
8109
|
+
function rejected(reason) {
|
8110
|
+
return { state: 'rejected', reason: reason };
|
8111
|
+
}
|
8290
8112
|
});
|
8291
8113
|
define("rsvp/config",
|
8292
8114
|
["./events","exports"],
|
8293
8115
|
function(__dependency1__, __exports__) {
|
8294
8116
|
"use strict";
|
8295
|
-
var EventTarget = __dependency1__
|
8117
|
+
var EventTarget = __dependency1__["default"];
|
8296
8118
|
|
8297
8119
|
var config = {
|
8298
8120
|
instrument: false
|
@@ -8323,10 +8145,10 @@ define("rsvp/defer",
|
|
8323
8145
|
["./promise","exports"],
|
8324
8146
|
function(__dependency1__, __exports__) {
|
8325
8147
|
"use strict";
|
8326
|
-
var Promise = __dependency1__
|
8148
|
+
var Promise = __dependency1__["default"];
|
8327
8149
|
|
8328
8150
|
/**
|
8329
|
-
`RSVP.defer` returns an object similar to jQuery's `$.Deferred
|
8151
|
+
`RSVP.defer` returns an object similar to jQuery's `$.Deferred`.
|
8330
8152
|
`RSVP.defer` should be used when porting over code reliant on `$.Deferred`'s
|
8331
8153
|
interface. New code should use the `RSVP.Promise` constructor instead.
|
8332
8154
|
|
@@ -8352,17 +8174,13 @@ define("rsvp/defer",
|
|
8352
8174
|
|
8353
8175
|
@method defer
|
8354
8176
|
@for RSVP
|
8355
|
-
@param {String}
|
8177
|
+
@param {String} label optional string for labeling the promise.
|
8178
|
+
Useful for tooling.
|
8356
8179
|
@return {Object}
|
8357
8180
|
*/
|
8358
8181
|
|
8359
|
-
function defer(label) {
|
8360
|
-
var deferred = {
|
8361
|
-
// pre-allocate shape
|
8362
|
-
resolve: undefined,
|
8363
|
-
reject: undefined,
|
8364
|
-
promise: undefined
|
8365
|
-
};
|
8182
|
+
__exports__["default"] = function defer(label) {
|
8183
|
+
var deferred = { };
|
8366
8184
|
|
8367
8185
|
deferred.promise = new Promise(function(resolve, reject) {
|
8368
8186
|
deferred.resolve = resolve;
|
@@ -8370,9 +8188,7 @@ define("rsvp/defer",
|
|
8370
8188
|
}, label);
|
8371
8189
|
|
8372
8190
|
return deferred;
|
8373
|
-
}
|
8374
|
-
|
8375
|
-
__exports__.defer = defer;
|
8191
|
+
};
|
8376
8192
|
});
|
8377
8193
|
define("rsvp/events",
|
8378
8194
|
["exports"],
|
@@ -8397,13 +8213,11 @@ define("rsvp/events",
|
|
8397
8213
|
};
|
8398
8214
|
|
8399
8215
|
/**
|
8400
|
-
|
8401
|
-
//@class EventTarget
|
8216
|
+
@class RSVP.EventTarget
|
8402
8217
|
*/
|
8403
|
-
|
8218
|
+
__exports__["default"] = {
|
8404
8219
|
|
8405
8220
|
/**
|
8406
|
-
@private
|
8407
8221
|
`RSVP.EventTarget.mixin` extends an object with EventTarget methods. For
|
8408
8222
|
Example:
|
8409
8223
|
|
@@ -8442,6 +8256,7 @@ define("rsvp/events",
|
|
8442
8256
|
|
8443
8257
|
@method mixin
|
8444
8258
|
@param {Object} object object to extend with EventTarget methods
|
8259
|
+
@private
|
8445
8260
|
*/
|
8446
8261
|
mixin: function(object) {
|
8447
8262
|
object.on = this.on;
|
@@ -8452,8 +8267,6 @@ define("rsvp/events",
|
|
8452
8267
|
},
|
8453
8268
|
|
8454
8269
|
/**
|
8455
|
-
@private
|
8456
|
-
|
8457
8270
|
Registers a callback to be executed when `eventName` is triggered
|
8458
8271
|
|
8459
8272
|
```javascript
|
@@ -8467,6 +8280,7 @@ define("rsvp/events",
|
|
8467
8280
|
@method on
|
8468
8281
|
@param {String} eventName name of the event to listen for
|
8469
8282
|
@param {Function} callback function to be called when the event is triggered.
|
8283
|
+
@private
|
8470
8284
|
*/
|
8471
8285
|
on: function(eventName, callback) {
|
8472
8286
|
var allCallbacks = callbacksFor(this), callbacks;
|
@@ -8483,8 +8297,6 @@ define("rsvp/events",
|
|
8483
8297
|
},
|
8484
8298
|
|
8485
8299
|
/**
|
8486
|
-
@private
|
8487
|
-
|
8488
8300
|
You can use `off` to stop firing a particular callback for an event:
|
8489
8301
|
|
8490
8302
|
```javascript
|
@@ -8520,6 +8332,8 @@ define("rsvp/events",
|
|
8520
8332
|
given will be removed from the event's callback queue. If no `callback`
|
8521
8333
|
argument is given, all callbacks will be removed from the event's callback
|
8522
8334
|
queue.
|
8335
|
+
@private
|
8336
|
+
|
8523
8337
|
*/
|
8524
8338
|
off: function(eventName, callback) {
|
8525
8339
|
var allCallbacks = callbacksFor(this), callbacks, index;
|
@@ -8537,8 +8351,6 @@ define("rsvp/events",
|
|
8537
8351
|
},
|
8538
8352
|
|
8539
8353
|
/**
|
8540
|
-
@private
|
8541
|
-
|
8542
8354
|
Use `trigger` to fire custom events. For example:
|
8543
8355
|
|
8544
8356
|
```javascript
|
@@ -8565,6 +8377,7 @@ define("rsvp/events",
|
|
8565
8377
|
@param {String} eventName name of the event to be triggered
|
8566
8378
|
@param {Any} options optional value to be passed to any event handlers for
|
8567
8379
|
the given `eventName`
|
8380
|
+
@private
|
8568
8381
|
*/
|
8569
8382
|
trigger: function(eventName, options) {
|
8570
8383
|
var allCallbacks = callbacksFor(this),
|
@@ -8580,25 +8393,130 @@ define("rsvp/events",
|
|
8580
8393
|
}
|
8581
8394
|
}
|
8582
8395
|
};
|
8396
|
+
});
|
8397
|
+
define("rsvp/filter",
|
8398
|
+
["./all","./map","./utils","exports"],
|
8399
|
+
function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
|
8400
|
+
"use strict";
|
8401
|
+
var all = __dependency1__["default"];
|
8402
|
+
var map = __dependency2__["default"];
|
8403
|
+
var isFunction = __dependency3__.isFunction;
|
8404
|
+
var isArray = __dependency3__.isArray;
|
8583
8405
|
|
8584
|
-
|
8406
|
+
/**
|
8407
|
+
`RSVP.filter` is similar to JavaScript's native `filter` method, except that it
|
8408
|
+
waits for all promises to become fulfilled before running the `filterFn` on
|
8409
|
+
each item in given to `promises`. `RSVP.filter` returns a promise that will
|
8410
|
+
become fulfilled with the result of running `filterFn` on the values the
|
8411
|
+
promises become fulfilled with.
|
8412
|
+
|
8413
|
+
For example:
|
8414
|
+
|
8415
|
+
```javascript
|
8416
|
+
|
8417
|
+
var promise1 = RSVP.resolve(1);
|
8418
|
+
var promise2 = RSVP.resolve(2);
|
8419
|
+
var promise3 = RSVP.resolve(3);
|
8420
|
+
|
8421
|
+
var filterFn = function(item){
|
8422
|
+
return item > 1;
|
8423
|
+
};
|
8424
|
+
|
8425
|
+
RSVP.filter(promises, filterFn).then(function(result){
|
8426
|
+
// result is [ 2, 3 ]
|
8427
|
+
});
|
8428
|
+
```
|
8429
|
+
|
8430
|
+
If any of the `promises` given to `RSVP.filter` are rejected, the first promise
|
8431
|
+
that is rejected will be given as an argument to the returned promise's
|
8432
|
+
rejection handler. For example:
|
8433
|
+
|
8434
|
+
```javascript
|
8435
|
+
var promise1 = RSVP.resolve(1);
|
8436
|
+
var promise2 = RSVP.reject(new Error("2"));
|
8437
|
+
var promise3 = RSVP.reject(new Error("3"));
|
8438
|
+
var promises = [ promise1, promise2, promise3 ];
|
8439
|
+
|
8440
|
+
var filterFn = function(item){
|
8441
|
+
return item > 1;
|
8442
|
+
};
|
8443
|
+
|
8444
|
+
RSVP.filter(promises, filterFn).then(function(array){
|
8445
|
+
// Code here never runs because there are rejected promises!
|
8446
|
+
}, function(reason) {
|
8447
|
+
// reason.message === "2"
|
8448
|
+
});
|
8449
|
+
```
|
8450
|
+
|
8451
|
+
`RSVP.filter` will also wait for any promises returned from `filterFn`.
|
8452
|
+
For instance, you may want to fetch a list of users then return a subset
|
8453
|
+
of those users based on some asynchronous operation:
|
8454
|
+
|
8455
|
+
```javascript
|
8456
|
+
|
8457
|
+
var alice = { name: 'alice' };
|
8458
|
+
var bob = { name: 'bob' };
|
8459
|
+
var users = [ alice, bob ];
|
8460
|
+
|
8461
|
+
var promises = users.map(function(user){
|
8462
|
+
return RSVP.resolve(user);
|
8463
|
+
});
|
8464
|
+
|
8465
|
+
var filterFn = function(user){
|
8466
|
+
// Here, Alice has permissions to create a blog post, but Bob does not.
|
8467
|
+
return getPrivilegesForUser(user).then(function(privs){
|
8468
|
+
return privs.can_create_blog_post === true;
|
8469
|
+
});
|
8470
|
+
};
|
8471
|
+
RSVP.filter(promises, filterFn).then(function(users){
|
8472
|
+
// true, because the server told us only Alice can create a blog post.
|
8473
|
+
users.length === 1;
|
8474
|
+
// false, because Alice is the only user present in `users`
|
8475
|
+
users[0] === bob;
|
8476
|
+
});
|
8477
|
+
```
|
8478
|
+
|
8479
|
+
@method filter
|
8480
|
+
@for RSVP
|
8481
|
+
@param {Array} promises
|
8482
|
+
@param {Function} filterFn - function to be called on each resolved value to
|
8483
|
+
filter the final results.
|
8484
|
+
@param {String} label optional string describing the promise. Useful for
|
8485
|
+
tooling.
|
8486
|
+
@return {Promise}
|
8487
|
+
*/
|
8488
|
+
function filter(promises, filterFn, label) {
|
8489
|
+
return all(promises, label).then(function(values){
|
8490
|
+
if (!isArray(promises)) {
|
8491
|
+
throw new TypeError('You must pass an array to filter.');
|
8492
|
+
}
|
8493
|
+
|
8494
|
+
if (!isFunction(filterFn)){
|
8495
|
+
throw new TypeError("You must pass a function to filter's second argument.");
|
8496
|
+
}
|
8497
|
+
|
8498
|
+
return map(promises, filterFn, label).then(function(filterResults){
|
8499
|
+
var i,
|
8500
|
+
valuesLen = values.length,
|
8501
|
+
filtered = [];
|
8502
|
+
|
8503
|
+
for (i = 0; i < valuesLen; i++){
|
8504
|
+
if(filterResults[i]) filtered.push(values[i]);
|
8505
|
+
}
|
8506
|
+
return filtered;
|
8507
|
+
});
|
8508
|
+
});
|
8509
|
+
}
|
8510
|
+
|
8511
|
+
__exports__["default"] = filter;
|
8585
8512
|
});
|
8586
8513
|
define("rsvp/hash",
|
8587
8514
|
["./promise","./utils","exports"],
|
8588
8515
|
function(__dependency1__, __dependency2__, __exports__) {
|
8589
8516
|
"use strict";
|
8590
|
-
var Promise = __dependency1__
|
8591
|
-
var
|
8592
|
-
|
8593
|
-
var keysOf = Object.keys || function(object) {
|
8594
|
-
var result = [];
|
8595
|
-
|
8596
|
-
for (var prop in object) {
|
8597
|
-
result.push(prop);
|
8598
|
-
}
|
8599
|
-
|
8600
|
-
return result;
|
8601
|
-
};
|
8517
|
+
var Promise = __dependency1__["default"];
|
8518
|
+
var isNonThenable = __dependency2__.isNonThenable;
|
8519
|
+
var keysOf = __dependency2__.keysOf;
|
8602
8520
|
|
8603
8521
|
/**
|
8604
8522
|
`RSVP.hash` is similar to `RSVP.all`, but takes an object instead of an array
|
@@ -8632,8 +8550,9 @@ define("rsvp/hash",
|
|
8632
8550
|
````
|
8633
8551
|
|
8634
8552
|
If any of the `promises` given to `RSVP.hash` are rejected, the first promise
|
8635
|
-
that is rejected will be given as
|
8636
|
-
|
8553
|
+
that is rejected will be given as the reason to the rejection handler.
|
8554
|
+
|
8555
|
+
Example:
|
8637
8556
|
|
8638
8557
|
```javascript
|
8639
8558
|
var promises = {
|
@@ -8681,52 +8600,53 @@ define("rsvp/hash",
|
|
8681
8600
|
@method hash
|
8682
8601
|
@for RSVP
|
8683
8602
|
@param {Object} promises
|
8684
|
-
@param {String} label
|
8603
|
+
@param {String} label optional string that describes the promise.
|
8685
8604
|
Useful for tooling.
|
8686
8605
|
@return {Promise} promise that is fulfilled when all properties of `promises`
|
8687
8606
|
have been fulfilled, or rejected if any of them become rejected.
|
8607
|
+
@static
|
8688
8608
|
*/
|
8689
|
-
function hash(object, label) {
|
8690
|
-
var results = {},
|
8691
|
-
keys = keysOf(object),
|
8692
|
-
remaining = keys.length;
|
8693
|
-
|
8609
|
+
__exports__["default"] = function hash(object, label) {
|
8694
8610
|
return new Promise(function(resolve, reject){
|
8695
|
-
var
|
8611
|
+
var results = {};
|
8612
|
+
var keys = keysOf(object);
|
8613
|
+
var remaining = keys.length;
|
8614
|
+
var entry, property;
|
8696
8615
|
|
8697
8616
|
if (remaining === 0) {
|
8698
|
-
resolve(
|
8617
|
+
resolve(results);
|
8699
8618
|
return;
|
8700
8619
|
}
|
8701
8620
|
|
8702
|
-
|
8621
|
+
function fulfilledTo(property) {
|
8703
8622
|
return function(value) {
|
8704
|
-
|
8623
|
+
results[property] = value;
|
8624
|
+
if (--remaining === 0) {
|
8625
|
+
resolve(results);
|
8626
|
+
}
|
8705
8627
|
};
|
8706
|
-
}
|
8707
|
-
|
8708
|
-
var resolveAll = function(prop, value) {
|
8709
|
-
results[prop] = value;
|
8710
|
-
if (--remaining === 0) {
|
8711
|
-
resolve(results);
|
8712
|
-
}
|
8713
|
-
};
|
8628
|
+
}
|
8714
8629
|
|
8630
|
+
function onRejection(reason) {
|
8631
|
+
remaining = 0;
|
8632
|
+
reject(reason);
|
8633
|
+
}
|
8715
8634
|
|
8716
|
-
for (var i = 0
|
8717
|
-
|
8718
|
-
|
8635
|
+
for (var i = 0; i < keys.length; i++) {
|
8636
|
+
property = keys[i];
|
8637
|
+
entry = object[property];
|
8719
8638
|
|
8720
|
-
if (
|
8721
|
-
|
8639
|
+
if (isNonThenable(entry)) {
|
8640
|
+
results[property] = entry;
|
8641
|
+
if (--remaining === 0) {
|
8642
|
+
resolve(results);
|
8643
|
+
}
|
8722
8644
|
} else {
|
8723
|
-
|
8645
|
+
Promise.cast(entry).then(fulfilledTo(property), onRejection);
|
8724
8646
|
}
|
8725
8647
|
}
|
8726
8648
|
});
|
8727
|
-
}
|
8728
|
-
|
8729
|
-
__exports__.hash = hash;
|
8649
|
+
};
|
8730
8650
|
});
|
8731
8651
|
define("rsvp/instrument",
|
8732
8652
|
["./config","./utils","exports"],
|
@@ -8735,7 +8655,7 @@ define("rsvp/instrument",
|
|
8735
8655
|
var config = __dependency1__.config;
|
8736
8656
|
var now = __dependency2__.now;
|
8737
8657
|
|
8738
|
-
function instrument(eventName, promise, child) {
|
8658
|
+
__exports__["default"] = function instrument(eventName, promise, child) {
|
8739
8659
|
// instrumentation should not disrupt normal usage.
|
8740
8660
|
try {
|
8741
8661
|
config.trigger(eventName, {
|
@@ -8744,62 +8664,169 @@ define("rsvp/instrument",
|
|
8744
8664
|
detail: promise._detail,
|
8745
8665
|
childGuid: child && promise._guidKey + child._id,
|
8746
8666
|
label: promise._label,
|
8747
|
-
timeStamp: now()
|
8667
|
+
timeStamp: now(),
|
8668
|
+
stack: new Error(promise._label).stack
|
8748
8669
|
});
|
8749
8670
|
} catch(error) {
|
8750
8671
|
setTimeout(function(){
|
8751
8672
|
throw error;
|
8752
8673
|
}, 0);
|
8753
8674
|
}
|
8754
|
-
}
|
8755
|
-
|
8756
|
-
__exports__.instrument = instrument;
|
8675
|
+
};
|
8757
8676
|
});
|
8758
|
-
define("rsvp/
|
8759
|
-
["./promise","./all","exports"],
|
8760
|
-
function(__dependency1__, __dependency2__, __exports__) {
|
8677
|
+
define("rsvp/map",
|
8678
|
+
["./promise","./all","./utils","exports"],
|
8679
|
+
function(__dependency1__, __dependency2__, __dependency3__, __exports__) {
|
8761
8680
|
"use strict";
|
8762
|
-
var Promise = __dependency1__
|
8763
|
-
var all = __dependency2__
|
8764
|
-
|
8765
|
-
var
|
8766
|
-
|
8767
|
-
function makeNodeCallbackFor(resolve, reject) {
|
8768
|
-
return function (error, value) {
|
8769
|
-
if (error) {
|
8770
|
-
reject(error);
|
8771
|
-
} else if (arguments.length > 2) {
|
8772
|
-
resolve(slice.call(arguments, 1));
|
8773
|
-
} else {
|
8774
|
-
resolve(value);
|
8775
|
-
}
|
8776
|
-
};
|
8777
|
-
}
|
8681
|
+
var Promise = __dependency1__["default"];
|
8682
|
+
var all = __dependency2__["default"];
|
8683
|
+
var isArray = __dependency3__.isArray;
|
8684
|
+
var isFunction = __dependency3__.isFunction;
|
8778
8685
|
|
8779
8686
|
/**
|
8780
|
-
|
8781
|
-
|
8782
|
-
|
8783
|
-
`
|
8687
|
+
`RSVP.map` is similar to JavaScript's native `map` method, except that it
|
8688
|
+
waits for all promises to become fulfilled before running the `mapFn` on
|
8689
|
+
each item in given to `promises`. `RSVP.map` returns a promise that will
|
8690
|
+
become fulfilled with the result of running `mapFn` on the values the promises
|
8691
|
+
become fulfilled with.
|
8692
|
+
|
8693
|
+
For example:
|
8784
8694
|
|
8785
8695
|
```javascript
|
8786
|
-
var fs = require('fs');
|
8787
8696
|
|
8788
|
-
|
8789
|
-
|
8790
|
-
|
8697
|
+
var promise1 = RSVP.resolve(1);
|
8698
|
+
var promise2 = RSVP.resolve(2);
|
8699
|
+
var promise3 = RSVP.resolve(3);
|
8700
|
+
var promises = [ promise1, promise2, promise3 ];
|
8701
|
+
|
8702
|
+
var mapFn = function(item){
|
8703
|
+
return item + 1;
|
8704
|
+
};
|
8705
|
+
|
8706
|
+
RSVP.map(promises, mapFn).then(function(result){
|
8707
|
+
// result is [ 2, 3, 4 ]
|
8791
8708
|
});
|
8792
8709
|
```
|
8793
8710
|
|
8794
|
-
|
8711
|
+
If any of the `promises` given to `RSVP.map` are rejected, the first promise
|
8712
|
+
that is rejected will be given as an argument to the returned promise's
|
8713
|
+
rejection handler. For example:
|
8795
8714
|
|
8796
8715
|
```javascript
|
8797
|
-
var
|
8798
|
-
|
8799
|
-
var
|
8716
|
+
var promise1 = RSVP.resolve(1);
|
8717
|
+
var promise2 = RSVP.reject(new Error("2"));
|
8718
|
+
var promise3 = RSVP.reject(new Error("3"));
|
8719
|
+
var promises = [ promise1, promise2, promise3 ];
|
8800
8720
|
|
8801
|
-
|
8802
|
-
|
8721
|
+
var mapFn = function(item){
|
8722
|
+
return item + 1;
|
8723
|
+
};
|
8724
|
+
|
8725
|
+
RSVP.map(promises, mapFn).then(function(array){
|
8726
|
+
// Code here never runs because there are rejected promises!
|
8727
|
+
}, function(reason) {
|
8728
|
+
// reason.message === "2"
|
8729
|
+
});
|
8730
|
+
```
|
8731
|
+
|
8732
|
+
`RSVP.map` will also wait if a promise is returned from `mapFn`. For example,
|
8733
|
+
say you want to get all comments from a set of blog posts, but you need
|
8734
|
+
the blog posts first becuase they contain a url to those comments.
|
8735
|
+
|
8736
|
+
```javscript
|
8737
|
+
|
8738
|
+
var mapFn = function(blogPost){
|
8739
|
+
// getComments does some ajax and returns an RSVP.Promise that is fulfilled
|
8740
|
+
// with some comments data
|
8741
|
+
return getComments(blogPost.comments_url);
|
8742
|
+
};
|
8743
|
+
|
8744
|
+
// getBlogPosts does some ajax and returns an RSVP.Promise that is fulfilled
|
8745
|
+
// with some blog post data
|
8746
|
+
RSVP.map(getBlogPosts(), mapFn).then(function(comments){
|
8747
|
+
// comments is the result of asking the server for the comments
|
8748
|
+
// of all blog posts returned from getBlogPosts()
|
8749
|
+
});
|
8750
|
+
```
|
8751
|
+
|
8752
|
+
@method map
|
8753
|
+
@for RSVP
|
8754
|
+
@param {Array} promises
|
8755
|
+
@param {Function} mapFn function to be called on each fulfilled promise.
|
8756
|
+
@param {String} label optional string for labeling the promise.
|
8757
|
+
Useful for tooling.
|
8758
|
+
@return {Promise} promise that is fulfilled with the result of calling
|
8759
|
+
`mapFn` on each fulfilled promise or value when they become fulfilled.
|
8760
|
+
The promise will be rejected if any of the given `promises` become rejected.
|
8761
|
+
@static
|
8762
|
+
*/
|
8763
|
+
__exports__["default"] = function map(promises, mapFn, label) {
|
8764
|
+
return all(promises, label).then(function(results){
|
8765
|
+
if (!isArray(promises)) {
|
8766
|
+
throw new TypeError('You must pass an array to map.');
|
8767
|
+
}
|
8768
|
+
|
8769
|
+
if (!isFunction(mapFn)){
|
8770
|
+
throw new TypeError("You must pass a function to map's second argument.");
|
8771
|
+
}
|
8772
|
+
|
8773
|
+
|
8774
|
+
var resultLen = results.length,
|
8775
|
+
mappedResults = [],
|
8776
|
+
i;
|
8777
|
+
|
8778
|
+
for (i = 0; i < resultLen; i++){
|
8779
|
+
mappedResults.push(mapFn(results[i]));
|
8780
|
+
}
|
8781
|
+
|
8782
|
+
return all(mappedResults, label);
|
8783
|
+
});
|
8784
|
+
};
|
8785
|
+
});
|
8786
|
+
define("rsvp/node",
|
8787
|
+
["./promise","exports"],
|
8788
|
+
function(__dependency1__, __exports__) {
|
8789
|
+
"use strict";
|
8790
|
+
var Promise = __dependency1__["default"];
|
8791
|
+
|
8792
|
+
var slice = Array.prototype.slice;
|
8793
|
+
|
8794
|
+
function makeNodeCallbackFor(resolve, reject) {
|
8795
|
+
return function (error, value) {
|
8796
|
+
if (error) {
|
8797
|
+
reject(error);
|
8798
|
+
} else if (arguments.length > 2) {
|
8799
|
+
resolve(slice.call(arguments, 1));
|
8800
|
+
} else {
|
8801
|
+
resolve(value);
|
8802
|
+
}
|
8803
|
+
};
|
8804
|
+
}
|
8805
|
+
|
8806
|
+
/**
|
8807
|
+
`RSVP.denodeify` takes a "node-style" function and returns a function that
|
8808
|
+
will return an `RSVP.Promise`. You can use `denodeify` in Node.js or the
|
8809
|
+
browser when you'd prefer to use promises over using callbacks. For example,
|
8810
|
+
`denodeify` transforms the following:
|
8811
|
+
|
8812
|
+
```javascript
|
8813
|
+
var fs = require('fs');
|
8814
|
+
|
8815
|
+
fs.readFile('myfile.txt', function(err, data){
|
8816
|
+
if (err) return handleError(err);
|
8817
|
+
handleData(data);
|
8818
|
+
});
|
8819
|
+
```
|
8820
|
+
|
8821
|
+
into:
|
8822
|
+
|
8823
|
+
```javascript
|
8824
|
+
var fs = require('fs');
|
8825
|
+
|
8826
|
+
var readFile = RSVP.denodeify(fs.readFile);
|
8827
|
+
|
8828
|
+
readFile('myfile.txt').then(handleData, handleError);
|
8829
|
+
```
|
8803
8830
|
|
8804
8831
|
Using `denodeify` makes it easier to compose asynchronous operations instead
|
8805
8832
|
of using callbacks. For example, instead of:
|
@@ -8849,14 +8876,15 @@ define("rsvp/node",
|
|
8849
8876
|
calling the `nodeFunc` function.
|
8850
8877
|
@return {Function} a function that wraps `nodeFunc` to return an
|
8851
8878
|
`RSVP.Promise`
|
8879
|
+
@static
|
8852
8880
|
*/
|
8853
|
-
function denodeify(nodeFunc, binding) {
|
8881
|
+
__exports__["default"] = function denodeify(nodeFunc, binding) {
|
8854
8882
|
return function() {
|
8855
8883
|
var nodeArgs = slice.call(arguments), resolve, reject;
|
8856
8884
|
var thisArg = this || binding;
|
8857
8885
|
|
8858
8886
|
return new Promise(function(resolve, reject) {
|
8859
|
-
all(nodeArgs).then(function(nodeArgs) {
|
8887
|
+
Promise.all(nodeArgs).then(function(nodeArgs) {
|
8860
8888
|
try {
|
8861
8889
|
nodeArgs.push(makeNodeCallbackFor(resolve, reject));
|
8862
8890
|
nodeFunc.apply(thisArg, nodeArgs);
|
@@ -8866,25 +8894,137 @@ define("rsvp/node",
|
|
8866
8894
|
});
|
8867
8895
|
});
|
8868
8896
|
};
|
8869
|
-
}
|
8870
|
-
|
8871
|
-
__exports__.denodeify = denodeify;
|
8897
|
+
};
|
8872
8898
|
});
|
8873
8899
|
define("rsvp/promise",
|
8874
|
-
["./config","./events","./cast","./
|
8875
|
-
function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
|
8900
|
+
["./config","./events","./instrument","./utils","./promise/cast","./promise/all","./promise/race","./promise/resolve","./promise/reject","exports"],
|
8901
|
+
function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __exports__) {
|
8876
8902
|
"use strict";
|
8877
8903
|
var config = __dependency1__.config;
|
8878
|
-
var EventTarget = __dependency2__
|
8879
|
-
var
|
8880
|
-
var
|
8881
|
-
var
|
8882
|
-
var
|
8883
|
-
var
|
8904
|
+
var EventTarget = __dependency2__["default"];
|
8905
|
+
var instrument = __dependency3__["default"];
|
8906
|
+
var objectOrFunction = __dependency4__.objectOrFunction;
|
8907
|
+
var isFunction = __dependency4__.isFunction;
|
8908
|
+
var now = __dependency4__.now;
|
8909
|
+
var cast = __dependency5__["default"];
|
8910
|
+
var all = __dependency6__["default"];
|
8911
|
+
var race = __dependency7__["default"];
|
8912
|
+
var Resolve = __dependency8__["default"];
|
8913
|
+
var Reject = __dependency9__["default"];
|
8884
8914
|
|
8885
8915
|
var guidKey = 'rsvp_' + now() + '-';
|
8886
8916
|
var counter = 0;
|
8887
8917
|
|
8918
|
+
function noop() {}
|
8919
|
+
|
8920
|
+
__exports__["default"] = Promise;
|
8921
|
+
|
8922
|
+
|
8923
|
+
/**
|
8924
|
+
Promise objects represent the eventual result of an asynchronous operation. The
|
8925
|
+
primary way of interacting with a promise is through its `then` method, which
|
8926
|
+
registers callbacks to receive either a promise’s eventual value or the reason
|
8927
|
+
why the promise cannot be fulfilled.
|
8928
|
+
|
8929
|
+
Terminology
|
8930
|
+
-----------
|
8931
|
+
|
8932
|
+
- `promise` is an object or function with a `then` method whose behavior conforms to this specification.
|
8933
|
+
- `thenable` is an object or function that defines a `then` method.
|
8934
|
+
- `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
|
8935
|
+
- `exception` is a value that is thrown using the throw statement.
|
8936
|
+
- `reason` is a value that indicates why a promise was rejected.
|
8937
|
+
- `settled` the final resting state of a promise, fulfilled or rejected.
|
8938
|
+
|
8939
|
+
A promise can be in one of three states: pending, fulfilled, or rejected.
|
8940
|
+
|
8941
|
+
Promises that are fulfilled have a fulfillment value and are in the fulfilled
|
8942
|
+
state. Promises that are rejected have a rejection reason and are in the
|
8943
|
+
rejected state. A fulfillment value is never a thenable. Similarly, a
|
8944
|
+
rejection reason is never a thenable.
|
8945
|
+
|
8946
|
+
Promises can also be said to *resolve* a value. If this value is also a
|
8947
|
+
promise, then the original promise's settled state will match the value's
|
8948
|
+
settled state. So a promise that *resolves* a promise that rejects will
|
8949
|
+
itself reject, and a promise that *resolves* a promise that fulfills will
|
8950
|
+
itself fulfill.
|
8951
|
+
|
8952
|
+
|
8953
|
+
Basic Usage:
|
8954
|
+
------------
|
8955
|
+
|
8956
|
+
```js
|
8957
|
+
var promise = new Promise(function(resolve, reject) {
|
8958
|
+
// on success
|
8959
|
+
resolve(value);
|
8960
|
+
|
8961
|
+
// on failure
|
8962
|
+
reject(reason);
|
8963
|
+
});
|
8964
|
+
|
8965
|
+
promise.then(function(value) {
|
8966
|
+
// on fulfillment
|
8967
|
+
}, function(reason) {
|
8968
|
+
// on rejection
|
8969
|
+
});
|
8970
|
+
```
|
8971
|
+
|
8972
|
+
Advanced Usage:
|
8973
|
+
---------------
|
8974
|
+
|
8975
|
+
Promises shine when abstracting away asynchronous interactions such as
|
8976
|
+
`XMLHttpRequest`s.
|
8977
|
+
|
8978
|
+
```js
|
8979
|
+
function getJSON(url) {
|
8980
|
+
return new Promise(function(resolve, reject){
|
8981
|
+
var xhr = new XMLHttpRequest();
|
8982
|
+
|
8983
|
+
xhr.open('GET', url);
|
8984
|
+
xhr.onreadystatechange = handler;
|
8985
|
+
xhr.responseType = 'json';
|
8986
|
+
xhr.setRequestHeader('Accept', 'application/json');
|
8987
|
+
xhr.send();
|
8988
|
+
|
8989
|
+
function handler() {
|
8990
|
+
if (this.readyState === this.DONE) {
|
8991
|
+
if (this.status === 200) {
|
8992
|
+
resolve(this.response);
|
8993
|
+
} else {
|
8994
|
+
reject(new Error("getJSON: `" + url + "` failed with status: [" + this.status + "]");
|
8995
|
+
}
|
8996
|
+
}
|
8997
|
+
};
|
8998
|
+
});
|
8999
|
+
}
|
9000
|
+
|
9001
|
+
getJSON('/posts.json').then(function(json) {
|
9002
|
+
// on fulfillment
|
9003
|
+
}, function(reason) {
|
9004
|
+
// on rejection
|
9005
|
+
});
|
9006
|
+
```
|
9007
|
+
|
9008
|
+
Unlike callbacks, promises are great composable primitives.
|
9009
|
+
|
9010
|
+
```js
|
9011
|
+
Promise.all([
|
9012
|
+
getJSON('/posts'),
|
9013
|
+
getJSON('/comments')
|
9014
|
+
]).then(function(values){
|
9015
|
+
values[0] // => postsJSON
|
9016
|
+
values[1] // => commentsJSON
|
9017
|
+
|
9018
|
+
return values;
|
9019
|
+
});
|
9020
|
+
```
|
9021
|
+
|
9022
|
+
@class RSVP.Promise
|
9023
|
+
@param {function}
|
9024
|
+
@param {String} label optional string for labeling the promise.
|
9025
|
+
Useful for tooling.
|
9026
|
+
@constructor
|
9027
|
+
*/
|
8888
9028
|
function Promise(resolver, label) {
|
8889
9029
|
if (!isFunction(resolver)) {
|
8890
9030
|
throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
|
@@ -8902,7 +9042,9 @@ define("rsvp/promise",
|
|
8902
9042
|
instrument('created', this);
|
8903
9043
|
}
|
8904
9044
|
|
8905
|
-
|
9045
|
+
if (noop !== resolver) {
|
9046
|
+
invokeResolver(resolver, this);
|
9047
|
+
}
|
8906
9048
|
}
|
8907
9049
|
|
8908
9050
|
function invokeResolver(resolver, promise) {
|
@@ -8921,35 +9063,11 @@ define("rsvp/promise",
|
|
8921
9063
|
}
|
8922
9064
|
}
|
8923
9065
|
|
8924
|
-
|
8925
|
-
|
8926
|
-
|
8927
|
-
|
8928
|
-
|
8929
|
-
try {
|
8930
|
-
value = callback(detail);
|
8931
|
-
succeeded = true;
|
8932
|
-
} catch(e) {
|
8933
|
-
failed = true;
|
8934
|
-
error = e;
|
8935
|
-
}
|
8936
|
-
} else {
|
8937
|
-
value = detail;
|
8938
|
-
succeeded = true;
|
8939
|
-
}
|
8940
|
-
|
8941
|
-
if (handleThenable(promise, value)) {
|
8942
|
-
return;
|
8943
|
-
} else if (hasCallback && succeeded) {
|
8944
|
-
resolve(promise, value);
|
8945
|
-
} else if (failed) {
|
8946
|
-
reject(promise, error);
|
8947
|
-
} else if (settled === FULFILLED) {
|
8948
|
-
resolve(promise, value);
|
8949
|
-
} else if (settled === REJECTED) {
|
8950
|
-
reject(promise, value);
|
8951
|
-
}
|
8952
|
-
}
|
9066
|
+
Promise.cast = cast;
|
9067
|
+
Promise.all = all;
|
9068
|
+
Promise.race = race;
|
9069
|
+
Promise.resolve = Resolve;
|
9070
|
+
Promise.reject = Reject;
|
8953
9071
|
|
8954
9072
|
var PENDING = void 0;
|
8955
9073
|
var SEALED = 0;
|
@@ -8997,11 +9115,205 @@ define("rsvp/promise",
|
|
8997
9115
|
config.trigger('error', reason);
|
8998
9116
|
},
|
8999
9117
|
|
9118
|
+
/**
|
9119
|
+
The primary way of interacting with a promise is through its `then` method,
|
9120
|
+
which registers callbacks to receive either a promise's eventual value or the
|
9121
|
+
reason why the promise cannot be fulfilled.
|
9122
|
+
|
9123
|
+
```js
|
9124
|
+
findUser().then(function(user){
|
9125
|
+
// user is available
|
9126
|
+
}, function(reason){
|
9127
|
+
// user is unavailable, and you are given the reason why
|
9128
|
+
});
|
9129
|
+
```
|
9130
|
+
|
9131
|
+
Chaining
|
9132
|
+
--------
|
9133
|
+
|
9134
|
+
The return value of `then` is itself a promise. This second, "downstream"
|
9135
|
+
promise is resolved with the return value of the first promise's fulfillment
|
9136
|
+
or rejection handler, or rejected if the handler throws an exception.
|
9137
|
+
|
9138
|
+
```js
|
9139
|
+
findUser().then(function (user) {
|
9140
|
+
return user.name;
|
9141
|
+
}, function (reason) {
|
9142
|
+
return "default name";
|
9143
|
+
}).then(function (userName) {
|
9144
|
+
// If `findUser` fulfilled, `userName` will be the user's name, otherwise it
|
9145
|
+
// will be `"default name"`
|
9146
|
+
});
|
9147
|
+
|
9148
|
+
findUser().then(function (user) {
|
9149
|
+
throw new Error("Found user, but still unhappy");
|
9150
|
+
}, function (reason) {
|
9151
|
+
throw new Error("`findUser` rejected and we're unhappy");
|
9152
|
+
}).then(function (value) {
|
9153
|
+
// never reached
|
9154
|
+
}, function (reason) {
|
9155
|
+
// if `findUser` fulfilled, `reason` will be "Found user, but still unhappy".
|
9156
|
+
// If `findUser` rejected, `reason` will be "`findUser` rejected and we're unhappy".
|
9157
|
+
});
|
9158
|
+
```
|
9159
|
+
If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
|
9160
|
+
|
9161
|
+
```js
|
9162
|
+
findUser().then(function (user) {
|
9163
|
+
throw new PedagogicalException("Upstream error");
|
9164
|
+
}).then(function (value) {
|
9165
|
+
// never reached
|
9166
|
+
}).then(function (value) {
|
9167
|
+
// never reached
|
9168
|
+
}, function (reason) {
|
9169
|
+
// The `PedgagocialException` is propagated all the way down to here
|
9170
|
+
});
|
9171
|
+
```
|
9172
|
+
|
9173
|
+
Assimilation
|
9174
|
+
------------
|
9175
|
+
|
9176
|
+
Sometimes the value you want to propagate to a downstream promise can only be
|
9177
|
+
retrieved asynchronously. This can be achieved by returning a promise in the
|
9178
|
+
fulfillment or rejection handler. The downstream promise will then be pending
|
9179
|
+
until the returned promise is settled. This is called *assimilation*.
|
9180
|
+
|
9181
|
+
```js
|
9182
|
+
findUser().then(function (user) {
|
9183
|
+
return findCommentsByAuthor(user);
|
9184
|
+
}).then(function (comments) {
|
9185
|
+
// The user's comments are now available
|
9186
|
+
});
|
9187
|
+
```
|
9188
|
+
|
9189
|
+
If the assimliated promise rejects, then the downstream promise will also reject.
|
9190
|
+
|
9191
|
+
```js
|
9192
|
+
findUser().then(function (user) {
|
9193
|
+
return findCommentsByAuthor(user);
|
9194
|
+
}).then(function (comments) {
|
9195
|
+
// If `findCommentsByAuthor` fulfills, we'll have the value here
|
9196
|
+
}, function (reason) {
|
9197
|
+
// If `findCommentsByAuthor` rejects, we'll have the reason here
|
9198
|
+
});
|
9199
|
+
```
|
9200
|
+
|
9201
|
+
Simple Example
|
9202
|
+
--------------
|
9203
|
+
|
9204
|
+
Synchronous Example
|
9205
|
+
|
9206
|
+
```javascript
|
9207
|
+
var result;
|
9208
|
+
|
9209
|
+
try {
|
9210
|
+
result = findResult();
|
9211
|
+
// success
|
9212
|
+
} catch(reason) {
|
9213
|
+
// failure
|
9214
|
+
}
|
9215
|
+
```
|
9216
|
+
|
9217
|
+
Errback Example
|
9218
|
+
|
9219
|
+
```js
|
9220
|
+
findResult(function(result, err){
|
9221
|
+
if (err) {
|
9222
|
+
// failure
|
9223
|
+
} else {
|
9224
|
+
// success
|
9225
|
+
}
|
9226
|
+
});
|
9227
|
+
```
|
9228
|
+
|
9229
|
+
Promise Example;
|
9230
|
+
|
9231
|
+
```javascript
|
9232
|
+
findResult().then(function(result){
|
9233
|
+
// success
|
9234
|
+
}, function(reason){
|
9235
|
+
// failure
|
9236
|
+
});
|
9237
|
+
```
|
9238
|
+
|
9239
|
+
Advanced Example
|
9240
|
+
--------------
|
9241
|
+
|
9242
|
+
Synchronous Example
|
9243
|
+
|
9244
|
+
```javascript
|
9245
|
+
var author, books;
|
9246
|
+
|
9247
|
+
try {
|
9248
|
+
author = findAuthor();
|
9249
|
+
books = findBooksByAuthor(author);
|
9250
|
+
// success
|
9251
|
+
} catch(reason) {
|
9252
|
+
// failure
|
9253
|
+
}
|
9254
|
+
```
|
9255
|
+
|
9256
|
+
Errback Example
|
9257
|
+
|
9258
|
+
```js
|
9259
|
+
|
9260
|
+
function foundBooks(books) {
|
9261
|
+
|
9262
|
+
}
|
9263
|
+
|
9264
|
+
function failure(reason) {
|
9265
|
+
|
9266
|
+
}
|
9267
|
+
|
9268
|
+
findAuthor(function(author, err){
|
9269
|
+
if (err) {
|
9270
|
+
failure(err);
|
9271
|
+
// failure
|
9272
|
+
} else {
|
9273
|
+
try {
|
9274
|
+
findBoooksByAuthor(author, function(books, err) {
|
9275
|
+
if (err) {
|
9276
|
+
failure(err);
|
9277
|
+
} else {
|
9278
|
+
try {
|
9279
|
+
foundBooks(books);
|
9280
|
+
} catch(reason) {
|
9281
|
+
failure(reason);
|
9282
|
+
}
|
9283
|
+
}
|
9284
|
+
});
|
9285
|
+
} catch(error) {
|
9286
|
+
failure(err);
|
9287
|
+
}
|
9288
|
+
// success
|
9289
|
+
}
|
9290
|
+
});
|
9291
|
+
```
|
9292
|
+
|
9293
|
+
Promise Example;
|
9294
|
+
|
9295
|
+
```javascript
|
9296
|
+
findAuthor().
|
9297
|
+
then(findBooksByAuthor).
|
9298
|
+
then(function(books){
|
9299
|
+
// found books
|
9300
|
+
}).catch(function(reason){
|
9301
|
+
// something went wrong
|
9302
|
+
});
|
9303
|
+
```
|
9304
|
+
|
9305
|
+
@method then
|
9306
|
+
@param {Function} onFulfilled
|
9307
|
+
@param {Function} onRejected
|
9308
|
+
@param {String} label optional string for labeling the promise.
|
9309
|
+
Useful for tooling.
|
9310
|
+
@return {Promise}
|
9311
|
+
*/
|
9000
9312
|
then: function(onFulfillment, onRejection, label) {
|
9001
9313
|
var promise = this;
|
9002
9314
|
this._onerror = null;
|
9003
9315
|
|
9004
|
-
var thenPromise = new this.constructor(
|
9316
|
+
var thenPromise = new this.constructor(noop, label);
|
9005
9317
|
|
9006
9318
|
if (this._state) {
|
9007
9319
|
var callbacks = arguments;
|
@@ -9019,118 +9331,398 @@ define("rsvp/promise",
|
|
9019
9331
|
return thenPromise;
|
9020
9332
|
},
|
9021
9333
|
|
9334
|
+
/**
|
9335
|
+
`catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
|
9336
|
+
as the catch block of a try/catch statement.
|
9337
|
+
|
9338
|
+
```js
|
9339
|
+
function findAuthor(){
|
9340
|
+
throw new Error("couldn't find that author");
|
9341
|
+
}
|
9342
|
+
|
9343
|
+
// synchronous
|
9344
|
+
try {
|
9345
|
+
findAuthor();
|
9346
|
+
} catch(reason) {
|
9347
|
+
// something went wrong
|
9348
|
+
}
|
9349
|
+
|
9350
|
+
// async with promises
|
9351
|
+
findAuthor().catch(function(reason){
|
9352
|
+
// something went wrong
|
9353
|
+
});
|
9354
|
+
```
|
9355
|
+
|
9356
|
+
@method catch
|
9357
|
+
@param {Function} onRejection
|
9358
|
+
@param {String} label optional string for labeling the promise.
|
9359
|
+
Useful for tooling.
|
9360
|
+
@return {Promise}
|
9361
|
+
*/
|
9022
9362
|
'catch': function(onRejection, label) {
|
9023
9363
|
return this.then(null, onRejection, label);
|
9024
9364
|
},
|
9025
9365
|
|
9026
|
-
|
9027
|
-
|
9366
|
+
/**
|
9367
|
+
`finally` will be invoked regardless of the promise's fate just as native
|
9368
|
+
try/catch/finally behaves
|
9369
|
+
|
9370
|
+
Synchronous example:
|
9371
|
+
|
9372
|
+
```js
|
9373
|
+
findAuthor() {
|
9374
|
+
if (Math.random() > 0.5) {
|
9375
|
+
throw new Error();
|
9376
|
+
}
|
9377
|
+
return new Author();
|
9378
|
+
}
|
9379
|
+
|
9380
|
+
try {
|
9381
|
+
return findAuthor(); // succeed or fail
|
9382
|
+
} catch(error) {
|
9383
|
+
return findOtherAuther();
|
9384
|
+
} finally {
|
9385
|
+
// always runs
|
9386
|
+
// doesn't affect the return value
|
9387
|
+
}
|
9388
|
+
```
|
9389
|
+
|
9390
|
+
Asynchronous example:
|
9391
|
+
|
9392
|
+
```js
|
9393
|
+
findAuthor().catch(function(reason){
|
9394
|
+
return findOtherAuther();
|
9395
|
+
}).finally(function(){
|
9396
|
+
// author was either found, or not
|
9397
|
+
});
|
9398
|
+
```
|
9399
|
+
|
9400
|
+
@method finally
|
9401
|
+
@param {Function} callback
|
9402
|
+
@param {String} label optional string for labeling the promise.
|
9403
|
+
Useful for tooling.
|
9404
|
+
@return {Promise}
|
9405
|
+
*/
|
9406
|
+
'finally': function(callback, label) {
|
9407
|
+
var constructor = this.constructor;
|
9408
|
+
|
9409
|
+
return this.then(function(value) {
|
9410
|
+
return constructor.cast(callback()).then(function(){
|
9411
|
+
return value;
|
9412
|
+
});
|
9413
|
+
}, function(reason) {
|
9414
|
+
return constructor.cast(callback()).then(function(){
|
9415
|
+
throw reason;
|
9416
|
+
});
|
9417
|
+
}, label);
|
9418
|
+
}
|
9419
|
+
};
|
9420
|
+
|
9421
|
+
function invokeCallback(settled, promise, callback, detail) {
|
9422
|
+
var hasCallback = isFunction(callback),
|
9423
|
+
value, error, succeeded, failed;
|
9424
|
+
|
9425
|
+
if (hasCallback) {
|
9426
|
+
try {
|
9427
|
+
value = callback(detail);
|
9428
|
+
succeeded = true;
|
9429
|
+
} catch(e) {
|
9430
|
+
failed = true;
|
9431
|
+
error = e;
|
9432
|
+
}
|
9433
|
+
} else {
|
9434
|
+
value = detail;
|
9435
|
+
succeeded = true;
|
9436
|
+
}
|
9437
|
+
|
9438
|
+
if (handleThenable(promise, value)) {
|
9439
|
+
return;
|
9440
|
+
} else if (hasCallback && succeeded) {
|
9441
|
+
resolve(promise, value);
|
9442
|
+
} else if (failed) {
|
9443
|
+
reject(promise, error);
|
9444
|
+
} else if (settled === FULFILLED) {
|
9445
|
+
resolve(promise, value);
|
9446
|
+
} else if (settled === REJECTED) {
|
9447
|
+
reject(promise, value);
|
9448
|
+
}
|
9449
|
+
}
|
9450
|
+
|
9451
|
+
function handleThenable(promise, value) {
|
9452
|
+
var then = null,
|
9453
|
+
resolved;
|
9454
|
+
|
9455
|
+
try {
|
9456
|
+
if (promise === value) {
|
9457
|
+
throw new TypeError("A promises callback cannot return that same promise.");
|
9458
|
+
}
|
9459
|
+
|
9460
|
+
if (objectOrFunction(value)) {
|
9461
|
+
then = value.then;
|
9462
|
+
|
9463
|
+
if (isFunction(then)) {
|
9464
|
+
then.call(value, function(val) {
|
9465
|
+
if (resolved) { return true; }
|
9466
|
+
resolved = true;
|
9467
|
+
|
9468
|
+
if (value !== val) {
|
9469
|
+
resolve(promise, val);
|
9470
|
+
} else {
|
9471
|
+
fulfill(promise, val);
|
9472
|
+
}
|
9473
|
+
}, function(val) {
|
9474
|
+
if (resolved) { return true; }
|
9475
|
+
resolved = true;
|
9476
|
+
|
9477
|
+
reject(promise, val);
|
9478
|
+
}, 'derived from: ' + (promise._label || ' unknown promise'));
|
9479
|
+
|
9480
|
+
return true;
|
9481
|
+
}
|
9482
|
+
}
|
9483
|
+
} catch (error) {
|
9484
|
+
if (resolved) { return true; }
|
9485
|
+
reject(promise, error);
|
9486
|
+
return true;
|
9487
|
+
}
|
9488
|
+
|
9489
|
+
return false;
|
9490
|
+
}
|
9491
|
+
|
9492
|
+
function resolve(promise, value) {
|
9493
|
+
if (promise === value) {
|
9494
|
+
fulfill(promise, value);
|
9495
|
+
} else if (!handleThenable(promise, value)) {
|
9496
|
+
fulfill(promise, value);
|
9497
|
+
}
|
9498
|
+
}
|
9499
|
+
|
9500
|
+
function fulfill(promise, value) {
|
9501
|
+
if (promise._state !== PENDING) { return; }
|
9502
|
+
promise._state = SEALED;
|
9503
|
+
promise._detail = value;
|
9504
|
+
|
9505
|
+
config.async(publishFulfillment, promise);
|
9506
|
+
}
|
9507
|
+
|
9508
|
+
function reject(promise, reason) {
|
9509
|
+
if (promise._state !== PENDING) { return; }
|
9510
|
+
promise._state = SEALED;
|
9511
|
+
promise._detail = reason;
|
9512
|
+
|
9513
|
+
config.async(publishRejection, promise);
|
9514
|
+
}
|
9515
|
+
|
9516
|
+
function publishFulfillment(promise) {
|
9517
|
+
publish(promise, promise._state = FULFILLED);
|
9518
|
+
}
|
9519
|
+
|
9520
|
+
function publishRejection(promise) {
|
9521
|
+
if (promise._onerror) {
|
9522
|
+
promise._onerror(promise._detail);
|
9523
|
+
}
|
9524
|
+
|
9525
|
+
publish(promise, promise._state = REJECTED);
|
9526
|
+
}
|
9527
|
+
});
|
9528
|
+
define("rsvp/promise/all",
|
9529
|
+
["../utils","exports"],
|
9530
|
+
function(__dependency1__, __exports__) {
|
9531
|
+
"use strict";
|
9532
|
+
var isArray = __dependency1__.isArray;
|
9533
|
+
var isNonThenable = __dependency1__.isNonThenable;
|
9534
|
+
|
9535
|
+
/**
|
9536
|
+
`RSVP.Promise.all` accepts an array of promises, and returns a new promise which
|
9537
|
+
is fulfilled with an array of fulfillment values for the passed promises, or
|
9538
|
+
rejected with the reason of the first passed promise to be rejected. It casts all
|
9539
|
+
elements of the passed iterable to promises as it runs this algorithm.
|
9540
|
+
|
9541
|
+
Example:
|
9542
|
+
|
9543
|
+
```javascript
|
9544
|
+
var promise1 = RSVP.resolve(1);
|
9545
|
+
var promise2 = RSVP.resolve(2);
|
9546
|
+
var promise3 = RSVP.resolve(3);
|
9547
|
+
var promises = [ promise1, promise2, promise3 ];
|
9548
|
+
|
9549
|
+
RSVP.Promise.all(promises).then(function(array){
|
9550
|
+
// The array here would be [ 1, 2, 3 ];
|
9551
|
+
});
|
9552
|
+
```
|
9553
|
+
|
9554
|
+
If any of the `promises` given to `RSVP.all` are rejected, the first promise
|
9555
|
+
that is rejected will be given as an argument to the returned promises's
|
9556
|
+
rejection handler. For example:
|
9557
|
+
|
9558
|
+
Example:
|
9559
|
+
|
9560
|
+
```javascript
|
9561
|
+
var promise1 = RSVP.resolve(1);
|
9562
|
+
var promise2 = RSVP.reject(new Error("2"));
|
9563
|
+
var promise3 = RSVP.reject(new Error("3"));
|
9564
|
+
var promises = [ promise1, promise2, promise3 ];
|
9565
|
+
|
9566
|
+
RSVP.Promise.all(promises).then(function(array){
|
9567
|
+
// Code here never runs because there are rejected promises!
|
9568
|
+
}, function(error) {
|
9569
|
+
// error.message === "2"
|
9570
|
+
});
|
9571
|
+
```
|
9572
|
+
|
9573
|
+
@method all
|
9574
|
+
@for RSVP.Promise
|
9575
|
+
@param {Array} entries array of promises
|
9576
|
+
@param {String} label optional string for labeling the promise.
|
9577
|
+
Useful for tooling.
|
9578
|
+
@return {Promise} promise that is fulfilled when all `promises` have been
|
9579
|
+
fulfilled, or rejected if any of them become rejected.
|
9580
|
+
@static
|
9581
|
+
*/
|
9582
|
+
__exports__["default"] = function all(entries, label) {
|
9583
|
+
|
9584
|
+
/*jshint validthis:true */
|
9585
|
+
var Constructor = this;
|
9586
|
+
|
9587
|
+
return new Constructor(function(resolve, reject) {
|
9588
|
+
if (!isArray(entries)) {
|
9589
|
+
throw new TypeError('You must pass an array to all.');
|
9590
|
+
}
|
9591
|
+
|
9592
|
+
var remaining = entries.length;
|
9593
|
+
var results = new Array(remaining);
|
9594
|
+
var entry, pending = true;
|
9595
|
+
|
9596
|
+
if (remaining === 0) {
|
9597
|
+
resolve(results);
|
9598
|
+
return;
|
9599
|
+
}
|
9600
|
+
|
9601
|
+
function fulfillmentAt(index) {
|
9602
|
+
return function(value) {
|
9603
|
+
results[index] = value;
|
9604
|
+
if (--remaining === 0) {
|
9605
|
+
resolve(results);
|
9606
|
+
}
|
9607
|
+
};
|
9608
|
+
}
|
9609
|
+
|
9610
|
+
function onRejection(reason) {
|
9611
|
+
remaining = 0;
|
9612
|
+
reject(reason);
|
9613
|
+
}
|
9614
|
+
|
9615
|
+
for (var index = 0; index < entries.length; index++) {
|
9616
|
+
entry = entries[index];
|
9617
|
+
if (isNonThenable(entry)) {
|
9618
|
+
results[index] = entry;
|
9619
|
+
if (--remaining === 0) {
|
9620
|
+
resolve(results);
|
9621
|
+
}
|
9622
|
+
} else {
|
9623
|
+
Constructor.cast(entry).then(fulfillmentAt(index), onRejection);
|
9624
|
+
}
|
9625
|
+
}
|
9626
|
+
}, label);
|
9627
|
+
};
|
9628
|
+
});
|
9629
|
+
define("rsvp/promise/cast",
|
9630
|
+
["exports"],
|
9631
|
+
function(__exports__) {
|
9632
|
+
"use strict";
|
9633
|
+
/**
|
9634
|
+
`RSVP.Promise.cast` coerces its argument to a promise, or returns the
|
9635
|
+
argument if it is already a promise which shares a constructor with the caster.
|
9636
|
+
|
9637
|
+
Example:
|
9028
9638
|
|
9029
|
-
|
9030
|
-
|
9031
|
-
|
9032
|
-
});
|
9033
|
-
}, function(reason) {
|
9034
|
-
return constructor.cast(callback()).then(function(){
|
9035
|
-
throw reason;
|
9036
|
-
});
|
9037
|
-
}, label);
|
9038
|
-
}
|
9039
|
-
};
|
9639
|
+
```javascript
|
9640
|
+
var promise = RSVP.Promise.resolve(1);
|
9641
|
+
var casted = RSVP.Promise.cast(promise);
|
9040
9642
|
|
9041
|
-
|
9643
|
+
console.log(promise === casted); // true
|
9644
|
+
```
|
9042
9645
|
|
9043
|
-
|
9044
|
-
|
9045
|
-
|
9646
|
+
In the case of a promise whose constructor does not match, it is assimilated.
|
9647
|
+
The resulting promise will fulfill or reject based on the outcome of the
|
9648
|
+
promise being casted.
|
9046
9649
|
|
9047
|
-
|
9048
|
-
if (promise === value) {
|
9049
|
-
throw new TypeError("A promises callback cannot return that same promise.");
|
9050
|
-
}
|
9650
|
+
Example:
|
9051
9651
|
|
9052
|
-
|
9053
|
-
|
9652
|
+
```javascript
|
9653
|
+
var thennable = $.getJSON('/api/foo');
|
9654
|
+
var casted = RSVP.Promise.cast(thennable);
|
9054
9655
|
|
9055
|
-
|
9056
|
-
|
9057
|
-
if (resolved) { return true; }
|
9058
|
-
resolved = true;
|
9656
|
+
console.log(thennable === casted); // false
|
9657
|
+
console.log(casted instanceof RSVP.Promise) // true
|
9059
9658
|
|
9060
|
-
|
9061
|
-
|
9062
|
-
|
9063
|
-
|
9064
|
-
}
|
9065
|
-
}, function(val) {
|
9066
|
-
if (resolved) { return true; }
|
9067
|
-
resolved = true;
|
9659
|
+
casted.then(function(data) {
|
9660
|
+
// data is the value getJSON fulfills with
|
9661
|
+
});
|
9662
|
+
```
|
9068
9663
|
|
9069
|
-
|
9070
|
-
|
9664
|
+
In the case of a non-promise, a promise which will fulfill with that value is
|
9665
|
+
returned.
|
9071
9666
|
|
9072
|
-
|
9073
|
-
}
|
9074
|
-
}
|
9075
|
-
} catch (error) {
|
9076
|
-
if (resolved) { return true; }
|
9077
|
-
reject(promise, error);
|
9078
|
-
return true;
|
9079
|
-
}
|
9667
|
+
Example:
|
9080
9668
|
|
9081
|
-
|
9082
|
-
|
9669
|
+
```javascript
|
9670
|
+
var value = 1; // could be a number, boolean, string, undefined...
|
9671
|
+
var casted = RSVP.Promise.cast(value);
|
9083
9672
|
|
9084
|
-
|
9085
|
-
|
9086
|
-
fulfill(promise, value);
|
9087
|
-
} else if (!handleThenable(promise, value)) {
|
9088
|
-
fulfill(promise, value);
|
9089
|
-
}
|
9090
|
-
}
|
9673
|
+
console.log(value === casted); // false
|
9674
|
+
console.log(casted instanceof RSVP.Promise) // true
|
9091
9675
|
|
9092
|
-
|
9093
|
-
|
9094
|
-
|
9095
|
-
|
9676
|
+
casted.then(function(val) {
|
9677
|
+
val === value // => true
|
9678
|
+
});
|
9679
|
+
```
|
9096
9680
|
|
9097
|
-
|
9098
|
-
|
9681
|
+
`RSVP.Promise.cast` is similar to `RSVP.Promise.resolve`, but `RSVP.Promise.cast` differs in the
|
9682
|
+
following ways:
|
9099
9683
|
|
9100
|
-
|
9101
|
-
|
9102
|
-
promise
|
9103
|
-
promise.
|
9684
|
+
* `RSVP.Promise.cast` serves as a memory-efficient way of getting a promise, when you
|
9685
|
+
have something that could either be a promise or a value. RSVP.resolve
|
9686
|
+
will have the same effect but will create a new promise wrapper if the
|
9687
|
+
argument is a promise.
|
9688
|
+
* `RSVP.Promise.cast` is a way of casting incoming thenables or promise subclasses to
|
9689
|
+
promises of the exact class specified, so that the resulting object's `then` is
|
9690
|
+
ensured to have the behavior of the constructor you are calling cast on (i.e., RSVP.Promise).
|
9104
9691
|
|
9105
|
-
|
9106
|
-
|
9692
|
+
@method cast
|
9693
|
+
@param {Object} object to be casted
|
9694
|
+
@param {String} label optional string for labeling the promise.
|
9695
|
+
Useful for tooling.
|
9696
|
+
@return {Promise} promise
|
9697
|
+
@static
|
9698
|
+
*/
|
9107
9699
|
|
9108
|
-
function
|
9109
|
-
|
9110
|
-
|
9700
|
+
__exports__["default"] = function cast(object, label) {
|
9701
|
+
/*jshint validthis:true */
|
9702
|
+
var Constructor = this;
|
9111
9703
|
|
9112
|
-
|
9113
|
-
|
9114
|
-
promise._onerror(promise._detail);
|
9704
|
+
if (object && typeof object === 'object' && object.constructor === Constructor) {
|
9705
|
+
return object;
|
9115
9706
|
}
|
9116
9707
|
|
9117
|
-
|
9118
|
-
|
9119
|
-
|
9120
|
-
|
9708
|
+
return new Constructor(function(resolve) {
|
9709
|
+
resolve(object);
|
9710
|
+
}, label);
|
9711
|
+
};
|
9121
9712
|
});
|
9122
|
-
define("rsvp/race",
|
9123
|
-
["
|
9124
|
-
function(__dependency1__,
|
9713
|
+
define("rsvp/promise/race",
|
9714
|
+
["../utils","exports"],
|
9715
|
+
function(__dependency1__, __exports__) {
|
9125
9716
|
"use strict";
|
9126
9717
|
/* global toString */
|
9127
9718
|
|
9128
|
-
var
|
9129
|
-
var
|
9719
|
+
var isArray = __dependency1__.isArray;
|
9720
|
+
var isFunction = __dependency1__.isFunction;
|
9721
|
+
var isNonThenable = __dependency1__.isNonThenable;
|
9130
9722
|
|
9131
9723
|
/**
|
9132
|
-
`RSVP.race`
|
9133
|
-
first promise
|
9724
|
+
`RSVP.Promise.race` returns a new promise which is settled in the same way as the
|
9725
|
+
first passed promise to settle.
|
9134
9726
|
|
9135
9727
|
Example:
|
9136
9728
|
|
@@ -9147,17 +9739,17 @@ define("rsvp/race",
|
|
9147
9739
|
}, 100);
|
9148
9740
|
});
|
9149
9741
|
|
9150
|
-
RSVP.race([promise1, promise2]).then(function(result){
|
9742
|
+
RSVP.Promise.race([promise1, promise2]).then(function(result){
|
9151
9743
|
// result === "promise 2" because it was resolved before promise1
|
9152
9744
|
// was resolved.
|
9153
9745
|
});
|
9154
9746
|
```
|
9155
9747
|
|
9156
|
-
`RSVP.race` is deterministic in that only the state of the first
|
9157
|
-
promise matters. For example, even if other promises given to the
|
9158
|
-
array argument are resolved, but the first
|
9159
|
-
rejected before the other promises became fulfilled, the returned
|
9160
|
-
will become rejected:
|
9748
|
+
`RSVP.Promise.race` is deterministic in that only the state of the first
|
9749
|
+
settled promise matters. For example, even if other promises given to the
|
9750
|
+
`promises` array argument are resolved, but the first settled promise has
|
9751
|
+
become rejected before the other promises became fulfilled, the returned
|
9752
|
+
promise will become rejected:
|
9161
9753
|
|
9162
9754
|
```javascript
|
9163
9755
|
var promise1 = new RSVP.Promise(function(resolve, reject){
|
@@ -9172,54 +9764,62 @@ define("rsvp/race",
|
|
9172
9764
|
}, 100);
|
9173
9765
|
});
|
9174
9766
|
|
9175
|
-
RSVP.race([promise1, promise2]).then(function(result){
|
9176
|
-
// Code here never runs
|
9767
|
+
RSVP.Promise.race([promise1, promise2]).then(function(result){
|
9768
|
+
// Code here never runs
|
9177
9769
|
}, function(reason){
|
9178
9770
|
// reason.message === "promise2" because promise 2 became rejected before
|
9179
9771
|
// promise 1 became fulfilled
|
9180
9772
|
});
|
9181
9773
|
```
|
9182
9774
|
|
9775
|
+
An example real-world use case is implementing timeouts:
|
9776
|
+
|
9777
|
+
```javascript
|
9778
|
+
RSVP.Promise.race([ajax('foo.json'), timeout(5000)])
|
9779
|
+
```
|
9780
|
+
|
9183
9781
|
@method race
|
9184
|
-
@for RSVP
|
9185
9782
|
@param {Array} promises array of promises to observe
|
9186
9783
|
@param {String} label optional string for describing the promise returned.
|
9187
9784
|
Useful for tooling.
|
9188
|
-
@return {Promise} a promise
|
9189
|
-
|
9190
|
-
|
9191
|
-
was rejected with.
|
9785
|
+
@return {Promise} a promise which settles in the same way as the first passed
|
9786
|
+
promise to settle.
|
9787
|
+
@static
|
9192
9788
|
*/
|
9193
|
-
function race(
|
9194
|
-
|
9195
|
-
|
9196
|
-
|
9197
|
-
return new
|
9198
|
-
|
9789
|
+
__exports__["default"] = function race(entries, label) {
|
9790
|
+
/*jshint validthis:true */
|
9791
|
+
var Constructor = this, entry;
|
9792
|
+
|
9793
|
+
return new Constructor(function(resolve, reject) {
|
9794
|
+
if (!isArray(entries)) {
|
9795
|
+
throw new TypeError('You must pass an array to race.');
|
9796
|
+
}
|
9797
|
+
|
9798
|
+
var pending = true;
|
9199
9799
|
|
9200
|
-
|
9201
|
-
|
9800
|
+
function onFulfillment(value) { if (pending) { pending = false; resolve(value); } }
|
9801
|
+
function onRejection(reason) { if (pending) { pending = false; reject(reason); } }
|
9202
9802
|
|
9203
|
-
|
9204
|
-
|
9803
|
+
for (var i = 0; i < entries.length; i++) {
|
9804
|
+
entry = entries[i];
|
9805
|
+
if (isNonThenable(entry)) {
|
9806
|
+
pending = false;
|
9807
|
+
resolve(entry);
|
9808
|
+
return;
|
9205
9809
|
} else {
|
9206
|
-
|
9810
|
+
Constructor.cast(entry).then(onFulfillment, onRejection);
|
9207
9811
|
}
|
9208
9812
|
}
|
9209
9813
|
}, label);
|
9210
|
-
}
|
9211
|
-
|
9212
|
-
__exports__.race = race;
|
9814
|
+
};
|
9213
9815
|
});
|
9214
|
-
define("rsvp/reject",
|
9215
|
-
["
|
9216
|
-
function(
|
9816
|
+
define("rsvp/promise/reject",
|
9817
|
+
["exports"],
|
9818
|
+
function(__exports__) {
|
9217
9819
|
"use strict";
|
9218
|
-
var Promise = __dependency1__.Promise;
|
9219
|
-
|
9220
9820
|
/**
|
9221
|
-
`RSVP.reject` returns a promise
|
9222
|
-
|
9821
|
+
`RSVP.Promise.reject` returns a promise rejected with the passed `reason`.
|
9822
|
+
It is shorthand for the following:
|
9223
9823
|
|
9224
9824
|
```javascript
|
9225
9825
|
var promise = new RSVP.Promise(function(resolve, reject){
|
@@ -9236,7 +9836,7 @@ define("rsvp/reject",
|
|
9236
9836
|
Instead of writing the above, your code now simply becomes the following:
|
9237
9837
|
|
9238
9838
|
```javascript
|
9239
|
-
var promise = RSVP.reject(new Error('WHOOPS'));
|
9839
|
+
var promise = RSVP.Promise.reject(new Error('WHOOPS'));
|
9240
9840
|
|
9241
9841
|
promise.then(function(value){
|
9242
9842
|
// Code here doesn't run because the promise is rejected!
|
@@ -9246,30 +9846,28 @@ define("rsvp/reject",
|
|
9246
9846
|
```
|
9247
9847
|
|
9248
9848
|
@method reject
|
9249
|
-
@for RSVP
|
9250
9849
|
@param {Any} reason value that the returned promise will be rejected with.
|
9251
9850
|
@param {String} label optional string for identifying the returned promise.
|
9252
9851
|
Useful for tooling.
|
9253
|
-
@return {Promise} a promise
|
9254
|
-
|
9852
|
+
@return {Promise} a promise rejected with the given `reason`.
|
9853
|
+
@static
|
9255
9854
|
*/
|
9256
|
-
function reject(reason, label) {
|
9257
|
-
|
9855
|
+
__exports__["default"] = function reject(reason, label) {
|
9856
|
+
/*jshint validthis:true */
|
9857
|
+
var Constructor = this;
|
9858
|
+
|
9859
|
+
return new Constructor(function (resolve, reject) {
|
9258
9860
|
reject(reason);
|
9259
9861
|
}, label);
|
9260
|
-
}
|
9261
|
-
|
9262
|
-
__exports__.reject = reject;
|
9862
|
+
};
|
9263
9863
|
});
|
9264
|
-
define("rsvp/resolve",
|
9265
|
-
["
|
9266
|
-
function(
|
9864
|
+
define("rsvp/promise/resolve",
|
9865
|
+
["exports"],
|
9866
|
+
function(__exports__) {
|
9267
9867
|
"use strict";
|
9268
|
-
var Promise = __dependency1__.Promise;
|
9269
|
-
|
9270
9868
|
/**
|
9271
|
-
`RSVP.resolve` returns a promise that will become
|
9272
|
-
`value`.
|
9869
|
+
`RSVP.Promise.resolve` returns a promise that will become resolved with the
|
9870
|
+
passed `value`. It is shorthand for the following:
|
9273
9871
|
|
9274
9872
|
```javascript
|
9275
9873
|
var promise = new RSVP.Promise(function(resolve, reject){
|
@@ -9284,7 +9882,7 @@ define("rsvp/resolve",
|
|
9284
9882
|
Instead of writing the above, your code now simply becomes the following:
|
9285
9883
|
|
9286
9884
|
```javascript
|
9287
|
-
var promise = RSVP.resolve(1);
|
9885
|
+
var promise = RSVP.Promise.resolve(1);
|
9288
9886
|
|
9289
9887
|
promise.then(function(value){
|
9290
9888
|
// value === 1
|
@@ -9292,27 +9890,88 @@ define("rsvp/resolve",
|
|
9292
9890
|
```
|
9293
9891
|
|
9294
9892
|
@method resolve
|
9295
|
-
@for RSVP
|
9296
9893
|
@param {Any} value value that the returned promise will be resolved with
|
9297
9894
|
@param {String} label optional string for identifying the returned promise.
|
9298
9895
|
Useful for tooling.
|
9299
9896
|
@return {Promise} a promise that will become fulfilled with the given
|
9300
9897
|
`value`
|
9898
|
+
@static
|
9301
9899
|
*/
|
9302
|
-
function resolve(value, label) {
|
9303
|
-
|
9900
|
+
__exports__["default"] = function resolve(value, label) {
|
9901
|
+
/*jshint validthis:true */
|
9902
|
+
var Constructor = this;
|
9903
|
+
|
9904
|
+
return new Constructor(function(resolve, reject) {
|
9304
9905
|
resolve(value);
|
9305
9906
|
}, label);
|
9306
|
-
}
|
9907
|
+
};
|
9908
|
+
});
|
9909
|
+
define("rsvp/race",
|
9910
|
+
["./promise","exports"],
|
9911
|
+
function(__dependency1__, __exports__) {
|
9912
|
+
"use strict";
|
9913
|
+
var Promise = __dependency1__["default"];
|
9307
9914
|
|
9308
|
-
|
9915
|
+
/**
|
9916
|
+
This is a convenient alias for `RSVP.Promise.race`.
|
9917
|
+
|
9918
|
+
@method race
|
9919
|
+
@param {Array} array Array of promises.
|
9920
|
+
@param {String} label An optional label. This is useful
|
9921
|
+
for tooling.
|
9922
|
+
@static
|
9923
|
+
*/
|
9924
|
+
__exports__["default"] = function race(array, label) {
|
9925
|
+
return Promise.race(array, label);
|
9926
|
+
};
|
9927
|
+
});
|
9928
|
+
define("rsvp/reject",
|
9929
|
+
["./promise","exports"],
|
9930
|
+
function(__dependency1__, __exports__) {
|
9931
|
+
"use strict";
|
9932
|
+
var Promise = __dependency1__["default"];
|
9933
|
+
|
9934
|
+
/**
|
9935
|
+
This is a convenient alias for `RSVP.Promise.reject`.
|
9936
|
+
|
9937
|
+
@method reject
|
9938
|
+
@for RSVP
|
9939
|
+
@param {Any} reason value that the returned promise will be rejected with.
|
9940
|
+
@param {String} label optional string for identifying the returned promise.
|
9941
|
+
Useful for tooling.
|
9942
|
+
@return {Promise} a promise rejected with the given `reason`.
|
9943
|
+
@static
|
9944
|
+
*/
|
9945
|
+
__exports__["default"] = function reject(reason, label) {
|
9946
|
+
return Promise.reject(reason, label);
|
9947
|
+
};
|
9948
|
+
});
|
9949
|
+
define("rsvp/resolve",
|
9950
|
+
["./promise","exports"],
|
9951
|
+
function(__dependency1__, __exports__) {
|
9952
|
+
"use strict";
|
9953
|
+
var Promise = __dependency1__["default"];
|
9954
|
+
|
9955
|
+
/**
|
9956
|
+
This is a convenient alias for `RSVP.Promise.resolve`.
|
9957
|
+
|
9958
|
+
@method resolve
|
9959
|
+
@for RSVP
|
9960
|
+
@param {Any} value value that the returned promise will be resolved with
|
9961
|
+
@param {String} label optional string for identifying the returned promise.
|
9962
|
+
Useful for tooling.
|
9963
|
+
@return {Promise} a promise that will become fulfilled with the given
|
9964
|
+
`value`
|
9965
|
+
@static
|
9966
|
+
*/
|
9967
|
+
__exports__["default"] = function resolve(value, label) {
|
9968
|
+
return Promise.resolve(value, label);
|
9969
|
+
};
|
9309
9970
|
});
|
9310
9971
|
define("rsvp/rethrow",
|
9311
9972
|
["exports"],
|
9312
9973
|
function(__exports__) {
|
9313
9974
|
"use strict";
|
9314
|
-
var local = (typeof global === "undefined") ? this : global;
|
9315
|
-
|
9316
9975
|
/**
|
9317
9976
|
`RSVP.rethrow` will rethrow an error on the next turn of the JavaScript event
|
9318
9977
|
loop in order to aid debugging.
|
@@ -9322,8 +9981,8 @@ define("rsvp/rethrow",
|
|
9322
9981
|
this reason, it is recommended that you always specify a second rejection
|
9323
9982
|
handler function to `then`. However, `RSVP.rethrow` will throw the exception
|
9324
9983
|
outside of the promise, so it bubbles up to your console if in the browser,
|
9325
|
-
or domain/cause uncaught exception in Node. `rethrow` will throw the
|
9326
|
-
again so the error can be handled by the promise.
|
9984
|
+
or domain/cause uncaught exception in Node. `rethrow` will also throw the
|
9985
|
+
error again so the error can be handled by the promise per the spec.
|
9327
9986
|
|
9328
9987
|
```javascript
|
9329
9988
|
function throws(){
|
@@ -9334,7 +9993,7 @@ define("rsvp/rethrow",
|
|
9334
9993
|
throws();
|
9335
9994
|
});
|
9336
9995
|
|
9337
|
-
promise.
|
9996
|
+
promise.catch(RSVP.rethrow).then(function(){
|
9338
9997
|
// Code here doesn't run because the promise became rejected due to an
|
9339
9998
|
// error!
|
9340
9999
|
}, function (err){
|
@@ -9344,64 +10003,75 @@ define("rsvp/rethrow",
|
|
9344
10003
|
|
9345
10004
|
The 'Whoops' error will be thrown on the next turn of the event loop
|
9346
10005
|
and you can watch for it in your console. You can also handle it using a
|
9347
|
-
rejection handler given to `.then` or `.
|
10006
|
+
rejection handler given to `.then` or `.catch` on the returned promise.
|
9348
10007
|
|
9349
10008
|
@method rethrow
|
9350
10009
|
@for RSVP
|
9351
10010
|
@param {Error} reason reason the promise became rejected.
|
9352
10011
|
@throws Error
|
10012
|
+
@static
|
9353
10013
|
*/
|
9354
|
-
function rethrow(reason) {
|
9355
|
-
|
10014
|
+
__exports__["default"] = function rethrow(reason) {
|
10015
|
+
setTimeout(function() {
|
9356
10016
|
throw reason;
|
9357
10017
|
});
|
9358
10018
|
throw reason;
|
9359
|
-
}
|
9360
|
-
|
9361
|
-
__exports__.rethrow = rethrow;
|
10019
|
+
};
|
9362
10020
|
});
|
9363
10021
|
define("rsvp/utils",
|
9364
10022
|
["exports"],
|
9365
10023
|
function(__exports__) {
|
9366
10024
|
"use strict";
|
9367
10025
|
function objectOrFunction(x) {
|
9368
|
-
return
|
10026
|
+
return typeof x === "function" || (typeof x === "object" && x !== null);
|
9369
10027
|
}
|
9370
10028
|
|
9371
|
-
function isFunction(x) {
|
10029
|
+
__exports__.objectOrFunction = objectOrFunction;function isFunction(x) {
|
9372
10030
|
return typeof x === "function";
|
9373
10031
|
}
|
9374
10032
|
|
9375
|
-
function
|
10033
|
+
__exports__.isFunction = isFunction;function isNonThenable(x) {
|
10034
|
+
return !objectOrFunction(x);
|
10035
|
+
}
|
10036
|
+
|
10037
|
+
__exports__.isNonThenable = isNonThenable;function isArray(x) {
|
9376
10038
|
return Object.prototype.toString.call(x) === "[object Array]";
|
9377
10039
|
}
|
9378
10040
|
|
9379
|
-
|
10041
|
+
__exports__.isArray = isArray;// Date.now is not available in browsers < IE9
|
9380
10042
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now#Compatibility
|
9381
10043
|
var now = Date.now || function() { return new Date().getTime(); };
|
10044
|
+
__exports__.now = now;
|
10045
|
+
var keysOf = Object.keys || function(object) {
|
10046
|
+
var result = [];
|
9382
10047
|
|
10048
|
+
for (var prop in object) {
|
10049
|
+
result.push(prop);
|
10050
|
+
}
|
9383
10051
|
|
9384
|
-
|
9385
|
-
|
9386
|
-
__exports__.
|
9387
|
-
__exports__.now = now;
|
10052
|
+
return result;
|
10053
|
+
};
|
10054
|
+
__exports__.keysOf = keysOf;
|
9388
10055
|
});
|
9389
10056
|
define("rsvp",
|
9390
|
-
["./rsvp/
|
9391
|
-
function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __exports__) {
|
10057
|
+
["./rsvp/promise","./rsvp/events","./rsvp/node","./rsvp/all","./rsvp/all_settled","./rsvp/race","./rsvp/hash","./rsvp/rethrow","./rsvp/defer","./rsvp/config","./rsvp/map","./rsvp/resolve","./rsvp/reject","./rsvp/filter","exports"],
|
10058
|
+
function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __dependency12__, __dependency13__, __dependency14__, __exports__) {
|
9392
10059
|
"use strict";
|
9393
|
-
var
|
9394
|
-
var
|
9395
|
-
var denodeify = __dependency3__
|
9396
|
-
var all = __dependency4__
|
9397
|
-
var
|
9398
|
-
var
|
9399
|
-
var
|
9400
|
-
var
|
9401
|
-
var
|
9402
|
-
var
|
9403
|
-
var
|
9404
|
-
var
|
10060
|
+
var Promise = __dependency1__["default"];
|
10061
|
+
var EventTarget = __dependency2__["default"];
|
10062
|
+
var denodeify = __dependency3__["default"];
|
10063
|
+
var all = __dependency4__["default"];
|
10064
|
+
var allSettled = __dependency5__["default"];
|
10065
|
+
var race = __dependency6__["default"];
|
10066
|
+
var hash = __dependency7__["default"];
|
10067
|
+
var rethrow = __dependency8__["default"];
|
10068
|
+
var defer = __dependency9__["default"];
|
10069
|
+
var config = __dependency10__.config;
|
10070
|
+
var configure = __dependency10__.configure;
|
10071
|
+
var map = __dependency11__["default"];
|
10072
|
+
var resolve = __dependency12__["default"];
|
10073
|
+
var reject = __dependency13__["default"];
|
10074
|
+
var filter = __dependency14__["default"];
|
9405
10075
|
|
9406
10076
|
function async(callback, arg) {
|
9407
10077
|
config.async(callback, arg);
|
@@ -9415,9 +10085,21 @@ define("rsvp",
|
|
9415
10085
|
config.off.apply(config, arguments);
|
9416
10086
|
}
|
9417
10087
|
|
10088
|
+
// Set up instrumentation through `window.__PROMISE_INTRUMENTATION__`
|
10089
|
+
if (typeof window !== 'undefined' && typeof window.__PROMISE_INSTRUMENTATION__ === 'object') {
|
10090
|
+
var callbacks = window.__PROMISE_INSTRUMENTATION__;
|
10091
|
+
configure('instrument', true);
|
10092
|
+
for (var eventName in callbacks) {
|
10093
|
+
if (callbacks.hasOwnProperty(eventName)) {
|
10094
|
+
on(eventName, callbacks[eventName]);
|
10095
|
+
}
|
10096
|
+
}
|
10097
|
+
}
|
10098
|
+
|
9418
10099
|
__exports__.Promise = Promise;
|
9419
10100
|
__exports__.EventTarget = EventTarget;
|
9420
10101
|
__exports__.all = all;
|
10102
|
+
__exports__.allSettled = allSettled;
|
9421
10103
|
__exports__.race = race;
|
9422
10104
|
__exports__.hash = hash;
|
9423
10105
|
__exports__.rethrow = rethrow;
|
@@ -9429,16 +10111,18 @@ define("rsvp",
|
|
9429
10111
|
__exports__.resolve = resolve;
|
9430
10112
|
__exports__.reject = reject;
|
9431
10113
|
__exports__.async = async;
|
10114
|
+
__exports__.map = map;
|
10115
|
+
__exports__.filter = filter;
|
9432
10116
|
});
|
9433
10117
|
|
9434
10118
|
})();
|
9435
10119
|
|
9436
10120
|
(function() {
|
9437
10121
|
/**
|
9438
|
-
@private
|
9439
10122
|
Public api for the container is still in flux.
|
9440
10123
|
The public api, specified on the application namespace should be considered the stable api.
|
9441
10124
|
// @module container
|
10125
|
+
@private
|
9442
10126
|
*/
|
9443
10127
|
|
9444
10128
|
/*
|
@@ -9451,7 +10135,6 @@ Ember.MODEL_FACTORY_INJECTIONS = false || !!Ember.ENV.MODEL_FACTORY_INJECTIONS;
|
|
9451
10135
|
define("container",
|
9452
10136
|
[],
|
9453
10137
|
function() {
|
9454
|
-
"use strict";
|
9455
10138
|
|
9456
10139
|
// A safe and simple inheriting object.
|
9457
10140
|
function InheritingDict(parent) {
|
@@ -9573,8 +10256,7 @@ define("container",
|
|
9573
10256
|
|
9574
10257
|
this.registry = new InheritingDict(parent && parent.registry);
|
9575
10258
|
this.cache = new InheritingDict(parent && parent.cache);
|
9576
|
-
this.factoryCache = new InheritingDict(parent && parent.
|
9577
|
-
this.resolveCache = new InheritingDict(parent && parent.resolveCache);
|
10259
|
+
this.factoryCache = new InheritingDict(parent && parent.cache);
|
9578
10260
|
this.typeInjections = new InheritingDict(parent && parent.typeInjections);
|
9579
10261
|
this.injections = {};
|
9580
10262
|
|
@@ -9695,7 +10377,9 @@ define("container",
|
|
9695
10377
|
@param {Object} options
|
9696
10378
|
*/
|
9697
10379
|
register: function(fullName, factory, options) {
|
9698
|
-
|
10380
|
+
if (fullName.indexOf(':') === -1) {
|
10381
|
+
throw new TypeError("malformed fullName, expected: `type:name` got: " + fullName + "");
|
10382
|
+
}
|
9699
10383
|
|
9700
10384
|
if (factory === undefined) {
|
9701
10385
|
throw new TypeError('Attempting to register an unknown factory: `' + fullName + '`');
|
@@ -9728,14 +10412,11 @@ define("container",
|
|
9728
10412
|
@param {String} fullName
|
9729
10413
|
*/
|
9730
10414
|
unregister: function(fullName) {
|
9731
|
-
validateFullName(fullName);
|
9732
|
-
|
9733
10415
|
var normalizedName = this.normalize(fullName);
|
9734
10416
|
|
9735
10417
|
this.registry.remove(normalizedName);
|
9736
10418
|
this.cache.remove(normalizedName);
|
9737
10419
|
this.factoryCache.remove(normalizedName);
|
9738
|
-
this.resolveCache.remove(normalizedName);
|
9739
10420
|
this._options.remove(normalizedName);
|
9740
10421
|
},
|
9741
10422
|
|
@@ -9772,18 +10453,7 @@ define("container",
|
|
9772
10453
|
@return {Function} fullName's factory
|
9773
10454
|
*/
|
9774
10455
|
resolve: function(fullName) {
|
9775
|
-
|
9776
|
-
|
9777
|
-
var normalizedName = this.normalize(fullName);
|
9778
|
-
var cached = this.resolveCache.get(normalizedName);
|
9779
|
-
|
9780
|
-
if (cached) { return cached; }
|
9781
|
-
|
9782
|
-
var resolved = this.resolver(normalizedName) || this.registry.get(normalizedName);
|
9783
|
-
|
9784
|
-
this.resolveCache.set(normalizedName, resolved);
|
9785
|
-
|
9786
|
-
return resolved;
|
10456
|
+
return this.resolver(fullName) || this.registry.get(fullName);
|
9787
10457
|
},
|
9788
10458
|
|
9789
10459
|
/**
|
@@ -9864,8 +10534,23 @@ define("container",
|
|
9864
10534
|
@return {any}
|
9865
10535
|
*/
|
9866
10536
|
lookup: function(fullName, options) {
|
9867
|
-
|
9868
|
-
|
10537
|
+
fullName = this.normalize(fullName);
|
10538
|
+
|
10539
|
+
options = options || {};
|
10540
|
+
|
10541
|
+
if (this.cache.has(fullName) && options.singleton !== false) {
|
10542
|
+
return this.cache.get(fullName);
|
10543
|
+
}
|
10544
|
+
|
10545
|
+
var value = instantiate(this, fullName);
|
10546
|
+
|
10547
|
+
if (value === undefined) { return; }
|
10548
|
+
|
10549
|
+
if (isSingleton(this, fullName) && options.singleton !== false) {
|
10550
|
+
this.cache.set(fullName, value);
|
10551
|
+
}
|
10552
|
+
|
10553
|
+
return value;
|
9869
10554
|
},
|
9870
10555
|
|
9871
10556
|
/**
|
@@ -9876,8 +10561,7 @@ define("container",
|
|
9876
10561
|
@return {any}
|
9877
10562
|
*/
|
9878
10563
|
lookupFactory: function(fullName) {
|
9879
|
-
|
9880
|
-
return factoryFor(this, this.normalize(fullName));
|
10564
|
+
return factoryFor(this, fullName);
|
9881
10565
|
},
|
9882
10566
|
|
9883
10567
|
/**
|
@@ -9889,8 +10573,11 @@ define("container",
|
|
9889
10573
|
@return {Boolean}
|
9890
10574
|
*/
|
9891
10575
|
has: function(fullName) {
|
9892
|
-
|
9893
|
-
|
10576
|
+
if (this.cache.has(fullName)) {
|
10577
|
+
return true;
|
10578
|
+
}
|
10579
|
+
|
10580
|
+
return !!this.resolve(fullName);
|
9894
10581
|
},
|
9895
10582
|
|
9896
10583
|
/**
|
@@ -9936,8 +10623,6 @@ define("container",
|
|
9936
10623
|
},
|
9937
10624
|
|
9938
10625
|
/**
|
9939
|
-
@private
|
9940
|
-
|
9941
10626
|
Used only via `injection`.
|
9942
10627
|
|
9943
10628
|
Provides a specialized form of injection, specifically enabling
|
@@ -9966,13 +10651,13 @@ define("container",
|
|
9966
10651
|
user.router === post.router; //=> true
|
9967
10652
|
```
|
9968
10653
|
|
10654
|
+
@private
|
9969
10655
|
@method typeInjection
|
9970
10656
|
@param {String} type
|
9971
10657
|
@param {String} property
|
9972
10658
|
@param {String} fullName
|
9973
10659
|
*/
|
9974
10660
|
typeInjection: function(type, property, fullName) {
|
9975
|
-
validateFullName(fullName);
|
9976
10661
|
if (this.parent) { illegalChildOperation('typeInjection'); }
|
9977
10662
|
|
9978
10663
|
addTypeInjection(this.typeInjections, type, property, fullName);
|
@@ -10022,26 +10707,18 @@ define("container",
|
|
10022
10707
|
@param {String} property
|
10023
10708
|
@param {String} injectionName
|
10024
10709
|
*/
|
10025
|
-
injection: function(
|
10710
|
+
injection: function(factoryName, property, injectionName) {
|
10026
10711
|
if (this.parent) { illegalChildOperation('injection'); }
|
10027
10712
|
|
10028
|
-
|
10029
|
-
|
10030
|
-
|
10031
|
-
if (fullName.indexOf(':') === -1) {
|
10032
|
-
return this.typeInjection(fullName, property, normalizedInjectionName);
|
10713
|
+
if (factoryName.indexOf(':') === -1) {
|
10714
|
+
return this.typeInjection(factoryName, property, injectionName);
|
10033
10715
|
}
|
10034
10716
|
|
10035
|
-
|
10036
|
-
var normalizedName = this.normalize(fullName);
|
10037
|
-
|
10038
|
-
addInjection(this.injections, normalizedName, property, normalizedInjectionName);
|
10717
|
+
addInjection(this.injections, factoryName, property, injectionName);
|
10039
10718
|
},
|
10040
10719
|
|
10041
10720
|
|
10042
10721
|
/**
|
10043
|
-
@private
|
10044
|
-
|
10045
10722
|
Used only via `factoryInjection`.
|
10046
10723
|
|
10047
10724
|
Provides a specialized form of injection, specifically enabling
|
@@ -10064,6 +10741,7 @@ define("container",
|
|
10064
10741
|
UserFactory.store instanceof SomeStore; //=> true
|
10065
10742
|
```
|
10066
10743
|
|
10744
|
+
@private
|
10067
10745
|
@method factoryTypeInjection
|
10068
10746
|
@param {String} type
|
10069
10747
|
@param {String} property
|
@@ -10072,7 +10750,7 @@ define("container",
|
|
10072
10750
|
factoryTypeInjection: function(type, property, fullName) {
|
10073
10751
|
if (this.parent) { illegalChildOperation('factoryTypeInjection'); }
|
10074
10752
|
|
10075
|
-
addTypeInjection(this.factoryTypeInjections, type, property,
|
10753
|
+
addTypeInjection(this.factoryTypeInjections, type, property, fullName);
|
10076
10754
|
},
|
10077
10755
|
|
10078
10756
|
/**
|
@@ -10124,21 +10802,14 @@ define("container",
|
|
10124
10802
|
@param {String} property
|
10125
10803
|
@param {String} injectionName
|
10126
10804
|
*/
|
10127
|
-
factoryInjection: function(
|
10805
|
+
factoryInjection: function(factoryName, property, injectionName) {
|
10128
10806
|
if (this.parent) { illegalChildOperation('injection'); }
|
10129
10807
|
|
10130
|
-
|
10131
|
-
|
10132
|
-
|
10133
|
-
validateFullName(injectionName);
|
10134
|
-
|
10135
|
-
if (fullName.indexOf(':') === -1) {
|
10136
|
-
return this.factoryTypeInjection(normalizedName, property, normalizedInjectionName);
|
10808
|
+
if (factoryName.indexOf(':') === -1) {
|
10809
|
+
return this.factoryTypeInjection(factoryName, property, injectionName);
|
10137
10810
|
}
|
10138
10811
|
|
10139
|
-
|
10140
|
-
|
10141
|
-
addInjection(this.factoryInjections, normalizedName, property, normalizedInjectionName);
|
10812
|
+
addInjection(this.factoryInjections, factoryName, property, injectionName);
|
10142
10813
|
},
|
10143
10814
|
|
10144
10815
|
/**
|
@@ -10148,6 +10819,7 @@ define("container",
|
|
10148
10819
|
@method destroy
|
10149
10820
|
*/
|
10150
10821
|
destroy: function() {
|
10822
|
+
|
10151
10823
|
for (var i=0, l=this.children.length; i<l; i++) {
|
10152
10824
|
this.children[i].destroy();
|
10153
10825
|
}
|
@@ -10173,32 +10845,6 @@ define("container",
|
|
10173
10845
|
}
|
10174
10846
|
};
|
10175
10847
|
|
10176
|
-
function has(container, fullName){
|
10177
|
-
if (container.cache.has(fullName)) {
|
10178
|
-
return true;
|
10179
|
-
}
|
10180
|
-
|
10181
|
-
return !!container.resolve(fullName);
|
10182
|
-
}
|
10183
|
-
|
10184
|
-
function lookup(container, fullName, options) {
|
10185
|
-
options = options || {};
|
10186
|
-
|
10187
|
-
if (container.cache.has(fullName) && options.singleton !== false) {
|
10188
|
-
return container.cache.get(fullName);
|
10189
|
-
}
|
10190
|
-
|
10191
|
-
var value = instantiate(container, fullName);
|
10192
|
-
|
10193
|
-
if (value === undefined) { return; }
|
10194
|
-
|
10195
|
-
if (isSingleton(container, fullName) && options.singleton !== false) {
|
10196
|
-
container.cache.set(fullName, value);
|
10197
|
-
}
|
10198
|
-
|
10199
|
-
return value;
|
10200
|
-
}
|
10201
|
-
|
10202
10848
|
function illegalChildOperation(operation) {
|
10203
10849
|
throw new Error(operation + " is not currently supported on child containers");
|
10204
10850
|
}
|
@@ -10214,14 +10860,14 @@ define("container",
|
|
10214
10860
|
|
10215
10861
|
if (!injections) { return hash; }
|
10216
10862
|
|
10217
|
-
var injection,
|
10863
|
+
var injection, lookup;
|
10218
10864
|
|
10219
10865
|
for (var i=0, l=injections.length; i<l; i++) {
|
10220
10866
|
injection = injections[i];
|
10221
|
-
|
10867
|
+
lookup = container.lookup(injection.fullName);
|
10222
10868
|
|
10223
|
-
if (
|
10224
|
-
hash[injection.property] =
|
10869
|
+
if (lookup !== undefined) {
|
10870
|
+
hash[injection.property] = lookup;
|
10225
10871
|
} else {
|
10226
10872
|
throw new Error('Attempting to inject an unknown injection: `' + injection.fullName + '`');
|
10227
10873
|
}
|
@@ -10246,7 +10892,7 @@ define("container",
|
|
10246
10892
|
}
|
10247
10893
|
|
10248
10894
|
function factoryFor(container, fullName) {
|
10249
|
-
var name = fullName;
|
10895
|
+
var name = container.normalize(fullName);
|
10250
10896
|
var factory = container.resolve(name);
|
10251
10897
|
var injectedFactory;
|
10252
10898
|
var cache = container.factoryCache;
|
@@ -10356,13 +11002,6 @@ define("container",
|
|
10356
11002
|
});
|
10357
11003
|
}
|
10358
11004
|
|
10359
|
-
var VALID_FULL_NAME_REGEXP = /^[^:]+.+:[^:]+$/;
|
10360
|
-
function validateFullName(fullName) {
|
10361
|
-
if (!VALID_FULL_NAME_REGEXP.test(fullName)) {
|
10362
|
-
throw new TypeError('Invalid Fullname, expected: `type:name` got: ' + fullName);
|
10363
|
-
}
|
10364
|
-
}
|
10365
|
-
|
10366
11005
|
function addInjection(rules, factoryName, property, injectionName) {
|
10367
11006
|
var injections = rules[factoryName] = rules[factoryName] || [];
|
10368
11007
|
injections.push({ property: property, fullName: injectionName });
|
@@ -10557,6 +11196,39 @@ Ember.copy = function(obj, deep) {
|
|
10557
11196
|
return _copy(obj, deep, deep ? [] : null, deep ? [] : null);
|
10558
11197
|
};
|
10559
11198
|
|
11199
|
+
/**
|
11200
|
+
Convenience method to inspect an object. This method will attempt to
|
11201
|
+
convert the object into a useful string description.
|
11202
|
+
|
11203
|
+
It is a pretty simple implementation. If you want something more robust,
|
11204
|
+
use something like JSDump: https://github.com/NV/jsDump
|
11205
|
+
|
11206
|
+
@method inspect
|
11207
|
+
@for Ember
|
11208
|
+
@param {Object} obj The object you want to inspect.
|
11209
|
+
@return {String} A description of the object
|
11210
|
+
*/
|
11211
|
+
Ember.inspect = function(obj) {
|
11212
|
+
var type = Ember.typeOf(obj);
|
11213
|
+
if (type === 'array') {
|
11214
|
+
return '[' + obj + ']';
|
11215
|
+
}
|
11216
|
+
if (type !== 'object') {
|
11217
|
+
return obj + '';
|
11218
|
+
}
|
11219
|
+
|
11220
|
+
var v, ret = [];
|
11221
|
+
for(var key in obj) {
|
11222
|
+
if (obj.hasOwnProperty(key)) {
|
11223
|
+
v = obj[key];
|
11224
|
+
if (v === 'toString') { continue; } // ignore useless items
|
11225
|
+
if (Ember.typeOf(v) === 'function') { v = "function() { ... }"; }
|
11226
|
+
ret.push(key + ": " + v);
|
11227
|
+
}
|
11228
|
+
}
|
11229
|
+
return "{" + ret.join(", ") + "}";
|
11230
|
+
};
|
11231
|
+
|
10560
11232
|
/**
|
10561
11233
|
Compares two objects, returning true if they are logically equal. This is
|
10562
11234
|
a deeper comparison than a simple triple equal. For sets it will compare the
|
@@ -10661,10 +11333,6 @@ var STRING_DECAMELIZE_REGEXP = (/([a-z\d])([A-Z])/g);
|
|
10661
11333
|
var STRING_CAMELIZE_REGEXP = (/(\-|_|\.|\s)+(.)?/g);
|
10662
11334
|
var STRING_UNDERSCORE_REGEXP_1 = (/([a-z\d])([A-Z]+)/g);
|
10663
11335
|
var STRING_UNDERSCORE_REGEXP_2 = (/\-|\s+/g);
|
10664
|
-
var STRING_PARAMETERIZE_REGEXP_1 = (/[_|\/|\s]+/g);
|
10665
|
-
var STRING_PARAMETERIZE_REGEXP_2 = (/[^a-z0-9\-]+/gi);
|
10666
|
-
var STRING_PARAMETERIZE_REGEXP_3 = (/[\-]+/g);
|
10667
|
-
var STRING_PARAMETERIZE_REGEXP_4 = (/^-+|-+$/g);
|
10668
11336
|
|
10669
11337
|
/**
|
10670
11338
|
Defines the hash of localized strings for the current language. Used by
|
@@ -10903,54 +11571,6 @@ Ember.String = {
|
|
10903
11571
|
}
|
10904
11572
|
};
|
10905
11573
|
|
10906
|
-
if (Ember.FEATURES.isEnabled("string-humanize")) {
|
10907
|
-
/**
|
10908
|
-
Returns the Humanized form of a string
|
10909
|
-
|
10910
|
-
Replaces underscores with spaces, and capitializes first character
|
10911
|
-
of string. Also strips "_id" suffixes.
|
10912
|
-
|
10913
|
-
```javascript
|
10914
|
-
'first_name'.humanize() // 'First name'
|
10915
|
-
'user_id'.humanize() // 'User'
|
10916
|
-
```
|
10917
|
-
|
10918
|
-
@method humanize
|
10919
|
-
@param {String} str The string to humanize.
|
10920
|
-
@return {String} The humanized string.
|
10921
|
-
*/
|
10922
|
-
|
10923
|
-
Ember.String.humanize = function(str) {
|
10924
|
-
return str.replace(/_id$/, '').
|
10925
|
-
replace(/_/g, ' ').
|
10926
|
-
replace(/^\w/g, function(s){
|
10927
|
-
return s.toUpperCase();
|
10928
|
-
});
|
10929
|
-
};
|
10930
|
-
}
|
10931
|
-
|
10932
|
-
if (Ember.FEATURES.isEnabled("string-parameterize")) {
|
10933
|
-
/**
|
10934
|
-
Transforms a string so that it may be used as part of a 'pretty' / SEO friendly URL.
|
10935
|
-
|
10936
|
-
```javascript
|
10937
|
-
'My favorite items.'.parameterize(); // 'my-favorite-items'
|
10938
|
-
'action_name'.parameterize(); // 'action-name'
|
10939
|
-
'100 ways Ember.js is better than Angular.'.parameterize(); // '100-ways-emberjs-is-better-than-angular'
|
10940
|
-
```
|
10941
|
-
|
10942
|
-
@method parameterize
|
10943
|
-
@param {String} str The string to parameterize.
|
10944
|
-
@return {String} the parameterized string.
|
10945
|
-
*/
|
10946
|
-
Ember.String.parameterize = function(str) {
|
10947
|
-
return str.replace(STRING_PARAMETERIZE_REGEXP_1, '-') // replace underscores, slashes and spaces with separator
|
10948
|
-
.replace(STRING_PARAMETERIZE_REGEXP_2, '') // remove non-alphanumeric characters except the separator
|
10949
|
-
.replace(STRING_PARAMETERIZE_REGEXP_3, '-') // replace multiple occurring separators
|
10950
|
-
.replace(STRING_PARAMETERIZE_REGEXP_4, '') // trim leading and trailing separators
|
10951
|
-
.toLowerCase();
|
10952
|
-
};
|
10953
|
-
}
|
10954
11574
|
|
10955
11575
|
|
10956
11576
|
})();
|
@@ -10975,13 +11595,6 @@ var fmt = Ember.String.fmt,
|
|
10975
11595
|
capitalize = Ember.String.capitalize,
|
10976
11596
|
classify = Ember.String.classify;
|
10977
11597
|
|
10978
|
-
if (Ember.FEATURES.isEnabled("string-humanize")) {
|
10979
|
-
var humanize = Ember.String.humanize;
|
10980
|
-
}
|
10981
|
-
|
10982
|
-
if (Ember.FEATURES.isEnabled("string-parameterize")) {
|
10983
|
-
var parameterize = Ember.String.parameterize;
|
10984
|
-
}
|
10985
11598
|
|
10986
11599
|
if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
|
10987
11600
|
|
@@ -11075,30 +11688,7 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
|
|
11075
11688
|
return capitalize(this);
|
11076
11689
|
};
|
11077
11690
|
|
11078
|
-
|
11079
|
-
/**
|
11080
|
-
See [Ember.String.humanize](/api/classes/Ember.String.html#method_humanize).
|
11081
|
-
|
11082
|
-
@method humanize
|
11083
|
-
@for String
|
11084
|
-
*/
|
11085
|
-
String.prototype.humanize = function() {
|
11086
|
-
return humanize(this);
|
11087
|
-
};
|
11088
|
-
}
|
11089
|
-
|
11090
|
-
if (Ember.FEATURES.isEnabled("string-parameterize")) {
|
11091
|
-
/**
|
11092
|
-
See [Ember.String.parameterize](/api/classes/Ember.String.html#method_parameterize).
|
11093
|
-
|
11094
|
-
@method parameterize
|
11095
|
-
@for String
|
11096
|
-
*/
|
11097
|
-
String.prototype.parameterize = function() {
|
11098
|
-
return parameterize(this);
|
11099
|
-
};
|
11100
|
-
}
|
11101
|
-
|
11691
|
+
|
11102
11692
|
}
|
11103
11693
|
|
11104
11694
|
|
@@ -11699,7 +12289,9 @@ function makeCtor() {
|
|
11699
12289
|
|
11700
12290
|
Ember.assert("Ember.Object.create no longer supports defining computed properties.", !(value instanceof Ember.ComputedProperty));
|
11701
12291
|
Ember.assert("Ember.Object.create no longer supports defining methods that call _super.", !(typeof value === 'function' && value.toString().indexOf('._super') !== -1));
|
11702
|
-
Ember.assert("`actions` must be provided at extend time, not at create
|
12292
|
+
Ember.assert("`actions` must be provided at extend time, not at create " +
|
12293
|
+
"time, when Ember.ActionHandler is used (i.e. views, " +
|
12294
|
+
"controllers & routes).", !((keyName === 'actions') && Ember.ActionHandler.detect(this)));
|
11703
12295
|
|
11704
12296
|
if (concatenatedProperties && indexOf(concatenatedProperties, keyName) >= 0) {
|
11705
12297
|
var baseValue = this[keyName];
|
@@ -11927,11 +12519,10 @@ CoreObject.PrototypeMixin = Mixin.create({
|
|
11927
12519
|
willDestroy: Ember.K,
|
11928
12520
|
|
11929
12521
|
/**
|
11930
|
-
@private
|
11931
|
-
|
11932
12522
|
Invoked by the run loop to actually destroy the object. This is
|
11933
12523
|
scheduled for execution by the `destroy` method.
|
11934
12524
|
|
12525
|
+
@private
|
11935
12526
|
@method _scheduledDestroy
|
11936
12527
|
*/
|
11937
12528
|
_scheduledDestroy: function() {
|
@@ -12682,7 +13273,7 @@ function contentPropertyDidChange(content, contentKey) {
|
|
12682
13273
|
@namespace Ember
|
12683
13274
|
@extends Ember.Object
|
12684
13275
|
*/
|
12685
|
-
Ember.ObjectProxy = Ember.Object.extend(
|
13276
|
+
Ember.ObjectProxy = Ember.Object.extend({
|
12686
13277
|
/**
|
12687
13278
|
The object whose properties will be forwarded.
|
12688
13279
|
|
@@ -13471,7 +14062,7 @@ Ember.Enumerable = Ember.Mixin.create({
|
|
13471
14062
|
var ret = initialValue;
|
13472
14063
|
|
13473
14064
|
this.forEach(function(item, i) {
|
13474
|
-
ret = callback(ret, item, i, this, reducerProperty);
|
14065
|
+
ret = callback.call(null, ret, item, i, this, reducerProperty);
|
13475
14066
|
}, this);
|
13476
14067
|
|
13477
14068
|
return ret;
|
@@ -13494,7 +14085,7 @@ Ember.Enumerable = Ember.Mixin.create({
|
|
13494
14085
|
this.forEach(function(x, idx) {
|
13495
14086
|
var method = x && x[methodName];
|
13496
14087
|
if ('function' === typeof method) {
|
13497
|
-
ret[idx] = args ? method.apply(x, args) : x
|
14088
|
+
ret[idx] = args ? method.apply(x, args) : method.call(x);
|
13498
14089
|
}
|
13499
14090
|
}, this);
|
13500
14091
|
|
@@ -13689,6 +14280,8 @@ Ember.Enumerable = Ember.Mixin.create({
|
|
13689
14280
|
notify range observers.
|
13690
14281
|
|
13691
14282
|
@method enumerableContentDidChange
|
14283
|
+
@param {Number} [start] optional start offset for the content change.
|
14284
|
+
For unordered enumerables, you should always pass -1.
|
13692
14285
|
@param {Ember.Enumerable|Number} removing An enumerable of the objects to
|
13693
14286
|
be removed or the number of items to be removed.
|
13694
14287
|
@param {Ember.Enumerable|Number} adding An enumerable of the objects to
|
@@ -13795,7 +14388,7 @@ var get = Ember.get, set = Ember.set, isNone = Ember.isNone, map = Ember.Enumera
|
|
13795
14388
|
@uses Ember.Enumerable
|
13796
14389
|
@since Ember 0.9.0
|
13797
14390
|
*/
|
13798
|
-
Ember.Array = Ember.Mixin.create(Ember.Enumerable,
|
14391
|
+
Ember.Array = Ember.Mixin.create(Ember.Enumerable, {
|
13799
14392
|
|
13800
14393
|
/**
|
13801
14394
|
Your array must support the `length` property. Your replace methods should
|
@@ -13898,7 +14491,7 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
|
|
13898
14491
|
|
13899
14492
|
@method slice
|
13900
14493
|
@param {Integer} beginIndex (Optional) index to begin slicing from.
|
13901
|
-
@param {Integer} endIndex (Optional) index to end the slice at
|
14494
|
+
@param {Integer} endIndex (Optional) index to end the slice at.
|
13902
14495
|
@return {Array} New array with specified slice
|
13903
14496
|
*/
|
13904
14497
|
slice: function(beginIndex, endIndex) {
|
@@ -14049,7 +14642,7 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
|
|
14049
14642
|
Becomes true whenever the array currently has observers watching changes
|
14050
14643
|
on the array.
|
14051
14644
|
|
14052
|
-
@property
|
14645
|
+
@property Boolean
|
14053
14646
|
*/
|
14054
14647
|
hasArrayObservers: Ember.computed(function() {
|
14055
14648
|
return Ember.hasListeners(this, '@array:change') || Ember.hasListeners(this, '@array:before');
|
@@ -14198,9 +14791,6 @@ var e_get = Ember.get,
|
|
14198
14791
|
doubleEachPropertyPattern = /(.*\.@each){2,}/,
|
14199
14792
|
arrayBracketPattern = /\.\[\]$/;
|
14200
14793
|
|
14201
|
-
if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
|
14202
|
-
var expandProperties = Ember.expandProperties;
|
14203
|
-
}
|
14204
14794
|
|
14205
14795
|
function get(obj, key) {
|
14206
14796
|
if (key === '@this') {
|
@@ -14658,9 +15248,7 @@ function ReduceComputedProperty(options) {
|
|
14658
15248
|
|
14659
15249
|
meta.dependentArraysObserver.suspendArrayObservers(function () {
|
14660
15250
|
forEach(cp._dependentKeys, function (dependentKey) {
|
14661
|
-
|
14662
|
-
if (!partiallyRecomputeFor(this, dependentKey)) { return; }
|
14663
|
-
|
15251
|
+
if (!partiallyRecomputeFor(this, dependentKey)) { return; }
|
14664
15252
|
|
14665
15253
|
var dependentArray = get(this, dependentKey),
|
14666
15254
|
previousDependentArray = meta.dependentArrays[dependentKey];
|
@@ -14689,9 +15277,7 @@ function ReduceComputedProperty(options) {
|
|
14689
15277
|
}, this);
|
14690
15278
|
|
14691
15279
|
forEach(cp._dependentKeys, function(dependentKey) {
|
14692
|
-
|
14693
|
-
if (!partiallyRecomputeFor(this, dependentKey)) { return; }
|
14694
|
-
|
15280
|
+
if (!partiallyRecomputeFor(this, dependentKey)) { return; }
|
14695
15281
|
|
14696
15282
|
var dependentArray = get(this, dependentKey);
|
14697
15283
|
if (dependentArray) {
|
@@ -14786,17 +15372,10 @@ ReduceComputedProperty.prototype.property = function () {
|
|
14786
15372
|
} else if (match = eachPropertyPattern.exec(dependentKey)) {
|
14787
15373
|
dependentArrayKey = match[1];
|
14788
15374
|
|
14789
|
-
|
14790
|
-
var itemPropertyKeyPattern = match[2],
|
14791
|
-
addItemPropertyKey = function (itemPropertyKey) {
|
14792
|
-
cp.itemPropertyKey(dependentArrayKey, itemPropertyKey);
|
14793
|
-
};
|
14794
|
-
|
14795
|
-
expandProperties(itemPropertyKeyPattern, addItemPropertyKey);
|
14796
|
-
} else {
|
15375
|
+
|
14797
15376
|
itemPropertyKey = match[2];
|
14798
15377
|
cp.itemPropertyKey(dependentArrayKey, itemPropertyKey);
|
14799
|
-
|
15378
|
+
|
14800
15379
|
propertyArgs.add(dependentArrayKey);
|
14801
15380
|
} else {
|
14802
15381
|
propertyArgs.add(dependentKey);
|
@@ -14907,7 +15486,7 @@ ReduceComputedProperty.prototype.property = function () {
|
|
14907
15486
|
|
14908
15487
|
```javascript
|
14909
15488
|
Ember.computed.max = function (dependentKey) {
|
14910
|
-
return Ember.reduceComputed(dependentKey, {
|
15489
|
+
return Ember.reduceComputed.call(null, dependentKey, {
|
14911
15490
|
initialValue: -Infinity,
|
14912
15491
|
|
14913
15492
|
addedItem: function (accumulatedValue, item, changeMeta, instanceMeta) {
|
@@ -15057,6 +15636,11 @@ ArrayComputedProperty.prototype.resetValue = function (array) {
|
|
15057
15636
|
return array;
|
15058
15637
|
};
|
15059
15638
|
|
15639
|
+
// This is a stopgap to keep the reference counts correct with lazy CPs.
|
15640
|
+
ArrayComputedProperty.prototype.didChange = function (obj, keyName) {
|
15641
|
+
return;
|
15642
|
+
};
|
15643
|
+
|
15060
15644
|
/**
|
15061
15645
|
Creates a computed property which operates on dependent arrays and
|
15062
15646
|
is updated with "one at a time" semantics. When items are added or
|
@@ -15244,7 +15828,7 @@ var get = Ember.get,
|
|
15244
15828
|
@return {Ember.ComputedProperty} computes the largest value in the dependentKey's array
|
15245
15829
|
*/
|
15246
15830
|
Ember.computed.max = function (dependentKey) {
|
15247
|
-
return Ember.reduceComputed(dependentKey, {
|
15831
|
+
return Ember.reduceComputed.call(null, dependentKey, {
|
15248
15832
|
initialValue: -Infinity,
|
15249
15833
|
|
15250
15834
|
addedItem: function (accumulatedValue, item, changeMeta, instanceMeta) {
|
@@ -15292,7 +15876,7 @@ Ember.computed.max = function (dependentKey) {
|
|
15292
15876
|
@return {Ember.ComputedProperty} computes the smallest value in the dependentKey's array
|
15293
15877
|
*/
|
15294
15878
|
Ember.computed.min = function (dependentKey) {
|
15295
|
-
return Ember.reduceComputed(dependentKey, {
|
15879
|
+
return Ember.reduceComputed.call(null, dependentKey, {
|
15296
15880
|
initialValue: Infinity,
|
15297
15881
|
|
15298
15882
|
addedItem: function (accumulatedValue, item, changeMeta, instanceMeta) {
|
@@ -15683,7 +16267,7 @@ Ember.computed.setDiff = function (setAProperty, setBProperty) {
|
|
15683
16267
|
if (arguments.length !== 2) {
|
15684
16268
|
throw new Ember.Error("setDiff requires exactly two dependent arrays.");
|
15685
16269
|
}
|
15686
|
-
return Ember.arrayComputed(setAProperty, setBProperty, {
|
16270
|
+
return Ember.arrayComputed.call(null, setAProperty, setBProperty, {
|
15687
16271
|
addedItem: function (array, item, changeMeta, instanceMeta) {
|
15688
16272
|
var setA = get(this, setAProperty),
|
15689
16273
|
setB = get(this, setBProperty);
|
@@ -15885,7 +16469,7 @@ Ember.computed.sort = function (itemsKey, sortDefinition) {
|
|
15885
16469
|
};
|
15886
16470
|
}
|
15887
16471
|
|
15888
|
-
return Ember.arrayComputed(itemsKey, {
|
16472
|
+
return Ember.arrayComputed.call(null, itemsKey, {
|
15889
16473
|
initialize: initFn,
|
15890
16474
|
|
15891
16475
|
addedItem: function (array, item, changeMeta, instanceMeta) {
|
@@ -15948,9 +16532,6 @@ Ember.RSVP.on('error', Ember.RSVP.onerrorDefault);
|
|
15948
16532
|
|
15949
16533
|
var a_slice = Array.prototype.slice;
|
15950
16534
|
|
15951
|
-
if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
|
15952
|
-
var expandProperties = Ember.expandProperties;
|
15953
|
-
}
|
15954
16535
|
|
15955
16536
|
if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
|
15956
16537
|
|
@@ -16047,18 +16628,9 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
|
|
16047
16628
|
@for Function
|
16048
16629
|
*/
|
16049
16630
|
Function.prototype.observes = function() {
|
16050
|
-
|
16051
|
-
var addWatchedProperty = function (obs) { watched.push(obs); };
|
16052
|
-
var watched = [];
|
16053
|
-
|
16054
|
-
for (var i=0; i<arguments.length; ++i) {
|
16055
|
-
expandProperties(arguments[i], addWatchedProperty);
|
16056
|
-
}
|
16057
|
-
|
16058
|
-
this.__ember_observes__ = watched;
|
16059
|
-
} else {
|
16631
|
+
|
16060
16632
|
this.__ember_observes__ = a_slice.call(arguments);
|
16061
|
-
|
16633
|
+
|
16062
16634
|
|
16063
16635
|
return this;
|
16064
16636
|
};
|
@@ -16121,18 +16693,9 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
|
|
16121
16693
|
@for Function
|
16122
16694
|
*/
|
16123
16695
|
Function.prototype.observesBefore = function() {
|
16124
|
-
|
16125
|
-
var addWatchedProperty = function (obs) { watched.push(obs); };
|
16126
|
-
var watched = [];
|
16127
|
-
|
16128
|
-
for (var i=0; i<arguments.length; ++i) {
|
16129
|
-
expandProperties(arguments[i], addWatchedProperty);
|
16130
|
-
}
|
16131
|
-
|
16132
|
-
this.__ember_observesBefore__ = watched;
|
16133
|
-
} else {
|
16696
|
+
|
16134
16697
|
this.__ember_observesBefore__ = a_slice.call(arguments);
|
16135
|
-
|
16698
|
+
|
16136
16699
|
|
16137
16700
|
return this;
|
16138
16701
|
};
|
@@ -16193,7 +16756,7 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
|
|
16193
16756
|
@namespace Ember
|
16194
16757
|
@since Ember 0.9
|
16195
16758
|
*/
|
16196
|
-
Ember.Comparable = Ember.Mixin.create(
|
16759
|
+
Ember.Comparable = Ember.Mixin.create({
|
16197
16760
|
|
16198
16761
|
/**
|
16199
16762
|
Override to return the result of the comparison of the two parameters. The
|
@@ -16244,7 +16807,7 @@ var get = Ember.get, set = Ember.set;
|
|
16244
16807
|
@namespace Ember
|
16245
16808
|
@since Ember 0.9
|
16246
16809
|
*/
|
16247
|
-
Ember.Copyable = Ember.Mixin.create(
|
16810
|
+
Ember.Copyable = Ember.Mixin.create({
|
16248
16811
|
|
16249
16812
|
/**
|
16250
16813
|
Override to return a copy of the receiver. Default implementation raises
|
@@ -16348,7 +16911,7 @@ var get = Ember.get, set = Ember.set;
|
|
16348
16911
|
@namespace Ember
|
16349
16912
|
@since Ember 0.9
|
16350
16913
|
*/
|
16351
|
-
Ember.Freezable = Ember.Mixin.create(
|
16914
|
+
Ember.Freezable = Ember.Mixin.create({
|
16352
16915
|
|
16353
16916
|
/**
|
16354
16917
|
Set to `true` when the object is frozen. Use this property to detect
|
@@ -16527,7 +17090,7 @@ var get = Ember.get, set = Ember.set;
|
|
16527
17090
|
@uses Ember.Array
|
16528
17091
|
@uses Ember.MutableEnumerable
|
16529
17092
|
*/
|
16530
|
-
Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable
|
17093
|
+
Ember.MutableArray = Ember.Mixin.create(Ember.Array, Ember.MutableEnumerable, {
|
16531
17094
|
|
16532
17095
|
/**
|
16533
17096
|
__Required.__ You must implement this method to apply this mixin.
|
@@ -17127,7 +17690,7 @@ Ember.DeferredMixin = Ember.Mixin.create({
|
|
17127
17690
|
@param {Function} resolve a callback function to be called when done
|
17128
17691
|
@param {Function} reject a callback function to be called when failed
|
17129
17692
|
*/
|
17130
|
-
then: function(resolve, reject) {
|
17693
|
+
then: function(resolve, reject, label) {
|
17131
17694
|
var deferred, promise, entity;
|
17132
17695
|
|
17133
17696
|
entity = this;
|
@@ -17142,7 +17705,7 @@ Ember.DeferredMixin = Ember.Mixin.create({
|
|
17142
17705
|
}
|
17143
17706
|
}
|
17144
17707
|
|
17145
|
-
return promise.then(resolve && fulfillmentHandler, reject);
|
17708
|
+
return promise.then(resolve && fulfillmentHandler, reject, label);
|
17146
17709
|
},
|
17147
17710
|
|
17148
17711
|
/**
|
@@ -17173,7 +17736,7 @@ Ember.DeferredMixin = Ember.Mixin.create({
|
|
17173
17736
|
},
|
17174
17737
|
|
17175
17738
|
_deferred: Ember.computed(function() {
|
17176
|
-
return RSVP.defer();
|
17739
|
+
return RSVP.defer('Ember: DeferredMixin - ' + this);
|
17177
17740
|
})
|
17178
17741
|
});
|
17179
17742
|
|
@@ -17205,20 +17768,137 @@ Ember.ActionHandler = Ember.Mixin.create({
|
|
17205
17768
|
mergedProperties: ['_actions'],
|
17206
17769
|
|
17207
17770
|
/**
|
17208
|
-
|
17771
|
+
The collection of functions, keyed by name, available on this
|
17772
|
+
`ActionHandler` as action targets.
|
17773
|
+
|
17774
|
+
These functions will be invoked when a matching `{{action}}` is triggered
|
17775
|
+
from within a template and the application's current route is this route.
|
17776
|
+
|
17777
|
+
Actions can also be invoked from other parts of your application
|
17778
|
+
via `ActionHandler#send`.
|
17779
|
+
|
17780
|
+
The `actions` hash will inherit action handlers from
|
17781
|
+
the `actions` hash defined on extended parent classes
|
17782
|
+
or mixins rather than just replace the entire hash, e.g.:
|
17783
|
+
|
17784
|
+
```js
|
17785
|
+
App.CanDisplayBanner = Ember.Mixin.create({
|
17786
|
+
actions: {
|
17787
|
+
displayBanner: function(msg) {
|
17788
|
+
// ...
|
17789
|
+
}
|
17790
|
+
}
|
17791
|
+
});
|
17792
|
+
|
17793
|
+
App.WelcomeRoute = Ember.Route.extend(App.CanDisplayBanner, {
|
17794
|
+
actions: {
|
17795
|
+
playMusic: function() {
|
17796
|
+
// ...
|
17797
|
+
}
|
17798
|
+
}
|
17799
|
+
});
|
17800
|
+
|
17801
|
+
// `WelcomeRoute`, when active, will be able to respond
|
17802
|
+
// to both actions, since the actions hash is merged rather
|
17803
|
+
// then replaced when extending mixins / parent classes.
|
17804
|
+
this.send('displayBanner');
|
17805
|
+
this.send('playMusic');
|
17806
|
+
```
|
17807
|
+
|
17808
|
+
Within a Controller, Route, View or Component's action handler,
|
17809
|
+
the value of the `this` context is the Controller, Route, View or
|
17810
|
+
Component object:
|
17811
|
+
|
17812
|
+
```js
|
17813
|
+
App.SongRoute = Ember.Route.extend({
|
17814
|
+
actions: {
|
17815
|
+
myAction: function() {
|
17816
|
+
this.controllerFor("song");
|
17817
|
+
this.transitionTo("other.route");
|
17818
|
+
...
|
17819
|
+
}
|
17820
|
+
}
|
17821
|
+
});
|
17822
|
+
```
|
17823
|
+
|
17824
|
+
It is also possible to call `this._super()` from within an
|
17825
|
+
action handler if it overrides a handler defined on a parent
|
17826
|
+
class or mixin:
|
17827
|
+
|
17828
|
+
Take for example the following routes:
|
17829
|
+
|
17830
|
+
```js
|
17831
|
+
App.DebugRoute = Ember.Mixin.create({
|
17832
|
+
actions: {
|
17833
|
+
debugRouteInformation: function() {
|
17834
|
+
console.debug("trololo");
|
17835
|
+
}
|
17836
|
+
}
|
17837
|
+
});
|
17209
17838
|
|
17839
|
+
App.AnnoyingDebugRoute = Ember.Route.extend(App.DebugRoute, {
|
17840
|
+
actions: {
|
17841
|
+
debugRouteInformation: function() {
|
17842
|
+
// also call the debugRouteInformation of mixed in App.DebugRoute
|
17843
|
+
this._super();
|
17844
|
+
|
17845
|
+
// show additional annoyance
|
17846
|
+
window.alert(...);
|
17847
|
+
}
|
17848
|
+
}
|
17849
|
+
});
|
17850
|
+
```
|
17851
|
+
|
17852
|
+
## Bubbling
|
17853
|
+
|
17854
|
+
By default, an action will stop bubbling once a handler defined
|
17855
|
+
on the `actions` hash handles it. To continue bubbling the action,
|
17856
|
+
you must return `true` from the handler:
|
17857
|
+
|
17858
|
+
```js
|
17859
|
+
App.Router.map(function() {
|
17860
|
+
this.resource("album", function() {
|
17861
|
+
this.route("song");
|
17862
|
+
});
|
17863
|
+
});
|
17864
|
+
|
17865
|
+
App.AlbumRoute = Ember.Route.extend({
|
17866
|
+
actions: {
|
17867
|
+
startPlaying: function() {
|
17868
|
+
}
|
17869
|
+
}
|
17870
|
+
});
|
17871
|
+
|
17872
|
+
App.AlbumSongRoute = Ember.Route.extend({
|
17873
|
+
actions: {
|
17874
|
+
startPlaying: function() {
|
17875
|
+
// ...
|
17876
|
+
|
17877
|
+
if (actionShouldAlsoBeTriggeredOnParentRoute) {
|
17878
|
+
return true;
|
17879
|
+
}
|
17880
|
+
}
|
17881
|
+
}
|
17882
|
+
});
|
17883
|
+
```
|
17884
|
+
|
17885
|
+
@property actions
|
17886
|
+
@type Hash
|
17887
|
+
@default null
|
17888
|
+
*/
|
17889
|
+
|
17890
|
+
/**
|
17210
17891
|
Moves `actions` to `_actions` at extend time. Note that this currently
|
17211
17892
|
modifies the mixin themselves, which is technically dubious but
|
17212
17893
|
is practically of little consequence. This may change in the future.
|
17213
17894
|
|
17895
|
+
@private
|
17214
17896
|
@method willMergeMixin
|
17215
17897
|
*/
|
17216
17898
|
willMergeMixin: function(props) {
|
17217
17899
|
var hashName;
|
17218
17900
|
|
17219
17901
|
if (!props._actions) {
|
17220
|
-
Ember.assert(this + " 'actions' should not be a function", typeof(props.actions) !== 'function');
|
17221
|
-
|
17222
17902
|
if (typeOf(props.actions) === 'object') {
|
17223
17903
|
hashName = 'actions';
|
17224
17904
|
} else if (typeOf(props.events) === 'object') {
|
@@ -17265,6 +17945,8 @@ Ember.ActionHandler = Ember.Mixin.create({
|
|
17265
17945
|
|
17266
17946
|
(function() {
|
17267
17947
|
var set = Ember.set, get = Ember.get,
|
17948
|
+
resolve = Ember.RSVP.resolve,
|
17949
|
+
rethrow = Ember.RSVP.rethrow,
|
17268
17950
|
not = Ember.computed.not,
|
17269
17951
|
or = Ember.computed.or;
|
17270
17952
|
|
@@ -17273,16 +17955,15 @@ var set = Ember.set, get = Ember.get,
|
|
17273
17955
|
@submodule ember-runtime
|
17274
17956
|
*/
|
17275
17957
|
|
17276
|
-
function
|
17277
|
-
|
17958
|
+
function observePromise(proxy, promise) {
|
17959
|
+
promise.then(function(value) {
|
17278
17960
|
set(proxy, 'isFulfilled', true);
|
17279
17961
|
set(proxy, 'content', value);
|
17280
|
-
return value;
|
17281
17962
|
}, function(reason) {
|
17282
17963
|
set(proxy, 'isRejected', true);
|
17283
17964
|
set(proxy, 'reason', reason);
|
17284
|
-
throw
|
17285
|
-
});
|
17965
|
+
// don't re-throw, as we are merely observing
|
17966
|
+
}, "Ember: PromiseProxy");
|
17286
17967
|
}
|
17287
17968
|
|
17288
17969
|
/**
|
@@ -17337,7 +18018,7 @@ function tap(proxy, promise) {
|
|
17337
18018
|
controller.get('lastName') //=> 'Penner'
|
17338
18019
|
```
|
17339
18020
|
|
17340
|
-
If the controller is backing a template, the attributes are
|
18021
|
+
If the controller is backing a template, the attributes are
|
17341
18022
|
bindable from within that template
|
17342
18023
|
|
17343
18024
|
```handlebars
|
@@ -17351,26 +18032,114 @@ function tap(proxy, promise) {
|
|
17351
18032
|
@class Ember.PromiseProxyMixin
|
17352
18033
|
*/
|
17353
18034
|
Ember.PromiseProxyMixin = Ember.Mixin.create({
|
18035
|
+
/**
|
18036
|
+
If the proxied promise is rejected this will contain the reason
|
18037
|
+
provided.
|
18038
|
+
|
18039
|
+
@property reason
|
18040
|
+
@default null
|
18041
|
+
*/
|
17354
18042
|
reason: null,
|
18043
|
+
|
18044
|
+
/**
|
18045
|
+
Once the proxied promise has settled this will become `false`.
|
18046
|
+
|
18047
|
+
@property isPending
|
18048
|
+
@default true
|
18049
|
+
*/
|
17355
18050
|
isPending: not('isSettled').readOnly(),
|
18051
|
+
|
18052
|
+
/**
|
18053
|
+
Once the proxied promise has settled this will become `true`.
|
18054
|
+
|
18055
|
+
@property isSettled
|
18056
|
+
@default false
|
18057
|
+
*/
|
17356
18058
|
isSettled: or('isRejected', 'isFulfilled').readOnly(),
|
18059
|
+
|
18060
|
+
/**
|
18061
|
+
Will become `true` if the proxied promise is rejected.
|
18062
|
+
|
18063
|
+
@property isRejected
|
18064
|
+
@default false
|
18065
|
+
*/
|
17357
18066
|
isRejected: false,
|
18067
|
+
|
18068
|
+
/**
|
18069
|
+
Will become `true` if the proxied promise is fulfilled.
|
18070
|
+
|
18071
|
+
@property isFullfilled
|
18072
|
+
@default false
|
18073
|
+
*/
|
17358
18074
|
isFulfilled: false,
|
17359
18075
|
|
18076
|
+
/**
|
18077
|
+
The promise whose fulfillment value is being proxied by this object.
|
18078
|
+
|
18079
|
+
This property must be specified upon creation, and should not be
|
18080
|
+
changed once created.
|
18081
|
+
|
18082
|
+
Example:
|
18083
|
+
|
18084
|
+
```javascript
|
18085
|
+
Ember.ObjectController.extend(Ember.PromiseProxyMixin).create({
|
18086
|
+
promise: <thenable>
|
18087
|
+
});
|
18088
|
+
```
|
18089
|
+
|
18090
|
+
@property promise
|
18091
|
+
*/
|
17360
18092
|
promise: Ember.computed(function(key, promise) {
|
17361
18093
|
if (arguments.length === 2) {
|
17362
|
-
|
18094
|
+
promise = resolve(promise);
|
18095
|
+
observePromise(this, promise);
|
18096
|
+
return promise.then(); // fork the promise.
|
17363
18097
|
} else {
|
17364
18098
|
throw new Ember.Error("PromiseProxy's promise must be set");
|
17365
18099
|
}
|
17366
18100
|
}),
|
17367
18101
|
|
17368
|
-
|
17369
|
-
|
17370
|
-
|
17371
|
-
|
18102
|
+
/**
|
18103
|
+
An alias to the proxied promise's `then`.
|
18104
|
+
|
18105
|
+
See RSVP.Promise.then.
|
18106
|
+
|
18107
|
+
@method then
|
18108
|
+
@param {Function} callback
|
18109
|
+
@return {RSVP.Promise}
|
18110
|
+
*/
|
18111
|
+
then: promiseAlias('then'),
|
18112
|
+
|
18113
|
+
/**
|
18114
|
+
An alias to the proxied promise's `catch`.
|
18115
|
+
|
18116
|
+
See RSVP.Promise.catch.
|
18117
|
+
|
18118
|
+
@method catch
|
18119
|
+
@param {Function} callback
|
18120
|
+
@return {RSVP.Promise}
|
18121
|
+
*/
|
18122
|
+
'catch': promiseAlias('catch'),
|
18123
|
+
|
18124
|
+
/**
|
18125
|
+
An alias to the proxied promise's `finally`.
|
17372
18126
|
|
18127
|
+
See RSVP.Promise.finally.
|
17373
18128
|
|
18129
|
+
@method finally
|
18130
|
+
@param {Function} callback
|
18131
|
+
@return {RSVP.Promise}
|
18132
|
+
*/
|
18133
|
+
'finally': promiseAlias('finally')
|
18134
|
+
|
18135
|
+
});
|
18136
|
+
|
18137
|
+
function promiseAlias(name) {
|
18138
|
+
return function () {
|
18139
|
+
var promise = get(this, 'promise');
|
18140
|
+
return promise[name].apply(promise, arguments);
|
18141
|
+
};
|
18142
|
+
}
|
17374
18143
|
|
17375
18144
|
})();
|
17376
18145
|
|
@@ -17493,11 +18262,12 @@ Ember.TrackedArray.prototype = {
|
|
17493
18262
|
items in the array.
|
17494
18263
|
|
17495
18264
|
`callback` will be called for each operation and will be passed the following arguments:
|
17496
|
-
|
17497
|
-
|
17498
|
-
|
17499
|
-
|
17500
|
-
|
18265
|
+
|
18266
|
+
* {array} items The items for the given operation
|
18267
|
+
* {number} offset The computed offset of the items, ie the index in the
|
18268
|
+
array of the first item for this operation.
|
18269
|
+
* {string} operation The type of the operation. One of
|
18270
|
+
`Ember.TrackedArray.{RETAIN, DELETE, INSERT}`
|
17501
18271
|
|
17502
18272
|
@method apply
|
17503
18273
|
@param {function} callback
|
@@ -17519,7 +18289,7 @@ Ember.TrackedArray.prototype = {
|
|
17519
18289
|
},
|
17520
18290
|
|
17521
18291
|
/**
|
17522
|
-
Return an ArrayOperationMatch for the operation that contains the item at `index`.
|
18292
|
+
Return an `ArrayOperationMatch` for the operation that contains the item at `index`.
|
17523
18293
|
|
17524
18294
|
@method _findArrayOperation
|
17525
18295
|
|
@@ -17681,10 +18451,10 @@ Ember.TrackedArray.prototype = {
|
|
17681
18451
|
|
17682
18452
|
@method ArrayOperation
|
17683
18453
|
@private
|
17684
|
-
@
|
18454
|
+
@param {string} type The type of the operation. One of
|
17685
18455
|
`Ember.TrackedArray.{RETAIN, INSERT, DELETE}`
|
17686
|
-
@
|
17687
|
-
@
|
18456
|
+
@param {number} count The number of items in this operation.
|
18457
|
+
@param {array} items The items of the operation, if included. RETAIN and
|
17688
18458
|
INSERT include their items, DELETE does not.
|
17689
18459
|
*/
|
17690
18460
|
function ArrayOperation (operation, count, items) {
|
@@ -17699,11 +18469,11 @@ function ArrayOperation (operation, count, items) {
|
|
17699
18469
|
|
17700
18470
|
@method ArrayOperationMatch
|
17701
18471
|
@private
|
17702
|
-
@
|
17703
|
-
@
|
17704
|
-
@
|
18472
|
+
@param {ArrayOperation} operation
|
18473
|
+
@param {number} index The index of `operation` in the array of operations.
|
18474
|
+
@param {boolean} split Whether or not the item index searched for would
|
17705
18475
|
require a split for a new operation type.
|
17706
|
-
@
|
18476
|
+
@param {number} rangeStart The index of the first item in the operation,
|
17707
18477
|
with respect to the tracked array. The index of the last item can be computed
|
17708
18478
|
from `rangeStart` and `operation.count`.
|
17709
18479
|
*/
|
@@ -17964,7 +18734,7 @@ var get = Ember.get, set = Ember.set;
|
|
17964
18734
|
@extends Ember.Object
|
17965
18735
|
@uses Ember.MutableArray
|
17966
18736
|
*/
|
17967
|
-
Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray
|
18737
|
+
Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray, {
|
17968
18738
|
|
17969
18739
|
/**
|
17970
18740
|
The content array. Must be an object that implements `Ember.Array` and/or
|
@@ -18018,11 +18788,10 @@ Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray,/** @scope Ember.Array
|
|
18018
18788
|
},
|
18019
18789
|
|
18020
18790
|
/**
|
18021
|
-
@private
|
18022
|
-
|
18023
18791
|
Invoked when the content property is about to change. Notifies observers that the
|
18024
18792
|
entire array content will change.
|
18025
18793
|
|
18794
|
+
@private
|
18026
18795
|
@method _contentWillChange
|
18027
18796
|
*/
|
18028
18797
|
_contentWillChange: Ember.beforeObserver('content', function() {
|
@@ -18044,11 +18813,10 @@ Ember.ArrayProxy = Ember.Object.extend(Ember.MutableArray,/** @scope Ember.Array
|
|
18044
18813
|
contentArrayDidChange: Ember.K,
|
18045
18814
|
|
18046
18815
|
/**
|
18047
|
-
@private
|
18048
|
-
|
18049
18816
|
Invoked when the content property changes. Notifies observers that the
|
18050
18817
|
entire array content has changed.
|
18051
18818
|
|
18819
|
+
@private
|
18052
18820
|
@method _contentDidChange
|
18053
18821
|
*/
|
18054
18822
|
_contentDidChange: Ember.observer('content', function() {
|
@@ -18747,7 +19515,7 @@ var get = Ember.get, set = Ember.set, guidFor = Ember.guidFor, isNone = Ember.is
|
|
18747
19515
|
@since Ember 0.9
|
18748
19516
|
*/
|
18749
19517
|
Ember.Set = Ember.CoreObject.extend(Ember.MutableEnumerable, Ember.Copyable, Ember.Freezable,
|
18750
|
-
|
19518
|
+
{
|
18751
19519
|
|
18752
19520
|
// ..........................................................
|
18753
19521
|
// IMPLEMENT ENUMERABLE APIS
|
@@ -19136,7 +19904,6 @@ var loaded = {};
|
|
19136
19904
|
The provided `callback` will be called with the `name` passed
|
19137
19905
|
resolved from a string into the object:
|
19138
19906
|
|
19139
|
-
|
19140
19907
|
``` javascript
|
19141
19908
|
Ember.onLoad('Ember.Handlebars' function(hbars){
|
19142
19909
|
hbars.registerHelper(...);
|
@@ -19203,6 +19970,7 @@ var get = Ember.get;
|
|
19203
19970
|
|
19204
19971
|
@class ControllerMixin
|
19205
19972
|
@namespace Ember
|
19973
|
+
@uses Ember.ActionHandler
|
19206
19974
|
*/
|
19207
19975
|
Ember.ControllerMixin = Ember.Mixin.create(Ember.ActionHandler, {
|
19208
19976
|
/* ducktype as a controller */
|