@angular-wave/angular.ts 0.4.2 → 0.4.4

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.
Files changed (150) hide show
  1. package/dist/angular-ts.esm.js +2 -2
  2. package/dist/angular-ts.umd.js +12 -2
  3. package/index.html +74 -3
  4. package/package.json +7 -7
  5. package/src/angular.spec.js +1 -269
  6. package/src/animations/animate-css-driver.js +2 -2
  7. package/src/animations/animate-css.js +12 -21
  8. package/src/animations/animate-js-driver.js +1 -3
  9. package/src/animations/animate-js.js +4 -4
  10. package/src/animations/animate-queue.js +23 -23
  11. package/src/animations/animate-runner.js +4 -8
  12. package/src/animations/animate.md +1 -1
  13. package/src/animations/animate.spec.js +0 -21
  14. package/src/animations/animation.js +4 -4
  15. package/src/animations/shared.js +14 -12
  16. package/src/binding.spec.js +0 -1
  17. package/src/core/cache/cache.js +2 -29
  18. package/src/core/compile/attributes.js +2 -3
  19. package/src/core/compile/compile.js +260 -245
  20. package/src/core/compile/compile.spec.js +63 -317
  21. package/src/core/compile/compile.test.js +1 -1
  22. package/src/core/controller/controller.js +2 -0
  23. package/src/core/di/injector.md +1 -1
  24. package/src/core/di/injector.spec.js +0 -2
  25. package/src/core/di/internal-injector.js +2 -1
  26. package/src/core/interpolate/interpolate.js +16 -3
  27. package/src/core/interpolate/interpolate.spec.js +70 -16
  28. package/src/core/location/location.js +0 -2
  29. package/src/core/location/location.spec.js +27 -27
  30. package/src/core/{scope/scope.html → model/model.html} +1 -1
  31. package/src/core/model/model.js +944 -0
  32. package/src/core/model/model.spec.js +3012 -0
  33. package/src/core/on.spec.js +0 -7
  34. package/src/core/parse/interpreter.js +10 -7
  35. package/src/core/parse/parse.js +28 -7
  36. package/src/core/parse/parse.spec.js +95 -91
  37. package/src/core/prop.spec.js +4 -60
  38. package/src/core/sce/sce.js +1 -2
  39. package/src/core/sce/sce.spec.js +0 -8
  40. package/src/core/scope/scope.js +62 -32
  41. package/src/core/scope/scope.spec.js +25 -1960
  42. package/src/directive/aria/aria.js +3 -6
  43. package/src/directive/aria/aria.spec.js +0 -87
  44. package/src/directive/attrs/attrs.spec.js +0 -5
  45. package/src/directive/{list/list.test.js → attrs/attrs.test.js} +1 -1
  46. package/src/{core/q/q.html → directive/attrs/boolean.html} +1 -1
  47. package/src/directive/attrs/boolean.spec.js +0 -15
  48. package/src/{core/q/q.test.js → directive/attrs/boolean.test.js} +1 -2
  49. package/src/{core/timeout/timeout.html → directive/attrs/element-style.html} +4 -1
  50. package/src/directive/attrs/element-style.spec.js +0 -8
  51. package/src/{core/scope/scope.test.js → directive/attrs/element-style.test.js} +1 -2
  52. package/src/directive/attrs/src.spec.js +0 -7
  53. package/src/directive/bind/bind.spec.js +0 -33
  54. package/src/directive/bind/bing-html.spec.js +1 -4
  55. package/src/{core/interval/interval.html → directive/channel/channel.html} +1 -1
  56. package/src/directive/channel/channel.js +29 -0
  57. package/src/directive/channel/channel.spec.js +52 -0
  58. package/src/directive/channel/channel.test.js +9 -0
  59. package/src/directive/class/class.js +3 -3
  60. package/src/directive/class/class.spec.js +9 -75
  61. package/src/directive/controller/controller.spec.js +0 -13
  62. package/src/directive/events/click.spec.js +0 -3
  63. package/src/directive/events/event.spec.js +0 -6
  64. package/src/directive/form/form.js +14 -22
  65. package/src/directive/form/form.spec.js +0 -65
  66. package/src/directive/if/if.spec.js +2 -7
  67. package/src/directive/if/if.test.js +1 -2
  68. package/src/directive/include/include.js +2 -2
  69. package/src/directive/include/include.spec.js +8 -59
  70. package/src/directive/init/init.js +6 -2
  71. package/src/directive/init/init.spec.js +0 -2
  72. package/src/directive/input/input.js +1 -2
  73. package/src/directive/input/input.spec.js +191 -331
  74. package/src/directive/messages/messages.spec.js +4 -35
  75. package/src/directive/model/model.js +30 -42
  76. package/src/directive/model/model.spec.js +2 -49
  77. package/src/directive/model-options/model-options.js +22 -26
  78. package/src/directive/model-options/model-options.spec.js +0 -6
  79. package/src/directive/non-bindable/non-bindable.spec.js +0 -1
  80. package/src/directive/observe/observe.js +0 -1
  81. package/src/directive/observe/observe.spec.js +0 -1
  82. package/src/directive/options/options.js +1 -3
  83. package/src/directive/options/options.spec.js +3 -38
  84. package/src/directive/ref/href.spec.js +0 -15
  85. package/src/directive/repeat/repeat.js +2 -2
  86. package/src/directive/repeat/repeat.spec.js +56 -192
  87. package/src/directive/script/script.spec.js +0 -2
  88. package/src/directive/select/select.js +3 -3
  89. package/src/directive/select/select.spec.js +9 -106
  90. package/src/directive/show-hide/show-hide.js +2 -2
  91. package/src/directive/show-hide/show-hide.spec.js +8 -19
  92. package/src/directive/style/style.spec.js +0 -7
  93. package/src/directive/switch/switch.js +1 -2
  94. package/src/directive/switch/switch.spec.js +5 -5
  95. package/src/directive/validators/validators.spec.js +0 -1
  96. package/src/loader.js +0 -1
  97. package/src/public.js +75 -80
  98. package/src/router/common/coreservices.js +0 -2
  99. package/src/router/directives/state-directives.js +24 -30
  100. package/src/router/directives/state-directives.spec.js +0 -83
  101. package/src/router/directives/view-directive.js +6 -15
  102. package/src/router/directives/view-directive.spec.js +25 -71
  103. package/src/router/hooks/lazy-load.js +2 -2
  104. package/src/router/hooks/views.js +3 -5
  105. package/src/router/resolve/resolvable.js +3 -6
  106. package/src/router/resolve/resolve-context.js +2 -2
  107. package/src/router/state/state-service.js +4 -4
  108. package/src/router/state/state.spec.js +2 -5
  109. package/src/router/state/views.js +9 -12
  110. package/src/router/template-factory.js +3 -6
  111. package/src/router/template-factory.spec.js +0 -4
  112. package/src/router/transition/transition-hook.js +1 -1
  113. package/src/router/transition/transition.js +1 -1
  114. package/src/router/url/url-service.js +2 -8
  115. package/src/router/url/url-service.spec.js +3 -4
  116. package/src/router/view-hook.spec.js +2 -2
  117. package/src/router/view-scroll.js +4 -6
  118. package/src/services/http/http.js +11 -15
  119. package/src/services/http/http.spec.js +30 -31
  120. package/src/services/http/template-request.spec.js +0 -10
  121. package/src/services/http-backend/http-backend.js +19 -17
  122. package/src/services/http-backend/http-backend.spec.js +3 -3
  123. package/src/services/template-request.js +2 -4
  124. package/src/shared/common.js +6 -10
  125. package/src/shared/jqlite/jqlite.js +14 -15
  126. package/src/shared/jqlite/jqlite.spec.js +2 -2
  127. package/src/shared/utils.js +15 -92
  128. package/types/core/cache/cache.d.ts +1 -1
  129. package/types/core/model/model.d.ts +204 -0
  130. package/types/core/parse/parse.d.ts +26 -0
  131. package/types/core/scope/scope.d.ts +22 -21
  132. package/types/directive/channel/channel.d.ts +11 -0
  133. package/types/directive/form/form.d.ts +1 -0
  134. package/types/shared/common.d.ts +0 -1
  135. package/types/shared/utils.d.ts +0 -35
  136. package/src/core/interval/interval-factory.js +0 -50
  137. package/src/core/interval/interval.js +0 -77
  138. package/src/core/interval/interval.md +0 -123
  139. package/src/core/interval/interval.spec.js +0 -280
  140. package/src/core/q/q.js +0 -472
  141. package/src/core/q/q.md +0 -211
  142. package/src/core/q/q.spec.js +0 -2748
  143. package/src/core/timeout/timeout.js +0 -109
  144. package/src/core/timeout/timeout.spec.js +0 -354
  145. package/src/core/timeout/timout.test.js +0 -12
  146. package/src/directive/list/list.html +0 -18
  147. package/src/directive/list/list.js +0 -46
  148. package/src/directive/list/list.md +0 -22
  149. package/src/directive/list/list.spec.js +0 -172
  150. package/types/directive/list/list.d.ts +0 -4
