angularjs-rails 1.6.2 → 1.6.8

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.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.6.2
2
+ * @license AngularJS v1.6.8
3
3
  * (c) 2010-2017 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -25,7 +25,7 @@ var jqLite;
25
25
  * Currently, the ngMessages module only contains the code for the `ngMessages`, `ngMessagesInclude`
26
26
  * `ngMessage` and `ngMessageExp` directives.
27
27
  *
28
- * # Usage
28
+ * ## Usage
29
29
  * The `ngMessages` directive allows keys in a key/value collection to be associated with a child element
30
30
  * (or 'message') that will show or hide based on the truthiness of that key's value in the collection. A common use
31
31
  * case for `ngMessages` is to display error messages for inputs using the `$error` object exposed by the
@@ -272,6 +272,7 @@ angular.module('ngMessages', [], function initAngularHelpers() {
272
272
  isString = angular.isString;
273
273
  jqLite = angular.element;
274
274
  })
275
+ .info({ angularVersion: '1.6.8' })
275
276
 
276
277
  /**
277
278
  * @ngdoc directive
@@ -596,6 +597,7 @@ angular.module('ngMessages', [], function initAngularHelpers() {
596
597
  * @name ngMessage
597
598
  * @restrict AE
598
599
  * @scope
600
+ * @priority 1
599
601
  *
600
602
  * @description
601
603
  * `ngMessage` is a directive with the purpose to show and hide a particular message.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.6.2
2
+ * @license AngularJS v1.6.8
3
3
  * (c) 2010-2017 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -511,8 +511,8 @@ angular.mock.$IntervalProvider = function() {
511
511
  }
512
512
 
513
513
  repeatFns.push({
514
- nextTime:(now + delay),
515
- delay: delay,
514
+ nextTime: (now + (delay || 0)),
515
+ delay: delay || 1,
516
516
  fn: tick,
517
517
  id: nextRepeatId,
518
518
  deferred: deferred
@@ -562,10 +562,16 @@ angular.mock.$IntervalProvider = function() {
562
562
  * @return {number} The amount of time moved forward.
563
563
  */
564
564
  $interval.flush = function(millis) {
565
+ var before = now;
565
566
  now += millis;
566
567
  while (repeatFns.length && repeatFns[0].nextTime <= now) {
567
568
  var task = repeatFns[0];
568
569
  task.fn();
570
+ if (task.nextTime === before) {
571
+ // this can only happen the first time
572
+ // a zero-delay interval gets triggered
573
+ task.nextTime++;
574
+ }
569
575
  task.nextTime += task.delay;
570
576
  repeatFns.sort(function(a, b) { return a.nextTime - b.nextTime;});
571
577
  }
@@ -797,6 +803,7 @@ angular.mock.TzDate.prototype = Date.prototype;
797
803
  * You need to require the `ngAnimateMock` module in your test suite for instance `beforeEach(module('ngAnimateMock'))`
798
804
  */
799
805
  angular.mock.animate = angular.module('ngAnimateMock', ['ng'])
806
+ .info({ angularVersion: '1.6.8' })
800
807
 
801
808
  .config(['$provide', function($provide) {
802
809
 
@@ -1139,6 +1146,8 @@ angular.mock.dump = function(object) {
1139
1146
  $http.get('/auth.py').then(function(response) {
1140
1147
  authToken = response.headers('A-Token');
1141
1148
  $scope.user = response.data;
1149
+ }).catch(function() {
1150
+ $scope.status = 'Failed...';
1142
1151
  });
1143
1152
 
1144
1153
  $scope.saveMessage = function(message) {
@@ -1352,8 +1361,8 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1352
1361
 
1353
1362
  return function() {
1354
1363
  return angular.isNumber(status)
1355
- ? [status, data, headers, statusText]
1356
- : [200, status, data, headers];
1364
+ ? [status, data, headers, statusText, 'complete']
1365
+ : [200, status, data, headers, 'complete'];
1357
1366
  };
1358
1367
  }
1359
1368
 
@@ -1382,20 +1391,21 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1382
1391
  }
1383
1392
  }
1384
1393
 
1394
+ handleResponse.description = method + ' ' + url;
1385
1395
  return handleResponse;
1386
1396
 
1387
1397
  function handleResponse() {
1388
1398
  var response = wrapped.response(method, url, data, headers, wrapped.params(url));
1389
1399
  xhr.$$respHeaders = response[2];
1390
1400
  callback(copy(response[0]), copy(response[1]), xhr.getAllResponseHeaders(),
1391
- copy(response[3] || ''));
1401
+ copy(response[3] || ''), copy(response[4]));
1392
1402
  }
1393
1403
 
1394
1404
  function handleTimeout() {
1395
1405
  for (var i = 0, ii = responses.length; i < ii; i++) {
1396
1406
  if (responses[i] === handleResponse) {
1397
1407
  responses.splice(i, 1);
1398
- callback(-1, undefined, '');
1408
+ callback(-1, undefined, '', undefined, 'timeout');
1399
1409
  break;
1400
1410
  }
1401
1411
  }
@@ -1435,10 +1445,16 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1435
1445
  return;
1436
1446
  }
1437
1447
  }
1438
- throw wasExpected ?
1448
+ var error = wasExpected ?
1439
1449
  new Error('No response defined !') :
1440
1450
  new Error('Unexpected request: ' + method + ' ' + url + '\n' +
1441
1451
  (expectation ? 'Expected ' + expectation : 'No more request expected'));
1452
+
1453
+ // In addition to be being converted to a rejection, this error also needs to be passed to
1454
+ // the $exceptionHandler and be rethrown (so that the test fails).
1455
+ error.$$passToExceptionHandler = true;
1456
+
1457
+ throw error;
1442
1458
  }
