unpoly-rails 0.54.1 → 0.55.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 unpoly-rails might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a638be0eb0bec7b79fbd186dce420a721e34b780fd1b5f22a5e0a82ab3f5c64f
4
- data.tar.gz: dda52bf9065aa7e49327dd3ba4c1007609797198508fb6e5e476f014e81b66c6
3
+ metadata.gz: 1fdee33cdc0082856a8323e4b98743dc38231346dd10a166c8abadaa03b70663
4
+ data.tar.gz: ebd311b2afaedf289c35de0ed0b56d5e4ad6da81ba927ca174ecc44f2d192c7d
5
5
  SHA512:
6
- metadata.gz: c9f145172d0afff7ef55080c38bc522e4b7ee0db583203ce68e8a4afbf39e6776ff286a0cbb3a5b6d17533b021c4499a11e3f5e135de58b4a984f5ac4bdd829c
7
- data.tar.gz: 47e49f7c26c8c9065aa4ea93063ce2f486a30d156fe19cf3a6314b9ba7d85741e90fb488ff086d8e0245743a10aab35877b3ea0fe1516b30bf495504ab87fa5c
6
+ metadata.gz: a2b40fc88ec64615aec1360710d669e9757c88673af1a0c319c37df744caf7838fd707638fd56634129564851c95881dca35e4890d449a5f77af9ad5e524c81d
7
+ data.tar.gz: d5d04c17594f151a4104dfbac2e3280d9776b39b4fe653f36fce3ea8587dcbc877c3cab683ca20f22a586df87400e9ac839bde2233ac588ff388765599990cdd
@@ -6,6 +6,33 @@ Changes to this project will be documented in this file.
6
6
  This project mostly adheres to [Semantic Versioning](http://semver.org/).
7
7
 
8
8
 
9
+ Unreleased
10
+ ----------
11
+
12
+ ### Fragment updates
13
+
14
+ - Unpoly now detects when an [`[up-target]`](/up-target) with multiple selectors would [replace](/up.replace) the same element multiple times. In such a case the target selector will be shortened to contain the element once.
15
+ - Unpoly now detects when an [`[up-target]`](/up-target) with multiple selectors contains nested elements. In such a case the target selector will be shortened to only contain the outmost element.
16
+
17
+
18
+ ### Utility functions
19
+
20
+ - [`up.util.uniq()`](/up.util.uniq) now works on DOM elements and other object references.
21
+ - New experimental function [`up.util.uniqBy()`](/up.util.uniqBy). This function is like [`uniq`](/up.util.uniq), accept that the given function is invoked for each element to generate the value for which uniquness is computed.
22
+ - Changes to [utility functions](/up.util) that work on lists ([`up.util.each()`](/up.util.each), [`up.util.map()`](/up.util.map), [`up.util.all()`](/up.util.all), [`up.util.any()`](/up.util.any), [`up.util.select()`](/up.util.select), [`up.util.reject()`](/up.util.reject)):
23
+ - List functions now accept a property name instead of a mapping function:
24
+
25
+ ```
26
+ users = [{ name: 'foo' }, { name: 'bar' }]
27
+ up.util.map(users, 'name') // ['foo', 'bar']
28
+ ```
29
+ - List functions now pass the iteration index as a second argument to the given function:
30
+
31
+ ```
32
+ users = [{ name: 'foo' }, { name: 'bar' }]
33
+ up.util.map(users, function(user, index) { return index }) // [0, 1]
34
+ ```
35
+
9
36
  0.54.1
10
37
  ------
11
38
 
@@ -5,7 +5,7 @@
5
5
 
6
6
  (function() {
7
7
  window.up = {
8
- version: "0.54.1",
8
+ version: "0.55.0",
9
9
  renamedModule: function(oldName, newName) {
10
10
  return typeof Object.defineProperty === "function" ? Object.defineProperty(up, oldName, {
11
11
  get: function() {
@@ -41,7 +41,7 @@ that might save you from loading something like [Lodash](https://lodash.com/).
41
41
  @function up.util.noop
42
42
  @experimental
43
43
  */
44
- var $createElementFromSelector, $createPlaceholder, $submittingButton, DivertibleChain, ESCAPE_HTML_ENTITY_MAP, all, always, any, appendRequestData, assign, assignPolyfill, attributeSelector, castedAttr, clientSize, compact, config, contains, copy, copyAttributes, createElementFromHtml, cssAnimate, detachWith, detect, documentHasVerticalScrollbar, each, escapeHtml, escapePressed, evalOption, except, extractOptions, fail, fixedToAbsolute, flatten, forceCompositing, forceRepaint, horizontalScreenHalf, identity, intersect, isArray, isBlank, isBodyDescendant, isCrossDomain, isDefined, isDetached, isElement, isFixed, isFormData, isFunction, isGiven, isJQuery, isMissing, isNull, isNumber, isObject, isOptions, isPresent, isPromise, isStandardPort, isString, isTruthy, isUndefined, isUnmodifiedKeyEvent, isUnmodifiedMouseEvent, last, map, margins, measure, memoize, merge, mergeRequestData, methodAllowsPayload, microtask, multiSelector, muteRejection, newDeferred, nextFrame, nonUpClasses, noop, normalizeMethod, normalizeUrl, nullJQuery, offsetParent, once, only, opacity, openConfig, option, options, parseUrl, pluckData, pluckKey, presence, presentAttr, previewable, promiseTimer, reject, rejectOnError, remove, renameKey, requestDataAsArray, requestDataAsQuery, requestDataFromForm, scrollbarWidth, select, selectInDynasty, selectInSubtree, selectorForElement, sequence, setMissingAttrs, setTimer, submittedValue, temporaryCss, times, toArray, trim, unJQuery, uniq, unresolvablePromise, unwrapElement, whenReady;
44
+ var $createElementFromSelector, $createPlaceholder, $submittingButton, DivertibleChain, ESCAPE_HTML_ENTITY_MAP, all, always, any, appendRequestData, assign, assignPolyfill, attributeSelector, castedAttr, clientSize, compact, config, contains, copy, copyAttributes, createElementFromHtml, cssAnimate, detachWith, detect, documentHasVerticalScrollbar, each, escapeHtml, escapePressed, evalOption, except, extractOptions, fail, fixedToAbsolute, flatten, forceCompositing, forceRepaint, horizontalScreenHalf, identity, intersect, isArray, isBlank, isBodyDescendant, isCrossDomain, isDefined, isDetached, isElement, isFixed, isFormData, isFunction, isGiven, isJQuery, isMissing, isNull, isNumber, isObject, isOptions, isPresent, isPromise, isStandardPort, isString, isTruthy, isUndefined, isUnmodifiedKeyEvent, isUnmodifiedMouseEvent, last, listBlock, map, margins, measure, memoize, merge, mergeRequestData, methodAllowsPayload, microtask, multiSelector, muteRejection, newDeferred, nextFrame, nonUpClasses, noop, normalizeMethod, normalizeUrl, nullJQuery, offsetParent, once, only, opacity, openConfig, option, options, parseUrl, pluckData, pluckKey, presence, presentAttr, previewable, promiseTimer, reject, rejectOnError, remove, renameKey, requestDataAsArray, requestDataAsQuery, requestDataFromForm, scrollbarWidth, select, selectInDynasty, selectInSubtree, selectorForElement, sequence, setMissingAttrs, setTimer, setToArray, submittedValue, temporaryCss, times, toArray, trim, unJQuery, uniq, uniqBy, unresolvablePromise, unwrapElement, whenReady;
45
45
  noop = $.noop;
46
46
 
47
47
  /***
@@ -331,19 +331,33 @@ that might save you from loading something like [Lodash](https://lodash.com/).
331
331
  @stable
332
332
  */
333
333
  trim = $.trim;
334
+ listBlock = function(block) {
335
+ if (isString(block)) {
336
+ return function(item) {
337
+ return item[block];
338
+ };
339
+ } else {
340
+ return block;
341
+ }
342
+ };
334
343
 
335
344
  /***
336
- Calls the given function for each element (and, optional, index)
337
- of the given array.
345
+ Translate all items in an array to new array of items.
338
346
 
339
- @function up.util.each
347
+ @function up.util.map
340
348
  @param {Array<T>} array
341
- @param {Function(T, number)} block
349
+ @param {Function(T, number): any|String} block
342
350
  A function that will be called with each element and (optional) iteration index.
351
+
352
+ You can also pass a property name as a String,
353
+ which will be collected from each item in the array.
354
+ @return {Array}
355
+ A new array containing the result of each function call.
343
356
  @stable
344
357
  */
345
- each = function(array, block) {
358
+ map = function(array, block) {
346
359
  var i, index, item, len, results;
360
+ block = listBlock(block);
347
361
  results = [];
348
362
  for (index = i = 0, len = array.length; i < len; index = ++i) {
349
363
  item = array[index];
@@ -353,17 +367,16 @@ that might save you from loading something like [Lodash](https://lodash.com/).
353
367
  };
354
368
 
355
369
  /***
356
- Translate all items in an array to new array of items.
370
+ Calls the given function for each element (and, optional, index)
371
+ of the given array.
357
372
 
358
- @function up.util.map
373
+ @function up.util.each
359
374
  @param {Array<T>} array
360
- @param {Function(T, number): any} block
375
+ @param {Function(T, number)} block
361
376
  A function that will be called with each element and (optional) iteration index.
362
- @return {Array}
363
- A new array containing the result of each function call.
364
377
  @stable
365
378
  */
366
- map = each;
379
+ each = map;
367
380
 
368
381
  /***
369
382
  Calls the given function for the given number of times.
@@ -776,16 +789,19 @@ that might save you from loading something like [Lodash](https://lodash.com/).
776
789
 
777
790
  @function up.util.any
778
791
  @param {Array<T>} array
779
- @param {Function(T): boolean} tester
792
+ @param {Function(T, number): boolean} tester
793
+ A function that will be called with each element and (optional) iteration index.
794
+
780
795
  @return {boolean}
781
796
  @experimental
782
797
  */
783
798
  any = function(array, tester) {
784
- var element, i, len, match;
799
+ var element, i, index, len, match;
800
+ tester = listBlock(tester);
785
801
  match = false;
786
- for (i = 0, len = array.length; i < len; i++) {
787
- element = array[i];
788
- if (tester(element)) {
802
+ for (index = i = 0, len = array.length; i < len; index = ++i) {
803
+ element = array[index];
804
+ if (tester(element, index)) {
789
805
  match = true;
790
806
  break;
791
807
  }
@@ -799,16 +815,19 @@ that might save you from loading something like [Lodash](https://lodash.com/).
799
815
 
800
816
  @function up.util.all
801
817
  @param {Array<T>} array
802
- @param {Function(T): boolean} tester
818
+ @param {Function(T, number): boolean} tester
819
+ A function that will be called with each element and (optional) iteration index.
820
+
803
821
  @return {boolean}
804
822
  @experimental
805
823
  */
806
824
  all = function(array, tester) {
807
- var element, i, len, match;
825
+ var element, i, index, len, match;
826
+ tester = listBlock(tester);
808
827
  match = true;
809
- for (i = 0, len = array.length; i < len; i++) {
810
- element = array[i];
811
- if (!tester(element)) {
828
+ for (index = i = 0, len = array.length; i < len; index = ++i) {
829
+ element = array[index];
830
+ if (!tester(element, index)) {
812
831
  match = false;
813
832
  break;
814
833
  }
@@ -838,31 +857,73 @@ that might save you from loading something like [Lodash](https://lodash.com/).
838
857
  @stable
839
858
  */
840
859
  uniq = function(array) {
841
- var seen;
842
- seen = {};
843
- return select(array, function(element) {
844
- if (seen.hasOwnProperty(element)) {
860
+ var set;
861
+ if (array.length < 2) {
862
+ return array;
863
+ }
864
+ set = new Set(array);
865
+ return setToArray(set);
866
+ };
867
+
868
+ /**
869
+ This function is like [`uniq`](/up.util.uniq), accept that
870
+ the given function is invoked for each element to generate the value
871
+ for which uniquness is computed.
872
+
873
+ @function up.util.uniqBy
874
+ @param {Array<T>} array
875
+ @param {Function<T>: any} array
876
+ @return {Array<T>}
877
+ @experimental
878
+ */
879
+ uniqBy = function(array, mapper) {
880
+ var set;
881
+ if (array.length < 2) {
882
+ return array;
883
+ }
884
+ mapper = listBlock(mapper);
885
+ set = new Set();
886
+ return select(array, function(elem, index) {
887
+ var mapped;
888
+ mapped = mapper(elem, index);
889
+ if (set.has(mapped)) {
845
890
  return false;
846
891
  } else {
847
- return seen[element] = true;
892
+ set.add(mapped);
893
+ return true;
848
894
  }
849
895
  });
850
896
  };
851
897
 
898
+ /**
899
+ @function up.util.setToArray
900
+ @internal
901
+ */
902
+ setToArray = function(set) {
903
+ var array;
904
+ array = [];
905
+ set.forEach(function(elem) {
906
+ return array.push(elem);
907
+ });
908
+ return array;
909
+ };
910
+
852
911
  /***
853
912
  Returns all elements from the given array that return
854
913
  a truthy value when passed to the given function.
855
914
 
856
915
  @function up.util.select
857
916
  @param {Array<T>} array
917
+ @param {Function(T, number): boolean} tester
858
918
  @return {Array<T>}
859
919
  @stable
860
920
  */
861
921
  select = function(array, tester) {
862
922
  var matches;
923
+ tester = listBlock(tester);
863
924
  matches = [];
864
- each(array, function(element) {
865
- if (tester(element)) {
925
+ each(array, function(element, index) {
926
+ if (tester(element, index)) {
866
927
  return matches.push(element);
867
928
  }
868
929
  });
@@ -875,12 +936,14 @@ that might save you from loading something like [Lodash](https://lodash.com/).
875
936
 
876
937
  @function up.util.reject
877
938
  @param {Array<T>} array
939
+ @param {Function(T, number): boolean} tester
878
940
  @return {Array<T>}
879
941
  @stable
880
942
  */
881
943
  reject = function(array, tester) {
882
- return select(array, function(element) {
883
- return !tester(element);
944
+ tester = listBlock(tester);
945
+ return select(array, function(element, index) {
946
+ return !tester(element, index);
884
947
  });
885
948
  };
886
949
 
@@ -1848,7 +1911,7 @@ that might save you from loading something like [Lodash](https://lodash.com/).
1848
1911
  */
1849
1912
  isDetached = function(element) {
1850
1913
  element = unJQuery(element);
1851
- return !jQuery.contains(document.documentElement, element);
1914
+ return !$.contains(document.documentElement, element);
1852
1915
  };
1853
1916
 
1854
1917
  /***
@@ -2076,17 +2139,17 @@ that might save you from loading something like [Lodash](https://lodash.com/).
2076
2139
  * Registers an empty rejection handler with the given promise.
2077
2140
  * This prevents browsers from printing "Uncaught (in promise)" to the error
2078
2141
  * console when the promise is rejection.
2079
- *
2142
+ #
2080
2143
  * This is helpful for event handlers where it is clear that no rejection
2081
2144
  * handler will be registered:
2082
- *
2145
+ #
2083
2146
  * up.on('submit', 'form[up-target]', (event, $form) => {
2084
2147
  * promise = up.submit($form)
2085
2148
  * up.util.muteRejection(promise)
2086
2149
  * })
2087
- *
2150
+ #
2088
2151
  * Does nothing if passed a missing value.
2089
- *
2152
+ #
2090
2153
  * @function up.util.muteRejection
2091
2154
  * @param {Promise|undefined|null} promise
2092
2155
  * @return {Promise}
@@ -2126,8 +2189,8 @@ that might save you from loading something like [Lodash](https://lodash.com/).
2126
2189
  var error;
2127
2190
  try {
2128
2191
  return block();
2129
- } catch (error1) {
2130
- error = error1;
2192
+ } catch (_error) {
2193
+ error = _error;
2131
2194
  return Promise.reject(error);
2132
2195
  }
2133
2196
  };
@@ -2177,6 +2240,7 @@ that might save you from loading something like [Lodash](https://lodash.com/).
2177
2240
  intersect: intersect,
2178
2241
  compact: compact,
2179
2242
  uniq: uniq,
2243
+ uniqBy: uniqBy,
2180
2244
  last: last,
2181
2245
  isNull: isNull,
2182
2246
  isDefined: isDefined,
@@ -2471,7 +2535,6 @@ that might save you from loading something like [Lodash](https://lodash.com/).
2471
2535
  function ExtractCascade(selector, options) {
2472
2536
  this.oldPlanNotFound = bind(this.oldPlanNotFound, this);
2473
2537
  this.matchingPlanNotFound = bind(this.matchingPlanNotFound, this);
2474
- this.hungrySteps = bind(this.hungrySteps, this);
2475
2538
  this.bestMatchingSteps = bind(this.bestMatchingSteps, this);
2476
2539
  this.bestPreflightSelector = bind(this.bestPreflightSelector, this);
2477
2540
  this.detectPlan = bind(this.detectPlan, this);
@@ -2530,9 +2593,13 @@ that might save you from loading something like [Lodash](https://lodash.com/).
2530
2593
  ExtractCascade.prototype.bestPreflightSelector = function() {
2531
2594
  var plan;
2532
2595
  if (this.options.provideTarget) {
2533
- return this.plans[0].selector;
2534
- } else if (plan = this.oldPlan()) {
2535
- return plan.selector;
2596
+ plan = this.plans[0];
2597
+ } else {
2598
+ plan = this.oldPlan();
2599
+ }
2600
+ if (plan) {
2601
+ plan.resolveNesting();
2602
+ return plan.selector();
2536
2603
  } else {
2537
2604
  return this.oldPlanNotFound();
2538
2605
  }
@@ -2541,37 +2608,14 @@ that might save you from loading something like [Lodash](https://lodash.com/).
2541
2608
  ExtractCascade.prototype.bestMatchingSteps = function() {
2542
2609
  var plan;
2543
2610
  if (plan = this.matchingPlan()) {
2544
- return plan.steps.concat(this.hungrySteps());
2611
+ plan.addHungrySteps();
2612
+ plan.resolveNesting();
2613
+ return plan.steps;
2545
2614
  } else {
2546
2615
  return this.matchingPlanNotFound();
2547
2616
  }
2548
2617
  };
2549
2618
 
2550
- ExtractCascade.prototype.hungrySteps = function() {
2551
- var $hungries, $hungry, $newHungry, hungry, j, len, selector, steps, transition;
2552
- steps = [];
2553
- if (this.options.hungry) {
2554
- $hungries = up.radio.hungrySelector().select();
2555
- for (j = 0, len = $hungries.length; j < len; j++) {
2556
- hungry = $hungries[j];
2557
- $hungry = $(hungry);
2558
- selector = u.selectorForElement($hungry);
2559
- if ($newHungry = this.options.response.first(selector)) {
2560
- transition = u.option(up.radio.config.hungryTransition, this.options.transition);
2561
- steps.push({
2562
- selector: selector,
2563
- $old: $hungry,
2564
- $new: $newHungry,
2565
- transition: transition,
2566
- reveal: false,
2567
- origin: null
2568
- });
2569
- }
2570
- }
2571
- }
2572
- return steps;
2573
- };
2574
-
2575
2619
  ExtractCascade.prototype.matchingPlanNotFound = function() {
2576
2620
  var inspectAction, message;
2577
2621
  if (this.newPlan()) {
@@ -2616,19 +2660,25 @@ that might save you from loading something like [Lodash](https://lodash.com/).
2616
2660
 
2617
2661
  up.ExtractPlan = (function() {
2618
2662
  function ExtractPlan(selector, options) {
2663
+ this.addHungrySteps = bind(this.addHungrySteps, this);
2619
2664
  this.parseSteps = bind(this.parseSteps, this);
2665
+ this.selector = bind(this.selector, this);
2666
+ this.resolveNesting = bind(this.resolveNesting, this);
2667
+ this.addSteps = bind(this.addSteps, this);
2620
2668
  this.matchExists = bind(this.matchExists, this);
2621
2669
  this.newExists = bind(this.newExists, this);
2622
2670
  this.oldExists = bind(this.oldExists, this);
2623
2671
  this.findNew = bind(this.findNew, this);
2624
2672
  this.findOld = bind(this.findOld, this);
2673
+ var originalSelector;
2625
2674
  this.reveal = options.reveal;
2626
2675
  this.origin = options.origin;
2627
- this.selector = up.dom.resolveSelector(selector, this.origin);
2676
+ this.hungry = options.hungry;
2628
2677
  this.transition = options.transition;
2629
2678
  this.response = options.response;
2630
2679
  this.oldLayer = options.layer;
2631
- this.parseSteps();
2680
+ originalSelector = up.dom.resolveSelector(selector, this.origin);
2681
+ this.parseSteps(originalSelector);
2632
2682
  }
2633
2683
 
2634
2684
  ExtractPlan.prototype.findOld = function() {
@@ -2667,35 +2717,59 @@ that might save you from loading something like [Lodash](https://lodash.com/).
2667
2717
  return this.oldExists() && this.newExists();
2668
2718
  };
2669
2719
 
2720
+ ExtractPlan.prototype.addSteps = function(steps) {
2721
+ return this.steps = this.steps.concat(steps);
2722
+ };
2670
2723
 
2671
- /***
2672
- Example:
2673
-
2674
- parseSelector('foo, bar:before', transition: 'cross-fade')
2675
-
2676
- [
2677
- { selector: 'foo', pseudoClass: undefined, transition: 'cross-fade' },
2678
- { selector: 'bar', pseudoClass: 'before', transition: 'cross-fade' }
2679
- ]
2680
- */
2724
+ ExtractPlan.prototype.resolveNesting = function() {
2725
+ var compressed;
2726
+ if (this.steps.length < 2) {
2727
+ return;
2728
+ }
2729
+ compressed = u.copy(this.steps);
2730
+ compressed = u.uniqBy(compressed, function(step) {
2731
+ return step.$old[0];
2732
+ });
2733
+ compressed = u.select(compressed, (function(_this) {
2734
+ return function(candidateStep, candidateIndex) {
2735
+ return u.all(compressed, function(rivalStep, rivalIndex) {
2736
+ var candidateElement, rivalElement;
2737
+ if (rivalIndex === candidateIndex) {
2738
+ return true;
2739
+ } else {
2740
+ candidateElement = candidateStep.$old[0];
2741
+ rivalElement = rivalStep.$old[0];
2742
+ return rivalStep.pseudoClass || !$.contains(rivalElement, candidateElement);
2743
+ }
2744
+ });
2745
+ };
2746
+ })(this));
2747
+ compressed[0].reveal = this.steps[0].reveal;
2748
+ return this.steps = compressed;
2749
+ };
2681
2750
 
2682
- ExtractPlan.prototype.parseSteps = function() {
2751
+ ExtractPlan.prototype.selector = function() {
2752
+ return u.map(this.steps, 'expression').join(', ');
2753
+ };
2754
+
2755
+ ExtractPlan.prototype.parseSteps = function(originalSelector) {
2683
2756
  var comma, disjunction;
2684
2757
  comma = /\ *,\ */;
2685
2758
  this.steps = [];
2686
- disjunction = this.selector.split(comma);
2759
+ disjunction = originalSelector.split(comma);
2687
2760
  return u.each(disjunction, (function(_this) {
2688
- return function(literal, i) {
2689
- var doReveal, literalParts, pseudoClass, selector;
2690
- literalParts = literal.match(/^(.+?)(?:\:(before|after))?$/);
2691
- literalParts || up.fail('Could not parse selector literal "%s"', literal);
2692
- selector = literalParts[1];
2761
+ return function(expression, i) {
2762
+ var doReveal, expressionParts, pseudoClass, selector;
2763
+ expressionParts = expression.match(/^(.+?)(?:\:(before|after))?$/);
2764
+ expressionParts || up.fail('Could not parse selector literal "%s"', expression);
2765
+ selector = expressionParts[1];
2693
2766
  if (selector === 'html') {
2694
2767
  selector = 'body';
2695
2768
  }
2696
- pseudoClass = literalParts[2];
2769
+ pseudoClass = expressionParts[2];
2697
2770
  doReveal = i === 0 ? _this.reveal : false;
2698
2771
  return _this.steps.push({
2772
+ expression: expression,
2699
2773
  selector: selector,
2700
2774
  pseudoClass: pseudoClass,
2701
2775
  transition: _this.transition,
@@ -2706,10 +2780,48 @@ that might save you from loading something like [Lodash](https://lodash.com/).
2706
2780
  })(this));
2707
2781
  };
2708
2782
 
2783
+ ExtractPlan.prototype.addHungrySteps = function() {
2784
+ var $hungries, $hungry, $newHungry, hungry, hungrySteps, j, len, selector, transition;
2785
+ hungrySteps = [];
2786
+ if (this.hungry) {
2787
+ $hungries = up.radio.hungrySelector().select();
2788
+ transition = u.option(up.radio.config.hungryTransition, this.transition);
2789
+ for (j = 0, len = $hungries.length; j < len; j++) {
2790
+ hungry = $hungries[j];
2791
+ $hungry = $(hungry);
2792
+ selector = u.selectorForElement($hungry);
2793
+ if ($newHungry = this.response.first(selector)) {
2794
+ hungrySteps.push({
2795
+ selector: selector,
2796
+ $old: $hungry,
2797
+ $new: $newHungry,
2798
+ transition: transition,
2799
+ reveal: false,
2800
+ origin: null
2801
+ });
2802
+ }
2803
+ }
2804
+ }
2805
+ return this.addSteps(hungrySteps);
2806
+ };
2807
+
2709
2808
  return ExtractPlan;
2710
2809
 
2711
2810
  })();
2712
2811
 
2812
+ }).call(this);
2813
+ (function() {
2814
+ var u;
2815
+
2816
+ u = up.util;
2817
+
2818
+ up.ExtractStep = (function() {
2819
+ function ExtractStep() {}
2820
+
2821
+ return ExtractStep;
2822
+
2823
+ })();
2824
+
2713
2825
  }).call(this);
2714
2826
  (function() {
2715
2827
  var u,
@@ -3852,7 +3964,7 @@ Internet Explorer 10 or lower
3852
3964
  sessionStorage = u.memoize(function() {
3853
3965
  try {
3854
3966
  return window.sessionStorage;
3855
- } catch (error) {
3967
+ } catch (_error) {
3856
3968
  return polyfilledSessionStorage();
3857
3969
  }
3858
3970
  });
@@ -3901,8 +4013,7 @@ Internet Explorer 10 or lower
3901
4013
  sprintfWithFormattedArgs: sprintfWithFormattedArgs,
3902
4014
  sessionStorage: sessionStorage,
3903
4015
  popCookie: popCookie,
3904
- hash: hash,
3905
- canPushState: canPushState
4016
+ hash: hash
3906
4017
  };
3907
4018
  })(jQuery);
3908
4019
 
@@ -6923,8 +7034,8 @@ is built from these functions. You can use them to extend Unpoly from your
6923
7034
  try {
6924
7035
  improvedTarget = bestPreflightSelector(selectorOrElement, successOptions);
6925
7036
  improvedFailTarget = bestPreflightSelector(options.failTarget, failureOptions);
6926
- } catch (error) {
6927
- e = error;
7037
+ } catch (_error) {
7038
+ e = _error;
6928
7039
  return Promise.reject(e);
6929
7040
  }
6930
7041
  request = {
@@ -9399,8 +9510,8 @@ new page is loading.
9399
9510
  @function up.link.addFollowVariant
9400
9511
  @param {string} simplifiedSelector
9401
9512
  A selector without `a` or `[up-href]`, e.g. `[up-target]`
9402
- @param {Function<jQuery, Object>} options.follow
9403
- @param {Function<jQuery, Object>} options.preload
9513
+ @param {Function(jQuery, Object)} options.follow
9514
+ @param {Function(jQuery, Object)} options.preload
9404
9515
  @internal
9405
9516
  */
9406
9517
  addFollowVariant = function(simplifiedSelector, options) {