@@ -49,8 +49,6 @@ describe("ngModelOptions", () => {
49
49
  ]);
50
50
  $compile = injector.get("$compile");
51
51
  $rootScope = injector.get("$rootScope");
52
- $q = injector.get("$q");
53
- $timeout = injector.get("$timeout");
54
52
  });
55
53
 
56
54
  describe("should fall back to `defaultModelOptions`", () => {
@@ -273,8 +271,6 @@ describe("ngModelOptions", () => {
273
271
  '<input type="text" ng-model="name" name="alias" />' +
274
272
  "</form>",
275
273
  )($rootScope);
276
- $rootScope.$digest();
277
-
278
274
  inputElm = doc.find("input");
279
275
  changeGivenInputTo(inputElm, "a");
280
276
  expect($rootScope.name).toEqual(undefined);
@@ -935,7 +931,6 @@ describe("ngModelOptions", () => {
935
931
  expect($rootScope.value).toBe("12345");
936
932
  expect($rootScope.form.input.$pending.promiseValidator).toBe(true);
937
933
  defer.reject();
938
- $rootScope.$digest();
939
934
  expect($rootScope.value).toBe("12345");
940
935
  expect(inputElm[0].classList.contains("ng-invalid")).toBeTrue();
941
936
  });
@@ -958,7 +953,6 @@ describe("ngModelOptions", () => {
958
953
  expect(inputElm.val()).toBe("12345");
959
954
  expect($rootScope.form.input.$pending.promiseValidator).toBe(true);
960
955
  defer.reject();
961
- $rootScope.$digest();
962
956
  expect(inputElm.val()).toBe("12345");
963
957
  expect(inputElm[0].classList.contains("ng-invalid")).toBeTrue();
964
958
  });
@@ -43,7 +43,6 @@ describe("ngNonBindable", () => {
43
43
  )($rootScope);
44
44
  $rootScope.a = "one";
45
45
  $rootScope.b = "two";
46
- $rootScope.$digest();
47
46
  // Bindings not contained by ng-non-bindable should resolve.
48
47
  const spans = element.find("span");
49
48
  expect(spans.eq(0).text()).toEqual("one");
@@ -20,7 +20,6 @@ export function ngObserveDirective() {
20
20
  ).getAttribute(source);
21
21
  if (scope[prop] !== newValue) {
22
22
  scope[prop] = newValue;
23
- scope.$digest();
24
23
  }
25
24
  });
26
25
 
@@ -25,7 +25,6 @@ describe("observe", () => {
25
25
  function createDirective(attributeValue, updateProp) {
26
26
  const template = `<div ng-observe="${attributeValue}" data-update="${updateProp}"></div>`;
27
27
  element = $compile(template)($scope);
28
- $scope.$digest();
29
28
  }
30
29
 
31
30
  it("should set the scope property to the attribute value before any changes", () => {
@@ -1,7 +1,6 @@
1
1
  import { JQLite, removeElement, startingTag } from "../../shared/jqlite/jqlite";
2
2
  import {
3
3
  equals,
4
- forEach,
5
4
  hashKey,
6
5
  includes,
7
6
  isArrayLike,
@@ -328,8 +327,7 @@ export const ngOptionsDirective = [
328
327
  selectCtrl.readValue = function readNgOptionsMultiple() {
329
328
  const selectedValues = selectElement.val() || [];
330
329
  const selections = [];
331
-
332
- forEach(selectedValues, (value) => {
330
+ selectedValues.forEach((value) => {
333
331
  const option = options.selectValueMap[value];
334
332
  if (option && !option.disabled)
335
333
  selections.push(options.getViewValueFromOption(option));
@@ -2,7 +2,6 @@ import { createInjector } from "../../core/di/injector";
2
2
  import { JQLite, dealoc } from "../../shared/jqlite/jqlite";
3
3
  import { Angular } from "../../loader";
4
4
  import {
5
- forEach,
6
5
  isBoolean,
7
6
  hashKey,
8
7
  equals,
@@ -232,7 +231,7 @@ describe("ngOptions", () => {
232
231
 
233
232
  function createSelect(attrs, blank, unknown) {
234
233
  let html = "<select";
235
- forEach(attrs, (value, key) => {
234
+ Object.entries(attrs).forEach(([key, value]) => {
236
235
  if (isBoolean(value)) {
237
236
  if (value) html += ` ${key}`;
238
237
  } else {
@@ -388,8 +387,6 @@ describe("ngOptions", () => {
388
387
  "ng-model": "selected",
389
388
  "ng-options": "option.id as option.display for option in values",
390
389
  });
391
- scope.$digest();
392
-
393
390
  const options = element.find("option");
394
391
  expect(options.length).toEqual(2);
395
392
  expect(options.eq(0)).toEqualOption("FF0000", "red");
@@ -401,8 +398,6 @@ describe("ngOptions", () => {
401
398
  expect(options.eq(0)[0].selected).toBe(true);
402
399
 
403
400
  scope.selected = "0000FF";
404
- scope.$digest();
405
-
406
401
  expect(options.eq(1)[0].getAttribute("selected")).toBe("selected");
407
402
  expect(options.eq(1).attr("selected")).toBe("selected");
408
403
  expect(options.eq(1)[0].selected).toBe(true);
@@ -439,7 +434,6 @@ describe("ngOptions", () => {
439
434
  { id: 0, label: "x" },
440
435
  { id: 1, label: "y" },
441
436
  ];
442
- scope.$digest();
443
437
  const options = element.find("option");
444
438
  expect(options.length).toEqual(2);
445
439
  expect(options.eq(0)).toEqualOption(0, "x");
@@ -613,8 +607,6 @@ describe("ngOptions", () => {
613
607
  scope.array.other = "do not watch";
614
608
  scope.array.fn = function () {};
615
609
  scope.selected = "b";
616
- scope.$digest();
617
-
618
610
  expect(scope.createLabel).toHaveBeenCalledWith("a");
619
611
  expect(scope.createLabel).toHaveBeenCalledWith("b");
620
612
  expect(scope.createLabel).toHaveBeenCalledWith("c");
@@ -636,8 +628,6 @@ describe("ngOptions", () => {
636
628
  $property: "invisible",
637
629
  };
638
630
  scope.selected = "regularProperty";
639
- scope.$digest();
640
-
641
631
  expect(scope.createLabel).toHaveBeenCalledWith("regularProperty");
642
632
  expect(scope.createLabel).not.toHaveBeenCalledWith("$$private");
643
633
  expect(scope.createLabel).not.toHaveBeenCalledWith("$property");
@@ -689,8 +679,6 @@ describe("ngOptions", () => {
689
679
  expect(optionToSelect.text()).toBe("B");
690
680
 
691
681
  optionToSelect[0].selected = true;
692
- scope.$digest();
693
-
694
682
  expect(optionToSelect[0].selected).toBe(true);
695
683
  expect(scope.selected).toBe(scope.values[0]);
696
684
  });
@@ -783,7 +771,6 @@ describe("ngOptions", () => {
783
771
 
784
772
  // Change the scope but the options should not change
785
773
  scope.arr = ["w", "x", "y", "z"];
786
- scope.$digest();
787
774
  options = element.find("option");
788
775
  expect(options.length).toEqual(4);
789
776
  expect(options.eq(0)).toEqualUnknownOption();
@@ -812,30 +799,23 @@ describe("ngOptions", () => {
812
799
  expect(options[2].selected).not.toBe(true);
813
800
 
814
801
  scope.selected = scope.values[0];
815
- scope.$digest();
816
-
817
802
  expect(options[0].selected).not.toBe(true);
818
803
  expect(options[1].selected).toBe(true);
819
804
  expect(options[2].selected).not.toBe(true);
820
805
 
821
806
  scope.selected = scope.values[1];
822
- scope.$digest();
823
-
824
807
  expect(options[0].selected).not.toBe(true);
825
808
  expect(options[1].selected).not.toBe(true);
826
809
  expect(options[2].selected).toBe(true);
827
810
 
828
811
  // This will select the empty option
829
812
  scope.selected = null;
830
- scope.$digest();
831
-
832
813
  expect(options[0].selected).toBe(true);
833
814
  expect(options[1].selected).not.toBe(true);
834
815
  expect(options[2].selected).not.toBe(true);
835
816
 
836
817
  // This will add and select the unknown option
837
818
  scope.selected = "unmatched value";
838
- scope.$digest();
839
819
  options = element.find("option");
840
820
 
841
821
  expect(options[0].selected).toBe(true);
@@ -845,7 +825,6 @@ describe("ngOptions", () => {
845
825
 
846
826
  // Back to matched value
847
827
  scope.selected = scope.values[1];
848
- scope.$digest();
849
828
  options = element.find("option");
850
829
 
851
830
  expect(options[0].selected).not.toBe(true);
@@ -1531,7 +1510,6 @@ describe("ngOptions", () => {
1531
1510
  expect(scope.selected).toEqual(scope.arr[1]);
1532
1511
 
1533
1512
  scope.selected = {};
1534
- scope.$digest();
1535
1513
  expect(options[0].selected).toBeTrue();
1536
1514
  expect(options[1].selected).not.toBeTrue();
1537
1515
  expect(options[2].selected).not.toBeTrue();
@@ -1869,8 +1847,6 @@ describe("ngOptions", () => {
1869
1847
  { cls: "one", name: "Beta" },
1870
1848
  { cls: "two", name: "Gamma" },
1871
1849
  ];
1872
- scope.$digest();
1873
-
1874
1850
  optgroups = element.find("optgroup");
1875
1851
  expect(optgroups.length).toBe(2);
1876
1852
 
@@ -1896,8 +1872,6 @@ describe("ngOptions", () => {
1896
1872
  { cls: "two", name: "Delta" },
1897
1873
  { cls: "three", name: "Epsilon" },
1898
1874
  );
1899
- scope.$digest();
1900
-
1901
1875
  optgroups = element.find("optgroup");
1902
1876
  expect(optgroups.length).toBe(3);
1903
1877
 
@@ -2355,8 +2329,6 @@ describe("ngOptions", () => {
2355
2329
  expect(element[0].value).toBe("?");
2356
2330
 
2357
2331
  scope.selected = undefined;
2358
- scope.$digest();
2359
-
2360
2332
  expect(element[0].value).toBe("");
2361
2333
  });
2362
2334
 
@@ -2615,7 +2587,6 @@ describe("ngOptions", () => {
2615
2587
  createSingleSelect(true);
2616
2588
  // ensure the first option (the blank option) is selected
2617
2589
  expect(element[0].selectedIndex).toEqual(0);
2618
- scope.$digest();
2619
2590
  // ensure the option has not changed following the digest
2620
2591
  expect(element[0].selectedIndex).toEqual(0);
2621
2592
  });
@@ -2766,7 +2737,6 @@ describe("ngOptions", () => {
2766
2737
  element = $compile(
2767
2738
  '<custom-select ng-model="value" options="options"></custom-select>',
2768
2739
  )(scope);
2769
- scope.$digest();
2770
2740
  }).not.toThrow();
2771
2741
 
2772
2742
  dealoc(element);
@@ -2941,7 +2911,6 @@ describe("ngOptions", () => {
2941
2911
  scope.values = { 0: "A", 1: "B" };
2942
2912
 
2943
2913
  scope.selected = ["1"];
2944
- scope.$digest();
2945
2914
  expect(element.find("option")[1].selected).toBe(true);
2946
2915
 
2947
2916
  element.find("option")[0].selected = true;
@@ -2993,7 +2962,7 @@ describe("ngOptions", () => {
2993
2962
  const addSpiesOnProto =
2994
2963
  originalSelectedDescriptor && originalSelectedDescriptor.configurable;
2995
2964
 
2996
- forEach(options, (option, i) => {
2965
+ Object.entries(options).forEach(([i, option]) => {
2997
2966
  const setSelected = function (value) {
2998
2967
  _selected[i] = value;
2999
2968
  };
@@ -3004,7 +2973,7 @@ describe("ngOptions", () => {
3004
2973
  });
3005
2974
 
3006
2975
  if (!addSpiesOnProto) {
3007
- forEach(options, (option, i) => {
2976
+ Object.entries(options).forEach(([i, option]) => {
3008
2977
  Object.defineProperty(option, "selected", {
3009
2978
  get() {
3010
2979
  return _selected[i];
@@ -3429,7 +3398,6 @@ describe("ngOptions", () => {
3429
3398
  });
3430
3399
 
3431
3400
  it("should fail validation when $asyncValidators fail", () => {
3432
- let $q = injector.get("$q");
3433
3401
  let defer;
3434
3402
  createSelect({
3435
3403
  name: "select",
@@ -3448,14 +3416,12 @@ describe("ngOptions", () => {
3448
3416
  expect(element).toEqualSelectValue("third");
3449
3417
 
3450
3418
  defer.reject();
3451
- scope.$digest();
3452
3419
  expect(scope.form.select.$pending).toBeUndefined();
3453
3420
  expect(scope.value).toBeUndefined();
3454
3421
  expect(element).toEqualSelectValue("third");
3455
3422
  });
3456
3423
 
3457
3424
  it("should pass validation when $asyncValidators pass", () => {
3458
- let $q = injector.get("$q");
3459
3425
  let defer;
3460
3426
  createSelect({
3461
3427
  name: "select",
@@ -3474,7 +3440,6 @@ describe("ngOptions", () => {
3474
3440
  expect(element).toEqualSelectValue("third");
3475
3441
 
3476
3442
  defer.resolve();
3477
- scope.$digest();
3478
3443
  expect(scope.form.select.$pending).toBeUndefined();
3479
3444
  expect(scope.value).toBe("third");
3480
3445
  expect(element).toEqualSelectValue("third");
@@ -29,7 +29,6 @@ describe("ngHref", () => {
29
29
 
30
30
  it("should interpolate the expression and bind to href", () => {
31
31
  element = $compile('<a ng-href="some/{{id}}"></div>')($rootScope);
32
- $rootScope.$digest();
33
32
  expect(element.attr("href")).toEqual("some/");
34
33
 
35
34
  $rootScope.$apply(() => {
@@ -42,31 +41,25 @@ describe("ngHref", () => {
42
41
  element = $compile('<a ng-href="{{url}}" rel="{{rel}}"></a>')($rootScope);
43
42
  $rootScope.url = "http://server";
44
43
  $rootScope.rel = "REL";
45
- $rootScope.$digest();
46
44
  expect(element.attr("href")).toEqual("http://server");
47
45
  expect(element.attr("rel")).toEqual("REL");
48
46
  });
49
47
 
50
48
  it("should bind href even if no interpolation", () => {
51
49
  element = $compile('<a ng-href="http://server"></a>')($rootScope);
52
- $rootScope.$digest();
53
50
  expect(element.attr("href")).toEqual("http://server");
54
51
  });
55
52
 
56
53
  it("should not set the href if ng-href is empty", () => {
57
54
  $rootScope.url = null;
58
55
  element = $compile('<a ng-href="{{url}}">')($rootScope);
59
- $rootScope.$digest();
60
56
  expect(element.attr("href")).toEqual(undefined);
61
57
  });
62
58
 
63
59
  it("should remove the href if ng-href changes to empty", () => {
64
60
  $rootScope.url = "http://www.google.com/";
65
61
  element = $compile('<a ng-href="{{url}}">')($rootScope);
66
- $rootScope.$digest();
67
-
68
62
  $rootScope.url = null;
69
- $rootScope.$digest();
70
63
  expect(element.attr("href")).toEqual(undefined);
71
64
  });
72
65
 
@@ -74,26 +67,22 @@ describe("ngHref", () => {
74
67
  /* eslint no-script-url: "off" */
75
68
  $rootScope.imageUrl = "javascript:alert(1);";
76
69
  element = $compile('<a ng-href="{{imageUrl}}">')($rootScope);
77
- $rootScope.$digest();
78
70
  expect(element.attr("href")).toBe("unsafe:javascript:alert(1);");
79
71
  });
80
72
 
81
73
  it("should sanitize non-interpolated url", () => {
82
74
  element = $compile('<a ng-href="javascript:alert(1);">')($rootScope);
83
- $rootScope.$digest();
84
75
  expect(element.attr("href")).toBe("unsafe:javascript:alert(1);");
85
76
  });
86
77
 
87
78
  it("should bind numbers", () => {
88
79
  element = $compile('<a ng-href="{{1234}}"></a>')($rootScope);
89
- $rootScope.$digest();
90
80
  expect(element.attr("href")).toEqual("1234");
91
81
  });
92
82
 
93
83
  it("should bind and sanitize the result of a (custom) toString() function", () => {
94
84
  $rootScope.value = {};
95
85
  element = $compile('<a ng-href="{{value}}"></a>')($rootScope);
96
- $rootScope.$digest();
97
86
  expect(element.attr("href")).toEqual("[object Object]");
98
87
 
99
88
  function SafeClass() {}
@@ -103,7 +92,6 @@ describe("ngHref", () => {
103
92
  };
104
93
 
105
94
  $rootScope.value = new SafeClass();
106
- $rootScope.$digest();
107
95
  expect(element.attr("href")).toEqual("custom value");
108
96
 
109
97
  function UnsafeClass() {}
@@ -113,7 +101,6 @@ describe("ngHref", () => {
113
101
  };
114
102
 
115
103
  $rootScope.value = new UnsafeClass();
116
- $rootScope.$digest();
117
104
  expect(element.attr("href")).toEqual("unsafe:javascript:alert(1);");
118
105
  });
119
106
 
@@ -124,7 +111,6 @@ describe("ngHref", () => {
124
111
  $rootScope,
125
112
  );
126
113
  const child = element.children("a");
127
- $rootScope.$digest();
128
114
  expect(child.attr("xlink:href")).toEqual("some/");
129
115
 
130
116
  $rootScope.$apply(() => {
@@ -138,7 +124,6 @@ describe("ngHref", () => {
138
124
  $rootScope,
139
125
  );
140
126
  const child = element.children("a");
141
- $rootScope.$digest();
142
127
  expect(child.attr("xlink:href")).toEqual("http://server");
143
128
  });
144
129
  });
@@ -1,4 +1,4 @@
1
- import { forEach, minErr, hashKey, isArrayLike } from "../../shared/utils";
1
+ import { minErr, hashKey, isArrayLike } from "../../shared/utils";
2
2
  import { getBlockNodes } from "../../shared/jqlite/jqlite";
3
3
 
4
4
  export const ngRepeatDirective = [
@@ -188,7 +188,7 @@ export const ngRepeatDirective = [
188
188
  nextBlockOrder[index] = block;
189
189
  } else if (nextBlockMap[trackById]) {
190
190
  // if collision detected. restore lastBlockMap and throw an error
191
- forEach(nextBlockOrder, function (block) {
191
+ Object.values(nextBlockOrder).forEach((block) => {
192
192
  if (block && block.scope) lastBlockMap[block.id] = block;
193
193
  });
194
194
  throw ngRepeatMinErr(