1443
1459
 
1444
1460
  /**
@@ -1888,7 +1904,9 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
1888
1904
  $httpBackend.verifyNoOutstandingRequest = function(digest) {
1889
1905
  if (digest !== false) $rootScope.$digest();
1890
1906
  if (responses.length) {
1891
- throw new Error('Unflushed requests: ' + responses.length);
1907
+ var unflushedDescriptions = responses.map(function(res) { return res.description; });
1908
+ throw new Error('Unflushed requests: ' + responses.length + '\n ' +
1909
+ unflushedDescriptions.join('\n '));
1892
1910
  }
1893
1911
  };
1894
1912
 
@@ -2361,15 +2379,10 @@ angular.mock.$ComponentControllerProvider = ['$compileProvider',
2361
2379
  * @packageName angular-mocks
2362
2380
  * @description
2363
2381
  *
2364
- * # ngMock
2365
- *
2366
- * The `ngMock` module provides support to inject and mock Angular services into unit tests.
2367
- * In addition, ngMock also extends various core ng services such that they can be
2382
+ * The `ngMock` module provides support to inject and mock AngularJS services into unit tests.
2383
+ * In addition, ngMock also extends various core AngularJS services such that they can be
2368
2384
  * inspected and controlled in a synchronous manner within test code.
2369
2385
  *
2370
- *
2371
- * <div doc-module-components="ngMock"></div>
2372
- *
2373
2386
  * @installation
2374
2387
  *
2375
2388
  * First, download the file:
@@ -2413,7 +2426,7 @@ angular.module('ngMock', ['ng']).provider({
2413
2426
  $provide.decorator('$rootScope', angular.mock.$RootScopeDecorator);
2414
2427
  $provide.decorator('$controller', createControllerDecorator($compileProvider));
2415
2428
  $provide.decorator('$httpBackend', angular.mock.$httpBackendDecorator);
2416
- }]);
2429
+ }]).info({ angularVersion: '1.6.8' });
2417
2430
 
2418
2431
  /**
2419
2432
  * @ngdoc module
@@ -2428,7 +2441,7 @@ angular.module('ngMock', ['ng']).provider({
2428
2441
  */
2429
2442
  angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
2430
2443
  $provide.decorator('$httpBackend', angular.mock.e2e.$httpBackendDecorator);
2431
- }]);
2444
+ }]).info({ angularVersion: '1.6.8' });
2432
2445
 
2433
2446
  /**
2434
2447
  * @ngdoc service
@@ -2482,7 +2495,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
2482
2495
  *
2483
2496
  * Afterwards, bootstrap your app with this new module.
2484
2497
  *
2485
- * ## Example
2498
+ * @example
2486
2499
  * <example name="httpbackend-e2e-testing" module="myAppE2E" deps="angular-mocks.js">
2487
2500
  * <file name="app.js">
2488
2501
  * var myApp = angular.module('myApp', []);
@@ -3210,13 +3223,56 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
3210
3223
 
3211
3224
  (function() {
3212
3225
  /**
3213
- * Triggers a browser event. Attempts to choose the right event if one is
3214
- * not specified.
3226
+ * @ngdoc function
3227
+ * @name browserTrigger
3228
+ * @description
3229
+ *
3230
+ * This is a global (window) function that is only available when the {@link ngMock} module is
3231
+ * included.
3232
+ *
3233
+ * It can be used to trigger a native browser event on an element, which is useful for unit testing.
3234
+ *
3215
3235
  *
3216
3236
  * @param {Object} element Either a wrapped jQuery/jqLite node or a DOMElement
3217
- * @param {string} eventType Optional event type
3218
- * @param {Object=} eventData An optional object which contains additional event data (such as x,y
3219
- * coordinates, keys, etc...) that are passed into the event when triggered
3237
+ * @param {string=} eventType Optional event type. If none is specified, the function tries
3238
+ * to determine the right event type for the element, e.g. `change` for
3239
+ * `input[text]`.
3240
+ * @param {Object=} eventData An optional object which contains additional event data that is used
3241
+ * when creating the event:
3242
+ *
3243
+ * - `bubbles`: [Event.bubbles](https://developer.mozilla.org/docs/Web/API/Event/bubbles).
3244
+ * Not applicable to all events.
3245
+ *
3246
+ * - `cancelable`: [Event.cancelable](https://developer.mozilla.org/docs/Web/API/Event/cancelable).
3247
+ * Not applicable to all events.
3248
+ *
3249
+ * - `charcode`: [charCode](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/charcode)
3250
+ * for keyboard events (keydown, keypress, and keyup).
3251
+ *
3252
+ * - `elapsedTime`: the elapsedTime for
3253
+ * [TransitionEvent](https://developer.mozilla.org/docs/Web/API/TransitionEvent)
3254
+ * and [AnimationEvent](https://developer.mozilla.org/docs/Web/API/AnimationEvent).
3255
+ *
3256
+ * - `keycode`: [keyCode](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/keycode)
3257
+ * for keyboard events (keydown, keypress, and keyup).
3258
+ *
3259
+ * - `keys`: an array of possible modifier keys (ctrl, alt, shift, meta) for
3260
+ * [MouseEvent](https://developer.mozilla.org/docs/Web/API/MouseEvent) and
3261
+ * keyboard events (keydown, keypress, and keyup).
3262
+ *
3263
+ * - `relatedTarget`: the
3264
+ * [relatedTarget](https://developer.mozilla.org/docs/Web/API/MouseEvent/relatedTarget)
3265
+ * for [MouseEvent](https://developer.mozilla.org/docs/Web/API/MouseEvent).
3266
+ *
3267
+ * - `which`: [which](https://developer.mozilla.org/docs/Web/API/KeyboardEvent/which)
3268
+ * for keyboard events (keydown, keypress, and keyup).
3269
+ *
3270
+ * - `x`: x-coordinates for [MouseEvent](https://developer.mozilla.org/docs/Web/API/MouseEvent)
3271
+ * and [TouchEvent](https://developer.mozilla.org/docs/Web/API/TouchEvent).
3272
+ *
3273
+ * - `y`: y-coordinates for [MouseEvent](https://developer.mozilla.org/docs/Web/API/MouseEvent)
3274
+ * and [TouchEvent](https://developer.mozilla.org/docs/Web/API/TouchEvent).
3275
+ *
3220
3276
  */
3221
3277
  window.browserTrigger = function browserTrigger(element, eventType, eventData) {
3222
3278
  if (element && !element.nodeName) element = element[0];
@@ -3263,25 +3319,25 @@ angular.mock.$RootScopeDecorator = ['$delegate', function($delegate) {
3263
3319
  if (/transitionend/.test(eventType)) {
3264
3320
  if (window.WebKitTransitionEvent) {
3265
3321
  evnt = new window.WebKitTransitionEvent(eventType, eventData);
3266
- evnt.initEvent(eventType, false, true);
3322
+ evnt.initEvent(eventType, eventData.bubbles, true);
3267
3323
  } else {
3268
3324
  try {
3269
3325
  evnt = new window.TransitionEvent(eventType, eventData);
3270
3326
  } catch (e) {
3271
3327
  evnt = window.document.createEvent('TransitionEvent');
3272
- evnt.initTransitionEvent(eventType, null, null, null, eventData.elapsedTime || 0);
3328
+ evnt.initTransitionEvent(eventType, eventData.bubbles, null, null, eventData.elapsedTime || 0);
3273
3329
  }
3274
3330
  }
3275
3331
  } else if (/animationend/.test(eventType)) {
3276
3332
  if (window.WebKitAnimationEvent) {
3277
3333
  evnt = new window.WebKitAnimationEvent(eventType, eventData);
3278
- evnt.initEvent(eventType, false, true);
3334
+ evnt.initEvent(eventType, eventData.bubbles, true);
3279
3335
  } else {
3280
3336
  try {
3281
3337
  evnt = new window.AnimationEvent(eventType, eventData);
3282
3338
  } catch (e) {
3283
3339
  evnt = window.document.createEvent('AnimationEvent');
3284
- evnt.initAnimationEvent(eventType, null, null, null, eventData.elapsedTime || 0);
3340
+ evnt.initAnimationEvent(eventType, eventData.bubbles, null, null, eventData.elapsedTime || 0);
3285
3341
  }
3286
3342
  }
3287
3343
  } else if (/touch/.test(eventType) && supportsTouchEvents()) {
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.6.2
2
+ * @license AngularJS v1.6.8
3
3
  * (c) 2010-2017 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1231,14 +1231,9 @@ function IDC_Y(cp) {
1231
1231
  * @packageName angular-parse-ext
1232
1232
  * @description
1233
1233
  *
1234
- * # ngParseExt
1235
- *
1236
1234
  * The `ngParseExt` module provides functionality to allow Unicode characters in
1237
1235
  * identifiers inside Angular expressions.
1238
1236
  *
1239
- *
1240
- * <div doc-module-components="ngParseExt"></div>
1241
- *
1242
1237
  * This module allows the usage of any identifier that follows ES6 identifier naming convention
1243
1238
  * to be used as an identifier in an Angular expression. ES6 delegates some of the identifier
1244
1239
  * rules definition to Unicode, this module uses ES6 and Unicode 8.0 identifiers convention.
@@ -1267,7 +1262,8 @@ function isValidIdentifierContinue(ch, cp) {
1267
1262
  angular.module('ngParseExt', [])
1268
1263
  .config(['$parseProvider', function($parseProvider) {
1269
1264
  $parseProvider.setIdentifierFns(isValidIdentifierStart, isValidIdentifierContinue);
1270
- }]);
1265
+ }])
1266
+ .info({ angularVersion: '1.6.8' });
1271
1267
 
1272
1268
 
1273
1269
  })(window, window.angular);
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.6.2
2
+ * @license AngularJS v1.6.8
3
3
  * (c) 2010-2017 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -53,14 +53,9 @@ function shallowClearAndCopy(src, dst) {
53
53
  * @name ngResource
54
54
  * @description
55
55
  *
56
- * # ngResource
57
- *
58
56
  * The `ngResource` module provides interaction support with RESTful services
59
57
  * via the $resource service.
60
58
  *
61
- *
62
- * <div doc-module-components="ngResource"></div>
63
- *
64
59
  * See {@link ngResource.$resourceProvider} and {@link ngResource.$resource} for usage.
65
60
  */
66
61
 
@@ -130,8 +125,8 @@ function shallowClearAndCopy(src, dst) {
130
125
  * URL `/path/greet?salutation=Hello`.
131
126
  *
132
127
  * If the parameter value is prefixed with `@`, then the value for that parameter will be
133
- * extracted from the corresponding property on the `data` object (provided when calling a
134
- * "non-GET" action method).
128
+ * extracted from the corresponding property on the `data` object (provided when calling actions
129
+ * with a request body).
135
130
  * For example, if the `defaultParam` object is `{someParam: '@someProp'}` then the value of
136
131
  * `someParam` will be `data.someProp`.
137
132
  * Note that the parameter will be ignored, when calling a "GET" action method (i.e. an action
@@ -179,7 +174,7 @@ function shallowClearAndCopy(src, dst) {
179
174
  * set `transformResponse` to an empty array: `transformResponse: []`
180
175
  * - **`cache`** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
181
176
  * GET request, otherwise if a cache instance built with
182
- * {@link ng.$cacheFactory $cacheFactory}, this cache will be used for
177
+ * {@link ng.$cacheFactory $cacheFactory} is supplied, this cache will be used for
183
178
  * caching.
184
179
  * - **`timeout`** – `{number}` – timeout in milliseconds.<br />
185
180
  * **Note:** In contrast to {@link ng.$http#usage $http.config}, {@link ng.$q promises} are
@@ -197,7 +192,14 @@ function shallowClearAndCopy(src, dst) {
197
192
  * [requestType](https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType).
198
193
  * - **`interceptor`** - `{Object=}` - The interceptor object has two optional methods -
199
194
  * `response` and `responseError`. Both `response` and `responseError` interceptors get called
200
- * with `http response` object. See {@link ng.$http $http interceptors}.
195
+ * with `http response` object. See {@link ng.$http $http interceptors}. In addition, the
196
+ * resource instance or array object is accessible by the `resource` property of the
197
+ * `http response` object.
198
+ * Keep in mind that the associated promise will be resolved with the value returned by the
199
+ * response interceptor, if one is specified. The default response interceptor returns
200
+ * `response.resource` (i.e. the resource instance or array).
201
+ * - **`hasBody`** - `{boolean}` - allows to specify if a request body should be included or not.
202
+ * If not specified only POST, PUT and PATCH requests will have a body.
201
203
  *
202
204
  * @param {Object} options Hash with custom settings that should extend the
203
205
  * default `$resourceProvider` behavior. The supported options are:
@@ -242,9 +244,15 @@ function shallowClearAndCopy(src, dst) {
242
244
  * The action methods on the class object or instance object can be invoked with the following
243
245
  * parameters:
244
246
  *
245
- * - HTTP GET "class" actions: `Resource.action([parameters], [success], [error])`
246
- * - non-GET "class" actions: `Resource.action([parameters], postData, [success], [error])`
247
- * - non-GET instance actions: `instance.$action([parameters], [success], [error])`
247
+ * - "class" actions without a body: `Resource.action([parameters], [success], [error])`
248
+ * - "class" actions with a body: `Resource.action([parameters], postData, [success], [error])`
249
+ * - instance actions: `instance.$action([parameters], [success], [error])`
250
+ *
251
+ *
252
+ * When calling instance methods, the instance itself is used as the request body (if the action
253
+ * should have a body). By default, only actions using `POST`, `PUT` or `PATCH` have request
254
+ * bodies, but you can use the `hasBody` configuration option to specify whether an action
255
+ * should have a body or not (regardless of its HTTP method).
248
256
  *
249
257
  *
250
258
  * Success callback is called with (value (Object|Array), responseHeaders (Function),
@@ -264,8 +272,7 @@ function shallowClearAndCopy(src, dst) {
264
272
  * {@link ngRoute.$routeProvider resolve section of $routeProvider.when()} to defer view
265
273
  * rendering until the resource(s) are loaded.
266
274
  *
267
- * On failure, the promise is rejected with the {@link ng.$http http response} object, without
268
- * the `resource` property.
275
+ * On failure, the promise is rejected with the {@link ng.$http http response} object.
269
276
  *
270
277
  * If an interceptor object was provided, the promise will instead be resolved with the value
271
278
  * returned by the interceptor.
@@ -285,11 +292,11 @@ function shallowClearAndCopy(src, dst) {
285
292
  * the Resource API. This object can be serialized through {@link angular.toJson} safely
286
293
  * without attaching Angular-specific fields. Notice that `JSON.stringify` (and
287
294
  * `angular.toJson`) automatically use this method when serializing a Resource instance
288
- * (see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON()_behavior)).
295
+ * (see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON%28%29_behavior)).
289
296
  *
290
297
  * @example
291
298
  *
292
- * # Credit card resource
299
+ * ### Credit card resource
293
300
  *
294
301
  * ```js
295
302
  // Define CreditCard class
@@ -334,7 +341,7 @@ function shallowClearAndCopy(src, dst) {
334
341
  *
335
342
  * @example
336
343
  *
337
- * # User resource
344
+ * ### User resource
338
345
  *
339
346
  * When the data is returned from the server then the object is an instance of the resource type and
340
347
  * all of the non-GET methods are available with `$` prefix. This allows you to easily support CRUD
@@ -375,7 +382,7 @@ function shallowClearAndCopy(src, dst) {
375
382
  *
376
383
  * @example
377
384
  *
378
- * # Creating a custom 'PUT' request
385
+ * ### Creating a custom 'PUT' request
379
386
  *
380
387
  * In this example we create a custom method on our resource to make a PUT request
381
388
  * ```js
@@ -407,7 +414,7 @@ function shallowClearAndCopy(src, dst) {
407
414
  *
408
415
  * @example
409
416
  *
410
- * # Cancelling requests
417
+ * ### Cancelling requests
411
418
  *
412
419
  * If an action's configuration specifies that it is cancellable, you can cancel the request related
413
420
  * to an instance or collection (as long as it is a result of a "non-instance" call):
@@ -434,6 +441,7 @@ function shallowClearAndCopy(src, dst) {
434
441
  *
435
442
  */
436
443
  angular.module('ngResource', ['ng']).
444
+ info({ angularVersion: '1.6.8' }).
437
445
  provider('$resource', function ResourceProvider() {
438
446
  var PROTOCOL_AND_IPV6_REGEX = /^https?:\/\/\[[^\]]*][^/]*/;
439
447
 
@@ -484,7 +492,7 @@ angular.module('ngResource', ['ng']).
484
492
  * $resourceProvider.defaults.actions.update = {
485
493
  * method: 'PUT'
486
494
  * };
487
- * });
495
+ * }]);
488
496
  * ```
489
497
  *
490
498
  * Or you can even overwrite the whole `actions` list and specify your own:
@@ -647,7 +655,7 @@ angular.module('ngResource', ['ng']).
647
655
  };
648
656
 
649
657
  forEach(actions, function(action, name) {
650
- var hasBody = /^(POST|PUT|PATCH)$/i.test(action.method);
658
+ var hasBody = action.hasBody === true || (action.hasBody !== false && /^(POST|PUT|PATCH)$/i.test(action.method));
651
659
  var numericTimeout = action.timeout;
652
660
  var cancellable = isDefined(action.cancellable) ?
653
661
  action.cancellable : route.defaults.cancellable;
@@ -772,6 +780,9 @@ angular.module('ngResource', ['ng']).
772
780
  response.resource = value;
773
781
 
774
782
  return response;
783
+ }, function(response) {
784
+ response.resource = value;
785
+ return $q.reject(response);
775
786
  });
776
787
 
777
788
  promise = promise['finally'](function() {
@@ -819,7 +830,9 @@ angular.module('ngResource', ['ng']).
819
830
 
820
831
  function cancelRequest(value) {
821
832
  promise.catch(noop);
822
- timeoutDeferred.resolve(value);
833
+ if (timeoutDeferred !== null) {
834
+ timeoutDeferred.resolve(value);
835
+ }
823
836
  }
824
837
  };
825
838
 
@@ -833,11 +846,6 @@ angular.module('ngResource', ['ng']).
833
846
  };
834
847
  });
835
848
 
836
- Resource.bind = function(additionalParamDefaults) {
837
- var extendedParamDefaults = extend({}, paramDefaults, additionalParamDefaults);
838
- return resourceFactory(url, extendedParamDefaults, actions, options);
839
- };
840
-
841
849
  return Resource;
842
850
  }
843
851